Changelog

Unreleased · 146 changes · page 3 of 4

coding.sh v0.1.6

Cost 9

  • # Added coding.sh cache doctor grades the prompt cache (hit rate, A to F) and ranks what broke the cached prefix by extra cost: model switches, tool set changes, a volatile line such as a timestamp in the system prompt, other system prompt changes, rewritten history, idle gaps. Each cause has its break count, sessions, tokens re-billed, the fix and a diff-calls example. Prompt cache health.
  • # Added coding.sh usage --baseline and the MCP usage tool's baseline compare each agent's cache hit rate with Requesty's published rate for that agent (April 2026), as a signed point delta, - for an agent it does not list. Without the flag the output is unchanged. Prompt cache health.
  • # Added CLIProxyAPI is a gateway: sessions whose base URL is on port 8317 (or CLIPROXYAPI_URL) are tagged gateway:cliproxyapi, and gateway enrich --gateway cliproxyapi reads its usage queue with the management key and joins each record to its llm call by session id, or by time and model. The call gets reasoning effort, service tier, speed, time to first token, compaction, tokens, upstream cost and a hashed account id. The read empties the queue for other readers, so it runs only when named, prints a warning, and keeps every record until it joins. LLM gateways.
  • # Fixed A Claude Code subagent whose transcript sits under more than one session is stored once, under the session that wrote it. A workflow run resumed in another session (resumeFromRunId), a symlinked run dir or a fork used to store each copy as its own subagent session, so its calls and cost counted again. Adapters.
  • # Fixed Copies already in the index are removed on the next re-parse. A session an older coding.sh stored from a copy of another session's transcript (a Claude Code subagent copied into a resumed workflow run or a fork) is deleted with its events once the session that wrote it is stored, so its calls and cost stop counting twice. Re-parse used to keep it as a session whose transcript is gone; a session whose transcript is really gone is still kept. ingest --rebuild prints how many it removed. Troubleshooting.
  • # Fixed Claude Fable 5.2 and Mythos 5.2 are priced at their own rates ($8 input, $40 output, $0.20 cache hit, fast mode $16/$80) instead of Fable 5.1's $10/$50, which put standard calls 25% high and fast calls 37.5% low. Stored sessions are repriced on the next ingest. Prices.
  • # Fixed usage and cache doctor total every session in the window; they stopped at the newest 2,000 without saying so. Past 100,000 sessions (CODING_SH_SCAN_CAP) they print Stopped after N sessions: narrow --since or --where. and set truncated in --json. Configuration
  • # Fixed coding.sh cache doctor counts every session in the window in its breaks, re-billed tokens, extra USD and grade, so they match usage whatever --limit is. --limit (default 200) now only bounds how many sessions are read to classify causes: a session past it keeps its stored cause or counts as unclassified, and --json adds breaksNotRead. Before, the totals and the grade covered only the sessions that were read. Explore
  • # Fixed A gateway enrich record with no upstream cost no longer removes (estimated) from a session's cost. Only a record with a billed cost marks the call as billed. LLM gateways

OpenTelemetry 4

  • # Added The receiver reads reasoning tokens (gen_ai.usage.reasoning.output_tokens, the AI SDK's reasoningTokens, Codex's reasoning_token_count, Gemini CLI's thoughts_token_count) into payload.reasoningTokens on the llm.call; skills (gen_ai.skill.name, Claude Code's skill_activated, Codex's codex.skill_invocation) as payload.skill and a skill:<name> tag; gen_ai.conversation.compacted and Claude Code's compaction event as context.compact; and gen_ai.main_agent.name, Claude Code's agent_id/parent_agent_id and Codex's codex.agent_response for the agent and its subagents. Spans without them map as before. OpenTelemetry.
  • # Added An eve or durable-harness agent can send its Agent Runs spans to coding.sh collector as well as to Vercel, with one extra span processor; each run becomes a session with its turn, model calls, tool calls and usage, under the agent durable-harness for durable-harness. Tee Agent Runs.
  • # Fixed A span that reports a cache read or cache write of 0 tokens no longer adds cacheReadTokens: 0 or cacheWriteTokens: 0 to the call's usage; non-zero counts and cost are unchanged. OpenTelemetry.
  • # Fixed eve's agent.step and approval spans become notification events (eve.step, …), as the eve mapping documents, instead of generic span events. eve.

Collector 4

  • # Added coding.sh collector import --clickhouse <url> reads agent traces from an OpenTelemetry Collector's ClickHouse otel_traces table (Map or JSON attributes) into the local store, with the same mapping, redaction and pricing as spans posted to the collector. It keeps its place per table and row filter, so a second run imports nothing new; --since, --from-start, --where, --table, --all, --dry-run and --json shape it. Pull from ClickHouse.
  • # Changed coding.sh collector stores concurrent requests together, in one transaction with one blob flush, and no longer keeps every source span as a blob (--keep-raw turns that back on; serve still keeps them). On the desk, 8 clients posting 61-span requests went from 1,437-3,075 to 5,585-6,865 spans/s, with request p95 from 283-613 ms to 125-155 ms. A long session per client is not faster. OTLP collector.
  • # Fixed coding.sh collector import keeps its place per table and row filter (--all, each --where), so a run without the filter reads the rows a filtered run skipped. A --since given on the command line reads from that time again, and the new --from-start does the same with the default 7 days, for a root span that reached the table more than an hour late. Nothing is stored twice. Pull from ClickHouse
  • # Fixed coding.sh collector import stores each page with its sessions before it saves its place, so a run that loses ClickHouse part-way leaves no events without a session. A dropped connection or a 502, 503 or 504 is tried three more times; a run that still fails says how many spans it read and prints the command that reads the rest. Before, the next run exited 0 with fewer sessions than traces. Pull from ClickHouse

Docs 5

  • # Added A guide to whether a terse mode saves money on your tasks: run them with and without a be-concise rule, skill or plugin, read pass rate and cost with intervals, and split output tokens from the input the instruction adds. It cites our A/B of a terse-output plugin: output −8%, cost +11%, same pass rate and clarity. Its commands are checked against the CLI in tests. Terse mode guide.
  • # Changed The instructions file is called AGENTS.md wherever any agent is meant: the home page, docs titles and prose, command examples, --help and the MCP tool descriptions. Lists of the files coding.sh reads start with AGENTS.md, and the site, the docs, --help and the hints coding.sh improve prints name no other instructions file: where a sentence is about one agent's own file, it says "the agent's instructions file". The five-minute guide moved to /docs/how-to/test-agents-md-change; the old URL redirects to it. No command changed which file it reads or writes. Test an AGENTS.md change in five minutes.
  • # Changed The docs pages are shorter and easier to skim: each starts with what it is for and one real example, flags are in tables, and depth sits in "How it is computed" blocks or behind a link. A site test keeps bullets, paragraphs and guide pages within word budgets. Experiments.
  • # Fixed Status claims match the code and the registries again. Tool evals and workflows are tagged built, and coding.sh, @codingdotsh/sdk and the Postgres, ClickHouse and S3 store plugins are no longer called unpublished; the Python SDK is still not on PyPI. The dogfood plan gives each step's state with code pointers. A site test fails when a page calls something planned whose module exists, or when the agent list disagrees with the adapters in the code. What is built.
  • # Fixed The troubleshooting page lists each error reason under the exit code the CLI gives it, and the session rows example in the API reference is the real answer for the page's example session. Errors by reason, API

Benchmarks 4

  • # Added bench show and the report add a routing headroom check: the any-contender pass rate against the best single contender, compared with a Rasch model where no contender specializes, so per-case routing is only suggested when the gap beats run noise. Routing headroom
  • # Added Contenders that cross models with harnesses (agents, or axes = { model, harness } on any contender) get a grid: interaction residuals with intervals, rank reversals, Cross-Model Fit per harness and leave-one-model-out regret. Model × harness grid
  • # Fixed Routing headroom now prints the best single contender's own pass rate, the one on the leaderboard, and measures the gap and its expected range from it. With several trials it used to average the best contender of each trial, so the rate beside the name was too high and the gap too small. Runs stored before the fix keep their old numbers. Routing headroom
  • # Fixed The model × harness grid no longer states noise as fact. A rank reversal is listed only when the 95% interval of both pass-rate gaps excludes 0, each leave-one-model-out regret and the mean carry a 95% interval (regretCi and meanRegretCi in --json), no cell is starred under 20 paired cases, a bound that rounds to 0 no longer stars some cells of a 2 × 2 and not others, and the legend says the stars are per cell and not adjusted for the number of cells. Model × harness grid

Sessions 4

  • # Added An agent started by another agent's shell tool (codex exec or gemini -p from Claude Code's Bash tool) is linked to that session as a child of type harness, and coding.sh show lists it under the parent. The link comes from the session id Claude Code and Codex export to the commands they run, else from the parent's shell call that ran the child's CLI while the child started in the same directory. Concepts.
  • # Changed stats.toolErrors, repeated-tool-failure and the failure-streak derail count only real failures. A search that found nothing (grep, rg exiting 1 with no output), a probe that answered no (test -f, command -v) and a diff that found differences are counted in the new stats.benignToolErrors, and a stopped call in stats.interruptedToolCalls. Stored sessions are counted again on the next ingest. API.
  • # Changed A shell command run from a REPL or code tool's cell (bash("npm test"), subprocess.run(["pytest"]), os.system, an IPython ! line, a %%bash cell) counts as verification for no-verification, as the same command in a shell tool does. Concepts.
  • # Fixed show, tree, usage, improve, harness audit and the other reads answer within the read budget while a re-parse runs, from what is indexed. show, tree, usage, replay and harness audit used to ingest every pending capture first, with no budget. They leave the spool to the re-parse, say how many files wait (on stderr, or pending with reparsing: true in JSON), and a session not found says it may be among them. Configuration.

Workflows 4

  • # Added coding.sh ui shows workflow runs at #/workflows: one bar per agent grouped by phase, the critical path outlined, barrier idle shaded, a concurrency strip against the cap, links to each agent's session, and per-phase and metrics tables. On a phone it opens as a table. The page reads /api/workflows, the same documents workflows show --json prints. Workflows guide
  • # Added Verifier cases take named [[truth.tests]] and score the share that pass, reporting tests marked before = "pass" that fail after the run as regressions. Judge cases (kind = "judge", a rubric) are graded by an LLM judge and flagged uncalibrated until coding.sh judge calibrate has calibrated that judge version. workflows run now scores every case kind as workflows score does. Workflows guide
  • # Added workflows run checks each seeded bug on its case's [start] snapshot before any run: the bug's test fails seeded and passes with the patch reverted (--no-validate skips it). A case whose truth file sits inside its [start] tree no longer loads. Workflows guide
  • # Added A command-driver variant with fromCheckpoint or replayFrom passes --from-checkpoint <id> or --replay-from <node> to the program, for LangGraph checkpoint forks and node replays. Workflows guide

Store 6

  • # Added Every one-way index migration first keeps a copy of the index next to it (index.db.v<N>.bak, a copy-on-write clone where the filesystem has one; a full copy is refused with the space it needs when it would not fit), and coding.sh upgrade-store --restore puts it back. The index it replaces is kept as index.db.v<N>.undone. Troubleshooting
  • # Changed The index is about a quarter smaller. The search index no longer keeps its own copy of tool text, each working directory is stored once, and an unused index is gone. On a 756k-event store, after gc --compact, it takes 1.38 MB per 1,000 events instead of 1.89. The upgrade builds the new search index and leaves old rows as they are; gc --compact empties their old copies and gives the space back. A coding.sh older than 0.1.5 refuses the upgraded index and says to upgrade. Storage.
  • # Fixed An index upgrade on a store of 100,000 events or more no longer runs silently. It says so on stderr within a second, prints its progress at most once a second, and ends with how long it took and, when old data is left, gc --compact. A command that opens the index while another process upgrades it waits and prints that process's progress. Upgrading a 740k-event store from schema v2 took 20 s instead of 119 s. Troubleshooting.
  • # Fixed The store records the coding.sh version that last wrote it. A build that is not a newer release than that one (a source checkout, a stale dist) no longer migrates the index by itself, with or without a bin/: it stops with store_version, and coding.sh upgrade-store migrates on request. Troubleshooting
  • # Fixed The error for a store a newer coding.sh already migrated says captures are safe in the spool, how many files wait there, which version wrote the store, and to run coding.sh update; it offers upgrade-store --restore when a copy from before the migration is kept. Troubleshooting
  • # Fixed coding.sh upgrade-store always leaves bin/cli-path naming the running coding.sh (also when there is no bin/, or it names a CLI that is gone), and upgrade progress counts events instead of the highest rowid. Troubleshooting

Improve 2

  • # Changed improve check says Helped only when failures fall: the flagged share, or one flag (Holm-adjusted) with no other rising significantly in its place. A new line the agent follows while flagged sessions stay put is now "Followed, no effect yet", and a change after which sessions make 1.25x the tool calls or take 1.25x as long, with no fall, is "Costlier"; both suggest refine test git:<previous> to test the harness without it. --json adds work and next. Regressed and its exit 1 are unchanged. Improve.
  • # Fixed A Helped line from improve check now names every flag whose share rose after the change, significant or not, as in repeated-tool-failure rose 4 to 8 of 12, not significant. The verdict is unchanged: one flag falling is Helped unless another flag rose significantly. Improve guide

From CHANGELOG.md · RSS · All releases