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:
@@ -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 2–4 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
|
||||
Reference in New Issue
Block a user