Skip to content

Overnight swarm runbook — 2026-07-15 (evening → ~3am, v0.1 RC punch list)

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.

  1. git pull --rebase before starting AND before every commit. On .git/index.lock — wait 5s and retry, never delete, never leave files staged while waiting.
  2. Work off docs/RELEASE-0.1.md only. Feature freeze: bug fixes, QA tooling, docs, release tasks. Mark items ✅ DONE (commit X) in place. Anything new found goes ON the list first.
  3. Every code change runs the bh-dev-chunk ritual: TDD → full suite → scripts/check-test-count.sh → boot smoke → determinism check (read the literal pinned assertion in tests/test_determinism_survival.gd; re-pin via bh-determinism-repin ONLY when an rng-draw-order change genuinely explains it) → commit → push.
  4. UI-affecting change → scripts/ui-sweep.sh must pass (run it FOREGROUND — a backgrounded windowed godot gets App-Napped and crawls/dies). Re-bless only after eyeballing the diff.
  5. Sim-behaviour change → one scripts/soak.sh run must come back clean (no invariant failures).
  6. 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).
  • 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 (never cp/rsync gameplay 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):

  1. Wyrm per-segment status DoT still multiplies the shared pool (§4). apply_status_and_decay ticks 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 per wyrm_id per tick, not per segment. TDD the per-creature dedup in elemental_system.gd; DoT is deterministic (no rng) so the baseline should hold — VERIFY it does, don’t assume. Soak clean.
  2. 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 + the docs/architecture/enemies-bosses-survival.md doc to match the live rosters. Pure doc.
  3. 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.
  4. 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 from rng → re-pin, gameplay-affecting) vs (b) bless the clean arena, delete the dead code, fix the SpawnDirector.pick_boss_add_type comment. 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.

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.