ob_sample.py pairs a live read of a guest VA with a screenshot and a crop of the HUD counter, and reads the word again AFTER the shot so a sample whose two reads disagree can be thrown away instead of believed -- that race is what left the first three-snapshot filter with zero survivors. ob_session.sh is fly_session.sh plus that sampler, because the evidence this needs is a transition, and an unattended craft is dead in about a minute. Its header records that launch_mission.sh does not yet finish unattended on restored state, so nobody discovers that halfway through a boot. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
46 lines
1.9 KiB
Bash
Executable File
46 lines
1.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Boot -> Stage 02 flight -> fly the survival pilot, sampling the candidate
|
|
# REMAINING OB address against the HUD the whole time.
|
|
#
|
|
# fly_session.sh with one addition: ob_sample.py runs alongside the pilot, so
|
|
# the RAM word and the HUD digits come from the same run rather than from two.
|
|
# The pilot is not optional decoration -- an unattended craft is dead in about a
|
|
# minute (upstream-baseline.md), and a dead craft produces no transitions, which
|
|
# is exactly the evidence this test needs.
|
|
#
|
|
# NOTE (2026-08-23): launch_mission.sh does not currently finish unattended on a
|
|
# freshly restored profile -- it reaches the READY ROOM and stops on BRIEFINGS
|
|
# (docs/re/dynamic-re-state-restore.md). Until that fixed `sleep 28` becomes a
|
|
# wait for the screen, this script inherits the same stop and the sampler never
|
|
# starts; drive the last two presses by hand, or fix the launcher first.
|
|
set -u
|
|
export HOME=/sylph-home/re SDL_AUDIODRIVER=dummy DISPLAY=:98
|
|
export PYTHONPATH=/sylph-home/.local/lib/python3.12/site-packages
|
|
SD="$(cd "$(dirname "$0")" && pwd)"
|
|
SECS="${1:-240}"
|
|
TAG="${2:-ob}"
|
|
VA="${OB_VA:-0xbdb59668}"
|
|
SHOTS=/sylph-home/re/shots/$TAG
|
|
CFG=/tmp/nav-live.json
|
|
|
|
"$SD/launch_mission.sh" fly || { echo "BOOT FAILED"; exit 1; }
|
|
mkdir -p "$SHOTS"
|
|
|
|
# Sample immediately -- the first reading is the cross-run test and must not
|
|
# depend on the pilot binding, which can fail on its own.
|
|
python3 "$SD/ob_sample.py" "$VA" "/tmp/$TAG-ob.csv" "$SHOTS" "$TAG" 25 \
|
|
"$(python3 -c "import math;print(max(2,math.ceil($SECS/25)))")" &
|
|
SAMPLER=$!
|
|
|
|
if python3 "$SD/entities2.py" self 0x130 "$CFG"; then
|
|
echo "--- config: $(cat "$CFG")"
|
|
python3 "$SD/pilot.py" "$CFG" "$SECS" || echo "PILOT EXITED $?"
|
|
else
|
|
echo "BIND FAILED -- sampling an unattended craft, expect a short run"
|
|
fi
|
|
|
|
wait $SAMPLER 2>/dev/null
|
|
echo "--- samples: /tmp/$TAG-ob.csv"
|
|
cat "/tmp/$TAG-ob.csv"
|
|
echo "SESSION DONE"
|