Repository navigation
coding.sh 0.1.2
coding.sh runs on Windows, and CI tests it there.
Added
- Sessions. A new
text-tool-callflag marks a session whose model wrote a tool call out as text, so the call never ran. In Claude Code this is usually a subagent whosetools:frontmatter is a map (edit: false), which leaves it with no tools;improvenames the fix. Concepts. - Sessions. A session whose main thread moved to another model mid-session, such as Claude Code's silent fallback to an older model after a refusal, gets the
model:switchtag andstats.modelSwitchwith both models, when, and the trigger (refusal,erroror/model).stats.modelscounts calls per model (both show in a Models row inshowand the MCP digest), a refused call adds therefusalflag, and a session's model is now the one most of its main-thread calls ran on instead of the last one seen. Helper models (Haiku titles) and subagents are not a switch. Read API. - Evals.
eval validatetakes several tasks, or--tag <tag>for every task with that tag (suite:<name>for a suite), prints one line per task and exits 1 if any did not validate. Evals. - Evals.
eval init --sessions --repo <DIR|all>drafts tasks from sessions in another checkout or worktree of the project, not only the current one. Evals. - Docs. Use-case pages for tracking Claude Code and Codex cost, replaying a session, testing a CLAUDE.md, AGENTS.md or skill change, building evals from failures, self-hosting, and logging model calls through the proxy. Comparison pages for Langfuse, LangSmith, Braintrust, AgentOps, Laminar and ccusage, each with a feature table, where the other tool is the better choice, and its sources. Compare.
- Site. Every docs page has its own link preview image, the home page and FAQ carry FAQ markup, and the site build fails on a missing or too-long title or description, a wrong canonical URL, or a link to a page that doesn't exist.
- Evals.
eval validatechecks verifiers that grade the agent's answer or trace: a task dir'sreference/(output.md,stdout.jsonl) is a correct run that must pass, andnear-misses/<label>/hold wrong runs that must fail. The verifier reads them throughCODING_SH_AGENT_OUTPUT,CODING_SH_AGENT_STDOUTandCODING_SH_AGENT_DIFF, as in a real run. Evals. - Evals. A hand-written task can start from a commit with
"start": {"commit": "<sha or ref>", "repo": "<path>"}intask.json, so a suite can live in the repo it tests. Evals. - Capture.
coding.sh initimports the sessions each agent already keeps on this machine, so the viewer the installer opens shows your own history. It shows progress, stops after 8 seconds and imports the rest in the background; the viewer says "Importing past sessions…" until it is done.--no-importskips it. An empty viewer shows the import command,coding.sh ingest --backfill, and what each imported session shows. What init changes. - Examples.
examples/plugin-abA/B tests a Claude Code plugin against plain Claude Code on ten small tasks in a container, withcoding.sh compare: pass rate, tokens, cost split by token type, wall time, reply length and a blind clarity judge, paired by task with bootstrap intervals. It takes any plugin directory and ships a small demo plugin. The example. - Improve.
coding.sh improvelists what goes wrong most in this repo's sessions (failure flags, and any command failing the same way in two or more sessions), each with an example session, the CLAUDE.md or AGENTS.md line that fixes it and the next commands.improve fix Nadds the line, uncommitted.improve checkcompares the sessions before and after each committed CLAUDE.md, AGENTS.md, rule or skill change, with how often the agent follows each new line, says Helped, Regressed, No clear change or Too early, and exits 1 on a regression;--watchre-checks as sessions arrive. No API key needed. Improve your agent every week. - MCP.
improveandharness_changestools, andimproveanddid-it-helpprompts, run the same loop from inside your agent: what to fix first, and whether a CLAUDE.md change helped, without a shell. Improve your agent every week. - Harness.
coding.sh harness auditlists each memory and instruction file (Claude auto-memory, CLAUDE.md, AGENTS.md, rules, skills) with the sessions that loaded it, read it and wrote it, its size and its load cost in tokens, and flags files never read, written but never read back, and skills listed but never used.--agent,--since(default 30d) and--json. Memory and instruction files. - Sessions. Text that Claude Code hooks add to the context (a plugin's SessionStart notes, a UserPromptSubmit reminder, PostToolUse additionalContext) is stored as
hook.contextevents with its hook event, source and size.stats.hookContextcounts the tokens by source, each source tags the session (hook:plugin:caveman,hook:settings),sessions --where hook:plugin:<name>orhook.tokens>500filters on it,--facets hookcounts sessions per source, andshowlists it. Concepts. - Sessions. Headless sessions (
claude -p, an Agent SDK,codex exec) are markedstats.launch: "headless", and terminal or IDE sessions"interactive", from Claude Code's entrypoint and Codex's originator.sessions --where launch:headlessfilters on it and--facets launchcounts it. Concepts. - Improve.
improve checklists, under each change, the sessions still flagged after it with their flags and start time (five, or all with--sessions; every flagged session before and after in--json), and the MCPharness_changestool returns them asafter.flaggedSessions, so your agent can answer "which sessions still failed after it?". Did it help? - Sessions.
showhas aFlagsrow, andsessionsends with how many listed sessions are flagged and a pointer tocoding.sh improve. - Evals.
coding.sh eval initwrites an eval suite toevals/<name>/from failed or flagged sessions in the repo (--sessions,--session latest), a skill's should and should-not prompts (--skill), or cases for an app (--cases,--describewith--commandor--url).--drafthas a model write the prompts or cases, marked draft. It picks a code grader when it can and a judge to calibrate when it can't, marks the suite capability or regression, and ends with the run command and, for cases and skills, a GitHub Actions workflow. On a terminal with no flags it asks. Your first eval in 5 minutes. - Evals.
coding.sh eval run [suite…]runs suites k times per task and reports pass@k, pass^k, flaky tasks, the session of each failed trial, small suites and saturation. A regression suite exits 1 when a task fails most of its trials or nothing could be graded; a capability suite never fails on its score. The report. - MCP. An
eval_inittool lets your agent build an eval suite for you, with the same sources aseval init; it writes files only withconfirm: true. MCP server. - Evals.
eval importwarns when a verifier names atests/path but the hidden files land at the work-tree root (tests/check.jsis copied tocheck.js). Such a verifier finds no file, or runs zero tests and passes. Evals. - Judges. LLM graders take
"provider": "claude-code", which grades throughclaude -pon a Claude subscription (CLAUDE_CODE_OAUTH_TOKENfromclaude setup-token) instead of an API key. The judge runs with no tools, setting sources, plugins, MCP servers or saved session, so the hooks of the arm under test never reach it. Evaluate an Agent Skill. - Stores. The Postgres and ClickHouse store plugins answer
--wherein the database, with every value bound: session and event keys,has:,is:, bare words,sort:and--facets, forsessions,usage,export, the viewer API and MCP.sessions --whereand facets no longer stop at the newest 20,000 sessions there, and event keys and bare words no longer fail withunsupported_store. Query language. - Harness A/B. 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. - Harness A/B. 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?. - Harness A/B.
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. - Harness A/B.
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. - Skills.
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. - Examples. The skill eval tests an edit to the skill:
run.sh <out-dir> --candidate <skill-dir>runs the pinned skill as arm A and the edited copy as arm B, graded the same way, with the--promoteline in the report.TASKS="01 06"runs some of the tasks. Skill eval example. - Self-host.
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. - Self-host.
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.
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. - Capture.
coding.sh proxyis a local pass-through for the Anthropic and OpenAI APIs. Each model call is logged with its redacted request (system prompt, tool definitions, messages) and response, usage with cache reads and writes, status, time to first byte and token, and rate limits, inside the Claude Code or Codex session its hooks capture. Auth headers are forwarded and never stored. It adds 0.34 ms per streamed chunk and 1.96 ms to first byte (CI fails over 2 ms and 5 ms). Capture with the proxy. - Install.
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. - Install.
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? - Capture. Proxy calls record reasoning effort (including Anthropic's
output_config.effort), service tier and speed from the request when the response has none, andcompaction: trueon calls that compacted the conversation, including Codex's/responses/compact, which is now logged. What is stored - Capture. The proxy stores a call's messages in content-addressed blocks shared with the session's earlier calls, instead of the whole conversation again on every call, and reads the body back exactly. A synthetic 500-call session took 5× fewer bytes (828 KiB instead of 4,116 KiB); reading a call back takes about 10 ms. Works on SQLite, Postgres and ClickHouse stores; calls stored whole still read, and
gcandpurgefollow the blocks. What is stored - Capture. Proxy calls from a Claude Code subagent land in the subagent's own session instead of the parent's. Calls record the parent session, Claude Code's agent id and Codex's parent thread, fork and subagent kind when the client sends them, the account as a 16-character hash (the account id is not stored, in the event or the request body), and behind CLIProxyAPI the credential index it used. A session seen only through the proxy links to its parent. What is stored
- Serve.
coding.sh servemounts the proxy at/proxy/: send an ingest key inx-coding-sh-keyand the agent's own API key goes upstream unchanged. REST API. - Sessions.
show <session>#n(or a call id) prints one model call's system prompt, tools, settings, cache use and cost, anddiff-callscompares two calls in prompt-cache order and names what broke the cache. The viewer shows both on a proxy call. Capture with the proxy. - Sessions.
replay <session> --step N --forksends the model call behind step N again with a changed CLAUDE.md, AGENTS.md, rule, skill, system prompt or model (--with,--harness,--model,--system,-k) and prints the recorded next action beside the forked one.--runcarries on with Claude Code in a copy of the repo, the stored history spliced into its requests, and--verifyruns a check there. It needs a session captured through the proxy. The viewer's Replay pane has a "Fork from here" tab, and the MCPsession_replaytool takesfork. Explore sessions. - Evals.
replay --fork --save-case <suite>keeps the step as a case inevals/<suite>: arequesttask that sends the stored request with the project's current context files, graded by anext-actiongrader that fails when the model repeats the recorded action.eval runruns it like any suite. Evals. - Replay.
exp replayandreplay --forkuseCLAUDE_CODE_OAUTH_TOKEN(fromclaude setup-token) for Anthropic calls whenANTHROPIC_API_KEYis not set. Log model calls. - Experiments.
exp replay <call> --vary model=a,b --vary system=@file.md --n 5resends a logged model call with your own API key, grades whether each reply takes the agent's first action (or with a judge), and reports the paired comparison ofexp compare.--dry-runprints the cost estimate. Experiments. - Install. 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. - Capture. CI runs real OpenCode, Pi, Goose, Factory Droid, GitHub Copilot CLI and Aider sessions on Linux and Windows against a stub model, checks the recorded prompt, tool call, file change, model and reply, and checks that
ingest --backfilladds no duplicates. Install guide. - Gateways. OpenRouter, LiteLLM, Cloudflare AI Gateway, Portkey, Helicone and Ramp Router (router.com) join Vercel: sessions get a
gateway:<name>tag,gateway enrichfetches billed cost where the gateway has a lookup API,gateway statusshows one row per gateway, andcompare --gateway <name>routes runs through it. AI gateways. - SDKs. The TypeScript and Python SDKs detect all twelve gateways, not only Vercel: by base URL, a self-hosted gateway's URL env var, a response header (
cf-aig-log-id,helicone-id,x-litellm-call-id,x-portkey-trace-id, …) or the response id. Each model call records the gateway and its request id, so SDK sessions get thegateway:<name>tag andgateway enrichcan fetch their billed cost. The SDK tables are generated from the server's gateway list. AI gateways. - Experiments.
comparerecords the agent release each run started on (agentVersion, checked at most once a minute, so an auto-update mid-run shows). When the arms ran on different releases, the report addsagent claude-code 2.1.316 ×12 2.1.319 ×12 release differsand a note that the delta mixes the change with the release,--gaterepeats it, and--promoteholds withrelease_confound.--jsoncarriesreport.agentVersions(arXiv 2610.37332). Evals guide. - Experiments.
exp compareandcomparegive the exact McNemar power next to the normal MDE:power MDE 15.6pp · no 80% power at this n (exact McNemar ceiling 62%)or· exact MDE 10.6pp. The exact test needs 6 flipped cases to reject at α 0.05, so a small suite can have no 80% power for any gap; ano-powerwarning says so, and--jsoncarriespower.exact(arXiv 2610.04433). Experiments. - Experiments.
exp run --series NAMEtags each round of an iteration loop and prints whether to stop.exp plateauruns a restart e-detector over the series and names the version to ship. It exits 3 to stop, 0 to continue and 2 with too few experiments (Yin et al., arXiv 2610.04756). Experiments. - Experiments.
exp metricsA/Bs two commands that print numbers (ms, bytes) in interleaved pairs, with a 95% paired bootstrap CI and a sign test per metric.--fail-on-worseexits 1 for CI. Experiments. - Experiments.
comparenotes the runs whose model calls another model answered: after a refusal Claude Code retries on an older model, so a run can measure a model its arm did not ask for. The note counts those runs per arm and names the model;--jsoncarriesreport.modelMix. Evals guide. - Capture. Sessions stored before an adapter's parsing changed are re-parsed from their transcripts and spool in the background, so this release's dedupe fixes reach data already captured.
coding.sh ingest --rebuilddoes it now. Troubleshooting. - Harness A/B.
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. - Experiments.
exp compare --gategives the same ship-or-hold answer per case and exits 1 unless it is "Ship it".exp sweepends withadopt <winner>orkeep <start>and the reason. The MCPexperiment_comparetool returns the gate too. With 2+ trials,exp comparealso lists the cases B gained and lost (passed in any trial), counts cases that got more or less reliable, and warns when the two halves of the trials disagree;--matrixprints the success counts (EvoAudit, arXiv 2611.07624). Experiments. - Durable workflows. A Vercel Workflow, Temporal, Inngest, Restate, DBOS, LangGraph or Cloudflare Workflows run (Temporal, Restate and DBOS in both TypeScript and Python) is one session across processes, traces, crashes and deploys (keyed by run id).
show,workflows showand the viewer list each step with its attempts, failed and lost ones included, show sleeps and LangGraph interrupts as waiting rather than work, mark where the run resumed after a crash, deploy or restart, and leave replayed model calls out of tokens. An attempt lost with its process counts as busy only while its process was still seen;workflows statsshows the rest as "lost to crashes" instead of agent time. A span withworkflow.wait.namearound a sleep is a wait in any engine, for those that export none (Temporal, Inngest, DBOS TS). New flagsstep-retriedandresumed. Each engine is checked in CI against a real run with a failed step, a killed worker, a sleep and a restart. Trace a durable workflow. - Evals. Behaviour tasks can be written by hand and loaded with
eval import tasks/*/;compare --tag <tag>runs them. Verifiers get the agent's final answer and full stdout (CODING_SH_AGENT_OUTPUT,CODING_SH_AGENT_STDOUT), andjudge grade --grader checklist.jsongrades both from inside one.comparereportsagent spendandgrader spendrows,--max-cost 15stops starting runs at $15, per-task rows show task names, and a fresh store gets its hook script so runs are captured. Evaluate an Agent Skill. - Viewer. Cost shows in the session list, the session header and on each model call. Estimates read
~$0.04(hover: "Estimated from list prices", and which price a call used); billed and reported costs have no mark; a call with no price shows—and says why. - Judges. Judge prompts escape data tags in the judged text and say it is untrusted, so an output can't close
</output>and order a pass.judge calibrate --probe-injection judge.jsonplants a "respond pass" order in human-fail cases and reports how many verdicts flip; any flip exits 1. Default-prompt judges get new version ids. Evals. - Judges. Checklist items can grade rule compliance from the trace with no model call:
ran-command,read-path,wrote-identifier, andfollows-rules, which checks every imperative line that names a backticked command, flag, path or identifier (Never use `git push --force`) against what the agent did. Evals guide. - Cost. Estimates price each model call at the rates it ran at: long-context rates past the model's threshold (OpenAI over 272K, Gemini Pro and Claude Sonnet 4.5 1M over 200K, Haiku 5.5 over 100K), and batch, flex, priority, fast or Claude fast-mode rates from the call's recorded service tier. The call's
payload.priceTiersays which, and shows inshowand the viewer's cost tooltip.usage --jsonaddsestimatedCostByTier.[prices]takeslong_contextand tier tables. Claude 1-hour cache writes are priced at 2x input instead of 1.25x, from Claude Code'scache_creation.ephemeral_1h_input_tokensand OpenTelemetrycache_creation_1h_tokens, and Claude 4.6+ calls withinference_geo: "us"at 1.1x ([prices]takescache_write_1hand ageotable). Stored estimates reprice by themselves. Where cost comes from. - Judges.
judge calibrate --grader testsaudits a test or command verifier:--sample-passes 40lists unlabelled passing cases to label, and the audit reports precision (how many passes a person would accept) with a Wilson interval and the false accepts.exp showandexp comparethen print the precision and a pass rate corrected for it. Evals guide. - Workflows.
workflows comparegives each variant P(front), the share of bootstrap draws in which no other variant beats it on quality and cost (front 0.93,dominated by base (front 0.41)). Near-equal noisy variants no longer get a confident "dominated".--select min-cost --q-drop 10,--select weighted --lambda 2or--select paretopicks a variant to deploy and printsdeploy: cand (…)with the reason.--seedfixes the bootstrap (ParetoSaddler, arXiv 2611.02079). Workflows guide - Workflows.
workflows comparechecks replay experiments for a control fork. When the candidate resumes from recorded runs (resumeFromRunId) and no baseline run resumes from the same ones, it notes "no control fork", since the difference would mix the edit with the replay itself. With a control, it reports how often the control's outcome changed from its source run as the replay noise floor (control.driftin--json). Workflows guide. - Production.
coding.sh-store-clickhouseruns serve, the CLI and MCP on ClickHouse:--store 'clickhouse://user:pass@host:8123/db'(clickhouses://for TLS). It has no runtime dependencies and passes the store conformance suite; blobs stay onfile://or S3. The same page shows how to send sessions to an OpenTelemetry Collector that writes to ClickHouse, with SQL for cost, slow tools and failed sessions. Self-host for a team. - Evals.
eval validateflags hidden tests that name a helper or file only the reference adds and the instruction never mentions, which fail valid fixes written differently (--strict-couplingmakes it blocking).eval crosscheck <task>has a reviewer model judge stored runs' diffs against the instruction and lists the runs where it disagrees with the verifier, as false rejects or false accepts.--solver <bundle>solves the task once first. The counts are stored on the task in the same shape as a human verifier audit. Evals guide - Experiments. Long runs survive interruptions.
exp run,exp aa,exp sweep,compare,bench runandworkflows runsave each trial as it finishes, and--resume [<id>]re-runs only the unfinished ones, with the same seed, order and--stop-earlydecision as an uninterrupted run. A changed config refuses to resume and names what changed. The first Ctrl-C lets trials in flight finish. Rate limits, 5xx and network errors are retried with backoff (--retries, default 3), task failures never are.--trial-timeoutcaps a trial, andexp statusshows progress, ETA and cost so far. Evals guide. - Judges.
follows-rulesreads rule-file frontmatter: a Claude Code rule withpaths:, a Cursor rule withglobs:(or neither glob noralwaysApply), or a Copilot rule withapplyTo:is graded only after the agent touches a matching file or opens the rule. Before that the agent never saw it, so it no longer counts as skipped. Evals guide - Experiments.
coding.sh exp abtests a CLAUDE.md, AGENTS.md, rule or skill edit on your own recent sessions, with no eval tasks to write. It finds the moments your agent went wrong (said done without running anything, stopped with tests failing, retried a failed command unchanged), replays the next turn there with your committed files and with your edit, and has a judge score both. It prints the fixed and broken cases, the same ship gate ascompare --gate, and the replay noise floor from the control arm.--dry-runshows the cost first,--max-costcaps it, reruns are free from the cache, and--watchreruns on every save. CI runs it on real Claude Code sessions against a stub model. Test a CLAUDE.md change in five minutes. - Experiments. The pieces under
exp abwork on their own: acontinuationtask replays a frozen session's next turn with given context files, and a decision-point miner turns sessions into a dataset of those moments, each with its own rubric. A continuation experiment needs a control arm: run it as an A/B, or pass--no-controland get a warning that there is no noise floor to read the difference against. Evals guide. - Refine.
coding.sh refine propose|test|apply|rollback|log|runimproves CLAUDE.md, AGENTS.md, rules and skills in tested rounds.proposeasks a model for lines that address your sessions' most severe flags, with protected lines marked READ-ONLY.testchecks a candidate before any model call (protected lines, harmful or duplicate added lines), A/Bs it against your current files on the decision pointsexp abmines, and rejects it when it forgets what an earlier kept edit won (guard: forgets kept edit r_…).applywrites a kept edit with a backup,rollbackrestores it byte for byte, andloglists every round with its verdict, effect CI, guard result and reason.runloops until--rounds,--max-costor the plateau detector says stop. Evals guide. - Refine.
coding.sh refine score labels.jsonl --pred FILEscores diagnoses against hand labels by code: occurrence, Signal and session precision, recall and F1, Signal coverage, recall per taxonomy family and, with 2+--predfiles, repeat agreement, each with its counts. Matching is maximum one-to-one on session, component and top-3 type ids. Without--predit measures the precision of each session flag (Signals, arXiv 2611.04507). Evals guide. - Refine.
refine test|run --suite <name>judges a harness edit on an eval suite of repo tasks, k trials per arm, and can make the harness cheaper and faster, not only better:--objective cost,wallkeeps an edit whose pass rate holds within--margin(2pp by default) and whose cost, tokens, wall time, LLM time, turns or size drop significantly, and never keeps one that loses quality beyond the margin. With a cost or time objective the proposer cuts, shown what made the runs slow or expensive;--proposer-command 'claude -p'writes the edit with a command.--until-plateauclimbs until the e-detector says it stopped gaining,--resumecontinues an interrupted round, a skill directory can be the--target, andrefine logshows each climb's rounds and Pareto front. Evals guide. - Harness A/B.
coding.sh refine checkexits 1 on a CLAUDE.md, 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 run `git 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:3allows one on purpose. Evals guide. - Docs. A Workflow experiments page: capture and score multi-agent runs,
workflows compare, replays, the control fork and the replay noise floor. Workflow experiments - Long sessions. A session that runs for hours or days reads as one timeline split into phases: the start, each
claude --resume, each compaction and each long idle gap.showlists the phases with day lines,show --alllists every event, andshow --followprints new events while a session runs. Derails mark where a run went off the rails:looping,failure-streak,churn,no-progress,stalledandcontext-thrash, each with the event and time it started. They show inshow, on the viewer timeline (with ‹ › to step through them), insessions --flag <name>, and in the MCPsessions_listandsession_gettools.comparereports derails and time to first derail per run, and aprogressgrader scores time on track forexp compare. The viewer loads a 40,000-event session in the background and scrolls it smoothly, and MCPsession_getwithtailreads a long session's latest events. Live hook ingest updates a long session from its new events only: 0.46 s per update on a 30,000-event session, down from 1.16 s. Long sessions. - Experiments.
exp compare --margin 0.03checks that B is at most 3pp worse than A (paired non-inferiority on the 95% interval's lower bound) and exits 1 otherwise:non-inf B − A ≥ -3.0pp: yes (95% CI lower bound -1.2pp > -3.0pp). It lists cases A passed on every trial that B now mostly fails. Experiments. - Tool evals. A
callscheck: tools the trial must call (must), must not call (mustNot), at mostmaxcalls, and anorder, with partial argument matches (~textsubstrings,<=Nbounds, dotted paths). It reads the trial's tap; the MCP tap now keeps each call's arguments, redacted.exp runtakes the same fields as acallsgrader over the task's trace. Tool evals. - Experiments.
exp runandtoolevals runtake--samples adaptive: 2 trials per case, a 3rd when they disagree, and a case fails at half or more failing; the report gives case verdicts and no CI.--stop-on-regression --baseline <experiment>stops the run and exits 1 once a case that passed every baseline trial fails. Gating runs. - Tool evals.
toolevals compareprintsp (perm)beside McNemar: a task-paired permutation test on the per-task differences, exact over all sign flips up to 20 tasks and seeded Monte Carlo above. It holds its level at the 5-11 tasks a suite often has, where bootstrap intervals are too narrow (AT-AT, arXiv 2610.34679).--jsoncarriesreport.permutation; verdicts are unchanged. Tool evals. - Judges.
judge calibrateprints the judge's discrimination gap and label efficiency η, and warns when auditing outputs directly would need fewer human labels:label efficiency η 0.21 · auditing outputs directly needs ~4.8x fewer human labels for the same precision.--judge-cost 0.001adds the human label cost above which the judge pays off. The calibration state is unchanged;--jsoncarriescalibration.efficiency(Choi et al., arXiv 2610.35698). Evals. - Judges.
exp compare --pairwiseand judge graders inexp compareprint how often a resample of the cases picks the same winner, and n*, the smallest size where that holds 95% of the time:stable B better in 97% of resamples (n*=50)orunstable B better in 61% of resamples (n* censored). An uncalibrated judge that never settles warns "pick or calibrate the judge before collecting more verdicts" (arXiv 2611.04090).--jsoncarriesstability. Evals. - Judges.
judge sample <exp> --budget 60 --out plan.jsonsays which cases to label next: a seeded random sample stratified by the judge's verdict and confidence, with labels in proportion to stratum size, so the labels don't favour the doubtful cases.judge calibrate --plan plan.jsonthen prints the human-audited pass rate:human-audited pass rate 0.71 [0.63, 0.79] (42/50 of plan labelled; worst case ±0.09)(Choi et al., arXiv 2610.35698). Evals guide. - Site. Pages are ready about 0.5 s sooner on a slow phone, with half the font bytes and less layout shift. A Lighthouse A/B with budgets runs on every site change. Site speed.
- Site. A blog at /blog: posts are Markdown files in
apps/site/src/content/blog, each with its own page, title card and sitemap entry, and an Atom feed at /blog.xml. The first post explains why coding.sh keeps your sessions on your machine. Blog. - Capture. Claude Code Bash commands that edit files (
sed -i, a heredoc write,tee) record afile.changeper file with its diff, taken from Claude Code's own edit diff, even when the command then failed. A nested CLAUDE.md or skills folder loaded mid-session, a Skill call's skill folder and the skills restored after/compactbecomeharness.loadedevents and show inshowand the viewer timeline. Stored Claude Code sessions are re-parsed to pick them up. CI checks both on a real Claude Code 2.1.319 session. Adapters. - Sessions. Each skill a session used, through the Skill tool or by reading or running a file in its folder, adds a
skill:<name>tag, sosessions --flag skill:pdffinds those sessions.showlists them asSkills pdf (project, invoked, first, before any edit) · pdf-tools (personal, read), andshow --jsonand MCPsession_getreturnskills. A newskill-copy-conflictflag marks a session that used two copies of one skill (arXiv 2610.11647). Concepts. - Cost. Two kinds of waste per session. Re-fetches are read-only calls (Read, Grep,
cat,git diff, …) that returned the same result as an earlier call in the same context; three or more add theduplicate-fetchflag (arXiv 2611.07238). Cache breaks are model calls that found the prompt cache gone and paid for the prompt again, by cause (compaction, model switch, idle, other), priced as cache write minus cache read (arXiv 2610.35496).showprintsCache breaks 2: 31k prompt tokens billed again, $0.1086 extra (other 1, compaction 1),usagetotals both per group, and the viewer header,--jsonand MCP carrystats.wasteandstats.cacheBreaks. API reference. - Sessions. New
test-tamperflag: the agent added a skip marker to a test, deleted a test file while tests failed, or changed an assertion and that edit alone turned a failing run green. It reads Edit/Write/apply_patch changes and shell writes (sed -i,>,tee,rm,mv,git checkout), and covers test-runner configs and CI files. New tests and files the agent created itself are not flagged. On 3,957 local sessions it flags 13 (EPISTEME, arXiv 2611.06563). Concepts. - Harness A/B.
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. - Judges. New
no-test-tamperchecklist check, with no model call: it answers no when a test change hid a failure (a skip marker, a test deleted while red, an assertion edit that alone turned the tests green), cites the change and the test runs around it, and quotes what the agent said:weaken test/sum.test.js by Edit in e42 (turned failing tests green), disclosed: "…". Saying why never makes it pass. Evals guide. - Evals.
eval audit <task> --experiment <id> --witness <file> --witness-cmd <cmd>replays a witness test, one that checks a requirement the verifier skips, on every passing run:claude-tdd: passes 6/10, refuted 3, audited pass rate 30% (3/10). The witness must pass the reference 3/3 first. A replay whose verifier no longer passes isreplay-mismatch, never refuted, and a witness refuting over half the passes is ambiguous and not counted. No model calls (TestJack, arXiv 2610.10619).--promoteadds it to the verifier, andeval export/importcarry witnesses. Evals guide. - Harness A/B. 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. - Harness A/B.
compareadds asurfacerow: the bytes of instruction text each bundle puts in front of the agent (CLAUDE.md, AGENTS.md, GEMINI.md, 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. - Evals. Experiment sessions:
exp session new --name <topic>starts one in a folder, and eachexp runthere prints its delta against the previous run on the same dataset as it finishes (pass 0.0% → 100.0% Δ +100.0pp […] mcnemar p=0.125, the grader deltas, the cases fixed and broken, the files changed), with noexp compare.exp session noterecords hypotheses and readings,exp session summary [--json]prints the timeline.exp run --watchreruns on every save of the spec, the agent script, grader files orwatchglobs, aborts a run made stale mid-way without storing it, and regrades the stored outputs with 0 agent calls when only the graders changed. Evals. - MCP.
exp_session_noteadds a redacted note to the project's experiment session (the hypothesis before a run, the reading after it) andexp_session_summaryreturns its timeline, paged, with the same blocks asexp session summary --json, so an agent can pick an investigation back up after a context reset. Without a session both return anot_founderror namingcoding.sh exp session new --name <topic>. Explore. - Experiments.
exp regrade <experiment> spec.jsongrades a stored experiment's outputs again with new graders, without calling the task, and prints the pass rate before and after, each grader's version change and every run that flipped (flips 1 of 4 runs: 1 pass → fail).exp comparepins grader versions: a grader that changed version or graded one side only gets a warning above the verdict, and cases left ungraded on one side are listed. Evals. - Experiments.
exp run matrix.jsonruns a spec with"matrix"(JSON Pointer axes, every combination) or"variants"(named cells plus"vary") against a baseline cell: the cells run interleaved, each is stored as its own experiment withmetadata.matrix, each is compared with the baseline, and the McNemar p-values are Holm-adjusted over the cells. A cell that differs from the baseline outsidevary, or touches graders or the dataset, is refused before any call;--planprints the cells and runs nothing,--cellruns a subset,--resumecontinues an interrupted matrix. Evals. - Graders. The
agent-slopgrader flags placeholder code,as anyand@ts-ignore, empty catches, leftover debugging, focused or skipped tests and narrating comments in the lines an agent's diff adds, andcoding.sh judge slop <session|run|experiment>scores captured work with it, per arm for a compare experiment. Verifiers get the agent's diff inCODING_SH_AGENT_DIFF. Evals guide. - Query.
coding.sh sql "select …"runs one read-only SQL query against the SQLite index: oneSELECTorWITHstatement on a read-only connection withquery_onlyon, with a timeout (--timeout, 10 s) and a row cap (--limit, 1000). Writes,ATTACH,PRAGMAand a second statement exit 2; Postgres and ClickHouse stores get an error that points toexport.coding.sh export sessions|events|labelsstreams rows as JSONL or CSV with the same filters assessions, on every store. Query and export. - Privacy. Sessions count what redaction replaced, by kind, in
stats.redactions(counts only, never values; blobs and metadata mode included), and a session in which a vendor token was redacted gets thesecret:exposedtag, since the agent and its model provider still saw it.coding.sh sessions --flag secret:exposedlists the credentials to rotate, andshowprints aRedactedrow. Sessions stored earlier are counted from their redaction markers. Storage, sinks and privacy. - Privacy.
coding.sh purge --literal <file>removes a leaked secret from the SQLite store after the fact: event payloads and the search index, session titles and stats, labels, eval docs, settings, blobs (rewritten under a new hash, with references repointed) and the spool, then VACUUMs the index. Values come from a file or stdin and are never printed;--dry-runcounts the copies. Storage, sinks and privacy. - Cost.
coding.sh usagemarks a cost that counts only some of a row's sessions as a lower bound (≥$1.50, replacing the+suffix), prints how many sessions have tokens but no cost, and names up to five unpriced models with the[prices."<model>"]fix.--jsonis unchanged. Find expensive sessions. - Experiments.
compare A B --reuse baselinecopies A's finished runs from earlier comparisons instead of running them again (--reuse bothcopies B's too), so several candidates against one baseline pay for it once. A run is reused only when its task, verifier and hidden files, bundle, agent version, attempt, timeout and route hash the same, it finished without an error, and it is newer than--reuse-max-age(default 7d).--dry-runprints how many runs each arm would reuse and run, and the report notes that reused runs did not run interleaved. Evals. - Evals. An
executabilitygrader scores a run by how far it got before its first invalid tool call, one the harness refused to run (a bad argument, an unknown tool, an edit of a file not read yet, a string to replace that is not there, a missing file or command, a denied call). A test that exits 1 ran and is not invalid. The score is the share of steps before that call (its mean is AUC-PEC), and it passes with at mostmaxInvalidinvalid calls (its pass rate is TER);kindscounts only some kinds (Prefix Executability, arXiv 2610.40444). Explore guide. - Query.
sessions,search,usageandexporttake--where, one filter language over any session or event field:agent:codex cost>0.5 tool:Bash ok:false -flag:compaction, withOR,( ), wildcards, ranges,sort:andlimit:.sessions --facets model,toolcounts sessions per value. The viewer API (?where=,/api/facets) and the MCP toolssessions_list,searchandusage(where,facets) take the same queries. On SQLite a query is one parameterized SQL statement; a typo is a usage error that points at the character. Query and export - Query.
--whereon tools, MCP servers, event kinds andokreads indexes instead of scanning events, and their facet counts come from a small per-session table. On a 3.3 GB, 1.4M-event store,tool:Bash ok:falsetakes 5 ms instead of 26 s and the tool, MCP and kind facets 31 ms instead of 8.5 s. The store migrates once on open (about a minute at that size, +4% on disk).GET /api/eventsreturns matching events across sessions, newest first and keyset-paged, and/api/facetstakesprefixfor autocomplete. Query and export - Viewer. The session list has one filter bar for the
--wherelanguage: it completes keys and values (with session counts), runs as you type, and on Enter says what is wrong with a bad query and where. Clauses show as removable chips. The sidebar counts sessions per agent, model, repository, branch, flag, tool, MCP server and event kind; a click adds a value, Alt-click excludes it, and groups fold shut. The query is in the URL, and old?agent=and?q=links still open. Full-text hits moved out of the list; the list matches sessions by their text. Explore - Viewer. An Events tab next to Sessions lists the events that match the query, newest first, with the session each belongs to and the matched words marked. Enter opens the event's step in its session, and
nandNstep through that session's other matches.GET /api/eventstakesscope=top. Explore - Privacy.
coding.sh purge --rule <regex>removes every match of a secret's shape (sk-ant-api03-[A-Za-z0-9_-]{80,}) the way--literalremoves a value, without printing the rule or a match. Purge also scrubs eval run dirs (~/.coding.sh/runs), where a kept run holds the agent's transcripts. Privacy - Experiments.
exp run matrix.json --reuse baselinecopies the baseline cell's finished case-trials from earlier experiments instead of running them again, so several matrices against one baseline pay for it once (--reuse allcopies any cell's). A case-trial is copied only when its case, task spec and files, graders, trial number and timeout all match, within--reuse-max-age(default 7d).--planprints how many each cell would copy, and the comparisons warn that the copies did not run interleaved. Evals guide. - Compare.
compare A B --experiment <id> --retry-errorsruns again, in place, only the runs of a stored comparison that errored or failed on infrastructure, and each task, arm and attempt counts once.--failing <id>[@bundle]runs only the tasks A failed in that comparison, with a note that the pass rates are conditioned on that failure.--sample N --seed Sruns a seeded random sample of the tasks.--jsonaddsplanned,skipped,retriedandselection, and the consent prompt counts only the runs still to go. Evals guide. - Docs. A grader field reference: every grader kind, its fields and defaults, and when it passes, with the provider fields judges share. Grader fields
- Experiments.
exp abandrefinerun on a Claude or ChatGPT subscription with--provider claude-code(claude -p) or--provider codex(codex exec), and pick one on their own when no API key is set and the CLI is logged in, saying so in one line. Each call runs without your hooks, plugins, MCP servers or settings, in a throwaway config dir; withclaude -pthe model gets the session's own Claude Code tools and a hook of ours refuses every call, so none runs. Calls run 2 at a time, rate limits back off and retry, and a spent usage limit stops the run with the finished trials kept. Costs show as API-equivalent, with no cap unless you pass--max-cost;improveandimprove fixsuggest the test on a subscription too. Replaying on a subscription. - Judges. LLM graders take
"provider": "codex", which grades throughcodex execon a ChatGPT subscription. Evals. - Experiments.
exp abwith no uncommitted harness edits tests your last commit that changed CLAUDE.md, AGENTS.md, a rule or a skill against the version before it,--dry-runincluded, instead of stopping with "No uncommitted changes". Evals.
Changed
- Harness A/B. 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. - Docs. Long docs are split into pages that load faster: the CLI reference has a page per command, a long changelog release continues over numbered pages, Evals continues on Experiments and Harness evals, and the Read API has its own two pages. Old links to a section that moved still land on it. CLI reference
- Docs. The vercel-security-audit case study has the live result: six read-only tasks against a real Vercel team, three runs per arm. Counting the 27 sessions that stayed on the requested model, graded with the fixed site check, 0/14 runs passed without the skill and 9/13 with it (+69.2 points, 95% CI +23.1 to +100, McNemar p = 0.25, gate Hold), at 6 times the cost per run. A Corrections section says what changed from the first 4/18 and 14/18: the
$LIVE_SITEcheck, task 06's wording, and 9 sessions that Claude Code moved to an older model after a refusal. Aggregate numbers only. Case study. - SDK. The TypeScript SDK is published as
@codingdotsh/sdk(npm org names can't contain a dot). Install it withnpm i @codingdotsh/sdk. See the SDK reference. - Experiments. The item gate no longer accepts removing a skill or rule when the agent fails the exposed tasks without it; such items read UNCOVERED (neither arm solves them) or UNMEASURED (pass rate without the item under 0.8). The gate line shows
U=andA=and a count of internalized, works, uncovered, hurts and between tasks (Wang et al., arXiv 2610.32322). Evals guide. - Experiments.
exp run,exp aaandexp regradeadd each--graderto the spec file's graders instead of replacing them, soexp run spec.json -g judge.jsongrades with both;--replace-graderskeeps the old behavior. Evals
Fixed
- Sessions. Replay knows that a file a step created did not exist before that step, instead of calling it unknown, so
replay --fork --runremoves it from the fork's copy. Replay a session. - Evals.
eval validateapplies a reference or near-miss patch after setup when it only applies to what setup creates, as an agent's run sees it. Before, a task whose setup made the mess the agent cleans up could not validate: its reference "did not apply". Evals. - Improve.
improve check --repo <DIR|all>counts the sessions that ran in other checkouts and worktrees of the repo. Before, it ignored--repoand counted only sessions whose repo root was the current checkout, so a repo whose agents work in worktrees showed every change as "No sessions yet". Improve. - Harness.
harness auditskips a file or directory it can't stat (a symlink loop, or a Windows junction Node can't follow) instead of failing with "unknown error". Memory and instruction files. - Harness A/B.
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. - Harness A/B.
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. - Capture. Backfill follows symlinked and junctioned transcript directories and files, and skips dangling links. Before, a
~/.claude/projectsmade of links ingested nothing. Adapters. - Harness A/B. 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.
- Harness A/B. 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. - Sessions.
premature-completionno longer flags an agent that stopped on a failing test run and said so ("2 tests still fail", "I couldn't get test_x to pass", or a question about the failing test). It still flags one that says it is done, fixed or passing, or says nothing about the failure. Stored sessions get their flags recomputed once. Concepts. - Site. A page that shows "±" no longer downloads a second font file for it. Site speed
- Harness A/B.
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. - Experiments.
exp abwith noANTHROPIC_API_KEYorOPENAI_API_KEYstops before the first trial withmissing_keyand points atcoding.sh improve check, instead of running every case into an error and reporting "Hold: not enough evidence".refine proposewithout a key names the proposer, not the judge. Improve your agent every week. - Rules. A CLAUDE.md line like "Run
npm testbefore you say you are done, and never claim…" is read as a requirement to runnpm test: the clause that holds the command decides, not a "never" later in the line. - Judges. The Anthropic and OpenAI judge providers read
ANTHROPIC_BASE_URLandOPENAI_BASE_URL, like the vendors' SDKs, so judges and drafts reach a proxy, gateway or local stub without--base-url. Judges. - Experiments. When no attempt in either arm solves a task,
comparesuggestscoding.sh eval validate <task>instead of aneval curatecommand that does not exist. - Refine.
refine check,refine testandexp abjudge only the new sentences of an edited line when looking for an edit that relaxes a protected line. Editing a one-line paragraph that already held a conditional ("use the CLI only if …") no longer rejects the edit. Protected safety lines. - Examples. The skill eval's live site check counts a network command that uses
$LIVE_SITEas touching the site; it missed those, and passed runs that had probed the site. Scenario 06 no longer tells the agent to record open questions instead of waiting, since its pass is to stop and ask. Skill eval example. - Privacy.
coding.sh purgenever repeats what was typed on its command line: a secret pasted as an argument, a flag value, an unknown option or a--literalpath that does not exist is refused with exit 2 and(value not shown), instead of being printed to the terminal and logs. Other commands still name a stray argument. Purge. - Compare. The
agent spendandgrader spendrows no longer count runs copied by--reuse; areusedrow shows what those runs cost when they first ran, marked not spent. Evals. - Sessions. Claude Code subagents get a title and a turn: the title is the Agent tool's
description, else the first line of the prompt, and the prompt is recorded as the subagent's first message. Claude Code's internal forks (the compaction summarizer, prompt suggestions) no longer leave empty subagent sessions with no model, tools or title. Stored sessions are parsed again on the next ingest. Concepts. - Capture. Claude Code subagents that fire no SubagentStart or SubagentStop (
web-fetch) are linked to their parent from the parent'sAgenttool result, with their prompt, result, model and end, instead of showing as a top-level session with no prompt. Adapters. - Sessions.
skill:<name>tags andskill-copy-conflictcount only installed skills: askills/folder under an agent's dot folder or in a plugin. Askills/folder in source code (skills/mod.rs), a reference checkout, text inside a heredoc and a write to a skill file no longer tag a skill. Codex's.system/andsynced/<id>/folders are skipped, soskill:.systemandskill:syncedbecome the skill's own name, and a plugin named for its one skill is tagged once (skill:frontend-design). Concepts. - Sessions.
test-tamperno longer flags adding tests: a skip guard inside a new test, fixing a test the agent added earlier, updating an expectation its own source edit broke, or a green run of fewer tests than the failing one. A file a shell command's diff picked up without the command naming it (a test run, agit rebase, another agent in the checkout) is never flagged, and BSDsed -i ''no longer counts''as a file. A skip marker inside a string literal (a diff orsedcommand a test holds as data) is not a skip. Stored sessions are re-checked in the background after the upgrade. Concepts. - Sessions.
coding.sh sessionsleaves out sessions with no turn, tool call or model call, such as a process that started and ended a session and did nothing;--emptylists them too, and--limitstill fills with sessions that have work. CLI reference. - Cost.
usageTOK/TURN(tokensPerTurn) is input, output and cache-write tokens per user turn. Cache reads are left out, because each model call re-reads the whole context, andTURNScounts only top-level sessions' turns, because a subagent's prompt comes from its parent's turn. Expensive sessions. - Capture. The background re-parse after an upgrade no longer blocks reads: it holds the ingest lock at most a second at a time and ingests new hook lines between holds, so
sessionsand the viewer answer in about a second instead of waiting 8 to 24 seconds. It writes blobs in batches, resumes where a cut-short run stopped, and works out stats and flags again for every stored session when an upgrade changes them. Listing a large spool is faster too. Troubleshooting. - Doctor. Hooks in a project's config (
.claude/settings.local.json,.codex/hooks.json,.gemini/settings.json,.cursor/hooks.json, …) show ashooked in <file> (project), found in the current directory and in the directories the agent's recent sessions ran in. An agent with events in the last 5 minutes and no hook found readsevents arriving, hook not in user config, nevernot hooked. A stale hook bin now saysrun coding.sh update --refresh-bininstead ofinit, andcoding.sh ingest(which the hook starts at every session end) refreshes the bin itself afternpm i -gof a newer version. Troubleshooting. - Viewer. API sessions with a failed request are red in the session list again, with the reason:
1 failed request (429), the first error on hover. Sessions carrystats.llmErrors, counted at ingest (existing indexes are filled in on upgrade), and a list page costs the same store queries at any length. - Viewer. The top bar fits from 320px up, in any font (on Linux without Geist it ran 2px past a 320px screen; a tab label now ends in an ellipsis before the page scrolls sideways): between 641 and 820px search folds to its icon instead of squeezing the theme button, and every top bar control has a 44px hit area.
- Viewer. The session title in the list keeps at least 12rem on any desktop width (at 1024px, next to the filter sidebar, it was 20px): tokens, then duration, then repo, then activity give way first.
- Windows.
coding.sh updateand the MCP launcher run npm andcoding.shwithout a shell, so paths with spaces or&arrive intact. - Windows. Goose's config is found under
%APPDATA%\Block\goose\config, where Goose keeps it on Windows. Eval runs find agent binaries on PATH (Windows spells itPath), and Amp and Pi hooks use thenodeon PATH, as elsewhere, instead of the one that raninit. - Aider. Eval runs pass
--no-show-release-notes: on a new version's first run,--yes-alwaysmade aider open its release notes in a browser. - Codex. Code mode: a command run inside an
execcell now points at the cell, the cell fails when a command in it fails, and session stats count each command once instead of twice (hooks and backfill agree). - Viewer. A big ingest no longer blanks reads:
coding.sh uiopens at once (0.3 s, was 41 s on a 25k-line spool) and indexes in a background worker with an "Indexing N files…" pill, andstatus,sessionsandsearchanswer within 1.5 s, noting what is still pending (--freshwaits). CLI reference. - Capture. A full ingest of a 25k-line spool takes 4 s instead of 294 s on macOS, and 39 s instead of 153 s on Linux: blobs are made durable once per checkpoint instead of with two fsyncs per line, and each checkpoint commits its events, session rows and spool cursors in one transaction, so a crash mid-drain neither loses nor duplicates events.
- Cost.
coding.sh collectorprices model calls with tokens and no cost, asserveandingestdo, using your[prices]. - Viewer. The top bar fits a 360px phone.
- MCP. Tool calls no longer wait for a big ingest: they answer within 1.5 s from what is indexed, with
pending: {files, indexing}in the result. CLI reference. - Harness A/B.
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. - Examples. The skill eval's live mode grades fairly:
--helpandhelpcalls never count as writes, a refusedenv lsreads "refused secret read", live task copies name the team, project and site only through$VERCEL_SCOPE,$VERCEL_PROJECTand$LIVE_SITE, the site checks match the team's real domains (kept from the agent), andout/checksrecords each run's task and arm.run.sh <out-dir> --regradegrades stored runs again without calling the agent. Evaluate an Agent Skill. - CLI.
status,sessionsandsearchwith--jsoncarry"pending": {"files", "indexing"}while captures are still waiting, instead of dropping the note. CLI reference. - Evals. A command task, grader or source that crashes names the error and its cause, such as
exited 1: TypeError: fetch failed (cause: connect ECONNREFUSED 127.0.0.1:8803), instead of the last three lines of stderr (for Node, the closing braces of the error object). A refused connection now reads as an infrastructure error, so the trial is retried and counted as infra, not as a failure. Evals - Evals. A task drafted from a session names the files its setup was guessed from, such as
setup guessed from package.json (no lockfile): npm install, instead of saying "from lockfiles" when there was none. - Experiments. A grader error leaves a run ungraded only when no other grader failed it. With
exactand a judge that is down, the runsexactfailed count as failures and only the runs it passed are left out, instead of every run reading ungraded and the pass rate going blank.exp regradefollows the same rule. Evals - Evals.
eval runreports on a cases suite say "case" and on a triggers suite "prompt" (the header, the table, never-passed, saturation and the regression lines), and--jsoncarries the report'sunit. - Evals.
eval validateshows the last 12 lines of the verifier's output when a check goes the wrong way (the reference fails, the no-op or a near-miss passes, or setup fails), once per kind of check, and--jsoncarries every step with its output insteps. Evals - Evals.
eval init --forceno longer deletes your work: it stops when the suite holds a fileeval initdid not write or that you changed since (areference.patchyou added, a prompt you fixed) and lists them.--force-alldeletes those too.evals/<name>/.eval-init.jsonrecords whateval initwrote. Evals - Evals.
eval init --skill <dir>uses the skill's owntriggers.tomlwhen it has one and you give no prompts and no--draft:suite.jsonpoints at it instead of a TODO template. Evals - Evals.
eval init --sessionsand--session latestinclude a session that just ended: they wait up to 30 seconds for the ingest its hook started, then ingest the rest, instead of skipping the ingest when its lock is busy after 1.5 seconds. Evals - Graders. When a command grader, command task or bench source crashes on Node 24.22, its reason names the error again (
TypeError: fetch failed (cause: connect ECONNREFUSED …)) instead of the crash's closing braces. Node 24.22 prints an uncaught fetch failure as[TypeError: fetch failed] {. Evals - Store. A SQLite index that fails to open (a newer schema, a failed migration) no longer stays open in the process that tried, so on Windows the file can be replaced or removed right away. Concepts
- Evals. On Windows,
eval initandeval runshow suite paths with forward slashes, like the file list under them:Wrote … to evals/triage,evals/pdf/triggers.toml still say TODOand the--skillpath in the--draft --forcehint read the same on every OS. Evals