Repository navigation
Release 0.120.0 - #1754
Merged
Merged
Release 0.120.0#1754
Conversation
Bump the version to 0.120.0, move the Unreleased notes into the release notes, and keep the CHANGELOG entry's title, opening paragraph and release link. pnpm docs:generate writes 0.120.0 into cli.mdx. Contents: #1744 and #1753, cut from main cf75cc6. Checked: a live smoke on a tarball packed from main cf75cc6 runs alongside this commit (try-live with analysis, runStudy with automatic analysis from a Bun process and from Node, 20 participants with a bounded run output). pnpm release:check runs on this commit next. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pnpm bench with its defaults (3 runs per arm, openai-computer-use, neutral mission) on the release commit 1122987, as docs/release/publish.md asks for a minor release: report recall 12/15, analysis recall 11/15, 0 invented on either arm, $5.87 estimated. 0.119.0 scored 10/15 and 10/15 at $6.12. The bench skipped the clean 3 analysis as skipped_budget: spend stood at $5.87 after that run and its analysis could have passed the $7 cap, so the analysis column covers 3 planted and 2 clean participants. The analysis cap was the dry run's admittedCostUsd, $1.21, against bills of $0.64 to $0.93. D1 and D5 account for the rise: all three planted reports name each, where two did on 0.119.0. Read from the traces' click coordinates, every planted participant committed its first edit with Save (3 of 3, as on 0.119.0) and pressed Clear completed after checking a task (3 of 3, against 2 of 3). Planted 2's unresolved analysis finding "Edited task text reverted after Save and filter changes" describes D5, so analysis recall read by hand is 12/15. No planted participant typed more than 28 characters in one action, so none met D2. Every participant ran threaded, ended on its own and gave 6 impressions. E2B listed 0 tagged sandboxes after it. Checked: the summary's claims to check by hand against the results file and the unresolved finding's text in the planted 2 analysis; the reach classifier from the 0.119.0 decline investigation on these traces and on 0.119.0's; typed lengths from the traces' action titles; node scripts/check-code-prose.mjs; pnpm format:check. Not checked: three runs per arm cannot separate the rise from run-to-run variation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cuts 0.120.0 from main, a minor release with #1744 and #1753 merged since 0.119.0. Commit 1122987 sets the version on main cf75cc6, moves the Unreleased body out of CHANGELOG.md and regenerates cli.mdx. Commit bd5a7d2 adds the Taskly benchmark result that docs/release/publish.md asks for on a minor release, run on 1122987. Nothing merged to main after the cut. The draft release notes follow; the GitHub release body is the same text from the opening paragraph down.
humanish 0.120.0 completes an analysis run from a Bun process, prints a run of more than 16
participants in a bounded number of lines, and counts and filters the Observer's participants by
status and persona. Under Bun,
undiciis Bun's built-in module, whoseAgenthas nodestroy(),and the analysis provider's teardown after each request threw a
TypeErrorthat replaced therequest's result, so every automatic analysis from a Bun process ended
unknownwithAUTOMATIC_ANALYSIS_OUTCOME_UNKNOWNand kept no receipt. A failing teardown is now ignored.humanish watchandhumanish runprint a computer-use run of more than 16 participants as oneline counting them by status, up to 16 participants that did not pass, and a
not listed:line.Each participant line holds its closing message on one line cut at 160 characters, and a warning
printed the same for each participant prints once. The Observer's participant grid counts the
participants by status when they ended more than one way, and pressing a count filters the grid.
Its view options gain a Persona filter, a filter change returns to the first page, and Next page
and Previous page open the new page at its first participant.
This is a minor release because
watchandrunprint a computer-use run of more than 16participants in a new shape and cut each participant's closing message at 160 characters, which a
script reading their terminal output would notice. Their
--jsonoutput is unchanged. The packageexports the same 13 values and 31 types as 0.119.0 and has the same file list, dependencies and
engines. It removes or renames no command, flag, study field or bundle field, and
verify,reviewandrunsprint the same for the same bundle. These outputs change for the same input:watchandrunprinted one line per participant for a computer-use run of two or more participants. In the smoke, 20 participants (2 passed, 18 gave up) gave 144 stdout lines, 47 of them the participant list; in the consumer check, a dry run of 40 gave 99 stdout lines with 40 participant lines.--json(lanes[]), run.json orreview. Matchparticipants:andnot listed:for the counts.…: "participant buyer-01: abandoned (gave_up) · participant outcome · DID NOT REACH THE GOAL. The page only displays bakery information and today's loaf ... or oth…". A run of one participant prints itssession:line whole, as before. (#1744)--json(lanes[].session.reason), run.json orreview.watchandrunprinted every warning the result carried, so a warning added once per participant printed once per participant: 20 copies of "Screenshots are unblurred for local use ..." for 20 participants, 86 warning lines in all.--jsonkeeps every copy. (#1744)--json'swarnings.runStudyunder Bun 1.3.11) endedstate: unknownwithAUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN,analysisId: nullanderror.code: ANALYSIS_UNAVAILABLE, kept onlystart.jsoninanalysis-attempts/<id>/, and recorded no cost, although its request was sent: the job ran 80 s. The analysis provider threw "TypeError: dispatcher.destroy is not a function" on a 200 and on an HTTP 500.completewithanalysis/<id>/analysis.jsonandreceipt.json, as under Node: in the smoke, one participant's analysis was expected at $0.80 and billed $0.20 under Bun ($0.25 under Node). A provider failure under Bun is recorded as that failure (provider_http_errorfor an HTTP 500, with a fake fetch). (#1753, fixes #1752)unknownunder Bun, runhumanish analyze --run <id>; its dry run on 0.120.0 admits such a run at an expected $0.80 (one participant). Spend from those 0.119.0 requests is in no receipt.Added
tally, when they ended more than one way. Pressing a count shows only those participants, and
pressing it again shows everyone. The view options gain a Persona filter when the participants
have more than one persona. In the smoke, 20 participants showed "Reported complete 2" and "Gave
up 18"; pressing "Gave up" showed 18 cards. (Count, filter and page the Observer grid and bound watch output at 100 participants #1744, from A study can't simulate a full day: computer-use studies stop at 16 participants #1737)
Changed
humanish watchandhumanish runprint a computer-use run of more than 16 participants in afixed number of lines: one line counting the participants by status, up to 16 participants that
did not pass, and how many it did not list. A run of 16 or fewer still lists every participant.
Each participant's line holds its closing message on one line, cut at 160 characters, where it
used to print the whole message. A warning repeated for each participant prints once (rows 1 to
3). (Count, filter and page the Observer grid and bound watch output at 100 participants #1744, from A study can't simulate a full day: computer-use studies stop at 16 participants #1737)
Fixes
undiciis Bun's built-in module,whose
Agenthas nodestroy(), and the provider's teardown after each request threw aTypeErrorthat replaced the request's result. Every automatic analysis then endedunknownwith
AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN, even when the model answered, and kept no receipt forrequests already sent. A failing teardown is now ignored (row 4). (Keep an analysis result when the agent teardown fails under Bun (#1752) #1753, fixes Automatic analysis always ends unknown when humanish runs inside Bun #1752)
its first participant. The grid kept its scroll position, so turning the page from the bottom of
36 participants showed the end of the next page, about 10,000 px past its first participant on a
phone. (Count, filter and page the Observer grid and bound watch output at 100 participants #1744, from A study can't simulate a full day: computer-use studies stop at 16 participants #1737)
Known gaps
recorded as
unknownwith no receipt, so the spend of requests already sent is not recorded.Automatic analysis always ends unknown when humanish runs inside Bun #1752 suggested recording it as
failedwith the usage known; Keep an analysis result when the agent teardown fails under Bun (#1752) #1753 fixes only the teardown.(Automatic analysis always ends unknown when humanish runs inside Bun #1752)
Count, filter and page the Observer grid and bound watch output at 100 participants #1744 measured the grid, paging and
watchat 40 and 100 with fixtures built from one recordedparticipant. (A study can't simulate a full day: computer-use studies stop at 16 participants #1737, Count, filter and page the Observer grid and bound watch output at 100 participants #1744)
runstill prints the per-participant warnings whose text names theparticipant: in the smoke, 20 participants gave 67 warning lines, 20 of them persona-background
warnings and 40 window clipping and fill warnings. The plan and progress on stderr print one or
more lines per participant (191 stderr lines for 20). The shared-world formatter still lists every
participant on its own line. (Count, filter and page the Observer grid and bound watch output at 100 participants #1744, Let a study have 100 participants and run them within the E2B plan #1739)
watchprints the run's block and then the Observer's block ("humanish observer rendered"), andboth carry the run-level warnings, so a dry run prints "This is a dry run: ..." twice. 0.119.0
does the same.
its 5-minute timeout without naming the case or step. (Observer proofs: bound every wait so a stall names its case and step #1750)
spend.requestscounts an analysis attempt as one request. A cohort analysis ofmore than 16 participants sends one request per cohort and a merge request, and its
study-analysis.jsonreads"requests": 1. (Observer spend.requests counts a cohort analysis as one request #1743)local-treeorclonesubject, the first participant holds the others at the pipeline gateuntil its desktop is ready. Participants due before the gate opens start when it opens, late, and
the plan's schedule does not count the gate. A failed first desktop skips every other
participant. (One participant's failed desktop skips every other participant in the study #1741)
budget is crossed early idles until its last start, with no sandbox.
runprints such aparticipant as "blocked · unknown ending" and leaves out the reason, which run.json holds.
(Start participants over time from a declared schedule #1745)
plan's peak and the provisioned shared world's app deadline count each session at its full budget
and leave out each desktop's start-up time; with several waves on a provisioned shared world,
that start-up comes out of the 10-minute teardown buffer. (Start participants over time from a declared schedule #1745)
doctor --studyof a study of more than 16 participants prints "ok post-run analysis" and doesnot say that the default $3 cap refuses its analysis;
runandstudy checksay so. (Analyse a run of more than 16 participants in cohorts merged into one report #1742)both cohorts". The merge request's
Analysis requestingline reads "0 evidence items, 0captures." (Analyse a run of more than 16 participants in cohorts merged into one report #1742)
rundoes not print the warning that namesHUMANISH_E2B_MAX_CONCURRENT_SANDBOXESwhen thelimit holds participants to waves; the run records it as a
study.warningevent, and theterminal shows only the plan line. (Let a study have 100 participants and run them within the E2B plan #1739)
runprints its analysis line from the declared participant count, so a--countoverride doesnot change it, and a
--countabove 64 with real email receiving still fails at run start.(Let a study have 100 participants and run them within the E2B plan #1739)
humanish tuican still confirm an armed action on its first key repeat. The400 ms floor ignores repeats that come sooner, and a system's initial repeat delay is often
longer (500 ms by default in GNOME). (TUI: the first key repeat of a held Enter can still confirm an armed action #1730)
serve.startthat bash cannot parse still waits outreadyTimeoutMs. The scripted andshared-world routes give a failed build their generic failure code; the message carries bash's
error. (Fail a detached step bash cannot parse at once, with bash's error #1734)
guest holds 8 utterances between two screenshots, so a long wait in a talking call can overflow
it; a wait there stays 30 seconds unless the study raises
actor.maxWaitMs. (A long wait no longer ends a participant's session #1724)(A host that sleeps mid-run is reported as dozens of product failures #1740)
same user, to swap a directory in the run between two filesystem calls: temporary-file cleanup
still unlinks by path (item 1), and the reviewer-notes listing still lists
notes/by path andcan follow a swapped directory (item 3). Storage validation and the scan still list each folder
whole before the 10,000-entry cap applies, verify has no total read budget, and a legitimate
sandbox-receipts.ndjsonover 32 MiB is refused. (Bind contained-file writes, reads and listings to directory descriptors #1669)humanish tui. (Coding agents never tell their person about humanish tui, and bare humanish does not name it #1701)such as a line break and the next header after
cwd:. Nothing leaks; text a reviewer needs islost. (Path redaction deletes the text after a path in terminal transcripts #1702)
é,€) askeys; it has to type them as text. (Translate E2B desktop key names through the shared key table (#1697) #1713)
E2B_DOMAINfromprocess.envon create and ignore one inRunStudyOptions.env. (Kill and list E2B sandboxes with the run's API key #1717)decodings at a marker edge are not read,
RunSecrets.spans(the terminal route's per-chunkreplacement) has no final check, and a value that is part of a marker nests markers. (Harden the shared secret scrubber against encoded and marker-shaped values #1646)
humanish tuireads "1 run, none live".visual critique whatever its persona. (Ask for impressions in the persona's own terms #1654)
runtime setup --memory --cpus.Package
humanish 0.120.0 packs to 2.5 MB, 7.9 MB unpacked, 972 files (
npm packon release/0.120.0 at1122987, shasum ee45f9f5e398f9b9327ff3deecfeb09f117b724e), the same file list as 0.119.0. The
package exports only
., with the same 13 values and 31 types as 0.119.0 (pnpm api:proof). Itsdependencies, optional peer and engines are the same as 0.119.0's: Node 22.19 or newer, and
@e2b/desktop2.3.2 or newer as an optional peer.Checked before release
A live smoke on a tarball packed from main cf75cc6, in fresh projects under /tmp with a fresh HOME
and npm cache,
DO_NOT_TRACK=1, and@e2b/desktop2.4.0 beside humanish. CLI commands got keysfrom the user key store through key discovery, with
XDG_CONFIG_HOMEpointing at it. TherunStudyscripts, which do no key discovery, got the same store through the runtime's own--env-file(Bun 1.3.11 and Node 24.12.0) into that one process. No--dotenvwas passed. Thestore's OpenAI organization is non-ZDR, so every OpenAI participant ran
threaded; its E2B key ison a Pro plan. Controls ran the same study files on npm 0.119.0 before #1753 merged. Priced spend:
$2.62 for the smoke ($1.13 of it in three analyses; $0.60 in the npm 0.119.0 controls, whose Bun
analysis request was billed and not recorded), then $0.26 for the dogfood run and $5.87 for the
benchmark.
init --yeswrites the same files as npm 0.119.0, anddoctor(the concurrent-sandboxes rowunset, at 100 and at
lots),doctor --study try-live,keys,study check try-liveandanalyze --helpprint the same apart from the cwd.runStudyfrom a Bun process (row 4): one participant on a static page with a declared analysis.On main under Bun 1.3.11 the participant ended
goal_satisfiedand the automatic analysis endedcomplete, withanalysis.jsonandreceipt.jsonwritten (expected $0.80, billed $0.20; 9cited evidence ids, all resolved). The same script under Node 24.12.0:
complete(expected$0.80, billed $0.25). On npm 0.119.0 under Bun:
unknown,AUTOMATIC_ANALYSIS_OUTCOME_UNKNOWN,only
start.json, no cost recorded, after an 80-second job.HUMANISH_E2B_MAX_CONCURRENT_SANDBOXES=100and 2-minute sessions (rows 1to 3): 2 readers passed and 18 participants asked to order on a page without an order form gave
up, on both versions; E2B listed the run's 20 sandboxes at once.
runprinted 96 stdout linesagainst npm 0.119.0's 144: the list was 18 lines against 47, the longest closing message 160
characters, and the screenshots warning 1 copy against 20. The default analysis was refused
before it started at the $3 cap and recorded
skippedwithAUTOMATIC_ANALYSIS_ADMISSION_REFUSEDon both. In headless Chrome the candidate's Observer showed the status row "Reported complete 2",
"Gave up 18"; pressing "Gave up" showed 18 cards and pressing it again 20; the Persona select
listed both personas. npm 0.119.0's Observer of its own run had neither.
initwrites it: reached the goal in 10 participant turns, input growing everyturn from 2,888 to 18,100 tokens, then 18,463 for the impressions request; cached input on each
turn from the second was the previous turn's input minus 3;
threadedon all 11 requests. $0.25run. Its automatic analysis, one request, was admitted at an expected $1.03 (
admittedCostUsd$1.13, worst case $2.01, cap $3) and billed $0.67, with 2 findings and 4 design findings whose 29
cited evidence ids all resolve. It gave 5 impressions (unclear, unclear, unfinished, liked,
liked).
verify,reviewandruns(text and--json) on copies of the six live runs: all 38 outputsbyte-identical on main and npm 0.119.0. A dry run of
analyze --runon npm 0.119.0'sunknownBun run is admitted on main at an expected $0.80.
reclaim --checkexited 0 withclean, andverifyexited 0 withlocal_only. Raw sandbox ids appear only insandbox-receipts.ndjson. E2B listed 0 taggedsandboxes before each batch, and after the smoke 1 tagged sandbox from none of its runs (the
dogfood ran then), and 0 after the benchmark. No key value from the store appears in any run
or kit file, as written, base64 or hex (11,386 files).
On the release branch:
pnpm release:checkon the release commit 1122987: exit 0 in 4.1 min, 515 test files passedand 10 skipped, 8,042 tests passed and 12 skipped; TUI 192 tests; lint 426 warnings at its cap of
426; api:proof "13 values and 31 types match"; public-surface scan of 3,068 text files and 527
binary assets;
npm pack --dry-run972 files with shasumee45f9f5e398f9b9327ff3deecfeb09f117b724e.
pnpm docs:generatethere wrote 0.120.0 into cli.mdx.On the benchmark commit bd5a7d2, the release head: exit 0 in 3.9 min, the same test, lint and
api:proof counts, a public-surface scan of 3,070 text files and 527 binary assets, and the same
npm pack --dry-runshasum, so the tarball the checks below used is the head's package.pnpm release:dogfoodon 1122987 (the script run with Node, keys read from the user store byNode's
--env-fileinto its environment, and a temporary HOME): "release:dogfood ok", verdictpassed(goal_satisfied), no-spend satisfied, $0.26. The participant raninit, the free dryrun,
verify(16 of 16,share_ready) andreviewon the installed 0.120.0, and did not start apaid live run.
verifyon a copy of the run:share_ready, 16 of 16;reclaim --checkclean.0.119.0's dogfood ended
blocked(blocked_approval) after the same steps.TMPDIR=/tmp,HUMANISH_SPECthetarball): 125 of 125 passed. Its 2 new rows cover
watch --dry-runof 16 and 40 participants(Count, filter and page the Observer grid and bound watch output at 100 participants #1744) and the analysis provider under Bun and Node with a fake fetch (Keep an analysis result when the agent teardown fails under Bun (#1752) #1753). The same script on
npm 0.119.0 passed 123 and failed the 2 new rows. A first pass failed row 117 on both versions
(124 and 123 of 125): it counted a warning repeated anywhere in
watch's stdout, andwatchprints the run's block and then the Observer's, each with the same two run-level warnings. The
row now checks the run's block, where 0.120.0 dedupes; both passes are in
post-publish/.release, on the release tarball from 1122987. On that tarball the consumer typechecks with 0
errors, as on npm 0.119.0, and needs no migration. The library steps are the same on both
versions, and of the 138 CLI lines from the 0.119.0 check, 136 are the same; the two that differ
are the dry runs of 17 and 24 participants, which now print "participants: 17 · 17 dry run,
nothing ran live" (row 1).
watch --dry-runof 16 participants prints the same 51 lines; of 40,61 lines against 99 (row 1). The package's analysis provider with a fake fetch under Bun returns
completedfor a 200 andprovider_http_errorfor a 500, where npm 0.119.0 throws theTypeErroron both; under Node both versions return the same (row 4).pnpm benchon 1122987 with its defaults (3 runs per arm,openai-computer-use,neutralmission), committed in bd5a7d2: report recall 12/15, analysis recall 11/15, 0 invented on either
arm, $5.87 estimated. 0.119.0 scored 10/15 and 10/15 at $6.12 (11/15 each read by hand). The bench
skipped the clean 3 analysis as
skipped_budget, since spend stood at $5.87 and that analysiscould have passed the $7 cap, so the analysis column covers 3 planted and 2 clean participants.
D1 and D5 account for the rise: all three planted reports name each, where two did on 0.119.0.
Read from the traces' click coordinates as Benchmark recall decline 0.114.0 to 0.118.0 is n=3 reach noise; same-hour A/B ties at 52/80 #1749 does, every planted participant committed its
first edit with Save (3 of 3 on both versions) and pressed Clear completed after checking a task
(3 of 3, against 2 of 3 on 0.119.0). The D1 rise follows that reach; D5 was reached 3 of 3 on both
and named 3 of 3 against 2 of 3. Planted 2's unresolved analysis finding "Edited task text
reverted after Save and filter changes" describes D5, so analysis recall read by hand is 12/15.
Three runs per arm cannot separate this rise from the noise Benchmark recall decline 0.114.0 to 0.118.0 is n=3 reach noise; same-hour A/B ties at 52/80 #1749 measured (52/80 planted-report
recall each for npm 0.114.0 and main d183d1a in one hour). The analysis cap was the dry run's
admittedCostUsd, $1.21, against bills of $0.64 to $0.93. No planted participant typed more than28 characters in one action, so none met D2. Every participant ran threaded, ended on its own and
gave 6 impressions.
Not verified
rows are offline dry runs, refusals, local runs and a fake fetch.
humanishCLI run under Bun, and a Bunanalysis of more than 16 participants: the smoke's Bun analysis sent one request, where the
adopter's 34-participant run sent cohort requests and a merge. The fix is in the per-request
teardown that every cohort and merge request runs.
terminal and scripted routes' warning dedupe on a live run.
--jsonofwatchandruncompared between versions on a live run; Count, filter and page the Observer grid and bound watch output at 100 participants #1744 says it is unchanged.analyze --runsent live on a run that 0.119.0 leftunknown; only its dry run was tried.🤖 Generated with Claude Code