Repository navigation
v0.2.12
The arena now checks its submissions, and can land the winner
Both of these came out of using the arena for real work — implementing this release's other two changes — rather than from reasoning about it. Both had to be worked around by hand in the same sitting.
[arena].verify
The arena judges a diff, and a diff does not say whether it builds. A real round produced a submission that failed cargo fmt --check: invisible in the patch, and enough to turn CI red had the tidier-looking change won on looks.
[arena]
verify = "cargo test"Runs inside each contender's own worktree once its work is captured. The verdict appears beside the diff, in the round summary, and again when the patch is applied.
A failed check is reported, never disqualifying. Turning a red check into an automatic loss would quietly replace your verdict with a proxy — which is what the gold bench already is. Here it is one more fact to weigh, and sometimes a one-line formatting slip sits on the better design.
agentpit arena apply
A round's worktrees are gone by the time you judge it; the patch is what survives. Landing a winner used to mean digging it out of the round JSON.
agentpit arena apply # the round's vote winner
agentpit arena apply --label A # or pick one yourselfIt refuses to guess when the votes do not name a winner — a tie, or an unjudged round, is not a decision — refuses on a dirty tree unless forced, and tells you the check verdict as it lands, so a red patch cannot be applied without your knowing.
Fan-out labels land on the member's own variant
Capability rows are keyed by (backend, model, effort). A fan-out run's RouteDecided only carries the run-wide --model/--effort; without those, each member still ran at its own [backends.<id>] default and the log did not say which — so every member's grade landed on the unpinned row. MemberStarted now records the resolved, already-clamped values, and a grade label uses that member's variant. Fallback is per field, so an old events.jsonl folds exactly as before.
Arena rounds run in parallel
Bounded by --concurrency, defaulting to 2 rather than "all of them" — every slot is a full agentic run and multiplies both token spend and local CPU. Results are re-sorted into contender order, so the stored round, and therefore the blind labels, never depend on who finished first.
The two changes above were implemented by backend agents in blind arena rounds and chosen by vote, then reviewed and verified before landing.