Repository navigation
0.112.0: Plain finding headlines, design findings, plain captions, DO_NOT_TRACK for terminal participants
humanish 0.112.0 writes findings and captions for someone who did not watch the session, and
terminal participants send DO_NOT_TRACK=1 by default. Each analysis finding leads with a plain
headline and an account of what the person tried, what got in their way and how it seemed to feel;
its title, summary and observations stay underneath as the evidence. Analyses also report design
findings: problems a product designer would notice in the captures, each with a severity and at
least one cited capture. review --json carries them as analysis.designFindings, and the
analysis prompt is study-evidence-7. Participant captions name the person, such as "Lobby host,
phone", and every route's run summary says how many participants took part and how many reached
the goal. Terminal participant and product setup commands run with DO_NOT_TRACK=1; set
execution.terminal.doNotTrack: false to study a product's telemetry. humanish runs and the
Observer now read a run with no outcome and a running simulation as interrupted, as the TUI,
stats and verify already did. The --env-file and cleanup aliases are removed in the first
minor release on or after 2026-11-03.
This is a minor release because terminal participants change their default behavior: their
commands now run with DO_NOT_TRACK=1, so a studied CLI that honors the variable stops sending
usage telemetry from them. It removes and renames no command, flag, study field, bundle field or
library export, and the package exports the same 13 values and 31 types as 0.111.4. It adds the
study field execution.terminal.doNotTrack, the bundle fact runtime.doNotTrack, and the
analysis fields headline, experience and designFindings. The --env-file and cleanup
aliases still work. Ten outputs change for the same input, which a script could notice:
| # | 0.111.4 | 0.112.0 | What to do |
|---|---|---|---|
| 1 | Terminal participant and product setup commands ran without DO_NOT_TRACK. A study file that set execution.terminal.doNotTrack was refused with HUMANISH_STUDY_INVALID: "Unknown study field in execution.terminal: doNotTrack." |
They run with DO_NOT_TRACK=1. doNotTrack: false leaves it unset, and a quoted value is refused: "execution.terminal.doNotTrack must be true or false (unquoted)." The resolved setting is recorded as doNotTrack in actor.json, run.json streams[].actor.runtime and terminal-ledgers.json, and in a dry run's runtime declaration. The host's own DO_NOT_TRACK is not passed through. (#1642) |
Set execution.terminal.doNotTrack: false in a study of a product's telemetry. |
| 2 | humanish runs, runs --json display and the served Observer read a run with no outcome, no usable status record and a simulation still running as running (tone live). The TUI, stats and verify read it interrupted. |
Every surface reads it interrupted (tone warn). A live run whose status record is fresh still reads running. (#1640) |
Treat interrupted as a run that stopped without finishing. humanish reclaim --check --run <id> reports its sandboxes. |
| 3 | A run whose run.json held its final outcome while status.json never got its final write read as unfinished in the run index. |
It reads finished, from run.json's outcome. (#1640) |
Nothing. |
| 4 | A negative, NaN or infinite cost estimate in a bundle reached the served Observer's cost label as a number. | It reads unknown on every cost display, as stats already read it. (#1640) |
Read a null cost as unknown. |
| 5 | review, analyze show and the end of a live run printed a finding as F1 <title>, then its assessment and summary. The end of a live run printed - F1 <impact>, <confidence> confidence, <recovery>: <title>. |
A finding prints as F1 <headline>, then the experience, then evidence: <title>, the assessment and the summary. A design findings: section follows the findings, reading design findings: none in the reviewed captures when there are none. The end of a live run prints - F1 <headline> (<impact>, <confidence> confidence, <recovery>), then design findings: <n> and - D1 <severity>: <headline>. An analysis written before study-evidence-7 prints as before, with no design section. (#1643) |
Read findings from review --json. The title is on the evidence: line. |
| 6 | review --json findings had no headline or experience, and analysis had no designFindings. Analyses were written at prompt study-evidence-6. |
Findings carry headline and experience, null for an analysis written before study-evidence-7. analysis.designFindings is a list, [] when the analysis found none and null for an older analysis. New analyses are written at study-evidence-7, which 0.111.4 cannot read: its review prints "findings: none. This run's analysis records could not be read or checked, so no findings are shown." (#1643) |
Read the new fields as optional. Read a run's analysis with 0.112.0 or later. |
| 7 | Participant captions (run.json streams[].label, the Observer, the TUI and a finding's affected lines) read lane-01 · browser on computer use, Concurrent persona <id> (type:<actorType> / surface:<surface> / case:<caseGroup>) · <study> on shared world, and Terminal agent · <study> on terminal. |
A participant is captioned by its roster id in words, with ", phone" or ", tablet" off a desktop: Lobby host, Player two, phone. A numbered id such as lane-01 takes the persona's name, Synthetic new user; two lanes with one persona share that caption in run.json, and the Observer adds · lane-01. A terminal participant takes its persona's name, Autonomous creative agent. The Observer and the TUI re-caption computer-use and shared-world runs that earlier releases recorded. (#1644) |
Read a participant's id and taxonomy from the bundle data: streams[].laneId on a computer-use fan-out, and roleId, actorType, surface and caseGroup in sharedWorld.outcomes[], joined to a stream by streamId, on shared world. |
| 8 | Run and participant summaries used route vocabulary. A shared-world dry run: review.summary "Concurrent shared-world dry run: 3 personas declared against one app served at a public sandbox URL (openai-computer-use); no sandboxes launched, $0 spent.", persona.name "Concurrent shared-world swarm (3 personas)", and each simulations[].summary "Persona (type:... / surface:... / case:...) () for openai-computer-use against the shared plane at [provisioned-subject]; no session ran." |
"Dry run: 3 participants would use one shared app at the same time, served from a sandbox. No sandboxes were launched and $0 was spent.", "3 participants in one shared app", and "Ops coordinator would use the shared app; no session ran." A live shared-world run reads "2 participants used one shared app at the same time. 2 of 2 reached the goal. ...", and each participant "Weekly planner used the shared app and reported reaching the goal." No summary or caption uses swarm, plane, coherently, run gate, credibility checks or goal_satisfied. (#1644) |
Read counts and outcomes from the bundle's fields. |
| 9 | A shared-world participant whose session ended failed was reported as "Actor did not produce a terminal session." A shared-world run in which a participant did not pass failed with "Concurrent shared-world run did not run coherently: N/M actors reached a terminal, engaged passed session." |
"Participant ended with failed: ", as computer use already reported it (#1639), and "The shared-world run failed: N of M participants passed. The run's review.md lists what happened to the others." (#1644) The error codes are unchanged. | Match a failure by error.code. |
| 10 | The --env-file and cleanup warnings ended "is removed in 0.112.0.", and the warning for execution.egressAllow off the terminal route ended "humanish 0.112.0 refuses it on every route except terminal." |
"is removed in the first minor release on or after 2026-11-03.", and "the first minor release on or after 2026-11-04 refuses it on every route except terminal." (#1647) | Match a warning by its text before the semicolon or colon. |
Added
- Each analysis finding leads with a plain headline and a short account of what the person tried,
what got in their way and how it seemed to feel, written for someone who did not watch the
session.humanish review,humanish analyze show, the end of a live run, the Observer and
analysis feedback drafts show the headline first. The finding's title, summary and observations
stay underneath as its evidence; in the Observer they are one disclosure away. When a reviewer
amends a finding withanalyze correct, the amended claim takes the headline's place and the
finding says it was corrected (rows 5 and 6). (#1643) - Analyses report design findings: problems a product designer would notice in the captures, such
as a primary button cut off at the bottom of the window or a control with a misleading label,
whether or not a participant mentioned them. Each names the screen, what a designer notices, why
it matters and one suggestion, has a severity (major, moderate or minor), and cites at least one
capture. The Observer lists them by severity with each capture as a thumbnail that opens it;
reviewandanalyze showprint them after the findings, andreview --jsoncarries them as
analysis.designFindings. The analysis prompt isstudy-evidence-7. Analyses written before it
keep showing their findings by title, with no design section (rows 5 and 6). (#1643)
Changed
- Terminal study participants and product setup commands send
DO_NOT_TRACK=1by default, so a
CLI that honors it can leave synthetic usage out of its telemetry. Set
execution.terminal.doNotTrack: falsewhen studying the product's telemetry behavior. Dry and
live run bundles record the resolved setting (row 1). (#1642) - Participant captions and run summaries are in plain words. A participant is captioned by its
roster id in words, plus "phone" or "tablet" when it is not on a desktop ("Lobby host, phone");
a numbered id such aslane-01takes the persona's name, and the study id is no longer
repeated. The Observer and the TUI show the same caption, including for computer-use and
shared-world runs an earlier release recorded. Every route's summary says how many participants
took part, how many reached the goal and that the gaps list the rest. Each participant's own
summary says how its session ended in words, a shared-world run is named "3 participants in one
shared app", and a failed shared-world run says how many participants passed. The taxonomy
(actorType,surface,caseGroup), attribution limits, topology and concurrency details stay
in the bundle data and inreview.md's detail lines (rows 7 to 9). (#1644) - The
--env-fileandcleanupaliases are removed in the first minor release on or after
2026-11-03, and the first minor release on or after 2026-11-04 refusesexecution.egressAllow
on routes other thanterminal. Earlier notes and warnings named 0.112.0; the dates are
unchanged (row 10). (#1647)
Fixes
- Analysis text no longer keeps a run's received one-time codes or links when the model writes
them encoded. Every generated field is checked for each value as written and as percent-encoded,
JSON-escaped, base64 or hex text, and an analysis that puts one in a finding ID or reference is
refused. Before, only the value as written was removed. (#1643) - A correction whose reason or replacement claim holds one of those values, as written or encoded,
is refused where the run's values are in scope.humanish analyze correctrun on its own holds
no such values and checks the secret patterns, as before. (#1643) - A design finding can name a participant as having seen the problem only when it cites one of
that participant's captures, and the Observer refuses a saved analysis that lacks the headlines
or design findings its prompt version requires. (#1643) - A shared-world participant whose session ended failed is reported with its status and reason
(row 9). (#1639) - Run listings, the Observer,
stats,verifyand the TUI agree when a run stops updating: an
unfinished bundle without usable status reads as interrupted, and a recorded final outcome wins
over a stale status record. Fresh live snapshots still read as running. Invalid cost estimates
stay unknown across cost displays and statistics (rows 2 to 4). (#1640)
Internal
- The OpenAI computer-use participant's conversation state (accepted replies, pending call outputs,
retention mode, carried history and its record) lives in one module. Recorded conversation
fields are unchanged. (#1641) pnpm arch:benchwrites a repeatable architecture report from the checkout. It is a repo
script and is not packed. (#1631)
Known gaps
humanish verifyand bundle export read percent-encoded UTF-8 one byte per character, so a
sensitive value with a non-ASCII character, written percent-encoded in evidence, does not match
their pattern scans. (#1645)- The shared secret scrubber leaves any
[REDACTED_...]-shaped span alone, so a known value
written hex inside one survives; it reads percent-encoded UTF-8 one byte per character; and its
marker check is quadratic, so a 1 MiB crafted input took about 6 s. These predate this release.
(#1646) - A participant's closing account still reports only friction. The participant-impressions half
of #1634 (what looked unclear, what the participant liked, what they expected and did not find)
is not shipped, so design findings come from the analysis of the captures alone. - Design findings cannot say that text or a click target is too small by measure: the analysis
sees scaled captures, and none of three runs of the new prompt on a run with visibly small text
flagged it. (#1638) - A reviewer cannot add a note at a moment in a recorded run. (#1635)
- The restricted Codex analysis provider with the
study-evidence-7schema has run only through
its test fakes. - Terminal and scripted runs recorded by earlier releases keep their stored captions, such as
Terminal agent · <study>. The Observer and the TUI re-caption computer-use and shared-world
runs only. - The end of a live shared-world run still prints
plane: <repo>@<commit>,
overlap: proven (...)andpersona <id> (<persona>): passed (goal_satisfied). The captions
and summaries in the run bundle and the Observer use none of these words.
Package
humanish 0.112.0 packs to 2.4 MB, 7.5 MB unpacked, 922 files (npm pack on release/0.112.0 at
70a05a5). Against 0.111.4 it adds dist/actors/computer-use/openai-conversation,
dist/run/liveness, dist/run/participant-caption and dist/run/review-markdown (.js and
.d.ts each) and drops dist/actors/computer-use/openai-requests. The package exports only .,
with the same 13 values and 31 types as 0.111.4 (pnpm api:proof). It needs Node 22.19 or newer,
as before, and @e2b/desktop 2.3.2 or newer as an optional peer.
The release tarball's shasum is 1c23076de86d124716bfbc169636129276f7dda7 and its integrity
sha512-2NGCF4paxtYJ479Q5O95YJr0iQoOY3B49mV+lKHXLBvdSX4LBlf05gm3zW0ycxtdMEBsTtybFzKupUSOidVG9g==.
The registry serves the same values: npm published 0.112.0 at 05:28 UTC on 2026-10-07 from the tagged commit, with a signed provenance statement, and the post-publish check passed 88 of 88 against the registry and unpkg.
Checked before release
A live smoke on a tarball packed from main 4a132ed, in fresh projects under /tmp with a fresh
HOME and npm cache, DO_NOT_TRACK=1, keys passed to the CLI only through --dotenv, and
@e2b/desktop 2.4.0 beside humanish. Dry runs, refusals and the same CLI commands also ran on npm
0.111.4. Priced spend: $2.33 for the five live runs, $1.79 of it in automatic analysis, then
$5.99 for the benchmark and $0.22 for the dogfood run.
- try-live, as
initwrites it: reached the goal in 10 turns, input growing every turn from
2,838 to 18,051 tokens, cached input from turn 2; $0.72. The analysis wrote 3 findings and 3
design findings, among them "The two table cards overlap despite ample empty canvas space.",
which its cited capture shows.reviewprinted each finding's headline, then its experience,
thenevidence: <title>, then adesign findings: 3, most severe firstsection.review --json
carriedanalysis.designFindingswith 3 entries andheadlineandexperienceon each finding,
andanalyze show --jsonreportedstudy-evidence-7. The Observer, served by
observe --run <id> --servein headless Chrome at 1440x900 and 390x844, showed the three
headlines and a "Design findings (3)" section with five capture thumbnails, with no page errors. - try-live with a
subject.envvalue planted in the mission percent-encoded, base64 and as written:
10 turns, input growing every turn from 3,020 to 18,331; $0.68. None of the 35 run and log files
holds the value as written, percent-encoded, JSON-escaped, base64 or hex; the participant's
report and the analysis read[REDACTED_SECRET]where it named the value. - shared world, 2 participants, live: both reached the goal, input 2,714, 4,416, 6,107 and 2,718,
4,383, 6,110; $0.51. Captions "Weekly planner" and "Ops coordinator", run summary "2 participants
used one shared app at the same time. 2 of 2 reached the goal. The app's shared state changed 1
time during the run." No caption, participant summary, run summary or persona name holds swarm,
plane, coherently, "overlap proven",goal_satisfied,type:,surface:orcase:, and neither
does the Observer's visible text. On a 3-participant dry run with two participants on a phone,
0.112.0 had 0 such matches and 0.111.4 had 22. - terminal, live: the agent ran
printenv DO_NOT_TRACKand got1by default and nothing, exit 1,
withdoNotTrack: false.actor.json,run.jsonandterminal-ledgers.jsonrecord
doNotTracktrue and false. $0.22 and $0.21. runs --jsonon a dry run copied without its outcome and with its simulations running:
interruptedon 0.112.0,runningon 0.111.4.- The
--env-file,cleanupandegressAllowwarnings name 2026-11-03 and 2026-11-04 on 0.112.0,
and 0.112.0 on 0.111.4. - An analysis written by 0.111.4 (
study-evidence-6) prints by title with no design section on
0.112.0; 0.111.4 prints "findings: none" for a 0.112.0 analysis (row 6). - After every run,
reclaim --checkexited 0 withclean, andverifyexited 0:local_onlyon
the browser routes andshare_readyon terminal. Raw sandbox ids appear only in
sandbox-receipts.ndjson, and the raw OpenAI and E2B keys in no run file. E2B then listed 0
sandboxes taggedtool: humanish.
On the release commit 70a05a5:
pnpm release:checkexit 0 in 3.5 min: 454 test files passed and 10 skipped, 7,337 tests
passed and 12 skipped; TUI 157 tests; lint 440 warnings at its cap of 440; api:proof "13 values
and 31 types match"; public-surface scan of 2,860 text files and 523 binary assets;npm pack --dry-runshasum as above.pnpm docs:generatewrote 0.112.0 into cli.mdx.
It passed again on the benchmark commit c2d529b, in 4.3 min with the same test and lint counts,
a public-surface scan of 2,862 text files, and the samenpm pack --dry-runshasum: the
benchmark files are not packed.pnpm release:dogfood(the script run with Node, keys from the env file in its environment and a
temporary HOME): "release:dogfood ok", verdictblocked(blocked_approval), no-spend
satisfied, $0.22. The participant raninitand the free dry run on the installed 0.112.0 and
reported: "all 16 evidence checks passed and the bundle wasshare_ready." and "The named next
command ishumanish run try-live." It stopped at the credentials the gate withholds. Its
commands ran withDO_NOT_TRACK=1(doNotTracktrue in its actor.json).verifyon the run:
share_ready, 16 of 16;reclaim --checkclean.- The post-publish check on the release tarball: 82 of 82 passed. Its 3 new rows cover the
doNotTracksetting a terminal dry run records, with the quoted value refused (#1642), plain
captions and summaries on a 3-participant shared-world dry run (#1644), andruns --jsonreading
an unfinished run as interrupted (#1640); 3 earlier rows now read the dated warnings (#1647). The
same script on npm 0.111.4 passed 76 and failed exactly those 6 rows. - The consumer check: the 0.111.4 check's library and CLI consumer, plus five library steps and
five CLI lines for this release. Typecheck 0 errors on both versions. Every output line is the
same on npm 0.111.4 and the release tarball except the new steps and lines, the two alias
warnings, andstats --jsoncounting one more dry run on 0.112.0, which writes the
doNotTrack: falsedry run that 0.111.4 refuses. pnpm benchon 70a05a5 with its defaults (3 runs per arm,openai-computer-use,neutral
mission), committed in c2d529b: report recall 11/15, analysis recall 9/15, 0 invented on the
clean arm, $5.99 estimated. 0.111.0 scored 10/15 and 8/15. No planted report or analysis named
D2; one planted participant typed past 30 characters in one action and did not report the
truncation. The first planted analysis names D5 in a line the rubric left unresolved ("Repeated
Save attempts did not retain the added task detail"), which puts analysis recall at 10/15 read by
hand. The clean-arm analysis line "Enter left the rename in edit mode" is true: the clean build's
edit box has no Enter handler. The rubric does not read the new headlines or design findings.
E2B listed 0 tagged sandboxes after it.
Not verified
- macOS and Windows. Every check ran on Linux x64 with Node 24.12.
- A live run on the published package: the live smoke ran on a main tarball, and the post-publish
rows are offline dry runs, refusals and a local scripted run. - Rows 3 and 4 (a finished
run.jsonwith a stale status record, an invalid cost estimate) and a
fresh live snapshot readingrunning: #1640's tests cover them, and no check here ran them. - Row 9: no participant failed in a live shared-world run. #1639 changed one failure golden for it.
- The correction refusal and feedback drafts that lead with the headline: not run.
- Design findings at major or minor severity: all five in the smoke were moderate. One of the five
(D1 on try-live) was checked against its capture; the others were not. - The TUI's captions: its tests in
release:checkcover them, and nobody opened the TUI. - The explicit-context conversation mode #1641 reorganized: a study file cannot select it, so the
live runs used the threaded mode. The memory contract test covers it offline. - The local VM, email capture and receiving, local-agent participants and the scripted route: not
run on 0.112.0.