re: UnitGroup member field n is a unit count, bounded by the formation

FormationSet_S<NN>.tbl records are slot lists -- 1 + 8*FrameCount fields,
exactly. Resolving every squadron's FormationID and comparing gives
sum(n) <= FrameCount holding 1159/1160 across all 28 stages, 0 unresolved, with
539 filling the formation exactly. The single violation is a debug leftover
(S20, AI_Test / MessageSet_test, Formation_1_only with n=2) and is recorded.

The old 'n is not the _NN suffix of FormationID' observation was right but drew
the wrong conclusion: the suffix IS FrameCount, so n=9 against _30 just means 9
units in 9 of 30 slots.

Also: FormationID does not hash into its table (0/16). FormationSet carries a
name roster record -- no FrameCount, fields are (tag, name, '') with the tags
being the record keys -- the same convention as Enumerate_Squadrons. Second
occurrence of 'keys are resolved by an in-table roster, not by hashing'.

Does not close the 387-vs-300 gap, and the key derivation stays open.
This commit is contained in:
Sylpheed RE agent
2026-08-25 10:04:20 +00:00
parent 96fe3cab0d
commit de42fbd742
2 changed files with 87 additions and 5 deletions

View File

@@ -32,6 +32,15 @@
# emulator survives BETWEEN calls in a turn:
# freeze_waitobj.sh boot [fly_s] boot, fly, capture `healthy`, leave running
# freeze_waitobj.sh watch [secs] poll for the freeze, capture `frozen`
# freeze_waitobj.sh run [fly_s] boot + healthy + watch, end to end
#
# `run` exists because the whole experiment does not fit one Bash call and a
# `timeout` kills the process group -- it took the emulator down once. Launch it
# detached (`nohup ... &`) and poll the log instead.
#
# SYLPH_INDUCE=1 starts heavy_read.py the moment flight begins, to test whether
# the freeze follows our instrument rather than the mission (see the n=1 entry in
# mission-freeze-resume-spin.md). The control is the same script without it.
set -u
export HOME=/sylph-home/re SDL_AUDIODRIVER=dummy DISPLAY=:98
export PYTHONPATH=/sylph-home/.local/lib/python3.12/site-packages
@@ -111,7 +120,7 @@ if [ "$MODE" = watch ]; then
echo "NO FREEZE within ${SECS}s (still animating)"; exit 1
fi
# ---- boot mode ----
# ---- boot / run mode ----
FLY="${FLY:-150}"
"$SD/launch_mission.sh" fly || { echo "BOOT FAILED"; exit 1; }
CFG=/tmp/nav-fz.json
@@ -123,7 +132,17 @@ for t in 1 2 3; do
</dev/null >/tmp/fz-pilot.log 2>&1 & echo "--- pilot flying"; break
fi
done
if [ "${SYLPH_INDUCE:-0}" = 1 ]; then
nohup python3 "$SD/heavy_read.py" 4000 2 cpu </dev/null >/tmp/heavy.log 2>&1 &
echo "--- INDUCER ON from flight start ($(date +%T))"
else
echo "--- inducer OFF (control run)"
fi
echo "--- flying ${FLY}s to the healthy control capture"
sleepfor "$FLY"; capture healthy
python3 "$SD/waitobj_report.py" healthy
echo "BOOT PHASE DONE -- emulator left running; now: freeze_waitobj.sh watch"
echo "BOOT PHASE DONE -- emulator left running"
if [ "$MODE" = run ]; then
echo "--- watching for the freeze ($(date +%T))"
exec "$0" watch "${WATCH_S:-1500}"
fi