Docs: LANTERN Phase 0.3 world-model review-hardened — Build Spec + DR-049

Adversarial design review (wf_aa6fb661-e25; 22 agents, 0 failures) over the world-model
proposal + ground-truth code raised 18 findings (12 CONFIRMED + 6 PARTIAL, 0 refuted) and
caught real design-breakers before any code:
- DP-1/RS-1 (HIGH): the seed model was self-contradictory (RunMapMath regenerates the WHOLE
  graph per seed, incompatible with a persistent pinned prefix) -> split: graph topology is
  a pure function of WorldSeed ONLY; DescentSalt re-knots content; pinning freezes PinnedSalt.
- NR-2/RS-3 (HIGH): salvaged respawn warps a dead Wick to base -> splits the co-located party
  -> in-pocket death; warp gated behind party-wipe; revive is new code, not salvage.
- DP-2 (HIGH): born-correct restore is per-entry lazy replay, not a boot one-shot.
- NR-1 phantom-kill CombatFeedback fix; NR-3 enemy wind-up gated on the light-union;
  RS-2 RegionTag->PocketTag is a ~23-site semantic rewrite, not a rename.

World_Model_Build_Spec.md = the review-hardened contract (all 18 folded, findings ledger,
build order, open risks). DR-049 records the decision. Spike -> reviewed; proposal -> superseded.
New forks parked (dark-contact policy, lantern placement, END-1/EB-1 mothball timing).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-13 23:53:59 -07:00
parent 73afab6ba5
commit fc31d066d0
6 changed files with 344 additions and 3 deletions
@@ -0,0 +1,83 @@
---
id: DR-049
title: LANTERN world-model design — pocket-graph + seed-pinning + light-relevancy (review-hardened)
status: accepted
date: 2026-07-13
tags: [decision, lantern, netcode, world-model, phase-0, review]
permalink: gamevault/07-sessions/decisions/dr-049-lantern-world-model-design
---
# DR-049 — LANTERN world-model design (review-hardened)
## Context
Phase 0.3 of [[Roadmap_Lantern_Slice]] (the ★review-first world-model spike, framed in
[[Lantern_World_Model_Spike]]) is the slice's hardest netcode problem: a seed-pinned **pocket-graph** where
**light is territory** (what you light persists; the dark re-knots), enforced across 24 co-op clients under
server authority + client prediction + a per-player light-based information radius. Two operator forks were
locked first: **co-located party (one active pocket)** and **party light-union relevancy (Wicks always
visible)**. A design proposal ([[Lantern_World_Model_Design_Proposal]]) was written from three read-only
ground-truth passes (relevancy/lifecycle/save) + ctx7 on `GhostRelevancy`/`GhostImportance`, then put through
the standing adversarial design-review ritual **before any world code**.
## Decision
**Adopt the review-hardened world model in [[World_Model_Build_Spec]] as the Phase 0.3 gate output and the
authority for Phase 2 world code.** No world code is written outside that spec.
The design review (`wf_aa6fb661-e25`; 22 agents, **0 failures/quota-deaths** — findings verified real, not the
masquerading-empty trap) ran three lenses (netcode/relevancy · determinism/prediction · reuse/scope) with
refute-first critics and raised **18 findings — 12 CONFIRMED, 6 PARTIAL, 0 refuted.** It did its job: it
caught design-breakers a green-tests-and-clean-Play pass would have missed. Verdict:
- **Netcode — pass with changes.** Hard requirements folded in: in-pocket death (NR-2), the `CombatFeedbackSystem`
alive-prune phantom-kill fix (NR-1), enemy wind-up gated on the light-union (NR-3).
- **Determinism — needed rework (3 HIGH), now re-specified.** The proposal's seed model was internally
contradictory (DP-1/RS-1) and its persistence-lifecycle citation was wrong (DP-2). Re-specified in the Build
Spec's C1/C6 — these were save-corruption / soft-lock class.
- **Reuse — needed rework on graph generation.** `RunMapMath` is **not** salvageable as-is (RS-1); the
`RegionTag→PocketTag` change is a **semantic rewrite over ~23 sites in 15 files**, not a rename (RS-2).
**The load-bearing reworks (now locked in the Build Spec):**
1. **Seed model split (DP-1/RS-1):** the pocket **graph topology is a pure function of `WorldSeed` ONLY** and
is byte-identical across every descent; `DescentSalt` re-knots only per-pocket **content**; **pinning =
freeze a per-pocket `PinnedSalt`**. A pocket is pinned **iff it has a `PinnedPocketSave[]` row** (never a
`salt != 0` test — salt can be 0). `DescentSalt` lineage must be **persisted** (`TotalDescents`, v7) or the
dark repeats across quit+continue (DP-6).
2. **In-pocket death (NR-2/RS-3):** `PlayerRespawnSystem`'s warp-to-base + `RegionTag=Base` flip is **not**
ported unchanged — it would split the co-located party. A downed Wick stays in the active pocket (flame-
share revive reachable); warp-to-station is gated behind a **party-wipe** check. The co-op death/revive
loop is **new code, not salvage.**
3. **Two hard-cull relevancy layers:** Layer-A pocket-occupancy keyed off the run's **single active
`PocketKey`** (connection-independent), with a **disjoint StationPocketKey sentinel** (station must not
alias `NodeId(0,0)=0`); Layer-B party light-union with a **locked once-lit hysteresis latch** + the NR-1
fix + the NR-3 wind-up gate.
4. **Persistence = per-entry lazy replay (DP-2), not a boot one-shot** — reuse only `BaseRestoreSystem`'s
born-correct same-ECB `Health` mechanism, not its lifecycle. `BuildPlaceSystem`/`BaseRestoreSystem` are
**pattern-only** salvage (RS-6).
5. **Scope discipline (RS-4):** this spec is the *"pinning feels like winning"* half (Layer-A + persistence +
muster + FSM rename). Layer-B light-union is deferred to the roadmap's separate **Phase-1 relevancy-light
★review** so it isn't confounded with pinning.
## Consequences
- **Phase 0.3 gate:** the world-model design review has **passed with a re-specified design** (the Build
Spec). Combined with DR-048 (adoption) + the A0 style-proof scene (still open), this closes 0.3's design
half; the in-engine A0 gate remains open.
- **No re-bake / no code yet.** This is design only. Phase 2 world code follows the Build Spec's build order
(each step ends compile+`read_console`; wire/bake churn classified per step; Play-validate world creation
for sort-cycles regardless of green tests — RS-5).
- **New operator forks surfaced** (parked in [[Lantern_Operator_Questions]]): the **dark-side contact policy**
(non-telegraphed chip vs nothing — NR-3), **lantern placement granularity** (free-position vs build-grid —
RS-6), and the **END-1/EB-1 mothball timing** (decide before the `RegionTag` semantic pass so the Core-
fallback / structure-aggro branches are deleted, not generalized — RS-2 site class (c)).
- **Revisit when:** implementation surfaces a contradiction with the spec (loop back to a mini-review), or the
Phase-3 pinning playtest fails its falsifiable test.
## Related
- [[World_Model_Build_Spec]] — the durable contract this DR accepts (all 18 findings folded)
- [[Lantern_World_Model_Design_Proposal]] — the pre-review proposal (superseded)
- [[Lantern_World_Model_Spike]] — the ★review-first brief · [[Roadmap_Lantern_Slice]] Phase 0.3 / Phase 2
- [[DR-048_Lantern_Adoption_Full_Pivot]] — the adoption · [[Lantern_Strip_Mothball_Inventory]] — salvage
- [[validate-netcode-design-before-coding]] — the ritual that caught these before code