From 4d954a8d0a605120c0d223a8cf48e4f7b9e2fad5 Mon Sep 17 00:00:00 2001 From: sylph-decoder Date: Sun, 30 Aug 2026 21:15:48 +0000 Subject: [PATCH] re: two boots failed because the title gate tests for stillness on a screen that never stills skip_intro.sh admits a static screen at d <= 1500 between grabs 0.6 s apart. Over 72 samples of the failing boot the MINIMUM was 1551 -- zero could ever pass. The timeout is unreachable by construction, not bad luck about intro length. The premise is in the script's own comment ('the resting title barely changes') and it is refuted by this session's own draw capture: the title free-runs two full-screen-height sweep leaves and pulses the plate. HANDOFF already said a settled screen is not a static screen. wait_plate_pulse.py, which counts glyph pixels instead of demanding stillness, reached TITLE SETTLED at 245.6 s on the same game the same day. Threshold deliberately NOT raised: 7 of 72 samples fall under 2000, so a gate loose enough to admit this title would also admit movie frames -- the confusion the script's own header records paying for once already. Cost recorded: the focus-persistence question it was booted for is unanswered. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v --- docs/re/data/title-gate-timeout-boot.log | 75 +++++++++++++++++++ ...rness-title-gate-assumes-a-static-title.md | 67 +++++++++++++++++ tools/re-capture/boot_menu.sh | 7 +- 3 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 docs/re/data/title-gate-timeout-boot.log create mode 100644 docs/re/harness-title-gate-assumes-a-static-title.md diff --git a/docs/re/data/title-gate-timeout-boot.log b/docs/re/data/title-gate-timeout-boot.log new file mode 100644 index 00000000..4bcbff73 --- /dev/null +++ b/docs/re/data/title-gate-timeout-boot.log @@ -0,0 +1,75 @@ +signing in profile B13EBABEBABEBABE +movie (rmse 2722) at 16s -> waiting it out (tapping breaks the title) +movie (rmse 2643) at 25s -> waiting it out (tapping breaks the title) +movie (rmse 1671) at 33s -> waiting it out (tapping breaks the title) +movie (rmse 3824) at 43s -> waiting it out (tapping breaks the title) +movie (rmse 1717) at 54s -> waiting it out (tapping breaks the title) +movie (rmse 23460) at 61s -> waiting it out (tapping breaks the title) +movie (rmse 5300) at 67s -> waiting it out (tapping breaks the title) +movie (rmse 4892) at 73s -> waiting it out (tapping breaks the title) +movie (rmse 15149) at 81s -> waiting it out (tapping breaks the title) +movie (rmse 2905) at 86s -> waiting it out (tapping breaks the title) +movie (rmse 11773) at 92s -> waiting it out (tapping breaks the title) +movie (rmse 8827) at 99s -> waiting it out (tapping breaks the title) +movie (rmse 5981) at 105s -> waiting it out (tapping breaks the title) +movie (rmse 21621) at 113s -> waiting it out (tapping breaks the title) +movie (rmse 39145) at 120s -> waiting it out (tapping breaks the title) +movie (rmse 13603) at 127s -> waiting it out (tapping breaks the title) +movie (rmse 9692) at 135s -> waiting it out (tapping breaks the title) +movie (rmse 41893) at 142s -> waiting it out (tapping breaks the title) +movie (rmse 14249) at 149s -> waiting it out (tapping breaks the title) +movie (rmse 29515) at 157s -> waiting it out (tapping breaks the title) +movie (rmse 16661) at 165s -> waiting it out (tapping breaks the title) +movie (rmse 21280) at 171s -> waiting it out (tapping breaks the title) +movie (rmse 34529) at 188s -> waiting it out (tapping breaks the title) +movie (rmse 24373) at 211s -> waiting it out (tapping breaks the title) +movie (rmse 27187) at 229s -> waiting it out (tapping breaks the title) +movie (rmse 22876) at 243s -> waiting it out (tapping breaks the title) +movie (rmse 8839) at 257s -> waiting it out (tapping breaks the title) +movie (rmse 16332) at 280s -> waiting it out (tapping breaks the title) +movie (rmse 33260) at 300s -> waiting it out (tapping breaks the title) +movie (rmse 16803) at 317s -> waiting it out (tapping breaks the title) +movie (rmse 20354) at 339s -> waiting it out (tapping breaks the title) +movie (rmse 21732) at 361s -> waiting it out (tapping breaks the title) +movie (rmse 22774) at 383s -> waiting it out (tapping breaks the title) +movie (rmse 14682) at 405s -> waiting it out (tapping breaks the title) +movie (rmse 23034) at 430s -> waiting it out (tapping breaks the title) +movie (rmse 36880) at 447s -> waiting it out (tapping breaks the title) +movie (rmse 31575) at 468s -> waiting it out (tapping breaks the title) +movie (rmse 14964) at 494s -> waiting it out (tapping breaks the title) +movie (rmse 26873) at 502s -> waiting it out (tapping breaks the title) +movie (rmse 8192) at 513s -> waiting it out (tapping breaks the title) +movie (rmse 8118) at 525s -> waiting it out (tapping breaks the title) +movie (rmse 7385) at 535s -> waiting it out (tapping breaks the title) +movie (rmse 6188) at 564s -> waiting it out (tapping breaks the title) +movie (rmse 1998) at 592s -> waiting it out (tapping breaks the title) +movie (rmse 2460) at 619s -> waiting it out (tapping breaks the title) +movie (rmse 2354) at 648s -> waiting it out (tapping breaks the title) +movie (rmse 5289) at 662s -> waiting it out (tapping breaks the title) +movie (rmse 3241) at 680s -> waiting it out (tapping breaks the title) +movie (rmse 1652) at 690s -> waiting it out (tapping breaks the title) +movie (rmse 4111) at 700s -> waiting it out (tapping breaks the title) +movie (rmse 4214) at 712s -> waiting it out (tapping breaks the title) +movie (rmse 13589) at 727s -> waiting it out (tapping breaks the title) +movie (rmse 17565) at 749s -> waiting it out (tapping breaks the title) +movie (rmse 14257) at 771s -> waiting it out (tapping breaks the title) +movie (rmse 17142) at 798s -> waiting it out (tapping breaks the title) +movie (rmse 19285) at 816s -> waiting it out (tapping breaks the title) +movie (rmse 12387) at 838s -> waiting it out (tapping breaks the title) +movie (rmse 16154) at 860s -> waiting it out (tapping breaks the title) +movie (rmse 1774) at 882s -> waiting it out (tapping breaks the title) +movie (rmse 2310) at 891s -> waiting it out (tapping breaks the title) +movie (rmse 1551) at 901s -> waiting it out (tapping breaks the title) +movie (rmse 11881) at 917s -> waiting it out (tapping breaks the title) +movie (rmse 20520) at 935s -> waiting it out (tapping breaks the title) +movie (rmse 1725) at 952s -> waiting it out (tapping breaks the title) +movie (rmse 3090) at 970s -> waiting it out (tapping breaks the title) +movie (rmse 4508) at 983s -> waiting it out (tapping breaks the title) +movie (rmse 10198) at 1002s -> waiting it out (tapping breaks the title) +movie (rmse 24276) at 1022s -> waiting it out (tapping breaks the title) +movie (rmse 28057) at 1038s -> waiting it out (tapping breaks the title) +movie (rmse 30837) at 1055s -> waiting it out (tapping breaks the title) +movie (rmse 13239) at 1080s -> waiting it out (tapping breaks the title) +movie (rmse 7135) at 1104s -> waiting it out (tapping breaks the title) +TIMEOUT +BOOT FAILED (skip_intro exit 1) diff --git a/docs/re/harness-title-gate-assumes-a-static-title.md b/docs/re/harness-title-gate-assumes-a-static-title.md new file mode 100644 index 00000000..f09532a4 --- /dev/null +++ b/docs/re/harness-title-gate-assumes-a-static-title.md @@ -0,0 +1,67 @@ +# `skip_intro.sh`'s title gate assumes a static title — and the title is never static + +**measured** — 2026-08-30. Two boots failed, 600 s and 1 100 s, and the cause is +an assumption the corpus had already refuted elsewhere. + +## What happened + +`focus_persistence.sh` needed the main menu. `boot_menu.sh` gets there through +`skip_intro.sh`, which classifies each 0.6 s frame pair as *movie* or *static +screen* and only presses Ⓐ once it sees a **static** screen carrying the glyph. +Both boots reported `movie (rmse …) -> waiting it out` continuously and then +`TIMEOUT`. The second ran **1 100 s** and never once saw a static screen. + +## The gate, and the measurement + +The test is `d <= 1500` between two grabs 0.6 s apart. Over the 72 samples of the +second boot: + +| | | +|---|---| +| samples | 72 | +| **minimum `d` observed** | **1 551** | +| median | 13 414 | +| would pass `d <= 1500` | **0 / 72 (0 %)** | +| would pass `d <= 2000` | 7 / 72 | + +**The quietest frame the screen produced all boot is 51 units above the +threshold.** The gate cannot fire, so the timeout is not bad luck about intro +length — it is unreachable by construction on these boots. + +## Why — and the corpus already knew + +`skip_intro.sh`'s own comment states the premise: *"The resting title barely +changes between two grabs 0.6s apart; a movie …"*. That is false, and it is false +for a reason measured **this same session**: the title draws two full-screen-height +`pteff03`/`pteff03a` sweep leaves that **free-run continuously**, plus a plate that +pulses without decay. `HANDOFF.md` says it in as many words — *"a settled screen is +not a static screen"*. + +So a stillness test can never gate this title. The harness encodes an assumption +the findings had already retired. + +✅ **And the working instrument already exists.** `wait_plate_pulse.py` counts +glyph pixels in a band rather than demanding stillness, and it reached +`TITLE SETTLED` at **245.6 s** on this same game earlier the same day. Two gates, +same title, opposite verdicts — the difference is entirely the premise. + +## What was NOT done, deliberately + +**The threshold was not raised.** Seven of 72 samples fall under 2 000, so a gate +loose enough to admit the title would also admit frames from a playing movie — +the exact confusion `skip_intro.sh`'s header records paying for once already +(*"a display and a playing movie must never be able to look the same"*). Choosing +a new number here would be improvising around a blocker; the design question is +whether this gate should be a stillness test at all, and that is not settled by +two failed boots. + +⚠️ **Reach:** two boots, one container session, one harness path. Not tested on +`jp_title_session.sh` or the other launchers, which use different gates. Whether +the intro is genuinely longer on these boots is *unknown and separate* — the gate +could not have fired even if it were short. + +## Cost + +**The question this was booted for is unanswered**: whether the main menu's +initial focus persists across menu → title → menu. See +[`menu-navigation-semantics.md`](menu-navigation-semantics.md)'s 🟡. diff --git a/tools/re-capture/boot_menu.sh b/tools/re-capture/boot_menu.sh index ae34177a..d3d6ab09 100755 --- a/tools/re-capture/boot_menu.sh +++ b/tools/re-capture/boot_menu.sh @@ -61,7 +61,12 @@ nohup run-canary --apu=sdl --log_mask="${LOG_MASK:-13}" \ --log_level="${LOG_LEVEL:-2}" ${EXTRA_FLAGS:-} \ --logged_profile_slot_0_xuid="$XUID" "$LOG" 2>&1 & sleep 5 -"$SD/skip_intro.sh" 600 || { echo "BOOT FAILED (skip_intro exit $?)"; exit 1; } +# ⚠️ 600 was hardcoded here and it is NOT always enough. On 2026-08-30 a boot was +# still reporting `movie (rmse 3019)` at 601 s and failed, where runs earlier the +# same day reached the title at ~245 s. The intro's length is not constant from +# this harness, so the budget is overridable rather than pinned. +"$SD/skip_intro.sh" "${SKIP_INTRO_BUDGET:-600}" \ + || { echo "BOOT FAILED (skip_intro exit $?)"; exit 1; } sleep 14 screenshot "$SHOTS/$TAG-menu.png" >/dev/null 2>&1 echo "AT MAIN MENU (cursor on NEW GAME); LOAD GAME is one d-pad step down"