diff --git a/docs/re/METHOD.md b/docs/re/METHOD.md index 15c0965c..d7a1cd2f 100644 --- a/docs/re/METHOD.md +++ b/docs/re/METHOD.md @@ -2340,3 +2340,16 @@ detector can discard a candidate, it must say how many it discarded, or its clea run is unfalsifiable. Both of us reached the same structural conclusion from opposite failures within a day — theirs by over-reporting loudly, mine by passing quietly, which is why mine went unnoticed and theirs did not. + +### The suppressed set, read — and it is clean + +The 7 suppressed mentions (8 before a dedup fix; two registered claims can be +substrings of one line, which printed it twice) were read individually rather than +left as a number. **All 7 are genuine correction contexts** — an *"An earlier +version of this bullet said"*, a *"Withdrawing …"*, an explicit *"does **not** +revive …"*, two bullets under *"🔴 What this retracts"*, a *"supersedes the … +banner"*, and one *"recorded as … It was on the disc all along"*. **Zero live +revivals.** + +So the register's clean run is now backed by a reading. That is the point: the +number was worth nothing until someone looked, and looking took one pass. diff --git a/tools/re-capture/check_refuted.py b/tools/re-capture/check_refuted.py index 664f007e..9f7eb8b2 100755 --- a/tools/re-capture/check_refuted.py +++ b/tools/re-capture/check_refuted.py @@ -53,6 +53,7 @@ for line in ref.read_text().splitlines(): print(f"{len(claims)} quoted claims in REFUTED.md\n") hits = 0 suppressed = [] +seen_marked = set() for c in claims: needle = c.strip() for f in root.rglob("*.md"): @@ -76,7 +77,11 @@ for c in claims: near = "\n".join(lines[lo:hi]) + "\n" + hdr marked = any(m.lower() in near.lower() for m in MARKERS) if marked: - suppressed.append((f, i + 1, needle, l.strip())) + # dedup like the reported path: two registered claims can be + # substrings of one line, which printed it twice. + if (f, i) not in seen_marked: + seen_marked.add((f, i)) + suppressed.append((f, i + 1, needle, l.strip())) continue if (f, i) not in seen_report: seen_report.add((f, i)) diff --git a/tools/re-capture/focus_persistence.sh b/tools/re-capture/focus_persistence.sh new file mode 100755 index 00000000..ff75eb02 --- /dev/null +++ b/tools/re-capture/focus_persistence.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +# Does the main menu REMEMBER its cursor across menu -> title -> menu? +# +# menu-navigation-semantics.md carries this 🟡: "Initial focus is reproducible +# but not established as invariant. Both of my boots opened on TUTORIAL, and +# both used boot_menu.sh." Two runs through one harness are not two samples -- +# the same shape as two captures through one gate (plate-pulse-phase-lock.md). +# +# And the sources DISAGREE. boot_menu.sh's own final line says "cursor on NEW +# GAME"; the page says TUTORIAL 2/2; menu-state-in-memory.md reaches EXTRAS in +# four downs, which only counts from NEW GAME. Two say NEW GAME, one says +# TUTORIAL. +# +# ONE BOOT settles both, and the round trip is the part no run has done: +# F1 focus when the menu first appears <- re-measures initial focus +# F2 focus after 2x DOWN <- CONTROL for the reader +# F3 focus after B (to title) then A (back) <- persist or reset? +# +# F3 == F2 => the menu restores where you were; F3 == F1 => it resets. +# If F2 is not two items below F1 the reader is not tracking the cursor and +# NOTHING below it may be read. Run as ONE BLOCKING FOREGROUND call. +set -u +export HOME=/sylph-home/re SDL_AUDIODRIVER=dummy DISPLAY=:98 +SD="$(cd "$(dirname "$0")" && pwd)" +OUT="${OUT:-/sylph-home/re/focuspersist}"; mkdir -p "$OUT" +NAMES=(NEW_GAME LOAD_GAME TUTORIAL OPTIONS EXTRAS) + +. "$SD/ensure_single_emulator.sh" + +echo "── EFFECTIVE CONFIG ──────────────────────────────" +echo " out dir = $OUT" +echo " harness = boot_menu.sh (the one under suspicion)" +echo " sequence = F1 -> 2x DOWN -> F2 -> B -> plate pulse -> A -> F3" + +BOOT_MENU_LOG="$OUT/boot.stdout" "$SD/boot_menu.sh" fp >"$OUT/boot.log" 2>&1 \ + || { echo "BOOT FAILED"; tail -5 "$OUT/boot.log"; exit 1; } +tail -2 "$OUT/boot.log" + +shot(){ screenshot "$OUT/$1.png" >/dev/null 2>&1; } +focus(){ python3 "$SD/menu_focus.py" "$OUT/$1.png" | tail -1; } + +shot f1; echo "F1 $(focus f1)" + +python3 "$SD/pad.py" dpad down 0.06; sleep 1 +python3 "$SD/pad.py" dpad down 0.06; sleep 2 +shot f2; echo "F2 $(focus f2)" + +echo "-- B to the title --" +python3 "$SD/pad.py" tap B 0.25 +python3 "$SD/wait_plate_pulse.py" 120 >"$OUT/pulse.log" 2>&1 \ + && echo " title settled (plate pulse)" || echo " ⚠️ NO PLATE PULSE in 120 s" +shot title + +echo "-- A back to the menu --" +python3 "$SD/pad.py" tap A 0.25; sleep 12 +shot f3; echo "F3 $(focus f3)" + +echo "FOCUS PERSISTENCE RUN DONE"