Overnight swarm runbook — 2026-07-15 (evening → ~3am, v0.1 RC punch list)
Overnight swarm runbook — 2026-07-15
Section titled “Overnight swarm runbook — 2026-07-15”Mission (Chris, 2026-07-15 22:45): ~4-hour looping evening run (until ~3am) to burn down what
remains of the v0.1 RC punch list (docs/RELEASE-0.1.md) and surface/improve anything worthwhile.
Every loop iteration reads THIS file first, then the punch list, then acts.
Power note: started on BATTERY at 82% (not AC). ~7%/hr swarm load → ~54% by 3am, fine for the
horizon. Monitor fires BATTERY_CRITICAL at ≤25% → early wind-down. Idle-sleep is blocked
(PreventUserIdleSystemSleep=1) but a lid-close would still clamshell-sleep; workers resume
cleanly on wake, losing time not work.
Standing orders (every iteration)
Section titled “Standing orders (every iteration)”git pull --rebasebefore starting AND before every commit. On.git/index.lock— wait 5s and retry, never delete, never leave files staged while waiting.- Work off
docs/RELEASE-0.1.mdonly. Feature freeze: bug fixes, QA tooling, docs, release tasks. Mark items✅ DONE (commit X)in place. Anything new found goes ON the list first. - Every code change runs the
bh-dev-chunkritual: TDD → full suite →scripts/check-test-count.sh→ boot smoke → determinism check (read the literal pinned assertion intests/test_determinism_survival.gd; re-pin viabh-determinism-repinONLY when an rng-draw-order change genuinely explains it) → commit → push. - UI-affecting change →
scripts/ui-sweep.shmust pass (run it FOREGROUND — a backgrounded windowed godot gets App-Napped and crawls/dies). Re-bless only after eyeballing the diff. - Sim-behaviour change → one
scripts/soak.shrun must come back clean (no invariant failures). - Concurrency: disjoint file scopes per live worker (named in the dispatch). Claim protocol:
first commit is the
⏳ claimed (Wn)punch-list edit, staged by exact pathspec only, then push. Serialize commits; claim-sweep races are benign (verify content on HEAD, note attribution).
HARD DON’Ts overnight
Section titled “HARD DON’Ts overnight”- NO deploys (
bh-deploy), NO App Store / TestFlight actions (bh-appstore-release), NO BUILD-number bumps — devices asleep, deploys are Chris-supervised. - NO touching
platform/tvos/symlinks (nevercp/rsyncgameplay into it). - NO pulling §5 post-0.1 items into the RC and no new features.
- NO re-pinning determinism to make a red test green without a written draw-order explanation.
- NO flipping ADAPTIVE_QUALITY (needs on-device verify — Chris’s gate).
- Do not action §3 (human playtests) — not automatable; leave for Chris + Toby.
- Chris’s decisions are escalations, not tasks: anything taste-sensitive or gameplay-changing with a re-pin (Boss2 dual-name pick, frigate niche buff, survival trickle-adds wiring, weapon fire sounds) gets a crisp “DECISION (Chris): …” writeup with evidence + the ready path — never auto-fixed overnight.
Work queue, in priority order (what’s actually left & worker-safe)
Section titled “Work queue, in priority order (what’s actually left & worker-safe)”A. §2/§4 clean code+doc fixes (agent-doable, do these first):
- Wyrm per-segment status DoT still multiplies the shared pool (§4).
apply_status_and_decayticks burn/poison DoT per SEGMENT, so igniting N segments drains the shared HP pool at N× DPS. Systematic-debugging: reproduce with a test first. The design call is the obvious one and matches W1’s AoE fix (dc3e739): a status DoT on a shared-pool creature should apply ONCE perwyrm_idper tick, not per segment. TDD the per-creature dedup inelemental_system.gd; DoT is deterministic (no rng) so the baseline should hold — VERIFY it does, don’t assume. Soak clean. - CLAUDE.md dimension-status doc drift (§2). CLAUDE.md still says Ice/Blood/Electricity/Poison
are “deferred pending their own new bosses/mechanics”, but
sim/area_defs.gd+ the dimension popup now offer 3 of all 7 non-Home dimensions (confirmed live in soak). Fix CLAUDE.md + thedocs/architecture/enemies-bosses-survival.mddoc to match the live rosters. Pure doc. - Bestiary lists Rusher/Zapper but SpawnTable never spawns them (§4). Investigate: are they
reachable by ANY spawn path (SpawnTable, SpawnDirector, dimension rosters, story)? If genuinely
unreachable → shelve (remove the dangling bestiary entries OR mark them clearly as unimplemented)
- document the verdict on the list. Wiring them IN is a feature (frozen) — do NOT.
- HUD wave/boss banner may collide with boss name label on 720p TV (§4). Reproduce via a 1280×720 ui-sweep capture during a boss phase; if they overlap, nudge layout so they don’t. ui-sweep must pass FOREGROUND. If no collision reproduces, document that + close.
B. Decision writeups for Chris (evidence + both paths, do NOT implement):
- Survival boss fights have NO trickle adds (§2) —
Sim._spawn_boss_adds(sim.gd:1616) is orphaned dead code, zero callers; every survival boss fight is a silent empty-arena duel (W3’s softlock verdict). Write the crisp DECISION: (a) wire it into PHASE_BOSS as designed (draws fromrng→ re-pin, gameplay-affecting) vs (b) bless the clean arena, delete the dead code, fix theSpawnDirector.pick_boss_add_typecomment. Name the exact files/lines for each path. - Confirm the already-phrased escalations still read cleanly: Boss2 dual-name (OVERSEER vs Sentinel), frigate-vs-cruiser balance, Blaster/Aim fire sounds. Leave as-is if already crisp.
C. §1 release-gate evidence (report, don’t flip): on final HEAD, run the full suite +
scripts/check-test-count.sh + boot smoke + one clean scripts/soak.sh + scripts/ui-sweep.sh,
and record the measured green state as the handoff’s “state of main” line. Do NOT flip
ADAPTIVE_QUALITY.
D. “What else can we come up with” (when A–C exhausted): run an overnight-review cycle (the
docs/overnight-review-2026-07-08.md pattern): read one subsystem deeply, log real findings with
file:line evidence. New findings go onto RELEASE-0.1.md §2/§4/§5 per the standing rule; write the
cycle log to docs/overnight-review-2026-07-15.md. Candidate subsystems not recently swept:
weapon-mod/evolution application, the dimension-choice popup flow, drone/decoy targeting,
audio_manager fx→sound mapping completeness.
Iteration shape
Section titled “Iteration shape”Each tick: pull → read punch list → check worker states (notifications, git log, git status,
pgrep godot) → dispatch new workers (2–3 max, disjoint scopes) to un-claimed items → tick done
items in place → push. Never leave an item half-done at tick end — finish or un-claim with a note.
Handoff (~3am, or BATTERY_CRITICAL, or queue exhausted)
Section titled “Handoff (~3am, or BATTERY_CRITICAL, or queue exhausted)”Write docs/overnight-swarm-report-2026-07-15-night.md — items completed (commit SHAs), decisions
awaiting Chris (with the ready path each), anything claimed-but-unfinished (target: none), new
findings added to the punch list, and the measured suite/soak/ui-sweep/count state of main at
handoff. Commit + push, TaskStop the Monitor, summarise for Chris with the decision queue up top.