Overnight feature loop 2026-10-07 — report
Overnight feature loop 2026-10-07 — report
Section titled “Overnight feature loop 2026-10-07 — report”Trigger: Chris, 2026-10-06 ~23:45 (difficulty/boss ramp, EVE-style interceptor elite, regen
suppressor, dynamic camera zoom, networked co-op). Queue + specs:
docs/superpowers/plans/2026-10-07-overnight-feature-queue.md. All work lands on branch
overnight-2026-10-07 (not main); every feel change is DevFlags-gated, default OFF.
Each cycle: implement in own worktree (bh-implementer, gate.sh) → adversarial review (bh-reviewer) → one fix round → merge into the integration branch → push.
T1 Dynamic camera zoom — 2026-10-07 01:05 — MERGED (649e5848)
Section titled “T1 Dynamic camera zoom — 2026-10-07 01:05 — MERGED (649e5848)”- Built:
render/camera_zoom.gd(puretarget_scale(speed, boss_alive, extra), MAX of contributions, exponential ease) driven frommain._drive_camera_zoom; zoom capped live at the spawn ring per device; culling, threat radar, boss edge indicator, Graviton lens follow it. 16 tests incl. the realmain._processpath. Review: MERGE. - Toggle: DevFlags
dynamic_zoom(Debug Settings “Dev: dynamic camera zoom (A/B)”, consoledev_flag dynamic_zoom); caps are tunables in the console’s Visuals & FX group. - Chris calls: cap 1.6x (tunable to 2.0; spawn ring limits it to ~1.39x on TV, ~1.54x iPhone);
speed = actual velocity vs ref 260 (base cruise = no zoom); boss 1.35x; ease 1.8/s;
extra_zoom_outhook for T3; co-op uses the fastest pilot. - Known cosmetic: screen-space shockwave/punch ripples not scaled by zoom; What’s-new copy says “up to 60%” but the ring cap gives ~39% on TV.
- Env fix:
test_remote_config_statenow parks a stale shareduser://remote_config.json(left by a windowed dev run 10-06) instead of failing every gate on this machine.
T2 Interceptor elite (sim + render) — 2026-10-07 01:35 — MERGED (35a01b99)
Section titled “T2 Interceptor elite (sim + render) — 2026-10-07 01:35 — MERGED (35a01b99)”- Built: enemy
tackler(TYPE_TACKLER=32, player name “Interceptor”, void, #c77dff) insim/tackler.gd: approach fast → orbit ~150 px → 0.7 s lock-on telegraph → web (−55% speed) + warp scramble (reuses the ATK_WARP scramble) → below 40% HP flee, repair only beyond 520 px, return at 90%. No rng draws.render/tackler_renderer.gd: lock-on reticle, web tether, web wrap + broken scram hex on the ship, retreat streaks + green repair ring. Swept-wing sprite, codex entry, VFX library card (score 3), 18 tunables (Elites group). 15 tests via real tick / main frame loop incl. XP through real kill. Review: MERGE. - Toggle: DevFlags
tackler_spawns(Debug Settings “Dev: Interceptor (tackler) spawns”, consoledev_flag tackler_spawns; live mid-run). Survival: first at 1:15, check every 45 s, max 1 alive. Dev spawn preset “tackler” spawns one directly. - Chris calls: hp 240 (scaled), speed 180, biomass 30, gold 3; elite HP bar but no elite weapons; approach 1.6x, orbit r150 @1.5 rad/s; the 0.7 s lock-on (warping during it escapes); tackle range 260.
- Carry-forward (low, for T3): codex preview has no
orbit/tacklecase (shows a walk); bestiary says “halves your speed” but it’s −55%; spawn point not clamped to the arena box; tackler state +tackle_timernot instate_checksum()(needed before T8 lockstep with the flag on); replays don’t record the flag; spawns ignore the dimension’s enemy list. Renderer not yet eyeballed windowed.
T3 Interceptor packs + boost + zoom hook — 2026-10-07 02:05 — MERGED (523eedaa)
Section titled “T3 Interceptor packs + boost + zoom hook — 2026-10-07 02:05 — MERGED (523eedaa)”- Built (
sim/tackler.gd): MWD boost (2.0x for 0.5 s, 3.5 s cd) to close in, swap into orbit, and break off.Tackler.plan()pack logic: 2+ healthy tacklers share one target, spread evenly; ONE striker locks on, holders circle a 300 px ring; when the striker is hurt it retreats and the healthiest holder boosts in. Spawns: singles until 5:00, pairs from 5:00, trios from 8:00, max 3 alive. Camera:tackler_zoom_out+40% (one engaged) / +60% (pack), MAX with T1’s hook. Renderer: afterburner trail, dashed pack ring with slot ticks. 12 tests (real tick + main loop), mutation-checked. Fixed T2’s bestiary wording. Review: MERGE. - Toggles: existing
tackler_spawns(+dynamic_zoomfor the zoom part). No new flag. - Chris calls: one-striker-at-a-time rule; pack orbit 0.8 rad/s; numbers above.
- ⚠️ For Chris: the zoom-out is capped by the enemy spawn ring (enemies spawn just off-screen; zooming out further would reveal them popping in). So the real ceiling is ~39% on TV, ~54% iPhone, below the 50–100% asked. Going further needs the spawn ring pushed out (perf + pacing cost) — a call for Chris. HOLD_RADIUS 300 can put holders off-screen on iPhone/iPad with zoom off.
T4 Player counters: web drone + Stasis Web — 2026-10-07 02:30 — MERGED (5987f80d)
Section titled “T4 Player counters: web drone + Stasis Web — 2026-10-07 02:30 — MERGED (5987f80d)”- Built: shared
EnemyPool.stasis_timer(webbed enemy moves at 20% speed; webbed Interceptor can’t boost and, withBREAKS_TACKLEon, can’t lock on — so its web/scram on you releases). Web drone (classweb): tethers the Interceptor nearest its pilot (else elite, else any non-boss). Stasis Web level-up card (stasis_web, up to 3 picks): auto-casts a net at the nearest Interceptor/elite in 520 px, 3 s web every 7 s.render/stasis_web_renderer.gd: net wrap, drone tether, cast shot + snapping ring. 12 tunables, 18 tests (mutation-checked). Review: MERGE. - Toggles: DevFlags
web_drone(bonus Web drone on every launch, beyond slot count); the card is offered only whiletackler_spawnsis on. - Chris calls: slow 0.2 (strongest-wins with Disruptor, no stacking); card scaling ×0.8 cd /+0.5 s per pick; drone reuses Disruptor sprite tinted white-cyan. Proposed shop (not added): unlock-drone-web 600 gold + standard per-class upgrade curve — needs KNOWN_CLASSES/bible/role tags + economy-sim re-run.
- Follow-ups (low): card shows “INSTANT” why-tag but is a cooldown auto-cast; bonus drone has no dock
icon; stasis state not in
state_checksum.
T5 Regen-suppressor enemy (“Blight”) — 2026-10-07 02:27 — MERGED (57c0ead4)
Section titled “T5 Regen-suppressor enemy (“Blight”) — 2026-10-07 02:27 — MERGED (57c0ead4)”- Built: enemy
suppressor(player name “Blight”, decay, #c8d84a) insim/suppressor.gd. Pilots inside its 240 px ring heal at 25% per Blight, multiplicative (two = 6.25%). Hovers 140 px from you, closes at 150 px/s (slower than the ship — you can fly out). With no Blight alive the multiplier is exactly 1.0 (bit-identical default path). - Heals cut: passive regen, Field Medic stand-still heal, Leech (after its cap), Scar Tissue
lifesteal, Logistics drone repair/overcharge, Chronowell bubble-end heal. Not cut: heal pickups,
story reward heals, Hull card HP, tutorial hull floor. Table in
docs/architecture/enemies-bosses-survival.md. - Render: ring at real radius (lit while holding a ship), drain thread per ship, crossed-out heal cross on the ship (+dot per extra ring). Sprite, codex, VFX card, 8 tunables. 18 tests. Review: MERGE.
- Toggle: DevFlags
suppressor_spawns(“Dev: Blight (anti-heal) spawns”); dev spawn “suppressor”. Spawns from 1:30, check every 60 s, max 2 alive. - Chris calls: −75% per ring, no floor; HP 160, speed 75, biomass 20, gold 3; indicator on the ship, not the HUD bar.
- Follow-ups (low): Scar Tissue/Chronowell cut untested; Logistics test bypasses tick; heal state not in
state_checksum.
T6 Boss ramp + overall difficulty — 2026-10-07 02:58 — MERGED (a6aff662)
Section titled “T6 Boss ramp + overall difficulty — 2026-10-07 02:58 — MERGED (a6aff662)”- Built:
sim/hard_tuning.gd— one Survival-only switch (sim.hard_tuning, copied from DevFlagshard_tuning; Story/tutorial never affected). 8 remote tunables (Enemy scaling): boss HP ×1.5, boss damage ×1.3, boss rests/cooldowns ×0.7 (telegraphs unchanged — fairness), all four phase bosses enrage at 60% HP (was 40%), boss-fight adds ×1.5, enemy HP ×1.15, contact ×1.1, wave fill ×1.2. Pause menu shows “BUILD N · HARD TUNING”. 15 tests (mutation-checked). Probe:tools/difficulty_probe/hard_tuning_probe.gd, orsoak --hard=1. Review: MERGE. - Toggle: Debug Settings “Dev: hard tuning (bosses + difficulty)” / console
dev_flag hard_tuning.
| Autopilot, 6 seeds, 12-min runs | Off | On | Δ |
|---|---|---|---|
| Survival time, fresh-save bot | 109 s | 72 s | −34% |
| Damage taken per boss (4000-HP bot) | 1179 | 2235 | +90% |
| Damage taken per run (4000-HP bot) | 2860 | 4149 | +45% |
| Boss time-to-kill (4000-HP bot) | 260 s | 282 s | +8% |
- ⚠️ For Chris: the “modest” global bump cuts weak-player survival by a third — likely more than “slightly too easy”. Easy dials: ENEMY_HP_MULT / WAVE_BIOMASS_MULT, or start them later. Bot TTK is minutes, so damage-per-boss is the meaningful number. Not measured with the live exponential-scaling dev patch (b258-dev-003) on. Telemetry doesn’t record the flag.
- Follow-ups (low): mid-wave Boss2 elite gets ×1.3 damage but no HP/cadence/enrage change; doc names it “Warden” (it’s Boss2).
T7 Networked co-op design spec — 2026-10-07 03:19 — MERGED (702a3d01)
Section titled “T7 Networked co-op design spec — 2026-10-07 03:19 — MERGED (702a3d01)”- Spec:
docs/superpowers/specs/2026-10-07-networked-coop-design.md(+ pointer incoop-and-pilots.md). Recommendation: host-scheduled input lockstep for LAN and internet — ENet on LAN, a Cloudflare Durable Object WebSocket relay for internet (~$0.003 per 20-min 2-player match beyond quota). Quantized inputs; separatenet_checksum()compared every 30 ticks (state_checksum()stays — baselines pin it). Rollback rejected (ATV tick up to 4.4 ms max). Six phases; 0–1 need no networking (cross-device determinism probe; move every out-of-tick sim mutation — e.g. upgrade rolls at main.gd:2338 — onto one tick-stamped command stream). - Verified:
tick()handles 2 pilots; unmerged July branchorigin/networked-multiplayer-mb-mcalready moved snapshots→lockstep (lessons reused); iOS UDP broadcast needs Apple’s multicast entitlement;webrtc-nativehas no tvOS build. Unverified: ENet raw packets without @rpc, cross-platform float determinism, tvOS multicast. - Chris calls (all proposals): supersedes the 06-30 snapshot+hetzner plan; level-up pauses everyone with a 15 s auto-pick; each pilot brings own meta/hull, each device banks run gold; any player can pause; manual IP + broadcast now, apply for the iOS multicast entitlement now; Apple-only cross-play first if floats differ; cap networked play at 2 pilots until the 4-pilot plan lands.
T8 LAN lockstep transport + loopback sync test — 2026-10-07 04:04 — MERGED (e3042beb)
Section titled “T8 LAN lockstep transport + loopback sync test — 2026-10-07 04:04 — MERGED (e3042beb)”- Built (spec Phase 2):
Sim.net_checksum()(RNG stream positions, clocks, boss state, pilot/enemy timers incl. T2–T5 state;state_checksum()untouched) +SeededRng.get_state/set_state.net/net_transport.gd,net/loopback_transport.gd(injectable latency/jitter/drop),net/enet_transport.gd(ENet as raw packet peer, no @rpc — works),net/lockstep_protocol.gd(quantized inputs; every peer incl. host ticks on the decoded copy),net/lockstep_session.gd(host never waits; client stalls on missing inputs, catches up 2 ticks/frame; input delay 2; checksum every 30 ticks, mismatch ends both; 5 s silence drops a peer). - Tests: two sims identical for 3,000 ticks over a lossy/jittery/out-of-order loopback; a nudged enemy caught within 30 ticks; 300-tick ENet session on 127.0.0.1. Mutation-checked. Review: MERGE.
- Not yet (Phase 1): out-of-tick sim mutations (level-up roll/pick, Drone Bay, DevFlag mirrors,
config patches) don’t go through the session — a level-up in a networked run will desync until
they do; no
net_desynctelemetry/banner; no rejoin. Nothing wired to main/UI yet (T9).
T9 Dev-only LAN co-op host/join — 2026-10-07 05:06 — MERGED (e3148943)
Section titled “T9 Dev-only LAN co-op host/join — 2026-10-07 05:06 — MERGED (e3148943)”- Built:
sim/sim_commands.gdtick-stamped command stream (level-up roll + pick, DevFlag mirrors), protocol v2,net/net_coop_run.gd,net/lan_beacon.gd(UDP broadcast discovery),ui/lan_lobby.gd, main.gd wiring + dev desync banner. Review round 1 found 3 defects (stale level-up panel after host auto-pick; Debug Settings dimension row could desync; lobby not a modal) — all fixed + tested in round 2. Review: MERGE. - Proof: real-ENet smoke — two headless processes on 127.0.0.1 both reached level 7 with identical checksums over 3,600 ticks, no desync. Not yet tried over Wi-Fi or on devices.
- How to test: Debug Settings → “Host LAN co-op” / “Join LAN co-op” (dev builds), or
godot --path . -- --mp-hostand-- --mp-join=<IP>(add--mp-autofor autopilot). Ports 47610 (ENet) / 47611 (beacon). - Chris calls: net runs = Survival, no areas/dimensions, no meta shop/hull, remote-config defaults;
level-up pauses everyone, P1 picks first, 15 s auto-pick; client can’t pause host; Drone Bay /
live tunables / config patches / sim dev commands refused in net runs; no
net_desynctelemetry until the privacy page + ASC label cover it. - Needed for devices (presets NOT edited): iOS
NSLocalNetworkUsageDescription(+NSBonjourServicesif Bonjour is used) and thecom.apple.developer.networking.multicastentitlement for broadcast discovery (manual IP join works without it). Detail indocs/architecture/coop-and-pilots.md. - Known gaps: client HUD/haptics/dash sound follow P1; LAN game-over banks gold into the local save; a device leaving mid-run keeps ticking alone; lobby/banner not eyeballed windowed.
T10 Morning handoff — 2026-10-07
Section titled “T10 Morning handoff — 2026-10-07”origin/mainmerged into the integration work (one docs commit, 5109ac31; no conflicts).- Cheap carried-forward lows fixed (tested, mutation-checked): the codex preview now shows the Interceptor holding an orbit with its lock-on → web cycle (was a plain walk) and the Blight’s anti-heal ring; the Stasis Web level-up card reads AUTO-CAST, not “INSTANT”; the hard-tuning doc names the mid-wave elites correctly (Warden elite + dormant Boss2).
- Not pushed by the T10 agent (its rules forbid pushing); the orchestrator pushes the integration branch.
How to test tomorrow
Section titled “How to test tomorrow”Everything is on branch overnight-2026-10-07, NOT main. Every feature is default OFF, so a
build of this branch plays exactly like main until you flip a toggle. Toggles live in two places
that stay in sync:
- In game: pause → Debug Settings (dev builds only: the Dark Cosmos Dev app, an editor
run, or a Mac export with
custom_features="dev"). Flags persist across launches. - Remote Console:
dev_flag <name>, but the console Worker is deployed from main, so the new rows only appear there after the console is redeployed from this branch (or after the merge).
The toggles
Section titled “The toggles”| DevFlag (Debug Settings row) | Task | What to look for |
|---|---|---|
dynamic_zoom (“Dev: dynamic camera zoom (A/B)”) |
T1, T3 | Camera eases out when you fly fast, when a boss is up, and when Interceptors engage (+40% one / +60% pack, capped). Check that it feels like more room, not seasick; check nothing pops in at the screen edge. Tunables: console Visuals & FX group. |
tackler_spawns (“Dev: Interceptor (tackler) spawns”) |
T2, T3, T4 | Survival: first Interceptor at 1:15, pairs from 5:00, trios from 8:00. Watch for: the boost in, the orbit, the 0.7 s lock-on reticle (warp out during it to escape), the web (−55% speed) + warp scramble, retreat below 40% HP. Packs: one tackles, the others circle a 300 px ring. Also unlocks the Stasis Web level-up card (AUTO-CAST tag). Dev spawn: Debug Settings spawn row → tackler. Tunables: Elites group. |
web_drone (“Dev: Web drone joins every launch”) |
T4 | A bonus white-cyan Web drone each drone launch, tethering the nearest Interceptor (else elite). Pairs with tackler_spawns. No dock icon yet. |
suppressor_spawns (“Dev: Blight (anti-heal) spawns”) |
T5 | Survival: Blight from 1:30 (max 2). Inside its 240 px ring your healing drops to 25% per Blight (two = 6.25%). Look for the ring lighting up, the drain thread and the crossed-out heal cross on your ship; check you can fly out of it. Dev spawn: suppressor. |
hard_tuning (“Dev: hard tuning (bosses + difficulty)”) |
T6 | Bosses: ×1.5 HP, ×1.3 damage, shorter rests, enrage at 60%; plus enemy HP ×1.15, contact ×1.1, waves ×1.2. Pause menu reads BUILD N · HARD TUNING. Survival only. Bot data says it cuts weak-player survival by a third — feel it on a fresh save first. |
| (not a flag) “Host LAN co-op” / “Join LAN co-op” (press rows in Debug Settings) | T9 | Two devices on the same Wi-Fi: one hosts, the other joins (beacon, or manual IP). Play past several level-ups; a red dev banner means desync. CLI: godot --path . -- --mp-host / -- --mp-join=<IP> (--mp-auto = autopilot). Ports 47610/47611. iOS/tvOS need the plist keys below first. |
Open Chris calls (from the per-task sections above)
Section titled “Open Chris calls (from the per-task sections above)”- Zoom ceiling (T1/T3): the zoom-out is capped by the spawn ring (~39% TV, ~54% iPhone) — below the 50–100% asked. Pushing the spawn ring out costs perf + pacing. Your call.
- Hard tuning strength (T6): keep as is, soften the global bump (ENEMY_HP_MULT / WAVE_BIOMASS_MULT), or start it later in the run.
- Interceptor numbers (T2/T3): HP 240, speed 180, web −55%, lock-on 0.7 s, spawn cadence above.
- Blight (T5): −75% healing per ring with no floor; heal pickups / story heals / Hull card deliberately NOT cut.
- Web drone in the shop (T4): proposed unlock 600 gold + the standard per-class curve; not added (needs KNOWN_CLASSES / bible / role tags + an economy-sim re-run).
- Networked co-op (T7 spec): Durable Object relay for internet play; apply for Apple’s iOS multicast entitlement now (lead time); 2-pilot cap until the 4-pilot plan lands; the T9 net-run rules (Survival only, no meta shop/hull, P1 picks first, 15 s auto-pick).
- Merge plan: which of T1–T9 go to main (all are flag-gated, so merging is low risk; the LAN co-op path is the biggest diff).
Mac dev build
Section titled “Mac dev build”See “Mac dev build (T10)” below for the result of the overnight attempt. To rebuild yourself from a
worktree of this branch (the root export_presets.cfg is gitignored; scripts/gate.sh copies it in
from the main checkout):
cd <worktree of overnight-2026-10-07>godot --headless --path . --import# Debug Settings only exist in a "dev" export: use a temp copy of the presets with the macOS preset's# custom_features="dev" (never commit it), thengodot --headless --path . --export-release "macOS" builds/macos-overnight/DarkCosmos-Overnight.appopen builds/macos-overnight/DarkCosmos-Overnight.appThe headless export skips the shader baker, so expect first-sight shader hitches; that is not a bug
in the overnight work. For two-instance LAN testing on one Mac, launch it twice
(open -n …app --args -- --mp-host, then open -n …app --args -- --mp-join=127.0.0.1; the -- matters, the game reads OS.get_cmdline_user_args()).
Device install (Apple TV / iPhone / iPad)
Section titled “Device install (Apple TV / iPhone / iPad)”Skill bh-worktree-device-install. In short:
- Highest BUILD on any branch is 263 (
voice-feedback); this branch is at 262. From a worktree ofovernight-2026-10-07, runscripts/bump-build.shtwice → 264, regenerateremote-config/manifest/build-264.json, commit. - Check no build is in flight:
ps aux | grep -E "xcodebuild|devicectl" | grep -v grepis empty. - Run (you, with
!, since the shell symlink is refused to Claude):! cd <WORKTREE> && ln -s /Users/chris/Claude/bullet-heaven/platform/tvos/build platform/tvos/build && (cd platform/tvos && godot --headless --path . --import >/dev/null 2>&1) && bash scripts/dev/install-dev.sh atv --no-bump(iPhone/iPad: also linkbuild-ios, passiphone/ipad.) - Afterwards:
git checkout -- project.godot audio/bus_layout.tres;rm platform/tvos/build(plainrm, no-r, no trailing slash). - LAN co-op on devices needs, in the iOS/tvOS presets (not edited overnight):
NSLocalNetworkUsageDescription(+NSBonjourServicesif Bonjour is ever used) and thecom.apple.developer.networking.multicastentitlement for broadcast discovery. Without them, manual-IP join may still work but discovery won’t. Detail:docs/architecture/coop-and-pilots.md. - Feel-test checklist on device: each row of the toggles table, one at a time, then
tackler_spawns+web_drone+dynamic_zoomtogether.
Mac dev build (T10)
Section titled “Mac dev build (T10)”- Built, not launched:
.claude/worktrees/ov-t10/builds/macos-overnight/DarkCosmos-Overnight.app(198 MB,[ DONE ] export), headless export of commit 686f1311 (= this branch + the T10 lows) from the rootmacOSpreset withcustom_features="dev"applied to a temp copy (the preset file was restored afterwards). Open it withopen <path>; Debug Settings is in the pause menu. - Not launched overnight on purpose: it shares the app’s
user://with any other Dark Cosmos Mac install on this machine, and nobody was there to look at it. No shader bake (headless), so expect first-sight hitches. One benign export error from the GUT addon (“Cannot set object script”). - It lives in a gitignored dir of the T10 worktree: deleting that worktree deletes the build.
Loop complete — 2026-10-07 05:50
Section titled “Loop complete — 2026-10-07 05:50”- 10/10 tasks MERGED into
overnight-2026-10-07(pushed; NOT merged to main). Merge commits: T1 649e5848 · T2 35a01b99 · T3 523eedaa · T4 5987f80d · T5 57c0ead4 · T6 a6aff662 · T7 702a3d01 · T8 e3042beb · T9 e3148943 · T10 b077ed36. Final gate: 451 scripts / 4800 tests green; seed-1234 baselines never moved. origin/main merged in at T10. - Mac dev build (exported, not launched — shares user:// with other Mac installs):
.claude/worktrees/ov-t10/builds/macos-overnight/DarkCosmos-Overnight.app. - Recurring across cycles, needs a deliberate pass: nothing eyeballed in a windowed run (all render
work is test-verified only); the spawn-ring cap on camera zoom (~39% TV) vs the 50–100% asked; client
HUD in LAN co-op follows P1; new sim state is in
net_checksum(T8) but notstate_checksum. Review noted Coil’s codex card now orbits too (T10) — check by eye. - Merging to main is Chris’s call after playtesting.