Skip to main content

Within One Token of a Human

Trevor McCormick
Data Product @ Disney+

That clip up top: a Djokovic ad point from the Roland Garros final, 5.8 seconds, with the machine's chart assembling token-by-token above the human charter's string. Second serve to the body, backhand exchange, and s5 b3 b3 b1 light green one by one — then the last ball dies on the net tape, the charter writes n, the machine wrote *, and the token glows amber. One token edit. Under the new north star, that point is accepted. The end card is the whole story in four bars.

cv-13 ended with a queue: the dead-ball coda needed a chart-level fix. Chasing it rebuilt the event detector from the net outward, and the rebuild demanded a metric honest enough to say how far the whole project still is from its actual goal. The answer was 2.2%. Then the decomposition of that number found a sign error wearing a direction-model costume.

Crossings first, wobbles second

Two passes set the table. The serve detector went ball-first — the serve is the track's first sustained net crossing, its direction names the server's end — and clay server end went 7/58 to 48/59 (12% → 81%), grass 17/49 to 38/49, with the honest asterisk that grass refuted the ball signal (white ball, white lines: 26/49, a coin flip) so its detector kept the players and only the window learned to slide. Then the coda pass went hunting for a per-event tell that separates a live rally from Wimbledon's dead-ball aftermath and refuted every one — landing positions, walking speed, coverage, all byte-similar — until the rule that held was sequence-level tennis: a live rally sends the ball across the net every shot.

That sentence turned out not to be a truncation rule. It was the detector, inverted. The old design — M2-era cusp classification, tuned on sparse SAM tracks — inspected every wobble in the ball track and asked "hit or bounce?" Diagnosing all 57 rally-count misses (not a sample) found the far-end miss systematic: a far hit at 250+ px is a ~1 px/frame wiggle no near-tuned gate can feel, but its flight crosses the net at full projected speed. And the keystone measurement, taken before any design was written: raw net-crossing count + 1 already beat the entire old detector — rally ±1 of 36/59 vs the chart's 25/59 on clay, 36/49 vs 26/49 on grass, from just counting crossings.

So v5 stops classifying wobbles. Net crossings are the rally skeleton: they partition the point, each partition contains exactly one hit, and the cusp machinery is demoted from counting shots to locating the hit inside its slot. Constants tuned on t3 only, everything else scored untouched — and the tuned tree went 42% → 61% on rally length while letters (aligned) tripled its base, 19/24 → 65/85. The named regression: t1 fell 16/22 → 13/22. The skeleton needs crossings, and the night reel's thin low-recall tracks amputate rallies the old cusp counter used to pad out. A design that leans on the net pays the price wherever the track can't see the ball cross it.

The report card gets a north star

Every scorecard so far graded components — server end, rally length, letters — and components can all drift upward while no single point is actually right. The new metric grades the deliverable. Tokenize both strings as [serve+zone][letter+direction]*[ending] and accept a point iff the machine's list is within one token edit of the human's — strict equality, a ? matches nothing, so refusing to commit costs exactly what being wrong costs.

First reading, all four matches: 3/135. 2.2%. (Before v5 it was 0/135.) That number is the honest distance to "a human charter would sign this," and rather than guess at what to build next, the 7.18 mean token edits per point got backtraced to an alignment and binned:

edit category (mean/point, n=135)      overall
deletion (shot never charted) 1.95
sub: letter AND direction wrong 1.61
sub: direction digit only 1.20
sub: ending token 0.70
insertion (phantom shot) 0.54

Direction digits sit in two of those bins and add up to 2.81 edits per point — 39% of the entire edit budget — attempted on only 70% of shots and 48% right when attempted, barely above the 33% floor. Meanwhile the effort curve says the skeleton v5 just rebuilt is no longer the wall: structure alone (shot count + letters) would already accept 23.7% of points at the same ≤1 bar. And the headroom table turned "what next" from opinion into arithmetic — fix one component to truth, re-score, read the ceiling:

counterfactual                        accept ≤1      mean dist
baseline (v5 as charted) 3/135 ( 2.2%) 7.18
directions perfect (all shots) 9/135 ( 6.7%) 5.88
endings perfect 7/135 ( 5.2%) 6.47
letters + directions 21/135 (15.6%) 3.93
letters + dirs + endings 53/135 (39.3%) 3.23
all components (structure residual) 59/135 (43.7%) 2.93

No single fix rescues the metric — the mean point is wrong on several axes at once. But the compounding is steep and ordered, directions are the biggest single lever, and the tell is in the fine print: perfecting only the attempted directions is worth almost nothing. The sparsity and the accuracy are the same disease.

The mirrored compass

The disease had a name, and it wasn't perception. MCP's instructions define direction 1 as "a right-hander's forehand side (a lefty's backhand)" — and the parenthetical is the tell. That sentence names a fixed side of the receiving half, mirrored by which end is receiving, not flipped by who's holding the racquet. Our zone() had been coding absolute court thirds: correct for a far right-handed receiver by coincidence, mirrored for every near receiver. Half of "barely above the random floor" was a sign error.

Every plausible mapping went into a calibration table before any code, and the both-lefty t1 match is what adjudicated the handedness question: receiver-end mirror without a handedness flip scores 11/24 on the lefties; adding the flip drops it to 5/24. The naive reading of the spec loses to its own parenthetical. On top of the fixed compass, a measured signal ladder gives every shot a direction now — the workhorse is the receiver's next contact (where the ball was received is where this shot went; 77% right, 81% coverage on the dev match), backed by the near-half bounce (86%) and the v5 skeleton moonlighting as a crossing-plus-slope extrapolator. Even refusal policy was an experiment, not a principle: vetoing on disagreement kept precision flat while shedding net-right tokens, and since the metric prices a shrug the same as an error, commit-always won.

Direction attempts went 70% → 97%, accuracy when attempted 48% → 75% — held-out matches gaining right alongside the tuned one — and acceptance moved 3/135 → 7/135, with the ≤5-edit curve jumping 41.5% → 57.0%. Every other metric on all four scorecards is byte-identical, which is exactly the claim a direction-only change should be able to make. The meta-lesson joins the permanent file: when a component scores near the random floor, check the semantics before rebuilding the perception. A 27-point accuracy jump was sitting in a coordinate convention the whole time.

The scorecard

Four matches, three surfaces, both tours, 168 points aligned to human charts — and one number that now leads every eval printout:

metric              t1 night   t2 ctrl   t3 clay      t4 grass
server end 10/22 2/5 48/59 (81%) 37/49 (76%)
rally length ±1 13/22 5/5 36/59 (61%) 28/49 (57%)
serve zone 11/12 1/3 8/17 15/32
letters (aligned) 9/11 12/12 65/85 (76%) 15/28
ending type 9/16 2/3 19/42 9/33
acceptance ≤1 edit 3/22 1/5 3/59 0/49

acceptance at ≤ k token edits (n=135):
≤1: 2.2 → 5.2% ≤2: 6.7 → 11.1% ≤3: 14.8 → 23.7% ≤5: 41.5 → 57.0%

The honest reads stay on the record: t4 is 0/49 strict — its disease is structure (1.24 phantom insertions plus deletions per point), and no direction digit fixes a token that shouldn't exist. t3's missing shots are mostly the film's fault, not ours — the RG editor cuts into rallies — and structure caps the all-components ceiling at 44%. The re-run decomposition already names the next levers in order: structure, letters, endings — one token per point, 30% right.

Two percent was the first honest reading of the mountain. Five percent is the second. The difference is that the climb now has arithmetic instead of opinion.

Session cost: $0.00. Project total: ~$4.15 of $9.