The ja DIFFICULTY capture failed because focus_persistence.py's round trip --
menu, B to title, A back -- did not return, leaving the game off-menu, and the
sweep that followed timed out with nothing to work with. Arriving at the menu is
the cheap part; the round trip is that probe's own experiment and is not every
caller's.
--reach-only stops once the menu is reached, and the session script passes it
through REACH_ONLY.
Committed before running.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
Sweep 1: ring_row.py scans x 500:542, the main menu's gutter. EXTRAS happened to
put its ring there; LOAD GAME, TUTORIAL and OPTIONS do not, so the reader found a
static element and all three voided on 'the ring did not move'. Differencing S1
against S2 shows the cursors moved at x 97..231, 338..1099 and 153..479.
Sweep 2: replaced the reader with a whole-frame comparison, controlled on the
EXTRAS frames whose answer is known. Then the guest crashed -- the already
documented STL map/set erase at PC 0x82307128, firing early in the boot, not
something B did -- and Xenia's crash dialog covers the screen centre, so a
whole-frame identity test can never match again. The narrow ring column the dialog
does not cover was reading correctly the whole time. I traded one blindness for
another, and did it because the first instrument had just failed.
Refutation attempt on 'B on a submenu restores the parent's focus' (4/4): it
SURVIVES, and the run I had written off is what corroborates it. The stuck frame
has the ring at y 303.5 = LOAD GAME, the item entered from. A fifth instance.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
menu_focus.py's row centres are design-space rows from screenshot output; my
probes fed it whole-display x11grab frames carrying Xenia's chrome and a surface
scaled 1.060. Caught by ground truth, not by a control: the probe announced 'on
EXTRAS', pressed A, and opened OPTIONS.
Measured directly with ring_row.py: initial focus on a fresh boot is NEW GAME,
2/2 fresh boots, both the first menu entry. That agrees with boot_menu.sh's own
line and menu-state-in-memory.md's four-downs, and withdraws this page's
'TUTORIAL 2/2' as the outlier.
Persistence stands and is now geometry-free -- 384.0 vs 385.5, 1.5 px apart. An
equality test is immune to a constant offset, which is why the conclusion survived
a broken reader when the published item names did not.
The control was structurally blind: 'two DOWNs move two items' tests relative
motion, and a constant offset preserves it exactly.
EXTRAS remains unmeasured; that run navigated to OPTIONS.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v