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
91 lines
3.7 KiB
Python
Executable File
91 lines
3.7 KiB
Python
Executable File
#!/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()
|