Skip to content

0.112.0: Plain finding headlines, design findings, plain captions, DO_NOT_TRACK for terminal participants

Choose a tag to compare

@danielgwilson danielgwilson released this 07 Oct 05:42
· 239 commits to main since this release
88aeb35

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 with analyze 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;
    review and analyze show print them after the findings, and review --json carries them as
    analysis.designFindings. The analysis prompt is study-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=1 by default, so a
    CLI that honors it can leave synthetic usage out of its telemetry. Set
    execution.terminal.doNotTrack: false when 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 as lane-01 takes 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 in review.md's detail lines (rows 7 to 9). (#1644)
  • The --env-file and cleanup aliases are removed in the first minor release on or after
    2026-11-03, and the first minor release on or after 2026-11-04 refuses execution.egressAllow
    on routes other than terminal. 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 correct run 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, verify and 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:bench writes a repeatable architecture report from the checkout. It is a repo
    script and is not packed. (#1631)

Known gaps

  • humanish verify and 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-7 schema 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 (...) and persona <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 init writes 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. review printed each finding's headline, then its experience,
    then evidence: <title>, then a design findings: 3, most severe first section. review --json
    carried analysis.designFindings with 3 entries and headline and experience on each finding,
    and analyze show --json reported study-evidence-7. The Observer, served by
    observe --run <id> --serve in 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.env value 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: or case:, 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_TRACK and got 1 by default and nothing, exit 1,
    with doNotTrack: false. actor.json, run.json and terminal-ledgers.json record
    doNotTrack true and false. $0.22 and $0.21.
  • runs --json on a dry run copied without its outcome and with its simulations running:
    interrupted on 0.112.0, running on 0.111.4.
  • The --env-file, cleanup and egressAllow warnings 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 --check exited 0 with clean, and verify exited 0: local_only on
    the browser routes and share_ready on 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 tagged tool: humanish.

On the release commit 70a05a5:

  • pnpm release:check exit 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-run shasum as above. pnpm docs:generate wrote 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 same npm pack --dry-run shasum: 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", verdict blocked (blocked_approval), no-spend
    satisfied, $0.22. The participant ran init and the free dry run on the installed 0.112.0 and
    reported: "all 16 evidence checks passed and the bundle was share_ready." and "The named next
    command is humanish run try-live." It stopped at the credentials the gate withholds. Its
    commands ran with DO_NOT_TRACK=1 (doNotTrack true in its actor.json). verify on the run:
    share_ready, 16 of 16; reclaim --check clean.
  • The post-publish check on the release tarball: 82 of 82 passed. Its 3 new rows cover the
    doNotTrack setting a terminal dry run records, with the quoted value refused (#1642), plain
    captions and summaries on a 3-participant shared-world dry run (#1644), and runs --json reading
    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, and stats --json counting one more dry run on 0.112.0, which writes the
    doNotTrack: false dry run that 0.111.4 refuses.
  • pnpm bench on 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.json with a stale status record, an invalid cost estimate) and a
    fresh live snapshot reading running: #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:check cover 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.