← Release notes

v0.3.16 Aug 2026

No response grows with the size of the change

The flow died on exactly the changes big enough to deserve a document. Paged diffs, hunk-id anchors, a run handle that survives a restart.

compute_diff returned the whole diff beside the run_id every later call needs. On a 205,432-character change the response was 234,337 characters — past the client’s tool-result cap, so it was spilled to a file whole and the run_id went with it. The reviewer has no file access by design, so it could neither record a round nor submit. The bigger the change, the more certain the failure.

Now compute_diff returns the handle, the SHAs and a numbered hunk index; the bytes come from read_diff, paged on hunk boundaries — the unit the anchors already speak in. Envelope on the change that prompted it: 234,337 → 15,622 characters, twelve pages, every walked hunk byte-identical on reassembly.

Breaking: compute_diff no longer returns diff. The document format is unchanged.

Also

  • •A run handle, not a working directory. Rounds were filed under the server’s cwd while submits passed the repo — different keys in a multi-repo workspace, so the submit found no interview and the reviewer re-ran everything. A run is now sha256(repo|base_sha|head_sha), required by both tools.
  • •Anchors by hunk id. A stop says H3, H4 instead of restating line numbers from a diff header. Ids are expanded before validation, so nothing downstream changes.
  • •A transcript parser per agent. Claude Code and Codex transcripts share nothing; guessing at both half-worked in silence — get_spine reduced 831 Codex entries to one gap item.
  • •A tour grouped by the plan, not the diff. Grouping by file structure produces stops that are really just filenames.
  • •The reviewer lost the orchestrator’s tools. It could reset consent for every repository on the machine, and in one run reached for it after two failed submits.

Commits for this release: v0.2.11…v0.3.1