Sessions 5
-
#
Added A new flag,
unapproved-action, marks a session where the agent ran a destructive or paid command after a user turn that did not approve it:rm -rfoutside temp and build dirs,git reset --hardorgit push --force, dropping a database, a tool's own--yeson a repair, reinit, migrate, delete or purge subcommand, deleting a data dir, or a known paid cloud or batch job. Asked only to "fix it", agents run the--yestheir tool's error names.stats.unapprovedActionscounts them, and--where unapproved>0lists the sessions. Flags. -
#
Fixed A session coding.sh fails to fold into stats no longer leaves the sessions after it with events but no row, invisible to
sessions, the viewer and stats. The import used to stop at the first such session and, for Codex history read on every command, stop at it again each time; one 0.1.4 store had 906 Codex sessions like that. The session now gets a row taggedfold:error, with the error instats.foldError, and the import goes on.coding.sh ingestfolds sessions that have events but no row, and fold:error ones, again, andcoding.sh doctorcounts both. Flags, Session stats. -
#
Fixed A shell command named like a built-in object key (
constructor,toString) no longer stops a session from being folded withPAID[tool]?.test is not a function. Flags. -
#
Fixed
sessions,showand the viewer no longer crash withCannot read properties of undefined (reading 'briefs')after another build of coding.sh worked out the same store. Each session's saved progress and the store's refold mark now carry the fold version and a hash of the progress's shape, so a store last folded by another build is folded again once. Saved progress with a missing part, or that fails to fold, is dropped and the session is worked out again from its events. Troubleshooting. -
#
Fixed
sessions --where id:<id>andexport --where id:<id>find a subagent's session, such as a Claude Code workflow agent's, asshow <id>does. Both commands leave out subagents unless you pass--subagents, and that default hid every session the query named. A query withid:,parent:,is:rootoris:childnow decides that itself, so--where is:childlists subagents too. Query and export.
Refine 2
-
#
Changed
refine test|run --suitekeeps a candidate whose pass rate is significantly better even when a listed objective such as cost got significantly worse, as long as the rise is within--max-cost-rise(default 50%, orrefine.maxCostRisein config). It used to reject +27 to +67 pt gains because each run cost a few cents more. The verdict prints the trade, such as+33.3 pts per task … for cost / run +20% … (limit +50%), and a rise past the limit still rejects. The gain must still pass the exact permutation test. Climbing on an eval suite. -
#
Fixed
refineandexp abcarry a skill's whole folder into each trial: itsscripts/,references/and other files as well as its SKILL.md, so a skill that runs a helper script is tested with it. Files over 1 MB or with binary content stay out, and the protected-line and duplicate checks still read only the instruction files. Refine loop.
CLI 1
-
#
Changed An error whose next step deletes or overwrites data, cannot be undone, or spends money now says the user must approve it first, and its
--jsonline hasaskUser: true. That covers the--yesa confirmation asks for (init,uninstall,eval run,compare,refine,workflows run), the tool-eval cost gate, and the--force,purgeandrollbacksteps that errors suggest. The text no longer says "Did you mean" before a--yescommand. Asked only to "fix it", agents ran the--yesan error named without asking. Output and exit codes.
Store 2
-
#
Changed A blob that compresses to under 4 KiB, such as a hook line's raw payload, is a row of one SQLite file,
blobs/pack.db, instead of a file of its own; larger blobs stay files. On the 100k-event ingest benchmark the store takes 1.72 MB per 1,000 events instead of 5.51, and ingest runs at about 6,200 events/s instead of 1,700. Blob files written before still read, andgc --compactmoves the small ones into the pack and removes the blob folders that leaves empty. A coding.sh older than 0.1.5 does not see packed blobs: its CLI reads sessions as usual, and its viewer shows their stored content as "not in the local store". Runpurgewith 0.1.5 or newer: an older purge leaves secrets in packed blobs, and they show again once you upgrade. Running the same purge again with 0.1.5 removes them, since it reads every packed blob. Storage, Store ingest. -
#
Fixed A coding.sh that doesn't own the store no longer migrates it and strands the install your hooks run. The owner is the CLI
~/.coding.sh/bin/cli-pathnames (initandupdatewrite it); any other install stops before a migration, names both versions, and leaves the store as it was until you run the newcoding.sh upgrade-store, which also points the hooks at it. Upgrades in place andcoding.sh updatemigrate as before. coding.sh run from a source checkout also no longer opens~/.coding.shunlessCODING_SH_HOME,--storeorCODING_SH_DEV_REAL_STORE=1says to. On 2026-11-08 a build from source migrated a real store to index schema v9, and the installed 0.1.2 could not open it for 10 hours. Troubleshooting.
Evals 2
-
#
Fixed An agent that is not logged in, or a setup step that fails, no longer counts as a task failure. A refused login (
Not logged in,Invalid API key · Please run /login, an HTTP 401) is never retried, and a setup step that exited non-zero or a work folder that could not be made is retried once; either way the trial is infra-unknown and left out of pass rates incompare,exp compare,refine --suite,eval runandtoolevals, which count it by kind. A run stops once 5 trials in a row fail on infrastructure (--stop-after-infra) and says it is no quality verdict, a comparison left with no pair isvoid:, and a refine round lost this way writes no verdict and stops the climb. An expired login had read as "quality held". Long runs. -
#
Fixed A few cases, tasks or prompts that all move the same way no longer pass a gate on their own. The bootstrap interval is then a single point, and the support share is 1, however few they are.
exp compare(with--marginand--pairwise),eval trigger --fail-on regression,toolevals comparemetric regressions,compare --promoteand refine's efficiency keeps now also need an exact sign-flip test to agree, over clusters when there is a cluster key. A verdict changes only when fewer than about 6 units carry the difference: 3 improved cases readinconclusiveinstead ofbetter(exact p 0.25), and one improved task no longer promotes. With one trial per case the test's p is the McNemar p, so larger comparisons keep their verdicts. JSON output gainssignFlip,porexactfields. Audit, Paired comparison.
Privacy 2
-
#
Fixed
purgeno longer reports success while another process (the viewer,serve, asqlite3shell, a backup) holds a read on the index or the blob pack. SQLite keeps the old bytes in that file or its WAL until the reader closes, and purge used to ignore the busy checkpoint that says so. It now waits a few seconds, then names the file that still holds them and exits 1; the same purge run again once the reader closes removes them. Privacy. -
#
Fixed
coding.sh purgeno longer reportsIntegrity check failedand exits 1 after every purge. The check asked SQLite's full-text search to find an entry for every event, but events with no text, such as a session start or a model call, are never indexed. It now checks that the index is sound and holds exactly the events with text. Search was not affected. Privacy.
Workflows 1
-
#
Fixed A Claude Code workflow run that is still going is named by its script's
meta.name, read from the copy of the script Claude Code keeps in the session'sworkflows/scripts/folder, instead of by itswf_…id. Claude Code writes the record, which held the only name coding.sh read, when the run ends.workflows importreads runs it stored before this fix again once. Workflows.
Capture 1
-
#
Fixed The hook no longer reads
.giton session-start and prompt events, which made each of those hook calls about 3.5 ms slower than in 0.1.2 in a repo with a 1 MBpacked-refs. Ingest takes a hook session's start commit from the reflog again, and still uses the HEAD a 0.1.3 or 0.1.4 hook recorded.CODING_SH_NO_GIT_HEADhas nothing left to turn off. Architecture.
Cost 1
-
#
Fixed A Claude Code fork subagent (
subagent_type: "fork") no longer counts the parent's model calls again. Its transcript opens with a copy of the parent's context, and each copied call was stored twice: 2,593 calls and $161 too many across 52 forks on one machine. The fork now holds only its own calls, its turn opens with the directive, andstats.inheritedTokenssays how much context it started with. Stored sessions are parsed again. Subagents.
Harness A/B 2
-
#
Fixed
comparecounts cache reads and writes intokens / run. With prompt caching the row tracked output tokens only, so a harness that cost 40% more could read as 11% more tokens. Harness A/B. -
#
Fixed
compareleaves outtime to first derailwhen no run in either arm derailed, where it only repeated the session length. Derails.
From CHANGELOG.md · RSS · All releases