Girl Chess · Coach model evaluation

Coach Eval v3: Sonnet vs Opus

Two AI models competed for one job: powering an in-game coaching assistant. The call is to keep the shipped model; this shows why, and the controls that make it trustworthy. The second tab covers how the evaluation was built, challenged, and hardened.

Read this first · noted 2026-08-18

This page truthfully records what was measured on 2026-07-23. Three things have changed since. The 45-word length budget was retired on 07-28; the cap is now 150 words and the sentence limit is gone. The 45-second timeout is now 180 seconds, so the threshold line on the latency chart sits four times too low. And the verdict rested on that length axis: a later run reverses it for live-board questions, giving those to Opus on p90 latency.

Sonnet (claude-sonnet-5, current default) Opus (claude-opus, challenger) Large dot = middle of 3 repeats · line = lowest to highest repeat

01

Headline recommendation

The winner was picked by a decision rule written down before any data existed, applied to the measures in a fixed priority order. The choice is a rule outcome, not taste.

Recommendation · decided by
The decision rule, evaluated in order (pre-registered as "D4" before any data existed)
  1. Plain language. If one model leaks internal engineering terms clearly less often (gap over 3 points, no overlap across repeats), it wins here. Tied at 100%, falls through.
  2. Answer length. If one model stays inside the coach's word budget clearly more often (gap over 5 points, no overlap), it wins here. this step fired: 33-point gap, no overlap → sonnet
  3. Responds to her held move. Counts only because its automated scorer passed a 95% human audit first. Never reached.
  4. Tie. Keep the current default, sonnet. Not needed.
Reported, not suppressed The scorecard is not one-sided. Sonnet wins on the measure weighted highest, keeping answers short, but reliability runs the other way: sonnet fails over to a canned reply on 8.2% of turns against opus's 0.5%, and sonnet's first run (12.3%) even breached the 10% health gate both models were expected to clear. Section 5 treats that as a real product finding against the winner, not a footnote. Both models scored 100% on finishing every reply cleanly.
Cost to adopt The winner is the current default (AGENT_SDK_MODEL = claude-sonnet-5), so it confirms the shipped model at no cost.
TakeawayKeep sonnet, the shipped default: plain language tied, so length decided it: 55% inside budget vs opus's 22%, no overlap. The cost is reliability (section 5); the pick holds until that flips.
02

Plain language: does the coach sound like a person?

Share of replies with zero internal engineering vocabulary. The coach should sound like a person, never the machinery behind it. (Internal metric name: jargon-clean rate.)

Replies free of engineering terms (0-100%)
Why the earlier gap vanished, and the lesson it taught An earlier comparison showed 85% vs 38% and looked like one model naturally "talks like an engine." The real cause was the coach's own instruction text, which mentioned the engine. The models were quoting their instructions back. With that instruction text fixed, both models score 100%. The lesson this rerun cemented: fix the structure before comparing models. A broken prompt can make two models look different when they are not, and a bigger model cannot fix a broken prompt.
Technical detail: baseline ran against persona commit ef8aa98 ("the engine's read"); current persona (10619ce) contains zero "engine" language, one un-branched prompt path, plus a runtime voice guard. The checker behind this number was hand-audited at 100% agreement (50/50 rows, both audit rounds).
TakeawayBoth models used plain language in 100% of replies across all six runs. The earlier 85%-vs-38% gap was a prompt bug, not a model difference.
03

Brevity: does the coach keep answers short?

this decided the pick

Share of replies inside the coach's length budget (45 words / 3 sentences; 20 words for quick confirmations). Short answers matter because the coach speaks in the middle of a live game.

Replies inside the length budget (0-100%)
Honest frame, and a fairness concern checked and cleared Neither model is good at this yet: sonnet misses the budget almost half the time. But sonnet is decisively closer to the coach the spec describes, in every one of six runs. Separately, the stakeholder suspected failed replies (timeouts served as canned fallbacks) were being counted against this score. That was verified directly in the scoring code and in the raw counts: failed replies never enter this measure. The concern did not reproduce, so nothing was changed, and the rule is printed below so the check stays visible.
"template/timeout/error rows are pipeline failures and are excluded from this denominator, verified in harness code and in baseline denominators 55/65". Exclusion rule, quoted verbatim from the pre-registered plan. Per-run sample sizes (57/62/60 and 64/65/65) equal 65 minus each run's failed replies, so the exclusion is visible on inspection.
TakeawaySonnet stays inside the 45-word budget 55% of the time (47% to 56% across repeats) against opus's 22% (19% to 28%). The ranges never overlap, and that decided the pick.
04

Staying on topic: does the coach address the move she is weighing?

When the player is holding a candidate move and asks about it, the reply should engage that specific move, judged by a human-audited reading, not keyword matching. Small sample: 14 such prompts per run, so a single miss moves this score 7 points. (Internal metric name: pending-awareness.)

Replies that engage her held move (0-100%)
This number survived a human audit The first automated scorer only gave credit when a reply named the exact square. It failed replies that plainly described her move in words ("steps your knight away from the bishop's attack"), and in an earlier version could pass replies that mentioned a square by coincidence. It was rebuilt and re-audited to 28-out-of-28 agreement with human labels before this number was accepted.
TakeawayBoth models address her held move nearly every time (medians 100%; sonnet missed once in 42 chances), so this measure never had to decide the pick.
05

Reliability: how often live coaching fails over to a canned reply

opus's strongest case

When a reply takes longer than 45 seconds, the player sees a canned fallback message instead of live coaching. This is where opus is genuinely stronger, and the gap survived every control applied to the test.

Canned-fallback rate per run (0-15%)
Timing-bias control: sonnet's fallback rate, before vs after
Each run began with 3 discarded warm-up calls, timing the runner after the warm-up laps, not during them. The models alternated which went first, so time-of-day effects could not quietly favor one side. Uncontrolled baseline: sonnet 10/65 failures front-loaded, opus 0/65.
Response time per run: typical (median) and slowest-tenth (p90), against the 45s limit
Test artifact vs product finding, kept separate Part of the earlier failure rate was the test's fault: cold processes penalized whichever model was timed first, and warm-up roughly halved sonnet's measured failures (15.4% before controls, 8.2% after). What remains is a real product finding, not explained away: even warm and alternated, sonnet serves the canned fallback on roughly 1 turn in 12, with zero hard errors. The pattern is always the same: its slowest replies ride the 45-second limit, on the same two hard open-ended questions in all three of its runs. This finding argues against the recommended model and is reported anyway; it lost only because the decision rule weights brevity above reliability. If that weighting ever flips, the options start here: a longer time limit, an automatic retry, or revisiting the model choice.
TakeawayEven with warm-up and alternated ordering, sonnet fell back to a canned reply on 16 of 195 turns while opus did once: roughly 1 turn in 12 versus 1 in 195, the strongest argument on opus's side.
06

Can the numbers be trusted? The scoring system was itself audited

Every score on this page comes from an automated checker. Before any of them were believed, a human hand-labeled hundreds of replies and compared their judgment to the checker's, requiring 95% agreement on every measure. Bars show final human-vs-checker agreement.

Automated checker vs human judgment, per measure (0-100%)
What the audit caught Two audit rounds (473 then 466 hand-labeled replies). Round 1 found two real scoring bugs, both in the same direction: the checker failed replies a human would pass. A text rule flagged the ordinary word "lets" as if it were the banned casual phrase "let's", and the on-topic scorer refused credit to replies that described her move without naming its square. Both were fixed as exact, testable rules with regression tests, not adjusted until the numbers agreed, and round 2 confirmed the fixes on fresh samples with no new failure modes. One known 1-in-285 word-count quirk (a dash counted as a word) was documented and accepted rather than patched. Honest scope note: one rare reply pattern the fix could theoretically mis-credit never occurred in either sample, so its behavior there is unmeasured.
Technical detail: fixes landed as commits e2d56b8 and 0b58498; full disagreement-by-disagreement ledger in audit/iter-1.md and audit/iter-2.md.
TakeawayAfter two audit rounds, the automated checker agrees with human judgment at 99.6% or better on every measure. The numbers on this page come from a verified instrument, not a trusted script.
07

How the comparison was controlled

The controls that make the pick defensible, and the limitations stated in the same breath.

Run order: six runs, alternating which model went first
    Limitations, stated plainly Three repeats in a single night: the 33-point gap that decided the pick is robust to that, but the small numbers (failure rates, the single on-topic miss) carry real run-to-run noise. Response times ran on a shared subscription backend whose speed varies by the hour. The same question ranged from 20 to 80 seconds, so these timings describe this backend on this night, not the models in the abstract. The alternation was imperfect: sonnet still went first in 2 of 3 pairs, so warm-up is the primary control and ordering the backup. The pick is a mechanical rule standing in for the owner's blinded side-by-side read; if her blind preference contradicts it, that is a finding to investigate, not an error to suppress. Two judgment calls are flagged for her review: her "over 95% accuracy" bar was interpreted as checker-vs-human agreement, and the tie rule defaults to the incumbent model.
    TakeawayThree repeats per model, alternated ordering, warmed processes, a database verified untouched after every run, a decision rule written before the data existed, and a blinded copy waiting for a human read.