re: RETRACT -- a Canary config dump is the FILE, not the run
Refuted my own evidence with a direct test. The A-press fault page cited the faulting run's dumped logged_profile_slot_0_xuid = "" as proof no profile was signed in. Xenia prints its config dump BEFORE applying command-line overrides: in a run launched with --apu=sdl --hid=file --mute=true --log_mask=13, the dump says apu="any", hid="any", mute=false, log_mask=0. Four for four. So the dump is a statement about xenia-canary.config.toml and nothing else, and this page cannot know the faulting run's profile state. Anything in the corpus citing a config dump as evidence of what a run did is making the same mistake; to know a run's settings, record its argv. Survives: the mechanism (swallow -> unbounded pump -> failed allocation -> fault), which rests on the [RE-INPUT] counter and the crash dump's registers; and canary-scripted-input-traps.md section 3's measured sign-in-dialog claim, which has a capture behind it. Also records the port's base-plus-glow mechanism for the plate, which explains why the pulse floor is 714 rather than the plate-absent 159 -- ptbtn00's fade at t=244 is an exit ramp so the base holds at 255 while the screen is held, and ptbtn00f's 0->80->0 glow draws over it. Marked as agreeing with the measurement, not confirming it: their renderer is not an oracle. It does rule out a glow-only plate, which could not produce a non-zero floor. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
90
tools/re-capture/wait_and_press.py
Executable file
90
tools/re-capture/wait_and_press.py
Executable file
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Wait for the interactive title, press Ⓐ once, and watch what happens.
|
||||
|
||||
The A/B this exists for: does a signed-in profile prevent the Ⓐ fault
|
||||
(`docs/re/structures/title-a-press-fault.md`)? A press sent before the title is
|
||||
up tests nothing, so the wait is a **control on the press**, not a convenience —
|
||||
`is_title.py`'s glyph counter has to clear its threshold first.
|
||||
|
||||
wait_and_press.py OUTDIR [wait_s] [watch_s]
|
||||
|
||||
🔴 The first version of this used a SINGLE frame over a glyph threshold, and it
|
||||
fired on the intro MOVIE — twice, voiding both legs of an A/B. The movie throws
|
||||
green flashes of 1298…5433 lasting under a second, which clears any threshold the
|
||||
title also clears. This is the same trap `is_title.py` records `screen_id.py`
|
||||
falling into (the SQUARE ENIX logo called "title" 151 s in).
|
||||
|
||||
The title is distinguished by the **plate's pulse**, not by brightness: a
|
||||
sustained oscillation that never drops below ~700 and never exceeds ~1600
|
||||
(`docs/re/structures/plate-pulse-measured.md` measured 714…1520). So the detector
|
||||
requires HOLD consecutive samples inside a band. A movie flash is 2–4 samples and
|
||||
overshoots the top of it.
|
||||
"""
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
|
||||
import numpy as np
|
||||
from PIL import Image
|
||||
|
||||
OUT = sys.argv[1]
|
||||
WAIT = float(sys.argv[2]) if len(sys.argv) > 2 else 420
|
||||
WATCH = float(sys.argv[3]) if len(sys.argv) > 3 else 90
|
||||
W, H = 1280, 720
|
||||
NEED = 500 # the plate is up; the floor with no plate is 159
|
||||
CEIL = 2500 # a movie flash overshoots this; the plate peaks at ~1520
|
||||
HOLD = 12 # consecutive in-band samples (~3 s at 4 Hz)
|
||||
|
||||
|
||||
def _open():
|
||||
return subprocess.Popen(
|
||||
["ffmpeg", "-loglevel", "error", "-f", "x11grab", "-draw_mouse", "0",
|
||||
"-video_size", f"{W}x{H}", "-i", ":98", "-r", "4",
|
||||
"-f", "rawvideo", "-pix_fmt", "rgb24", "-"],
|
||||
stdout=subprocess.PIPE, bufsize=W * H * 3 * 2)
|
||||
|
||||
|
||||
def glyph(a):
|
||||
r, g, b = a[:, :, 0], a[:, :, 1], a[:, :, 2]
|
||||
return int(((g > 130) & (g - r > 45) & (g - b > 45)).sum())
|
||||
|
||||
|
||||
p, n, t0, seg = _open(), W * H * 3, time.time(), time.time()
|
||||
log = open(f"{OUT}/series.tsv", "w")
|
||||
log.write("# t_s\tglyph\tmean\tphase\n")
|
||||
phase, pressed_at, streak = "wait", None, 0
|
||||
while True:
|
||||
el = time.time() - t0
|
||||
if phase == "wait" and el > WAIT:
|
||||
print(f"TITLE NEVER APPEARED in {WAIT}s"); break
|
||||
if phase == "watch" and time.time() - pressed_at > WATCH:
|
||||
print("watch window complete"); break
|
||||
if time.time() - seg > 30:
|
||||
p.kill(); p = _open(); seg = time.time()
|
||||
buf = p.stdout.read(n)
|
||||
if len(buf) < n:
|
||||
p.kill(); p = _open(); seg = time.time(); continue
|
||||
a = np.frombuffer(buf, np.uint8).reshape(H, W, 3).astype(int)
|
||||
c = glyph(a)
|
||||
log.write(f"{el:.3f}\t{c}\t{a.mean():.3f}\t{phase}\n"); log.flush()
|
||||
if phase == "wait":
|
||||
streak = streak + 1 if NEED <= c <= CEIL else 0
|
||||
if phase == "wait" and streak >= HOLD:
|
||||
Image.fromarray(a.astype(np.uint8)).save(f"{OUT}/before-press.png")
|
||||
print(f"TITLE UP at {el:.1f}s (glyph {c}, {streak} in-band samples) — pressing A")
|
||||
subprocess.run([sys.executable,
|
||||
os.path.join(os.path.dirname(os.path.abspath(__file__)), "pad.py"),
|
||||
"tap", "A", "0.12"], check=False)
|
||||
pressed_at = time.time(); phase = "watch"
|
||||
p.kill()
|
||||
# a last frame, whatever state it ended in
|
||||
try:
|
||||
p2 = _open(); buf = p2.stdout.read(n); p2.kill()
|
||||
if len(buf) == n:
|
||||
a = np.frombuffer(buf, np.uint8).reshape(H, W, 3).astype(int)
|
||||
Image.fromarray(a.astype(np.uint8)).save(f"{OUT}/after-watch.png")
|
||||
print(f"final glyph {glyph(a)} mean {a.mean():.1f}")
|
||||
except Exception as e:
|
||||
print("final grab failed:", e)
|
||||
log.close()
|
||||
Reference in New Issue
Block a user