Changelog

Nov 8, 2026 · 177 changes · page 5 of 5

coding.sh v0.1.2

coding.sh runs on Windows, and CI tests it there.

Refine 4

  • # Added coding.sh refine propose|test|apply|rollback|log|run improves AGENTS.md, rules and skills in tested rounds. propose asks a model for lines that address your sessions' most severe flags, with protected lines marked READ-ONLY. test checks a candidate before any model call (protected lines, harmful or duplicate added lines), A/Bs it against your current files on the decision points exp ab mines, and rejects it when it forgets what an earlier kept edit won (guard: forgets kept edit r_…). apply writes a kept edit with a backup, rollback restores it byte for byte, and log lists every round with its verdict, effect CI, guard result and reason. run loops until --rounds, --max-cost or the plateau detector says stop. Evals guide.
  • # Added coding.sh refine score labels.jsonl --pred FILE scores diagnoses against hand labels by code: occurrence, Signal and session precision, recall and F1, Signal coverage, recall per taxonomy family and, with 2+ --pred files, repeat agreement, each with its counts. Matching is maximum one-to-one on session, component and top-3 type ids. Without --pred it measures the precision of each session flag (Signals, arXiv 2611.04507). Evals guide.
  • # Added 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,wall keeps 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-plateau climbs until the e-detector says it stopped gaining, --resume continues an interrupted round, a skill directory can be the --target, and refine log shows each climb's rounds and Pareto front. Evals guide.
  • # Fixed refine check, refine test and exp ab judge 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.

Long sessions 1

  • # Added 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. show lists the phases with day lines, show --all lists every event, and show --follow prints new events while a session runs. Derails mark where a run went off the rails: looping, failure-streak, churn, no-progress, stalled and context-thrash, each with the event and time it started. They show in show, on the viewer timeline (with ‹ › to step through them), in sessions --flag <name>, and in the MCP sessions_list and session_get tools. compare reports derails and time to first derail per run, and a progress grader scores time on track for exp compare. The viewer loads a 40,000-event session in the background and scrolls it smoothly, and MCP session_get with tail reads 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.

Tool evals 2

  • # Added A calls check: tools the trial must call (must), must not call (mustNot), at most max calls, and an order, with partial argument matches (~text substrings, <=N bounds, dotted paths). It reads the trial's tap; the MCP tap now keeps each call's arguments, redacted. exp run takes the same fields as a calls grader over the task's trace. Tool evals.
  • # Added toolevals compare prints p (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). --json carries report.permutation; verdicts are unchanged. Tool evals.

Graders 2

  • # Added The agent-slop grader flags placeholder code, as any and @ts-ignore, empty catches, leftover debugging, focused or skipped tests and narrating comments in the lines an agent's diff adds, and coding.sh judge slop <session|run|experiment> scores captured work with it, per arm for a compare experiment. Verifiers get the agent's diff in CODING_SH_AGENT_DIFF. Evals guide.
  • # Fixed 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

Query 3

  • # Added coding.sh sql "select …" runs one read-only SQL query against the SQLite index: one SELECT or WITH statement on a read-only connection with query_only on, with a timeout (--timeout, 10 s) and a row cap (--limit, 1000). Writes, ATTACH, PRAGMA and a second statement exit 2; Postgres and ClickHouse stores get an error that points to export. coding.sh export sessions|events|labels streams rows as JSONL or CSV with the same filters as sessions, on every store. Query and export.
  • # Added sessions, search, usage and export take --where, one filter language over any session or event field: agent:codex cost>0.5 tool:Bash ok:false -flag:compaction, with OR, ( ), wildcards, ranges, sort: and limit:. sessions --facets model,tool counts sessions per value. The viewer API (?where=, /api/facets) and the MCP tools sessions_list, search and usage (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
  • # Added --where on tools, MCP servers, event kinds and ok reads 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:false takes 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/events returns matching events across sessions, newest first and keyset-paged, and /api/facets takes prefix for autocomplete. Query and export

Privacy 4

  • # Added 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 the secret:exposed tag, since the agent and its model provider still saw it. coding.sh sessions --flag secret:exposed lists the credentials to rotate, and show prints a Redacted row. Sessions stored earlier are counted from their redaction markers. Storage, sinks and privacy.
  • # Added 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-run counts the copies. Storage, sinks and privacy.
  • # Added coding.sh purge --rule <regex> removes every match of a secret's shape (sk-ant-api03-[A-Za-z0-9_-]{80,}) the way --literal removes 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
  • # Fixed coding.sh purge never repeats what was typed on its command line: a secret pasted as an argument, a flag value, an unknown option or a --literal path 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 2

  • # Added compare A B --experiment <id> --retry-errors runs 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 S runs a seeded random sample of the tasks. --json adds planned, skipped, retried and selection, and the consent prompt counts only the runs still to go. Evals guide.
  • # Fixed The agent spend and grader spend rows no longer count runs copied by --reuse; a reused row shows what those runs cost when they first ran, marked not spent. Evals.

SDK 1

  • # Changed The TypeScript SDK is published as @codingdotsh/sdk (npm org names can't contain a dot). Install it with npm i @codingdotsh/sdk. See [the SDK reference](docs/reference/sdk.md).

Rules 1

  • # Fixed An AGENTS.md line like "Run npm test before you say you are done, and never claim…" is read as a requirement to run npm test: the clause that holds the command decides, not a "never" later in the line.

Doctor 1

  • # Fixed Hooks in a project's config (.claude/settings.local.json, .codex/hooks.json, .gemini/settings.json, .cursor/hooks.json, …) show as hooked 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 reads events arriving, hook not in user config, never not hooked. A stale hook bin now says run coding.sh update --refresh-bin instead of init, and coding.sh ingest (which the hook starts at every session end) refreshes the bin itself after npm i -g of a newer version. Troubleshooting.

Windows 2

  • # Fixed coding.sh update and the MCP launcher run npm and coding.sh without a shell, so paths with spaces or & arrive intact.
  • # Fixed 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 it Path), and Amp and Pi hooks use the node on PATH, as elsewhere, instead of the one that ran init.

Aider 1

  • # Fixed Eval runs pass --no-show-release-notes: on a new version's first run, --yes-always made aider open its release notes in a browser.

Codex 1

  • # Fixed Code mode: a command run inside an exec cell 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).

CLI 1

  • # Fixed status, sessions and search with --json carry "pending": {"files", "indexing"} while captures are still waiting, instead of dropping the note. CLI reference.

Store 1

  • # Fixed 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

From CHANGELOG.md · RSS · All releases