docs/re: three more runs, and eh_dispatch is still untested — with the proof why

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.
This commit is contained in:
Sylpheed RE agent
2026-08-19 04:43:25 +00:00
parent 66f552b951
commit ae28d84dc1
2 changed files with 82 additions and 0 deletions

View File

@@ -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.

View File

@@ -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:-<none>}"
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:-<none>}' 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"