Docs: Geyser Build Spec + session log Part Q + roadmap tick + CLAUDE.md gotcha — Phase 1.5b bundle 3

Blight geyser (bundle 3) shipped review-first. Records the design-review fold
(2 HIGH: no edge-detect on the replicated tick; invert the invalid-guard for a
baked scheduled-tick so a born-0 can't storm) and the new CLAUDE.md tick-sentinel
corollary for baked [GhostField] scheduled-ticks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 13:53:22 -07:00
parent 649f656833
commit f271d5f47f
4 changed files with 205 additions and 9 deletions
@@ -355,14 +355,54 @@ Three locked sub-features, all **client-only presentation, procedural, zero netc
over the dark baked ground — needs a launched expedition + a focused editor (unfocused blocks live-frame
verify). Knobs to taste on the lap: `ScorchColor`/alpha, `CoverCrackMaxCount`, `RoomArenaDecalCount`.
## Part Q — Phase 1.5b bundle 3 (BLIGHT GEYSER) shipped — review-first netcode slice
A PERMANENT periodic hazard (operator forks: **Blight-biome rooms only · permanent · both-sides telegraphed
AoE**). The genuinely-new replicated surface is ONE `[GhostField] uint NextEruptTick`; everything else reuses
the barrel/cover chassis + bundle-2's scorch pool.
- **Design-review FIRST (`wf_900e9965-8f0`, 3 lenses / 23 agents / 0 errors → 11 CONFIRMED, 8 refuted; the
[[workflow-agent-quota-failures-look-clean]] check passed).** It caught **two HIGH defects the naive design
would have shipped**: (H1) firing the erupt VFX by EDGE-DETECTING the replicated `NextEruptTick` jump —
phantom-fires on the `0→stamp` transition + on every relevancy re-entry (death→respawn→re-enter, region
transit) + drops under snapshot loss; **fix = absolute-tick `TicksSince(predicted ServerTick)` disc + a
`>0→<=0` crossing burst LATCHED per NextEruptTick + a was-counting-down arm-guard** (the
`EnemyDangerTelegraphSystem`/`AttackWindup` "absolute, not an edge" idiom). (H2) copying the barrel's
`invalid-tick → detonate` guard VERBATIM onto a **baked [GhostField] that defaults to 0** → the 0 fails
`IsValid`, falls through, and erupts EVERY tick — a party-wiping AoE barrage; **fix = INVERT the guard (0 =
not-ready → skip) + born-correct stamp from the live ServerTick at seed**, hardened further with a
**lazy-stamp** in the erupt system so a stray 0 can neither storm nor stay inert-forever. Plus MEDs: reschedule
`= now + period` not `+=` (catch-up storm); do NOT extract a shared gather helper (`SystemAPI.Query` can't be
a static — verbatim-duplicate, the shipped convention); promote `BuildDisc` to `FeedbackFx` (shared with the
fuse ring); gate on `plan.Biome` not `info.CurrentBiome`; `SourceTick` at NOW not the scheduled tick. Durable
fold: [[Geyser_Build_Spec]].
- **Shipped:** `Geyser` component · server `GeyserEruptSystem` (inverted+lazy guard, inline both-sides gather,
`SourceNetworkId=-1`, reschedule `=now+period`, never destroyed) · client `GeyserTelegraphSystem` (absolute-tick
growing disc + latched/armed crossing burst; erupt VFX reuse `ScorchDecalSystem.RequestScorch` + `RequestFlash`)
· `GeyserFieldSpawner` + authoring · `Geyser.prefab` (duplicated `ResourceNode.prefab` — NOT `CoverRock`, which
has an Environment collider that'd block the walk-over hazard — authoring swapped to `GeyserAuthoring`) ·
`RoomFieldSystem` Blight-gated born-correct staggered seed (+`NetworkTime`) · `GeyserFieldSpawnerAuthoring`
wired into the `Gameplay.unity` subscene (`ResourceFieldSpawner` hub, Count 2). `BuildDisc` promoted to
`FeedbackFx`; `WorldFeedbackSystem` fuse ring now calls it.
- **Verified:** 474/474 EditMode (incl. the unstamped-storm regression asserting ZERO DamageEvents on a baked-0
geyser at a high tick) · console clean · **live end-to-end** (server-spawned geyser: periodic erupt +
single-clean reschedule `=now+period` across ~7 eruptions, **no storm**; ghost replicated to the client;
telegraph disc GOs created; erupt scorch fired). **Post-impl review clean** (`wf_5c8299f8-299`, 3 lenses, 0
findings — genuine, journal-verified). ⚠ Editing hazard hit + fixed mid-build: a `script_apply_edits` delete of
`WorldFeedbackSystem.BuildDisc` mangled the file (duplicated an `UpdateFuseRing` fragment, orphan brace) — a
brace-balanced whole-span `apply_text_edits` repaired it; prefer balanced-span replaces over structured deletes.
- **Deferred to the operator's gate lap:** the in-run VISUAL feel — telegraph disc read + erupt over the dark
Blight ground, and whether a distinct geyser mesh (interim = the ResourceNode mesh) is wanted. Knobs:
`Tuning.Geyser*` (period/telegraph/radius/damage) + `GeyserFieldSpawner.Count`.
## Next-session intent
**Phase 1.5b bundles 1 (ground) + 2 (decals) are SHIPPED**; remaining locked bundles in order: **3) Blight
geyser** (mini design review FIRST — new replicated erupt-phase surface) → **4) critters + weather beats**.
Then the operator's 1.5 gate lap ("no longer static", ground + decals judged explicitly) → Phase 1.7 boon
overhaul (design-review-FIRST) → Phase 2 hub-ification. Taste queue: **decals feel lap (scorch/crack/scar
tuning)** · arid brightness · craters call · B5 split-panels smoke · barrel explosion VFX polish · flower
density judgment (base may read dense — operator call on the lap).
**Phase 1.5b bundles 1 (ground) + 2 (decals) + 3 (Blight geyser) are SHIPPED.** Last locked bundle: **4)
critters + weather beats** (fleeing bugs/birds · cloud-shadow drifts · Blight lightning flicker — client-only,
likely no design review). Then the operator's 1.5 gate lap ("no longer static"; ground + decals + geyser judged
explicitly) → Phase 1.7 boon overhaul (design-review-FIRST) → Phase 2 hub-ification. Taste queue: **geyser feel
lap (telegraph/erupt tuning · distinct geyser mesh?)** · decals feel lap · arid brightness · craters call · B5
split-panels smoke · barrel explosion VFX polish · flower density.
Related: [[Iteration_2026-07_CoopHades]] · [[2026-07-07_Workflow_Consolidation]] ·
[[2026-07-07_Expedition_Enemy_Stuck_Harvest_Feedback]]