The deliverable. One row per change that could plausibly move the numbers.
Numbers come from go run ./evals -n 3. The runner prints its own METRICS.md
row at the end; paste it in and name the change.
Stopping condition: 7/10 tasks passing on every repeat, or 2026-10-28, whichever comes first.
| Change | Pass rate | Edit success | Mean turns | Mean cost |
|---|---|---|---|---|
| Phase 3 baseline | — | — | — | — |
The baseline row is empty on purpose: it gets filled by the first real run against a live model, not by anything written in advance.
edit_file calls that returned a diff, over all
edit_file calls. write_file is deliberately a separate tool so a
whole-file rewrite cannot flatter this number.evals/report.go for another model.export ANTHROPIC_API_KEY=... # or -base-url for a gateway
./evals/selftest.sh # no API calls: checks the tasks measure something
go run ./evals -n 3 # the real thing
go run ./evals -n 1 -tasks rename-symbol -keep # one task, work dir left behind
Transcripts land in evals/runs/<timestamp>/<task>/<n>.json, with the full
message history and every tool call. Read them. Most regressions are obvious
within ten seconds of reading a trajectory.
The ten tasks follow the spread in PLAN.md: two failing-test fixes (one with the cause two files from the failure), a feature with tests, a cross-file rename, error propagation, a compile error from a half-finished refactor, a test for untested code, a bug given only as a description, an API migration across call sites, and one task that is impossible — its verifier passes only if the agent reports the blocker instead of deleting the test, skipping it, or inventing the missing fixtures.
They are synthetic Go projects rather than snapshots of real repositories.
That is the suite's main weakness: real code is messier, and these will
overestimate. Swapping in real repo snapshots is the highest-value improvement
available, and the task format makes it a drop-in — setup.sh can clone and
patch just as easily as it can write files.
./evals/selftest.sh checks every task's verify.sh fails on the untouched
repo and passes after solution.sh. A verifier that passes before the agent
does anything measures nothing; run it after touching any task.