Skip to content

Overnight swarm report — 2026-07-15 evening→(slept)→2026-07-16 morning

Overnight swarm report — 2026-07-15 night run

Section titled “Overnight swarm report — 2026-07-15 night run”

Runbook: docs/overnight-swarm-runbook-2026-07-15.md. Horizon requested: ~22:45 → 3am. What actually happened (corrected — Chris, 2026-07-16): the session blocked on an unanswered permission prompt from ~00:50 to ~08:00, NOT machine sleep. A worker hit a permission-gated operation, the modal waited for approval, and Chris didn’t see it until morning — so everything behind it stalled. Evidence fits this exactly: battery barely moved (82→78% over 7h = idle-waiting, not the sleep I first assumed and not compute), all three workers went silent simultaneously, the scheduler ticks 4–9 batched and fired together the moment the modal cleared, and all three workers resumed and committed within minutes of the approval. So the “run” was ~2 real hours of work either side of a ~7h permission block.

Decisions awaiting Chris — NONE new tonight

Section titled “Decisions awaiting Chris — NONE new tonight”

No new escalations were generated. The pre-existing decision queue on the punch list is unchanged (ADAPTIVE_QUALITY re-enable, Boss2 dual-name, frigate-vs-cruiser balance, Blaster/Aim fire sounds, survival trickle-adds wiring). Nothing tonight needs your input.

Items completed (all pushed to origin/main, tree clean, HEAD == origin == 5591c26)

Section titled “Items completed (all pushed to origin/main, tree clean, HEAD == origin == 5591c26)”
  1. Wyrm per-segment status DoT multiplying the shared pool (§4 fix-if-cheap) — fcf8722. The real bug of the night. apply_status_and_decay ticked burn/poison DoT once per segment, so igniting N segments of one wyrm drained its shared HP pool at N× DPS. Fix mirrors the earlier AoE-event dedupe (dc3e739): bracket the whole status pass in begin_aoe_group()/end_aoe_group() so damage_enemy absorbs every-segment-after-the-first per wyrm_id. Non-wyrm enemies (wid < 0) are never deduped, so each still takes its own tick. 3 new tests in tests/test_wyrm.gd (shared-pool-once, two-wyrms-independent, ordinary-enemies-each-tick). Ritual verified on the committed code: suite 233 scripts / 2090 passing / 0 failing / 4 pre-existing risky; count guard OK; boot smoke 0 SCRIPT ERRORs; determinism baseline unchanged (4217109746/3312602286 — no wyrms in the home-area baseline run, as expected); soak clean (8 runs, invuln, solo+co-op, 0 invariant failures / 0 anomalies).

  2. CLAUDE.md dimension-status doc drift (§2) — d122f68. CLAUDE.md falsely said Ice/Blood/Electricity/Poison “remain deferred”. Verified against sim/area_defs.gd: all 7 non-Home dimensions are defined + offered (3-of-7 via Sim._roll_dimension_choice). Native bosses void_dim→Graviton, poison→FunZo, light→Eye; Warden stands in for fire/ice/blood/electricity (their bespoke bosses unbuilt, but the dimensions are live). Fixed CLAUDE.md and added a current-roster source-of-truth table to docs/architecture/enemies-bosses-survival.md. Pure docs.

  3. Rusher/Zapper “SpawnTable never spawns them” (§4) — 5591c26. Split verdict, doc-only, nothing shelved/wired (freeze respected):

    • Rusher: false alarm — it IS reachable. FunZo summons 3 Rushers at its 75%-HP threshold (funzo.gd:80). FunZo is a live boss (Home rotation + Poison dimension). Keep its entry.
    • Zapper: unreachable by gameplay, but intentional and NOT dangling. Fully implemented, test-covered, dev-spawnable, deliberately held out of the auto-spawn pool by the “Crystal Endless” balance removal (pinned by test_crystal_endless_tuning + test_new_enemies). Nothing to strip. Wiring it into spawns would be a frozen feature.

All three claimed items are [x] done and pushed.

Measured state of main at handoff (2026-07-16 ~08:15)

Section titled “Measured state of main at handoff (2026-07-16 ~08:15)”
  • git status clean; HEAD == origin == 5591c26.
  • Full GUT suite: 233 scripts, 2090 passing, 0 failing, 4 pre-existing risky/pending.
  • scripts/check-test-count.sh: OK, 233/233 scripts ran, 0 failing.
  • Boot smoke (--quit-after 120): 0 SCRIPT ERRORs.
  • Determinism survival baseline: unchanged (4217109746 / 3312602286).
  • Soak (4 runs × 12000 ticks, cobalt, coop=both, invuln): 0 invariant failures, 0 anomalies.
  • Root cause was a permission block, not sleep (and not self-armed watchers). All three background workers went silent between 23:18 and 23:48 because a worker hit a permission-gated operation and the approval modal sat unanswered overnight. I misread it as a stall/sleep and (a) sent SendMessage resume nudges, (b) took over W2’s docs item myself in the foreground and committed it (d122f68), which the real W2 later confirmed correct. When Chris approved the prompt (~08:00) all three workers unblocked and W1/W3 committed their own work autonomously; my job reduced to running W1’s ritual + soak on its committed code and pushing.
  • THE lesson for the next overnight run: pre-clear the permission posture BEFORE dispatch. An unattended swarm cannot survive a single permission modal — the first gated command blocks the whole session until someone answers. Before dispatching overnight, either (i) run the session in a non-blocking permission mode, or (ii) pre-approve every command the bh-dev-chunk ritual needs (godot, git commit/push/pull, bash scripts/*.sh) in .claude/settings.json, and verify no worker action will prompt. This supersedes the “Amphetamine sleep toggle” as the real overnight gate — sleep was a red herring this time.
  • Net: 3/3 attempted items landed, but only ~2 hours of the intended ~4 were real compute; the rest was lost behind the unanswered prompt. The claim protocol meant we lost time, not work.
  • No new findings to file. The punch list is now genuinely thin on overnight-safe code work — the bulk of what remains is your decisions (§1 ADAPTIVE_QUALITY, §4 Boss2 name / frigate balance / fire sounds) and the §3 human playtests, none of which are automatable.