You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: 8x the action_frame table from a live Mewtwo pair (9 -> 75 actions)
Recorded a real pair on the laptop — Mewtwo policy vs level-9 Fox CPU,
9189 frames — and merged its mapping. Coverage was the binding constraint
on task #8's fix being useful for Mewtwo; it no longer is.
Share of frames the table can normalize:
fixture 9 actions 75 actions
mewtwo_behind_response 9.7% 95.4%
mewtwo_dtilt_uptilt_dense 8.4% 91.0%
fox_multishine_closed 77.3% 85.9%
gnw_neutral_dense 16.5% 82.6%
gnw_movement_ledge 25.9% 74.4%
mewtwo_approach_fair 12.1% 54.9%
The pair validates cleanly: 100% agreement on action, on_ground and y over
all 9189 frames, action_frame the ONLY field that shifts, every action a
single consistent delta — reproducing on Mewtwo what phase 1 found on Fox.
Cross-validation, the part that matters: the 6 actions measured by BOTH
sources (24, 25, 29, 42, 323, 360) agree exactly, despite one being a
frame-perfect Fox TAS loop and the other a Mewtwo bot in a real match. The
convention is a property of Peppi-vs-libmelee, not of a character or a
technique. Every delta ever measured is 0 or 1, now asserted.
Trace emitter now SKIPS menu frames. The frame counter resets between games
and idles in menus, so a trace spanning them carries duplicate frame
numbers, and a duplicate silently pairs the wrong live frame to a parsed
one. Cost when it happened: this very pair first scored 98.0% action
agreement — close enough to look right, useless in fact — purely from
post-game frames. Trimming to the in-game run gave exactly 100%. Emitting
only IN_GAME/SUDDEN_DEATH makes that structural. Unknown menu_state still
emits: a noisy trace is recoverable, a missing one is not.
The anti-drift test becomes a CONSISTENCY check (the committed Fox pairs
must never contradict the table) plus an exact pin against
test/fixtures/statestream/action_frame_map.json, since the table is now
broader than the vendored fixtures. Hand-editing @deltas without
re-measuring still fails.
Tests that used action 14 as "unmeasured" now use 252 (cliff catch) — 14 is
measured (delta 1). 5 doctests + 6 properties + 470 tests, 0 failures.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
0 commit comments