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"