Changelog
Nov 8, 2026 · 177 changes · page 3 of 5
coding.sh v0.1.2
coding.sh runs on Windows, and CI tests it there.
Harness A/B 16
-
#
Added Each run keeps the end of its verifier's output (the last 4096 characters of stdout and stderr, colour codes removed, redacted with
capture.redact), each repair round too.compareandeval runprint the last lines of failed runs under the report, and--jsonlists them infailedRuns. Verifier output. -
#
Added Harness bundles carry Claude Code plugins (hooks, skills, agents, commands, MCP servers: the whole plugin directory) with
harness snapshot --plugin <name|dir>orplugins = [...]in a harness TOML, andcompare A --with plugin:<name>runs "with the plugin vs without" in one command (--without plugin:<name>drops one). Each run loads the plugin with--plugin-dirfrom its own home; your Claude config is never changed. Evals, Does this plugin help me?. -
#
Added
compare --repair Nreports Seq@1..N+1 per arm: the share of tasks solved by the k-th attempt with verifier feedback, with intervals, where the gain lands (EGS, LGS), rounds that changed no file, and the agent's spend per solved run. With--k 2or more it adds a cost front of k attempts with feedback against k independent attempts (unbiased pass@k), and a note when the two arms rank one way on the first attempt and the other way after the rounds (Seq@K, arXiv 2610.37859). Evals. -
#
Added
compare --repair Ntells the agent "Verification failed." in its own session (Claude Code--resume,codex exec resume) after a failed verifier, up to N rounds, with the hidden tests out of its tree. The report adds the repair rate, mean rounds and the rounds' cost per arm.--repair-signal namesadds the failing test names from the verifier output; a round that edits, deletes or skips tests is not a repair;--false-alarm Ptells a seeded share of passing runs they failed;--repair-verdictdecides on the outcome after repair. Repair settings are part of the--reusekey (BOBA, arXiv 2611.02207). Evals. -
#
Added
compare --gateanswers "ship B or not":Ship it: B wins 9 tasks, loses 0,Hold: not enough evidence, orDon't ship: B breaks 3 tasks A solvedwith the broken tasks listed. It exits 0 only for "Ship it" (SAGE, arXiv 2609.36043).--by suite:gates each tagged suite too, and one broken suite blocks a pooled "Ship it". Each arm's failed runs are split by the agent's own last test run:A fails 12: own tests green 7 (58%), red 3, stale 1, none 1, where green fails are silent misses (BOBA, arXiv 2611.02207).compare --promotealso keeps a B that is cheaper at the same quality:pareto: support 0.93 ≥ 0.70 → promote (cost-cut: …)or→ hold, exit 0 only on promote (ParetoSaddler, arXiv 2611.02079). When B adds or removes one rule, skill or context file, the report adds a one-item gate scored only on tasks where the item reached the agent's context:item gate k=3 τ=.34 m=2: KEEP · …, or RECHECK, KILL, RERUN, and ACCEPT, REJECT, UNMEASURED for removals;--item-gatesets the exit code (Cortex, arXiv 2610.14216). CI checks the gate and the own-tests split on real Claude Code and Codex sessions against a stub model. The MCPharness_comparetool lists these A/B results and returns one with its gates and own-tests split. Compare agents. -
#
Added
coding.sh refine checkexits 1 on an AGENTS.md, rule or skill edit that deletes or rewords a protected safety line, or adds an exception that relaxes one (`protected-line: AGENTS.md:3 "Never rungit push --force." (auto)), since a pass-rate A/B can't see that harm (Masked Erosion, arXiv 2610.38392). A line is protected by a<!-- coding.sh:protect -->block, a[refine] protectregex, or automatically when one sentence pairs a gate word with a safety topic;refine protectedlists them.exp abruns the same check before any model call and fails--gateon it.--allow-protected-edit AGENTS.md:3` allows one on purpose. Evals guide. -
#
Added
comparelinks each tamper flag to the tool call that made the change and splits tampered passes by whether the agent said it was changing the test:tampered passes B 3: disclosed 2, stealth 1, then one line per pass with the run, file, tool, event id and the agent's words.--jsonaddstamperAttributionper run, and the MCPharness_comparetool atamperfield. Evals guide. -
#
Added After
eval audit,compareshows each audited arm's raw and audited pass rate,audited pass B 60% → 30% (3 refuted, coverage 100%).--auditedcounts refuted passes as fails and labels the verdictverdict (audited), with a note when the audit changes it. It needs every pass in both arms replayed, or the raw verdict stands with a coverage note.--jsonand the MCPharness_comparetool add the per-arm counts. Evals guide. -
#
Added
compareadds asurfacerow: the bytes of instruction text each bundle puts in front of the agent (AGENTS.md and the other instructions files, skills, rules, system-prompt files,~/ones too). When B's is more than 20% bigger, a note asks for a success CI above 0 rather than a tie, since those bytes cost tokens on every turn.--jsonhas the sizes per file inreport.surface. Compare agents. -
#
Changed The
harness changesblock of acomparereport collapses a file list longer than 20 lines into directories with file counts (+ .claude/skills/ (412 files)). Before, comparing a full~/.claudeagainst plain Claude Code printed one line per file, 1,500 of them.--jsonstill lists every path inreport.bundleDiff. Harness A/B. -
#
Fixed
harness snapshotfollows linked skill, command and agent directories (npx skills, a dotfiles repo) and stores the files they point to. Before, a~/.claude/skillsmade of links snapshotted no skills, so the arm ran without them. Harness A/B. -
#
Fixed
compareandeval runsay why a failed run's agent failed: its exit code or timeout and the last lines of its stderr, redacted, under the report and infailedRuns[].agent. Before, an agent that couldn't start (Claude Code refusing bypass permissions as root, a bad flag) failed every run in seconds with only the verifier's output shown. Verifier output. - # Fixed Two tasks from the same repo no longer error when they start at once: the first run of a repo set up its snapshot store while the second was reading it. Evals.
-
#
Fixed The tamper check no longer flags a run that only added new test cases to an existing test file, so a regression test written next to the fix keeps the task in the gate's evidence. Changed, removed or skipped tests, early returns, hooks, mocks and shadowing definitions still flag. The run lists those files in
tamper.addedTests. Evals. -
#
Fixed
compare --gateno longer says "Don't ship: B breaks a task A solved" when both arms passed it by editing tests. Tamper-flagged passes now count as fails for the gate in both arms, not only in B. Evals. -
#
Fixed
compareandeval crosscheckruns keep the agent's text from mid-turn: the run dir, which holds the agent's own transcript, was removed before it was ingested, so the session kept only the final reply.
Skills 1
-
#
Added
eval trigger <skill-dir>checks that the agent loads a skill when it should and not when it shouldn't. It runs theshouldandshould_notprompts intriggers.tomlk times each with the skill and its siblings installed, reads each load from the captured session, and reports precision, recall and F1 with Wilson intervals, the missed and flaky prompts, and near misses that went to the expected sibling.--descriptionor--candidateA/Bs a new description with a paired bootstrap CI and the prompts that flipped.--min-f1and--fail-on regressionset the exit code. CI checks it with real Claude Code and Codex against a stub model. Evaluate an Agent Skill.
Self-host 2
-
#
Added
docker run -p 4318:4318 -v coding-sh:/data ghcr.io/jackulau/coding.shstarts a team server with no configuration: with no keys set, the first start makes a read key and an ingest key, keeps them in the volume and prints them with the connect command. Each tagged release publishes the image for amd64 and arm64, starting with this one.deploy/compose/has SQLite, Postgres and ClickHouse stacks that need no edits. The viewer's sign-in page takes the read key in a form. serve waits up to 30 s for its database to accept connections. Self-host for a team. -
#
Added
coding.sh init --remote <url> --key csh_ik_…connects a machine to a team server in one command: it checks the key, installs capture hooks and adds theteamsink.--remote-mode fullalso sends prompts and output. Self-host for a team.
Replay 2
-
#
Added
coding.sh replay <session>and a Replay mode on the viewer's session page step through a session with the files the agent touched rebuilt as of each step: each step's diff, a file's content at that step, what a range of steps changed, and shell commands with exit code and output. Where content can't be rebuilt, it says which step and why. The viewer plays at 1×, 4× or 16× with a scrubber and?step=Nlinks; the MCPsession_replaytool returns the same. Explore. -
#
Added
exp replayandreplay --forkuseCLAUDE_CODE_OAUTH_TOKEN(fromclaude setup-token) for Anthropic calls whenANTHROPIC_API_KEYis not set. Log model calls.
Install 3
-
#
Added
init --proxypoints Claude Code (ANTHROPIC_BASE_URL) and Codex (acoding-shprovider) at the proxy and starts it; the hook restarts it when a session starts.uninstall --proxyundoes only that, anddoctorshows whether it runs. CI checks it with real Claude Code and Codex. Capture with the proxy. -
#
Added
init --proxykeeps a base URL the agent already used (a gateway or CLIProxyAPI in Claude Code'sANTHROPIC_BASE_URL, your own Codex provider,openai_base_urlorOPENAI_BASE_URL) as the proxy's upstream and chains through it, instead of asking for--force.uninstall --proxyputs the old value back. Already using a gateway or CLIProxyAPI? -
#
Added Windows: run the installer from Git Bash. Hook commands use
C:/…paths that cmd.exe, PowerShell and Git Bash all run. CI runs the tests and the installer on Windows. Install guide.
Serve 1
From CHANGELOG.md · RSS · All releases