diff --git a/docs/port/HANDOFF.md b/docs/port/HANDOFF.md index 0e0b1be8..e143dfca 100644 --- a/docs/port/HANDOFF.md +++ b/docs/port/HANDOFF.md @@ -35,9 +35,17 @@ transition orders them. [`data/fade-four-transitions.txt`](../re/data/fade-four- | EXTRAS → menu (Ⓑ) | **2** | EXTRAS | | title → menu (Ⓐ) ×3 | **3, 3, 3** | title | -📌 **The gap is a property of the screen being LEFT.** Two transitions leaving the -menu give 0 and 1; the one leaving `EXTRAS` gives 2; the three leaving the title -give 3 every time. +📌 **The gap tracks the screen being LEFT — but CONSTRAINS rather than determines +it.** ⚠️ Corrected the same day, prompted by `sylpheed-port` asking for *"a second +value on any one outgoing screen"*: **the menu already has two, and they differ** — +0 leaving for the title, 1 leaving for `EXTRAS`. So "the outgoing screen determines +the gap" is too strong and I withdraw that phrasing. What holds is an ordering: +menu {0, 1} < `EXTRAS` {2} < title {3, 3, 3}. + +⚠️ **And their ask is answerable only from the menu.** The title's sole exit is Ⓐ +to the menu and `EXTRAS`'s sole exit is Ⓑ to the menu, so neither can supply a +second destination. The menu is the only screen in this archive with more than one +way out, which caps what these five transitions can establish. * **Direction is ruled out** — `EXTRAS → menu` (2) and `menu → EXTRAS` (1) are the same pair both ways and differ. diff --git a/docs/re/data/fade-four-transitions.txt b/docs/re/data/fade-four-transitions.txt index d29716c0..f3f8d7f4 100644 --- a/docs/re/data/fade-four-transitions.txt +++ b/docs/re/data/fade-four-transitions.txt @@ -173,3 +173,41 @@ frame untextured full-screen textured (distinct) draws tex # the data; a rule would PREDICT. And nothing declared does: the outgoing close is # 5, 5, 5, 4 frames against gaps 0/1, 2, 3 -- if anything inverted, on three # points. Recorded as a narrowing of WHERE to look, not as a rule. + +################################################################################ +# SIXTH TRANSITION: menu -> a screen OUTSIDE GP_TITLE, via (A). 2026-08-30. +# +# Taken because sylpheed-port's BLOCKED row asks for a SECOND VALUE ON ONE +# OUTGOING SCREEN -- the thing that would make "the gap tracks the outgoing +# screen" predictive rather than a restatement. ⚠️ The menu is the only screen in +# GP_TITLE that can supply it: the title's sole exit is (A) to the menu and +# EXTRAS's sole exit is (B) to the menu, so neither has a second destination. +# +# ⚠️ CONFOUND NAMED IN ADVANCE, before the result was seen: this transition leaves +# the ARCHIVE, so a pak load could inflate the gap for reasons having nothing to +# do with the outgoing screen. +# +# frames 4-21 menu settled ([64] = pteff02.prm) +# frames 24-28 outgoing quad 25, 127, 255 -- 4-5 frames, matching build 5's +# declared close of 10 units = 5 frames +# frame 30 EMPTY: 3 draws, 0 textured +# frames 32+ the new screen builds ([127] primitive, not the menu's [64]) +# +# ✅ GAP = 1, the same as menu -> EXTRAS. So the confound is MEASURED ABSENT: +# leaving the archive costs no extra black. That is worth having on its own. +# +################################################################################ +# SIX TRANSITIONS, GROUPED BY OUTGOING SCREEN +# +# outgoing screen gaps n +# menu (build 5) 0, 1, 1 3 -> title, -> EXTRAS, -> another archive +# EXTRAS (build 6) 2 1 -> menu +# title (build 4) 3, 3, 3 3 -> menu (three runs) +# +# 🟡 The ordering menu {0,1} < EXTRAS {2} < title {3} now rests on 3 + 1 + 3 +# measurements rather than 2 + 1 + 3, and the menu's three values agree to within +# ONE frame across three different destinations, one of them in another pak. +# +# 🔴 Still not predictive. Nothing declared separates 0/1 from 2 from 3: the +# outgoing closes are 5, 5, 4 frames for menu, EXTRAS, title against gaps of +# {0,1}, {2}, {3}. And EXTRAS still has n=1 with no way to get a second value. diff --git a/tools/re-capture/fade_decompose.sh b/tools/re-capture/fade_decompose.sh index 5a257bc5..275d51f4 100755 --- a/tools/re-capture/fade_decompose.sh +++ b/tools/re-capture/fade_decompose.sh @@ -76,6 +76,31 @@ if [ "$WHERE" = "menu" ]; then done [ "$s" = "menu" ] || { echo "NO MENU (screen=$s)"; exit 2; } BTN=B +elif [ "$WHERE" = "menu2other" ]; then + # A THIRD value for the menu as outgoing screen. The menu is the only screen in + # GP_TITLE with more than one exit, so it is the only place the port's ask -- a + # second value on one outgoing screen -- can be tested at all. Here we take an + # exit that LEAVES the archive (NEW GAME / LOAD / TUTORIAL / OPTIONS), which the + # discriminator reports as "neither" with a collapsed margin. + BRANCH="menu2other: arm on the MENU with focus on a non-EXTRAS item -> press (A)" + python3 "$SD/pad.py" tap A 0.5 + for _ in 1 2 3 4 5 6; do + sleep 4; s="$(screen)"; echo " after A: $s" + [ "$s" = "menu" ] && break + done + [ "$s" = "menu" ] || { echo "NO MENU (screen=$s)"; exit 2; } + # Confirm the focused item is NOT extras: press (A), check, (B) back. If it WAS + # extras, step the cursor once so the armed press goes somewhere else. + python3 "$SD/pad.py" tap A 0.5; sleep 5 + shot "$OUT/probe.png" + w="$(python3 "$SD/which_title_screen.py" "$OUT/probe.png")" + echo " probe: $w" + python3 "$SD/pad.py" tap B 0.5; sleep 6 + case "$w" in extras*) echo " focus was EXTRAS — stepping once" + python3 "$SD/pad.py" dpad UP 0.3; sleep 2;; esac + shot "$OUT/armed-on-menu.png" + echo " arming on: $(python3 "$SD/which_title_screen.py" "$OUT/armed-on-menu.png")" + BTN=A elif [ "$WHERE" = "extras" ] || [ "$WHERE" = "menu2extras" ]; then BRANCH="extras-family: navigate to EXTRAS" python3 "$SD/pad.py" tap A 0.5