From d0e3dc6f333b71b639a32d091e5aad187fa5ccde Mon Sep 17 00:00:00 2001 From: Sylpheed RE agent Date: Wed, 19 Aug 2026 04:43:25 +0000 Subject: [PATCH] =?UTF-8?q?docs/re:=20three=20more=20runs,=20and=20eh=5Fdi?= =?UTF-8?q?spatch=20is=20still=20untested=20=E2=80=94=20with=20the=20proof?= =?UTF-8?q?=20why?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drove NEW GAME deliberately (the menu's first item, no d-pad, which is what the run that first hit the crash actually did). Three runs with --eh_dispatch on: no crash, no throw, black screen before the save-slot screen. It is tempting to read that as the flag working. The run with --cache_throw_diag as well disproves it. That cvar logs the throw BEFORE any dispatch is attempted, so a throw would appear whatever dispatch then did — and there were zero. No guest exception happened, so neither flag ran any code, so neither can explain the difference. What took those runs out is the intermittent content-load hang, before the crash path was reached. eh_dispatch therefore stays untested, and the entry says so with the reasoning rather than banking a false pass. Confirmed on the way: the screen after NEW GAME is DIFFICULTY — its whole-image signature matches the earlier capture exactly — so the menu path is understood even though the runs die after it. --- docs/re/canary-scripted-input-traps.md | 29 ++++++++++++++ tools/re-capture/newgame_path.sh | 53 ++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100755 tools/re-capture/newgame_path.sh diff --git a/docs/re/canary-scripted-input-traps.md b/docs/re/canary-scripted-input-traps.md index 6d421f5..54b1e4f 100644 --- a/docs/re/canary-scripted-input-traps.md +++ b/docs/re/canary-scripted-input-traps.md @@ -352,3 +352,32 @@ Neither has been beaten, and this run tested neither: it took a different branch through the menus than the run before it (TUTORIAL leads to a lesson list, and the DIFFICULTY screen captured earlier came from a different selection). The `--eh_dispatch` test needs a run that actually reaches `SELECT DATA`. + +### `--eh_dispatch` is still untested, and here is why that is a logical claim, not an excuse + +Three more runs, driving **NEW GAME** deliberately (the menu's first item, no +d-pad — which is what the run that first hit the crash actually did, though it +believed it had chosen TUTORIAL): + +| flags | reached | crash dumps | `GUEST-THROW` | +|---|---|---|---| +| *(none)* — earlier run | menu → DIFFICULTY → **SELECT DATA** | **537** | yes | +| `--eh_dispatch=true` ×2 | menu → black | 0 | 0 | +| `--eh_dispatch=true --cache_throw_diag=true` | menu → **DIFFICULTY** → black | 0 | **0** | + +The third row is the informative one. `cache_throw_diag` runs `LogGuestThrow` +**before** any dispatch is attempted, so a throw would have been logged whatever +the dispatch then did — and there were **none**. So no guest exception occurred +in that run at all, and neither flag can have changed anything: both are inert +until a throw happens. + +**Therefore the difference between the rows is not the flags.** It is the +intermittent content-load hang, which took the run out before it reached the +save-slot screen. The flag remains untested for the reason the runs record, and +the temptation to read "0 crashes with `--eh_dispatch`" as a fix is exactly what +the log disproves. + +Also confirmed on the way: the screen after NEW GAME is **DIFFICULTY** — its +whole-image signature `(9.7, 19.5, 53.9)` matches the earlier capture of that +screen exactly — so the menu path is understood even though the run dies after +it. diff --git a/tools/re-capture/newgame_path.sh b/tools/re-capture/newgame_path.sh new file mode 100755 index 0000000..afc5570 --- /dev/null +++ b/tools/re-capture/newgame_path.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +# Boot -> title -> main menu -> NEW GAME -> DIFFICULTY -> SELECT DATA, and report +# the crash count there. +# +# NEW GAME is the menu's FIRST item, so this presses (A) with no d-pad movement — +# which is also what the run that first hit the SELECT DATA crash did, though it +# thought it was choosing TUTORIAL (the d-pad steps had not registered). TUTORIAL +# leads somewhere else entirely, to a lesson list, so it cannot test this crash. +# +# EXTRA_FLAGS is passed to the emulator, e.g. --eh_dispatch=true. +set -u +export HOME=/sylph-home/re SDL_AUDIODRIVER=dummy DISPLAY=:98 +SD="$(cd "$(dirname "$0")" && pwd)" +OUT="${1:-/sylph-home/re/newgame}" +mkdir -p "$OUT" +shot(){ screenshot "$1" >/dev/null 2>&1; } +screen(){ shot /tmp/ng.png; python3 "$SD/screen_id.py" /tmp/ng.png | awk '{print $1}'; } +crashes(){ grep -c "CRASH DUMP" "$OUT/canary.stdout" 2>/dev/null || echo 0; } +alive(){ ps -o pid=,stat= -C xenia_canary 2>/dev/null | awk '$2 !~ /^Z/ {print $1}'; } + +for attempt in $(seq 1 "${ATTEMPTS:-3}"); do +echo "=== attempt $attempt flags: ${EXTRA_FLAGS:-}" +pkill -9 -x xenia_canary 2>/dev/null; sleep 3 +( cd "$OUT" && nohup run-canary --mem_watch=false ${EXTRA_FLAGS:-} \ + --logged_profile_slot_0_xuid=B13EBABEBABEBABE >"$OUT/canary.stdout" 2>&1 & ) +sleep 8 +until xdotool search --name "Xenia-canary" >/dev/null 2>&1; do + [ -n "$(alive)" ] || { echo "EMULATOR GONE"; exit 4; }; sleep 1 +done + +s=""; deadline=$(( SECONDS + 420 )) +while [ $SECONDS -lt $deadline ]; do + s="$(screen)"; [ "$s" = "title" ] && break; sleep 2 +done +[ "$s" = "title" ] || { echo "NO TITLE this attempt"; continue; } +echo "title -> A" +python3 "$SD/pad.py" tap A 0.3 +for _ in 1 2 3 4 5 6 7 8; do sleep 3; s="$(screen)"; [ "$s" = "menu" ] && break; done +[ "$s" = "menu" ] || { echo "(A) not accepted; rebooting"; continue; } + +echo "menu -> A (NEW GAME, no d-pad)" +python3 "$SD/pad.py" tap A 0.3; sleep 10; shot "$OUT/step1.png" +echo " after NEW GAME: $(screen) crashes=$(crashes)" +echo "difficulty -> A (NORMAL)" +python3 "$SD/pad.py" tap A 0.3 +for i in $(seq 1 12); do + sleep 8; shot "$OUT/step2-$(printf '%02d' "$i").png" + echo " t+$((i*8))s $(screen) crashes=$(crashes)" +done +echo "RESULT flags='${EXTRA_FLAGS:-}' crash_dumps=$(crashes) throws=$(grep -c 'Guest attempted to throw' "$OUT/canary.stdout" 2>/dev/null || echo 0)" +exit 0 +done +echo "GAVE UP after ${ATTEMPTS:-3} boots"