Docs: LANTERN Phase 0 — full pivot adoption + all-doc sweep

Adopt LANTERN as the operative direction (co-op action-RPG, light-as-territory),
superseding the Awakening Engine fiction + the Co-op Hades iteration. Existing
code becomes salvage quarry; the mechanical pillars hold.

Phase 0 deliverables (doc portions):
- DR-048 adoption decision record (0.1)
- Lantern_Strip_Mothball_Inventory — system-by-system keep/rework/mothball (0.2)
- Lantern_World_Model_Spike — pocket-graph + seed-pinning BRIEF, review-first (0.3)
- Art_Direction_Lantern — style bible + material decision + A0 gate (0.4)

Docs/skills sweep: Pillars pointers + LANTERN locked decisions; superseded
banners on Identity, Iteration_CoopHades, Path_to_Fun, Milestones, Backlog,
End_Of_Month (all redirect to the LANTERN roadmap); Home MoC + current-direction
callout (and stale serena line fixed); Systems_Index era note; CLAUDE.md
core-loop line -> LANTERN direction pointer (verbose co-op-Hades invariants
archived to the gotchas archive, net-neutral under the 40 KB budget); dots-dev
validation-harness expedition-run recipe flagged era-specific.

Two Phase-0 gate items remain OPEN (not doc work): the 0.3 world-model design
review and the 0.4 in-engine style-proof scene.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-13 23:13:13 -07:00
parent 1b999e612a
commit 89dd155f85
17 changed files with 534 additions and 19 deletions
@@ -56,6 +56,11 @@ DOES propagate into parented children's `LocalToWorld` (verified live on 6.5.0).
## Headless expedition-run driving (flaky — know the failure modes)
> The specific nouns below (`PlayerReady`, expedition launch, respawn-reset) are **co-op-Hades-era** and become
> salvage under the LANTERN pivot ([[DR-048_Lantern_Adoption_Full_Pivot]]) — they will be re-meaned to the
> **descent lifecycle** (muster → Bell → pockets) when that lands. The *harness patterns* (server-inject, the
> `EditorApplication.update` guardian, capture-in-the-same-call) are direction-agnostic and stay valid.
- Launch by setting server `PlayerReady=1` from clean Staging. **Post-abort re-launch is intermittent** — a clean
Play restart launches reliably on the first ready; re-readying after an abort may not.
- **An AFK player dies to the swarm in ~15 s** and `Health` resets to the class value on respawn — a
+2 -2
View File
@@ -9,7 +9,7 @@ Multiplayer game on **Unity DOTS (Entities) + Netcode for Entities** — server-
- **Size check** — bash: `wc -c CLAUDE.md` · PowerShell: `(Get-Item CLAUDE.md).Length`. Must be `< 40960`.
- **Archive, don't delete.** When trimming, append the verbose / least-hot detail to the obsidian reference note `Docs/Vault/_Meta/CLAUDE_Build_Gotchas_Archive.md` under a **new dated heading** (never overwrite an older snapshot), and leave a one-line pointer + the relevant `[[DR-###]]` link here.
- **Net-zero rule:** every addition is paid for by a condensation elsewhere. Keep only the hottest, highest-recurrence operational rules inline (flag them **★**); depth lives in the archive + DRs.
- Condensation history (detail → archive dated headings): 06-17 · 07-04 · 07-04b · 07-04c · 07-06 · 07-07b (pays the attribute-swallow gotcha) · 07-07c (game-state narrative → invariants+DR pointers; ~3 KB freed, operator-ordered).
- Condensation history (detail → archive dated headings): 06-17 · 07-04 · 07-04b · 07-04c · 07-06 · 07-07b (pays the attribute-swallow gotcha) · 07-07c (game-state narrative → invariants+DR pointers; ~3 KB freed, operator-ordered) · 07-13 (co-op-Hades core-loop bullet → LANTERN direction pointer; [[DR-048_Lantern_Adoption_Full_Pivot]]).
## Stack — Unity 6.5.1 (`6000.5.1f1`, stable) as of 2026-06-27
@@ -138,7 +138,7 @@ Full rationale: [[DR-022_Animation_Pipeline_Rukhanka_Synty]] · [[DR-023_Enemy_A
- `ProjectM.Simulation.GameBootstrap : ClientServerBootstrap` overrides `Initialize` with `AutoConnectPort = 0` (M4 — listen/connect is explicit via the `ConnectionConfig` singleton + per-world ConnectionControlSystems). **Editor default = instant-into-game + MPPM** (creates `ServerWorld` (`WorldFlags.GameServer`) + `ClientWorld` (`WorldFlags.GameClient`)); the `ProjectM/Boot Into Menu (Editor)` EditorPref flips the MAIN editor to the frontend path. **Player builds boot the UITK frontend menu** (`return false` → one menu world, no netcode worlds until a menu choice). See [[DR-019_Frontend_Menu_Settings_Saves_Build]].
- **Scenes:** `Assets/Scenes/MainMenu.unity` (build index 0) boots the UITK frontend (menu world only); `Assets/Scenes/Game.unity` (index 1) holds gameplay with `Assets/_Project/Subscenes/Gameplay.unity` wired in as the baked subscene (GameObject `GameplaySubScene`). `SampleScene`/`DevSandbox` are kept as reference/dev scenes. The on-demand lifecycle (`WorldLauncher`/`SessionRunner`/`MainMenuController`) creates the right worlds per menu choice (Single/Host/Join), THEN `LoadScene(Game)` (subscene-streaming rule above).
- **Core loop = ready-check multi-room RUNS ★ (DR-044/045/046):** base = pure SPEND hub. `RunDirectorSystem` = sole `RunInfo` writer (`[UpdateBefore(CyclePhaseSystem)]`; nothing else in the room chain touches CyclePhase); banks Charge+retaliation once-per-`RunEpoch` on boss-clear ONLY; strips the boon band + `BoonOffer`s on exit; teleports ONLY launch-stamped `RunParticipant`s (released on Returning). Rooms spawn per `RoomEpoch`, `RoomTag`-torn-down, gate on a PORTAL (`RunLifecycle.RoomExplore=6` loot window; `PortalInteractRequest`→server `PortalCommand`). Class + per-run PREP spent at base (Staging-gated RPCs via shared `ClassSwapUtil`; prep `StatModifier` band stripped on Returning). `Health.Max` is a `[GhostField]`. Boss = server-only `BossState`/`BossAISystem` (sole boss mover). ★ **a serialized prefab bool ignores the C# initializer — flip the value in the prefab.** Feel/tuning detail → [[DR-044_Expedition_Redesign_Shipped_Demo_Polish]] · [[DR-045_Combat_Demo_Feel_Boss_Fight]] · [[DR-046_Base_Expedition_Ties_Portal_Class_Prep]].
- **Direction = LANTERN ★ — pivot LOCKED 2026-07-13 ([[DR-048_Lantern_Adoption_Full_Pivot]]).** Co-op action-RPG, *light is territory* (seed-pinned pocket-graph; SoD manual-aim skillshots; suit-frames + Sparks + wild mutations). Supersedes the Awakening-Engine fiction + the Co-op Hades iteration. Operative roadmap [[Roadmap_Lantern_Slice]]; **existing code (combat feel, ability/boon plumbing, run/hub lifecycle, save, regions/relevancy) is QUARRY, not foundation** — keep/rework/mothball per [[Lantern_Strip_Mothball_Inventory]]. **No world code until the ★review-first world-model spike ([[Lantern_World_Model_Spike]]) passes its design review.** The prior co-op-Hades core-loop (ready-check multi-room RUNS; `RunDirectorSystem`/`BossState`; DR-044/045/046) is salvage — invariants archived 07-13 in the gotchas archive. ★ **general gotcha kept: a serialized prefab bool ignores the C# initializer — flip the value in the prefab.**
## DOTS / ECS conventions (authoritative summary)
+11 -6
View File
@@ -2,7 +2,7 @@
tags:
- moc
- home
updated: 2026-06-24
updated: 2026-07-13
permalink: gamevault/00-home/home
---
@@ -10,16 +10,21 @@ permalink: gamevault/00-home/home
Multiplayer game on **Unity DOTS** (Entities) + **Netcode for Entities** (server-authoritative, client prediction). This vault is the canonical, cross-machine, human-facing record. Code lives in `Assets/_Project/`; engine/API truth comes from **context7**, not this vault.
> **Current direction: LANTERN** (locked 2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]) — a co-op
> action-RPG where **your territory is light**: what you light stays, what stays dark rerolls. SoD-grade
> skillshot combat + modular Spark kits + a seed-pinned pocket-graph world. Design: [[Identity_Lantern]];
> roadmap: [[Roadmap_Lantern_Slice]]. Prior directions (Awakening Engine, Co-op Hades) are kept as history.
## Map of Content
- **Vision** → [[Pillars]] — design pillars & locked decisions · [[Identity]] — the fiction (sci-fi frontier colony)
- **Vision** → [[Pillars]] — design pillars & locked decisions · [[Identity_Lantern]] — the fiction (light-as-territory abyssal co-op) · [[Art_Direction_Lantern]] — style bible & material decision · [[Theme_Direction_Candidates]] — the exploration behind the pivot
- **Game Design** → [[Systems_Index]] — per-system design docs
- **Roadmap** → **[[Path_to_Fun]]** (north star) · [[Backlog]] (committed list) · [[Milestones]] (history). **Current direction:** a co-op roguelite-ARPG, **expedition-driven loop** ([[DR-037_Procedural_Expedition_Spine_Two_Classes_Persistent_Meta]] → loop re-shape [[DR-042_Loop_Reshape_Expedition_Driven]]).
- **Sessions** → `07_Sessions/2026/` — dated work logs (latest: [[2026-06-24_Slice_Combat_Depth_Enemy_Variety_Impact_Build]] · [[2026-06-21_Slice3_Expedition_Combat_Spine_Build]] · [[2026-06-17_Design_Redirect_Coop_Roguelite]])
- **Decisions** → `07_Sessions/_Decisions/` — decision records DR-001 … DR-042 · [[DR-001_Netcode_Test_Harness]] · latest [[DR-042_Loop_Reshape_Expedition_Driven]] (loop re-shape: expedition-driven win)
- **Roadmap** → **[[Roadmap_Lantern_Slice]]** (operative) · [[Lantern_Strip_Mothball_Inventory]] (salvage map) · [[Lantern_World_Model_Spike]] (★review-first) · [[Backlog]] / [[Path_to_Fun]] / [[Milestones]] / [[Iteration_2026-07_CoopHades]] (history).
- **Sessions** → `07_Sessions/2026/` — dated work logs (latest: [[2026-07-13_Lantern_Phase0_Adoption_Pivot]] · [[2026-07-12_Phase17_Boon_Overhaul]])
- **Decisions** → `07_Sessions/_Decisions/` — decision records DR-001 … DR-048 · [[DR-001_Netcode_Test_Harness]] · latest [[DR-048_Lantern_Adoption_Full_Pivot]] (the LANTERN pivot)
- **Meta** → [[Documentation_Protocol]] · [[Tags]]
- **Templates** → [[Session_Log_Template]] · [[Decision_Record_Template]]
## How knowledge is organized
See [[Documentation_Protocol]]. In short: design / decisions / sessions live here (committed to git); **basic-memory** recalls over these notes; **serena** navigates C# symbols; native Claude memory holds machine-local facts; **context7** is the source of truth for DOTS / Netcode APIs.
See [[Documentation_Protocol]]. In short: design / decisions / sessions live here (committed to git); **basic-memory** recalls over these notes; C# symbols are navigated with **Glob/Grep** (serena removed 2026-07-07 — unused + flaky on Unity); native Claude memory holds machine-local facts; **context7** is the source of truth for DOTS / Netcode APIs.
@@ -0,0 +1,98 @@
---
tags: [vision, art-direction, lantern, style-bible, workstream-a]
status: draft-binding
updated: 2026-07-13
permalink: gamevault/01-vision/art-direction-lantern
---
# LANTERN — Art Direction Lock (Workstream A0)
> The binding one-page style bible for [[Roadmap_Lantern_Slice]]'s art track (Workstream A0, runs inside
> Phase 0). Adopted under [[DR-048_Lantern_Adoption_Full_Pivot]]. This is the **written** half of A0; the
> gate is the **in-engine style-proof scene** (below), which is **not yet built** — Phase 0 does not exit
> until it is approved. The readability law is lifted verbatim from [[Identity_Lantern#Art, audio & the
> readability law|the identity]] and applies to every asset from day one.
>
> **Why this matters more than usual:** one developer, learning Blender, shipping custom creatures. This
> direction lives or dies on a **repeatable factory**, not on any single beautiful asset. Every rule here is
> chosen so that creature N+1 is a routine sitting, not a research project.
## Style bible (binding)
- **Stylized low-poly, RoR2-lineage.** Silhouette-first; faceted geometry; flat / near-flat shading. Mood is
carried by **dynamic light in murk**, never by texture detail. A readable blob with a great light beats a
detailed model nobody can see in the dark.
- **Poly budgets (hard):** props **≤ ~800 tris** · creatures **≤ ~3k** · hero / boss / suit-frames **≤ ~6k**.
- **The palette is the ontology** (the fiction rule made visible): **warm gold/amber = light (ours, true) ·
cold corpse-green/blue = gloam (the deep's counterfeit) · lure-red = bait · white-hot = conversion.**
- **The readability law (binding, from the three reviews):**
1. **Value first, hue second.** Every warm/cold distinction is *also* carried by luminance value, shape
language, and **flicker-cadence** (steady = true, flicker = false — the load-bearing channel; hue is the
garnish). This is the colorblind answer (gold-vs-green is a worst-case red-green pair).
2. **Design the dark floor for the video encoder, not the OLED.** Bioluminescent ground-clutter density is
the streamability dial; dark scenes must survive 68 Mbps without macroblocking. A separate **capture /
photo grade** (lifted, saturated profile) ships for clips and screenshots.
3. **Screenshot discipline.** Every promotional frame reads at **200 px** with a warm focal light AND a
legible silhouette.
## The material decision (the solo-dev keystone)
**No per-asset texturing, ever.** This is the single most important production rule in the project.
- **One shared palette / gradient atlas** — Imphenzia-style: a single small texture of colour bands. UVs are
*placed onto bands*, not unwrapped. Zero texture-painting skill required; perfect style coherence; batches
hard.
- **Vertex-colour accents** for per-asset variation on top of the atlas.
- **Three master shaders — the whole rendering surface of the game:**
1. **`Lit-Palette`** — statics (props, dressing, environment, station).
2. **`Emissive-Gloam`** — parameterized warm/cold/lure emissive. **One shader is the entire palette rule:**
its parameters (hue, **flicker-cadence**, intensity) are *both* the look *and* gameplay information
(true-vs-false light). Every glow in the game is this shader.
3. **`Skinned-Palette`** — deformation-aware (the Rukhanka-skinned creatures/suits). Replaces the current
`AnimatedLitShader` role as the palette-atlas creature material.
**Every asset in the game shares ~3 materials.** Coherence, batching, and no per-asset UV/texture work — that
is the amortization that makes a one-person creature factory possible.
> ⚠ **Carry-over gotcha ([[material-property-body-flash-rukhanka]]):** a per-instance `URPMaterialPropertyBaseColor`
> tint only renders if the shader declares `_BaseColor` **Hybrid-Per-Instance** (ShaderGraph
> `overrideHLSLDeclaration:true` + `hlslDeclarationOverride:2`). The three master shaders must be authored
> Hybrid-Per-Instance if we want per-instance gloam-tint variants (a free variant axis — see A2 variant policy).
## Reference board
- **RoR2** — shape language, faceted low-poly, dynamic-light-first in dark ambient.
- **Dredge** — water mood, dread, the sea-as-atmosphere.
- **Hollow Knight** — value control in darkness (how to stay legible with almost no light).
- **Below** — the **cautionary** case: solo dread + screenshot-illegible darkness killed it. The readability
law exists specifically against this failure.
## The style-proof scene — THE GATE (not yet built)
**One prop + one creature + one suit**, in-engine, under murk + dynamic lights, on the capture grade. Judged
three ways, all of which must pass:
1. **Full-size** — reads as *this game and no other*.
2. **At 200 px** — silhouette + warm focal light legible (screenshot-discipline rule).
3. **In grayscale** — value-first / flicker-cadence carries the true-vs-false read with hue removed.
**Locked before any mass production.** This gate + [[DR-048_Lantern_Adoption_Full_Pivot]] + the world-model
review ([[Lantern_World_Model_Spike]]) together are Phase 0's exit. Until this scene is approved, Workstream A
stays in A0 (no A1 pipeline proof, no A2 factory).
## Handoff to the deeper pass (A1 recipes)
The concrete recipe documents are **A1 work** (Phase 1), not A0: the **statics recipe** (Blender → export
units/scale → collider policy → entity baking → palette material) and the **skinned recipe** (rig → per-action
clips, Key All Bones, bake-to-pose → FBX → Rukhanka ingest → `Skinned-Palette` → prefab). Both build on the
project's proven animation pipeline ([[DR-022_Animation_Pipeline_Rukhanka_Synty]] / [[DR-023_Enemy_Animation_MonsterMash]]
+ the machine-local Blender recipe) and the **three rig families** (Drifter / Crawler / Strider). This doc is
the constitution; the recipes are the operating manuals.
## Related
- [[Identity_Lantern]] — the fiction the palette encodes (the readability law lives there too)
- [[Roadmap_Lantern_Slice]] — Workstream A (A0 → A1 → A2 → A3) gates
- [[DR-048_Lantern_Adoption_Full_Pivot]] — the adoption
- [[Synty_Asset_Inventory]] — placeholder quarry until custom assets land
- [[DR-022_Animation_Pipeline_Rukhanka_Synty]] — the skinned-material lineage `Skinned-Palette` inherits
+5
View File
@@ -9,6 +9,11 @@ permalink: gamevault/01-vision/identity
# Game Identity — The Awakening Engine (Aether-colony sci-fi)
> [!warning] SUPERSEDED as the operative fiction (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
> The game pivoted to **LANTERN** — see [[Identity_Lantern]]. This Awakening-Engine fiction is **kept as
> history and as salvage quarry** (the code it skins is now inventoried in [[Lantern_Strip_Mothball_Inventory]]).
> Nothing here is deleted; it is no longer the target.
> The fiction that turns the [[Pillars|mechanical pillars]] into a *place*. Originally the "frontier colony" skin (2026-06-02, [[DR-009_GameFeel_Identity_FirstBlood]]); **evolved 2026-06-03** to absorb the magic + sci-fi premise (amnesiac Sleeper, a guiding voice, a goal called THEM) into one coherent world — recorded in [[DR-014_M6_Build_Structures_Automation_Foundation|the M6 build slice]] and the fiction-adoption decision. It remains a **skin over the locked pillars — no mechanical rework**: every M1M6 system keeps its code and gains a fictional role. The frontier colony is *recontextualised, not replaced*.
## One-sentence pitch
+29 -1
View File
@@ -11,6 +11,14 @@ permalink: gamevault/01-vision/pillars
> The few non-negotiables every system must serve. Keep this short; promote only decisions that are truly locked.
> [!info] Direction: **LANTERN** (locked 2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
> The **mechanical pillars below still hold** (Unity DOTS + Netcode, server-authoritative, 24 co-op,
> skill-expression combat, persistent base, automation-as-progression). What changed is the **fiction + three
> subsystems**: the fiction is now [[Identity_Lantern]] (not the Awakening Engine); combat sharpens to
> **SoD-grade manual-aim skillshots** (the soft auto-target era ends); the world becomes a seed-pinned
> **pocket-graph** where **light is territory**; the build layer becomes suit-frames + cultured Sparks + wild
> mutations. See the LANTERN locked decisions at the bottom.
## Pillars
> **Combat is the primary verb; base + automation braid around it** (locked 2026-06-08, [[DR-028_Combat_Primary_Verb_Depth_First]]). The fusion of all three is the identity — but as ONE braided loop with a single primary verb, never three co-equal, independently-deep modes. Roadmap: [[Path_to_Fun]].
@@ -30,7 +38,27 @@ permalink: gamevault/01-vision/pillars
- **Combat-primary + depth-before-breadth (locked 2026-06-08):** combat is the primary braided verb; **no new system until one braided loop is genuinely fun**, and every milestone ends with a play/fun-gate (not just green tests). [[DR-028_Combat_Primary_Verb_Depth_First]] · roadmap [[Path_to_Fun]].
- **Classes + persistent meta (locked 2026-06-17, [[DR-037_Procedural_Expedition_Spine_Two_Classes_Persistent_Meta]]):** **two classes****Warrior** (melee anchor) + **Ranger** (ranged, manually aimed — *not* auto-fire, which would break skill-expression). Class identity = the **primary-attack archetype**; run-acquired **meta-buffs ride the existing `StatModifier`/`TimedModifier` pipeline**. A **persistent meta-progression layer** (SaveData v6) funds permanent growth at the hub; run combat-buffs are run-scoped. **Reverses [[DR-031_Base_Mining_Loop_Cohesion]]'s expedition pause** (a real playtest — [[Scratch Notes 6152026]] — showed the single arena goes stale).
## LANTERN direction — locked decisions (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]])
These sit *on top of* the mechanical pillars above (which are unchanged). Full design: [[Identity_Lantern]];
roadmap: [[Roadmap_Lantern_Slice]].
- **The one rule:** *what the light holds, stays; what the dark holds, changes.* Applied to the world =
persistence; to the body = death; to the kit = builds; to the story = stakes.
- **World = seed-pinned pocket-graph** (light is territory). Permanence is spendable: lit pockets persist,
dark pockets re-knot. The hardest netcode problem — [[Lantern_World_Model_Spike]] (★review-first).
- **Combat feel = SoD-grade manual-aim skillshots** (telegraphs, dashes, cooldown kits; **soft auto-target
cut**). Suit-frames = chassis/class; **Sparks** (abilities-as-organs, cultured) graft into sockets; **wild
mutations** are the augment layer (paced thresholds, evaporate at homecoming, Tallow fix-slots).
- **Death = the split:** flame returns cheap (kit works within minutes); cargo + fixed mutations + raw organs
strand with the suit — recovery runs are optional value-runs, never mandatory kit-repair.
- **Session-only burn** (the Lamp burns only while a session runs — no offline punishment). **Hosting = Wicks
travel; worlds are saves** (Valheim contract). **Loss ceiling = pockets, never a shelf.**
- **The slice's falsifiable test:** *does pinning a pocket feel like winning, and does a stranded suit feel
worth a second descent?* — the only gate that matters.
## Related
- [[Identity]] — the **fiction** that skins these pillars: **The Awakening Engine** (Aether-colony sci-fi), evolved 2026-06-03 ([[DR-015_The_Awakening_Engine_Fiction_Adoption]]) from the original frontier-colony skin ([[DR-009_GameFeel_Identity_FirstBlood]], 2026-06-02). Skin-only — no mechanical rework; **Aether** is the one substance unifying magic + tech (cyan = ordered / orange = wild Blight), with an amnesiac-**Sleeper** / **Echo** (the guiding voice) / **THEM** spine.
- [[Identity_Lantern]] — the **operative fiction** these pillars now skin (co-op action-RPG; light-as-territory).
- [[Identity]] — the **prior** fiction (The Awakening Engine, Aether-colony sci-fi) — **superseded** as operative by [[DR-048_Lantern_Adoption_Full_Pivot]], kept as history/quarry. Skinned via [[DR-015_The_Awakening_Engine_Fiction_Adoption]] / [[DR-009_GameFeel_Identity_FirstBlood]] (amnesiac Sleeper / Echo / THEM · Aether cyan=ordered / orange=wild Blight).
- Decision records: `07_Sessions/_Decisions/`
@@ -8,6 +8,12 @@ permalink: gamevault/02-game-design/systems-index
# Systems Design — Index
> [!info] LANTERN pivot (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
> The systems catalogued below are the **Awakening-Engine / Co-op-Hades-era spine**. They are **not deleted** —
> under LANTERN they are **quarry**: each has a keep / rework / mothball verdict in
> [[Lantern_Strip_Mothball_Inventory]]. This index stays the accurate map of *what exists in code today*; the
> inventory is the map of *what happens to it*. New LANTERN systems get sections here as they land.
One design doc per gameplay system, linked here. Each should state: purpose, components (`IComponentData`), systems (`ISystem`), netcode shape (ghost? predicted vs interpolated? inputs / RPCs), and open questions.
## Systems
+3 -2
View File
@@ -7,8 +7,9 @@ updated: 2026-06-13
permalink: gamevault/06-roadmap/backlog
---
> [!warning] SUPERSEDED as the operative plan (2026-07-06 Co-op Hades conversion, banner added 2026-07-07).
> Current direction + phases: [[Iteration_2026-07_CoopHades]]. This doc is kept as history.
> [!warning] SUPERSEDED as the operative plan. Now **LANTERN** (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
> Current direction: [[Roadmap_Lantern_Slice]]. (Intermediate history: the 2026-07-06 Co-op Hades conversion,
> [[Iteration_2026-07_CoopHades]].) This doc is kept as history.
# Backlog
@@ -12,8 +12,9 @@ updated: 2026-06-17
permalink: gamevault/06-roadmap/end-of-month-game-jam-slice
---
> [!warning] SUPERSEDED as the operative plan (2026-07-06 Co-op Hades conversion, banner added 2026-07-07).
> Current direction + phases: [[Iteration_2026-07_CoopHades]]. This doc is kept as history.
> [!warning] SUPERSEDED as the operative plan. Now **LANTERN** (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
> Current direction: [[Roadmap_Lantern_Slice]]. (Intermediate history: the 2026-07-06 Co-op Hades conversion,
> [[Iteration_2026-07_CoopHades]].) This doc is kept as history.
# End-of-Month Game Jam Slice
@@ -7,6 +7,12 @@ permalink: gamevault/06-roadmap/iteration-2026-07-coophades
# Iteration 2026-07 — Co-op Hades Conversion
> [!warning] SUPERSEDED as the operative direction (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
> The project pivoted to **LANTERN** — operative roadmap [[Roadmap_Lantern_Slice]], design [[Identity_Lantern]].
> Everything below shipped and is **kept as history + salvage quarry** (see [[Lantern_Strip_Mothball_Inventory]]
> for the keep/rework/mothball calls on this iteration's systems — the combat feel layer, boon pipeline,
> world-alive presentation, and run/hub lifecycle are all salvage). Nothing here is deleted.
**Operator decision (2026-07-06, dev-loop iteration session):** commit the *Fix-the-Fight-in-Place trunk* PLUS the full
*Co-op Hades* direction — cut/mothball the tower-defense layer, base becomes a Hades-house hub, boons become
mechanic-changers, kit gains a second ability, real node types, second boss, co-op revive. **Depth folds in now** (not
@@ -0,0 +1,88 @@
---
title: LANTERN — Strip / Rework / Mothball Inventory (Phase 0.2)
date: 2026-07-13
tags: [roadmap, lantern, salvage, inventory, phase-0]
permalink: gamevault/06-roadmap/lantern-strip-mothball-inventory
---
# LANTERN — Strip / Rework / Mothball Inventory
> Phase 0.2 of [[Roadmap_Lantern_Slice]], adopted under [[DR-048_Lantern_Adoption_Full_Pivot]]. Inventories
> every current subsystem against the LANTERN vertical slice. **Existing code is quarry, not foundation** —
> this table records the salvage call, not a migration contract. The per-phase build specs (deeper technical
> pass) own the actual rework; this is the map.
>
> **Legend:** **KEEP** = ports ~as-is (re-theme only). **REWORK** = the chassis/plumbing survives, the design
> on top changes. **MOTHBALL** = retire from the flow via baked toggles (`ScheduleEnabled` pattern), code +
> tests keep compiling for reversibility — do not delete. **CUT** = the design is gone from the slice (code
> may still be mothballed).
>
> Headline calls (roadmap standing constraints): combat feel layer + telegraphs → **KEEP**; boon pipeline →
> **REWORK into mutations**; regions/relevancy, save, hub lifecycle → **REWORK**; sieges/economy leftovers →
> **MOTHBALL**.
## Combat & player (the primary verb — strongest salvage)
| Subsystem (current) | Verdict | LANTERN target / note |
|---|---|---|
| **Combat feel layer**`CombatFeedbackSystem` (+ split siblings), per-kind telegraph colours/voices/lights, hit-stop (camera punch), dash juice, damage numbers | **KEEP** | The single strongest asset. Roadmap: "combat feel layer + telegraphs: keep." Re-palette to warm/cold/lure; feed the SoD skillshot bar. |
| **Player mover** — CharacterController kinematic (collide-and-slide), `PlayerControlSystem`, `CharacterProcessor`, planar Y-lock, predicted-physics infra | **KEEP** | Suit-frames are weighted seafloor infantry (no swimming) — the top-down CC config is exactly right. |
| **Camera**`PrototypeCameraRig` (ARPG follow, look-ahead, zoom, shake/`Hold`) | **KEEP** | Unchanged; the warm-cone-in-dark framing is a camera+light job. |
| **Projectile/melee plumbing** — predicted `AbilityFireSystem`, `ProjectileMoveSystem`/`ClassificationSystem`, **swept** `ProjectileDamageSystem`, `HealthApplyDamageSystem`, MC-4 combo `Step` | **REWORK** | Keep the predicted-spawn + swept-hit + server-damage spine. Rebuild the ability grammar as **4-socket skillshot kits** with real windups/telegraphs/aim. |
| **Aim**`PlayerAimSystem` (client-derived), `AimReticleSystem`, scheme byte, **soft auto-target** | **REWORK** (auto-target **CUT**) | SoD-grade **manual aim** is the feel target — the in-arc soft auto-target ends. Reticle + client-derived aim plumbing reused. |
| **Ability data model**`AbilityDatabase` blob, `AbilityRef`, `StatModifier`/`EffectiveAbilityStats`, `StatRecomputeSystem` (every-tick fold, rollback-correct) | **KEEP / REWORK** | The substrate for **Sparks** (abilities-as-organs) + **mutations**`StatModifier→EffectiveAbilityStats` is exactly what buffs/tiers/mutations ride ([[Identity_Lantern]]). |
| **Boon pipeline**`BoonEffects` (SendToOwner Pierce/Fork/Chain/Flags), `BoonOffer`, offer dedup / dominated-protection / `Family` bias, `KillRewardSystem`, `ProjectileEffectState` | **REWORK → wild mutations** | The mechanic-changer architecture IS the **wild-mutation warp** substrate. Layer on: paced thresholds (pocket-clear beats), evaporate-at-homecoming, Tallow **fix slots** (1/Spark), culture library, raw-socketing. [[DR-047_Phase17_Boon_Overhaul_Mechanic_Changers]] is the salvage seed. |
| **Enemy AI + directors** — server-only `EnemyAISystem` (no-pathfinding collide-and-slide + `Depenetrate`/tangent-slide/`EnemyNavState` nudge backstop), `RoomEnemyDirectorSystem`, kind-indexed roster, `Dying` window, separation pass, poise byte | **REWORK** | Chassis kept (sole-position-writer, cover-aware nudge). Re-theme the roster to the bestiary: **Drowners** (Strider), **Grindylow** (Crawler leapers), **Wreckers** (Strider + fake-beacon/scan), **Wisp-Choir** (Drifter motes). Formalize spawn/rig path into **CreatureKit** (Workstream A2). |
| **Boss** — server-only `BossState`/`BossAISystem` (sole mover, telegraphed radial SLAM, phase-2 speed + summon), `Health.Max` `[GhostField]`, party-HP scale | **REWORK** | Reused for the **shelf-boss** (Phase 6) — a real multi-phase skillshot fight. |
## World, netcode & lifecycle (the ★review-first zone)
| Subsystem (current) | Verdict | LANTERN target / note |
|---|---|---|
| **Regions / relevancy**`RegionTag{byte}` (server-only), `GhostRelevancy` (`SetIsIrrelevant`), `RegionRelevancySystem`, untagged-global-ghost rule | **REWORK** | The seed for LANTERN's hardest idea: **light-as-information** relevancy (entities outside your lamp radius aren't replicated) + **pocket streaming**. Coordinate-region split → **pocket-graph**. Owned by the ★review-first [[Lantern_World_Model_Spike]] — no world code until that review passes. |
| **Run / room lifecycle**`RunDirectorSystem` (sole `RunInfo` writer), `RunLifecycle`/`RoomExplore`, `RoomEpoch`/`RoomTag` teardown, `PortalCommand`/`PortalInteractRequest`, ready-check, `ClassSwapUtil`, `PrepCatalog`/`PrepPurchaseRequest` | **REWORK** | Maps onto the **descent lifecycle**: muster at deepest lit waypoint → **Bell** down → pockets → Bell recall / lit-road walk home; ~3040 min cap. Rooms→**pockets** (seed-fresh re-knot); portal→Bell/waypoint transit; class-at-base→**suit-frame** pick; per-run prep kept. State machine is salvage; the pocket-graph replaces the linear route map. |
| **Save system**`SaveData` (single-slot atomic JSON, versioned/additive, `[MinLoadableVersion,Current]`), `SaveService`, born-correct `CycleDirectorSpawnSystem` staging, `BaseRestoreSystem` (charge-free replay + remaining-tick cooldowns + HP) | **REWORK** | Persistence = **seed-pinning**: persist pinned-pocket **seed + structure deltas** + banked light + culture library. The versioned-additive JSON + **born-correct load** pattern is exactly what pinning needs — keep the HOW, change the WHAT. Hosting = "**Wicks travel; worlds are saves**" (Valheim contract). |
| **Frontend / on-demand worlds**`GameBootstrap`, `WorldLauncher`/`SessionRunner`/`MainMenuController`, UITK menu (Single/Host/Join), `CreateClientWorld`/`CreateServerWorld` | **KEEP** | The Valheim hosting model needs exactly this on-demand world lifecycle + menu flow. Re-skin the menu to the station. |
| **Build / structures / grid**`BaseGridMath` (locked coord space), `StructureCatalog`, co-op-atomic `BuildPlaceSystem`, `PlacedStructure`, EB-1 `Health`/`Destructible` structure loss-state | **REWORK** | **Building v1** inside lit pockets (Phase 3) — the grid + atomic-placement RPC + catalog reused; structure-death (EB-1) reused for **tide defense** (severable fuel lines, garrisoned junctions). |
## Economy, resources & harvest
| Subsystem (current) | Verdict | LANTERN target / note |
|---|---|---|
| **Ledger + harvest** — global `StorageEntry` ledger (`ResourceLedger` tag), personal `InventorySlot` bag (`OwnerSendType.All`), unified **swept** `ResourceHarvestSystem` (nodes + clutter, immortal-sink guard), `G`-deposit RPC | **REWORK** | Re-mean the currencies: **Flame / Lumen / Gloam / Loudness / Salvage / Chum / Tallow** ([[Identity_Lantern]]). Ledger + personal bag + swept harvest plumbing kept; **carried-vs-banked cargo** distinction is new; harvest = **Lumen nodes + organ drops**. |
| **Resource ids** — Ore / Aether / Biomass / Charge (`ResourceId` bytes) | **REWORK** | Re-meaned to the LANTERN currency set (bytes, not enums — Burst rule holds). |
| **Inventory / equipment**`EquipmentSlot``AbilityRef` swap, `ItemDatabase` blob, `EquipSystem` (atomic bag↔slot) | **REWORK / PARTIAL** | Already PAUSED. The slot→ability swap is the **graft-into-socket** substrate for Sparks; **culture library** (permanent per-station collection) is new. |
| **Automation**`Harvester`/`Conveyor`/`Fabricator` chain, `ProductionMath`/`ConveyorMath`, deterministic offline catch-up, server-only I/O buffers | **MOTHBALL** | LANTERN **cuts spatial production machinery** ([[Identity_Lantern]] scope ladder). v1.0 automation is **assignment-based** (Tenders under the Klabautermann), not conveyors. Mothball the chain; keep the deterministic-catch-up math as reference for assignment production. |
## Sieges / win-condition (tower-defense layer — mothball-bound)
| Subsystem (current) | Verdict | LANTERN target / note |
|---|---|---|
| **Base-siege win** — END-2 final siege + latching Victory/Loss, `GoalReachedSystem`, `RunOutcome` (`[GhostField]` server-only) | **MOTHBALL / REWORK-meter** | No base-siege win in LANTERN. `GoalProgress`/`RunOutcome` **win-meter** reworks into the **Lamp brightness = campaign meter**. The **Dawn** (final carry) is the v1.0 win, not the slice. |
| **Losable Core** — END-1 `CoreIntegrity`, `CoreDamageSystem`/`CoreRestoreSystem`, Core as AI fallback target | **MOTHBALL** | Already mothball-bound (Phase 2). No Core in LANTERN; the station is never destroyed — **loss ceiling = frontier pockets, never a shelf**. |
| **Turret defense** — EB-2 turret-ammo `Charge`, `TurretFireSystem` soft-fail spend, ledger-fed Fabricator mint | **MOTHBALL** | No turret auto-defense in the slice. **Tide defense** (defend a planted lantern / fuel line) is a different, later beat (Phase 6 scripted tide). |
| **Cycle/phase director**`CyclePhaseSystem` (sole Phase writer), scheduled-siege / retaliation | **MOTHBALL / REWORK** | The auto-cycle retires. The **forecast** model (Siren sings tide windows in advance) replaces sprung sieges — a planned event, not an interrupt. |
## Presentation, world-feel & art (the LANTERN look is already here)
| Subsystem (current) | Verdict | LANTERN target / note |
|---|---|---|
| **Rendering identity** — dark-ambient + dynamic-light-first (clean dark-Synty), `DynamicLightSystem` (projectile/portal/node/impact lights), per-biome dark palettes, ACES/HDR grade | **KEEP** | *This is LANTERN.* The rendering pipeline stops being a style and becomes the fiction (light carves playable space). Add the **capture/photo grade** (lifted profile for clips) + the **readability law** (value-first, flicker-cadence, 200px). |
| **Atmosphere / ambient**`WorldAtmosphereSystem` (fog/ambient cross-fade), `AmbientMotionSystem` (drift/sway/rustle), `AmbientLifeSystem` (critters + cloud shadows + weather beats) | **KEEP / REWORK** | Ports as **water-column atmosphere** (murk, silt-outs, plankton blooms, currents, whale-falls). Critters → light's-edge fauna; weather beats → the dark-as-weather language. |
| **Hazards / breakables / decals / cover**`HazardExplosionSystem` (barrels), `GeyserEruptSystem` (periodic AoE, born-correct tick), `BlightClutter` breakables, destructible cover (env-collider ghost), `ScorchDecalSystem`/`CoverDamageSystem` | **KEEP / REWORK** | The both-sides-telegraphed AoE chassis (barrels/geyser) ports to **vent fields**; breakables/cover → wreck/coral dressing; decals reused. `BlightClutter`**pocket clutter** (glow-flora/wrecks). |
| **HUD / UI**`HudSystem` (UITK, split siblings), `MenuUi` palette/`PanelSettings`/`EventSystem`, build palette, `PauseMenuController`, `HudTheme` SO | **REWORK** | UITK chassis + build palette kept; re-mean to **Flame / Lumen / Gloam / Loudness pips** + **lamp-morse** ping wheel. Station panels (Lamp meter, rack, graft-bench) are Phase 7. |
| **Animation** — Rukhanka 2.9 client-derived (`PlayerAnimationDriveSystem`, `EnemyAnimationDriveSystem`, `ServerStripAnimationSystem`), `AnimatedLitShader`, `EnemyRigTools`, humanoid muscle-clip pipeline | **KEEP / REWORK** | Client-derived pipeline kept wholesale (netcode replication OFF). Formalize into the **3 rig families** (Drifter/Crawler/Strider, Workstream A1); `AnimatedLitShader` → the deformation-aware **`Skinned-Palette`** master shader (palette-atlas material decision). |
| **World art assets** — Synty biomes (`BaseBiome` Meadow / `ExpeditionBiome` Arid), `ColliderFitTools`, `EnvArtTools` (HDRP→URP) | **REWORK / QUARRY** | Synty = **placeholder quarry** during transition ([[Synty_Asset_Inventory]]). LANTERN's abyssal look is custom Blender + the 3 master shaders + one palette atlas (Workstream A0). `ColliderFitTools` reused for pocket collider fitting. |
| **Dev tooling**`DebugOverlay`/`TuningConfig`, `DebugCommandSendSystem`, class-switch, screenshot rig, validation-harness | **KEEP / REWORK** | Retooled per roadmap cross-cutting: **pocket-graph visualizer, seed-pin inspector, Loudness/threat readout, descent-state overlay**. The server-inject validation harness pattern stays. |
## What this leaves for Phase 1
The **combat gym** (Phase 1) can be built almost entirely from KEEP + light REWORK: player mover + camera + combat feel + projectile/melee spine + ability data model + telegraphs, with two suit-frames on the existing humanoid pipeline and 45 Sparks on the reworked boon substrate. The ★review-first items (relevancy → light-as-information, pocket streaming) are quarantined behind [[Lantern_World_Model_Spike]] and do not block the gym.
## Related
- [[DR-048_Lantern_Adoption_Full_Pivot]] — the adoption this delivers 0.2 for
- [[Roadmap_Lantern_Slice]] — the phase roadmap each verdict feeds
- [[Lantern_World_Model_Spike]] — owns the REWORK of relevancy/lifecycle/save (★review-first)
- [[Systems_Index]] — the per-system design docs being inventoried
- [[Synty_Asset_Inventory]] — the placeholder quarry
@@ -0,0 +1,91 @@
---
title: LANTERN — World-Model Design Spike (Phase 0.3, ★review-first)
date: 2026-07-13
tags: [roadmap, lantern, netcode, world-model, design-spike, phase-0, review-first]
status: brief-review-pending
permalink: gamevault/06-roadmap/lantern-world-model-spike
---
# LANTERN — World-Model Design Spike (pocket-graph + seed-pinning)
> **★ REVIEW-FIRST — this is a BRIEF, not a design.** Phase 0.3 of [[Roadmap_Lantern_Slice]], adopted under
> [[DR-048_Lantern_Adoption_Full_Pivot]]. This frames the slice's **hardest netcode problem** and its open
> questions so the adversarial design review has a target. **No world code is written until that review
> passes** (the standing project ritual — [[validate-netcode-design-before-coding]]). This doc feeds the
> review; the review produces the durable Build Spec that feeds the eventual DR.
>
> **This gate is one of Phase 0's three exit conditions** (with the adoption DR and the A0 style-proof scene).
> It is currently **OPEN** — the review has not been run.
## The problem in one sentence
Permanence is **territory made of light**: what a lamp holds is fixed and saved; what is dark **re-knots**
every descent — and this must hold across 24 co-op clients under server authority, client prediction, and a
per-player light-based information radius, without shipping a determinism nightmare.
## The design commitments to honour (from [[Identity_Lantern]])
- **The world is a pocket-graph** — discrete generated pockets on a graph, **not open stitched terrain**.
- **Permanence = seed-pinning.** Dark pockets generate from a per-descent seed; **lighting one pins its seed
and saves structure deltas.** "The dark re-knots" is a seed change, nearly free.
- **Light is information, server-enforced.** A client is not sent entities outside its lamp radius — relevancy,
not gamma. Dimming is a true trade (quiet for blind).
- **Session shape:** muster at the deepest lit waypoint → Bell down → pockets → Bell recall or lit-road walk
home; **~3040 min hard cap**. Lighting a lantern is a save point.
- **Loss ceiling:** the dark takes frontier *pockets*, never a whole shelf.
## The contract to design (the review's agenda)
1. **Pocket generation as a pure function of `(worldSeed, pocketId, descentSalt)`.** Deterministic, server-
authored. The seed never needs replicating cross-client (the DR-037 feasibility insight holds: **the server
spawns procedural content as runtime ghosts and clients just receive them** — no cross-client determinism
problem). Question: what is `pocketId` (graph node id) and how is the graph itself generated/pinned?
2. **Pinning = persist `seed + structure deltas`.** Lighting a waypoint-lantern writes the pocket's seed +
its building/harvest deltas to the save. Re-entry regenerates from seed then replays deltas (the
**born-correct** load pattern already proven in [[Lantern_Strip_Mothball_Inventory|the save rework]]).
Question: delta granularity (full structure list vs diff), and how banked-light/Lamp state composes.
3. **Pocket streaming / replication as runtime ghosts.** Only the current + adjacent pockets are live; a
pocket's entities spawn as server ghosts when the party enters and despawn on exit. Reuses the
`GhostRelevancy` (`SetIsIrrelevant`) machinery from the region split — but keyed on **pocket occupancy +
lamp radius**, not a coordinate region. Question: the transit/handoff moment (Bell down, walk between
pockets) and how relevancy composes with light radius without a per-tick cost blowup.
4. **Muster / Bell transit contract.** Muster relocates to the deepest lit waypoint; the Bell is the
depth-lock transit. Reuses the run/room lifecycle state machine ([[Lantern_Strip_Mothball_Inventory]]).
Question: co-op semantics (does the whole party transit together? partial-party descents?).
5. **Light-as-information relevancy.** Per-player lamp radius drives what is replicated to that client. This
is the Phase-1 "relevancy-light prototype" — the ★review-first item flagged there too. Question: is this
the SAME mechanism as pocket streaming or a second layer on top, and how do they interact.
## Known hazards the review must attack (from CLAUDE.md + prior DRs)
- **Relevancy cull re-audit:** a 2nd concept sharing an existing tag has repeatedly wiped/blocked cross-region
state (DR-031, DR-040). Any pocket/light relevancy scheme must re-audit every query/cull over the tag.
- **Shared GLOBAL state rides an UNTAGGED ghost** (never a relevancy-tagged one) — the Lamp meter, campaign
readout, party Loudness must stay relevant everywhere.
- **Prediction determinism:** no wall-clock / `Time.deltaTime` / `System.Random` in predicted sim; pocket gen
is server-authored (not predicted). Tick sentinels through `TickUtil.NonZero`.
- **Per-tick relevancy cost:** the region relevancy system already needs cosmetic props to be non-ghost;
light-radius relevancy recomputed per player per tick is a cost the review must bound.
- **Save additivity:** seed-pin schema must be additive/versioned (`[MinLoadableVersion, Current]`) so old
saves load.
## Explicit non-goals for the spike
Not designing: the full v1.0 severable fuel-net, the doppelganger relocation AI, shelf-regression, or open
terrain (cut). The spike designs **the slice's** pocket-graph + pinning + streaming + transit only.
## Status & next action
**OPEN.** Next action (not doc work): run the **adversarial design-review Workflow** (lenses:
netcode/relevancy · determinism/prediction · reuse/scope → adversarial critics → synthesis) over this brief +
the ground-truth relevancy/lifecycle/save code, producing `World_Model_Build_Spec.md`. Only then does any
world code begin (Phase 2 in the roadmap; Phase 1's combat gym has **no world** and is not blocked by this).
## Related
- [[Roadmap_Lantern_Slice]] — Phase 0.3 (this) and Phase 2 (the dark & the pocket-graph, which this gates)
- [[DR-048_Lantern_Adoption_Full_Pivot]] — the adoption
- [[Lantern_Strip_Mothball_Inventory]] — the relevancy/lifecycle/save salvage this reworks
- [[Identity_Lantern]] — the world-model commitments (the tide-line)
- [[DR-013_M6_Aether_Cycle_Region_Split]] — the region/relevancy machinery being reworked
- [[validate-netcode-design-before-coding]] — the ritual this doc sets up
+3 -2
View File
@@ -6,8 +6,9 @@ updated: 2026-06-13
permalink: gamevault/06-roadmap/milestones
---
> [!warning] SUPERSEDED as the operative plan (2026-07-06 Co-op Hades conversion, banner added 2026-07-07).
> Current direction + phases: [[Iteration_2026-07_CoopHades]]. This doc is kept as history.
> [!warning] SUPERSEDED as the operative plan. Now **LANTERN** (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
> Current direction: [[Roadmap_Lantern_Slice]]. (Intermediate history: the 2026-07-06 Co-op Hades conversion,
> [[Iteration_2026-07_CoopHades]].) This doc is kept as history.
# Milestones
+5 -4
View File
@@ -6,13 +6,14 @@ tags:
- economy
- endgame
- north-star
status: active
updated: 2026-06-24
status: superseded
updated: 2026-07-13
permalink: gamevault/06-roadmap/path-to-fun
---
> [!warning] SUPERSEDED as the operative plan (2026-07-06 Co-op Hades conversion, banner added 2026-07-07).
> Current direction + phases: [[Iteration_2026-07_CoopHades]]. This doc is kept as history.
> [!warning] SUPERSEDED (2026-07-13, [[DR-048_Lantern_Adoption_Full_Pivot]]).
> The project pivoted to **LANTERN** — operative roadmap [[Roadmap_Lantern_Slice]], design [[Identity_Lantern]].
> This north-star doc (and the Co-op Hades plan that first superseded it, 2026-07-06) are **kept as history**.
# Path to Fun — the north-star roadmap
@@ -0,0 +1,77 @@
---
date: 2026-07-13
type: session
tags: [session, lantern, pivot, phase-0, docs]
permalink: gamevault/07-sessions/2026/2026-07-13-lantern-phase0-adoption-pivot
---
# Session 2026-07-13 — LANTERN Phase 0: adoption & the full docs/skills pivot
## Goal
Start Phase 0 of the LANTERN roadmap ([[Roadmap_Lantern_Slice]]): **make the full pivot** — adopt LANTERN as
the operative direction and update **all docs & skills** to reflect it, plus deliver the Phase-0 items that are
documentation work. No code this session (the pivot is a direction adoption; implementation starts at Phase 1).
## Done
**Phase 0 checklist items (doc portions):**
- **0.1 Adoption** — wrote [[DR-048_Lantern_Adoption_Full_Pivot]] (LANTERN supersedes the Awakening-Engine
fiction + the Co-op Hades iteration; archive-not-delete; existing code = quarry; mechanical pillars hold).
- **0.2 Strip/mothball** — wrote [[Lantern_Strip_Mothball_Inventory]]: system-by-system keep / rework /
mothball / cut, grounded in [[Systems_Index]] + the co-op-Hades systems. Headlines: combat feel + telegraphs
= keep; boon pipeline → mutations; regions-relevancy / lifecycle / save → rework; automation +
sieges/Core/turret = mothball.
- **0.3 World-model spike** — wrote [[Lantern_World_Model_Spike]] as a **★review-first BRIEF** (pocket-graph +
seed-pinning + light-as-information relevancy + Bell transit contract, with the open questions + known
hazards for the review). Marked review-PENDING; no world code until the adversarial review passes.
- **0.4 Art A0** — wrote [[Art_Direction_Lantern]]: the binding style bible, **the material decision** (one
palette atlas + vertex colours under three master shaders `Lit-Palette`/`Emissive-Gloam`/`Skinned-Palette`),
the reference board, and the style-proof-scene gate definition. The in-engine scene itself = pending.
**"Update all docs & skills" sweep:**
- [[Pillars]] — LANTERN direction banner up top + a LANTERN locked-decisions block; Related repointed to
[[Identity_Lantern]] (prior [[Identity]] marked superseded/quarry).
- Superseded banners → [[Identity]], [[Iteration_2026-07_CoopHades]], [[Path_to_Fun]] (redirected straight to
LANTERN; `status: active``superseded`). Kept as history; nothing deleted.
- [[Home]] MoC — current-direction callout = LANTERN; vision/roadmap/session/decision pointers refreshed; the
stale "serena navigates C# symbols" line fixed to Glob/Grep (serena removed 07-07).
- [[Systems_Index]] — era note: the catalogued systems are the pre-pivot spine = quarry, verdicts in the
inventory.
- `CLAUDE.md` — the "Core loop" bootstrap bullet replaced with a **LANTERN direction pointer** (net-neutral:
39,684→39,681 B, under the 40 KB budget); the verbose DR-044/045/046 core-loop invariants archived verbatim
to `_Meta/CLAUDE_Build_Gotchas_Archive.md` under a new 2026-07-13 heading (the general "serialized prefab
bool ignores the C# initializer" gotcha kept inline). Condensation-history line ticked.
- `dots-dev` skill — `references/validation-harness.md`: noted the "expedition-run" driving recipe's nouns are
co-op-Hades-era (re-meaned to the descent lifecycle later); the harness *patterns* stay direction-agnostic.
The rest of the skill is process-only and needed no pivot.
- Native memory — new [[lantern-direction-pivot]] operative-direction note + `MEMORY.md` index; the prior
direction memory kept with a supersession pointer.
## Decisions
- [[DR-048_Lantern_Adoption_Full_Pivot]] — LANTERN is the operative direction (Phase 0.1 gate closed).
## Open / deferred (explicitly flagged — NOT silently deferred)
Two Phase-0 items are **not** doc work and remain OPEN gate conditions:
1. **0.3 world-model design review** — the ★review-first adversarial Workflow over [[Lantern_World_Model_Spike]]
+ ground-truth relevancy/lifecycle/save code, producing `World_Model_Build_Spec.md`. This is the slice's
hardest netcode problem; no world code until it passes.
2. **0.4 A0 style-proof scene** — one prop + one creature + one suit in-engine under murk, judged full-size +
200 px + grayscale. Requires Blender + engine work (Workstream A0 gate).
Phase 0 does not fully exit until both land. Phase 1 (the combat gym) has **no world** and is not blocked by
0.3 — it can start on the KEEP/rework salvage once the operator chooses.
## Next
Operator fork: (a) run the **0.3 world-model design-review Workflow** now, or (b) start the **0.4 style-proof
scene** (Blender on-ramp), or (c) begin **Phase 1 combat gym** planning from the salvage inventory. Recommend
(a) since it unblocks all world-touching work and is the standing review-first ritual, with (b) proceeding in
parallel on the art track.
## Related
- [[Roadmap_Lantern_Slice]] · [[Identity_Lantern]] · [[Lantern_Strip_Mothball_Inventory]] ·
[[Lantern_World_Model_Spike]] · [[Art_Direction_Lantern]] · [[DR-048_Lantern_Adoption_Full_Pivot]]
@@ -0,0 +1,94 @@
---
id: DR-048
title: LANTERN adoption — the full pivot (supersedes Awakening Engine + Co-op Hades)
status: accepted
date: 2026-07-13
tags: [decision, direction, lantern, pivot, adoption]
permalink: gamevault/07-sessions/decisions/dr-048-lantern-adoption-full-pivot
---
# DR-048 — LANTERN adoption: the full pivot
## Context
The 2026-07-13 vision refresh ([[Theme_Direction_Candidates]]) explored four load-bearing-theme
directions against the operator brief (**V Rising + Shape of Dreams** core; SoD-grade skillshot combat +
modular ability kits braided with a persistent base; 24 co-op; solo dev learning Blender, RoR2-lineage
low-poly). The operator selected **Direction A — LANTERN** and put a full identity draft through **three
independent adversarial reviews** (theme/narrative · systems/game-loop · player-experience/market). All
findings were operator-accepted and folded into the review-hardened final draft [[Identity_Lantern]] (v3),
with the vertical-slice roadmap [[Roadmap_Lantern_Slice]].
This forces a direction decision: the codebase and vault were built under **The Awakening Engine**
(Aether-colony sci-fi fiction, [[Identity]] / [[DR-015_The_Awakening_Engine_Fiction_Adoption]]) and most
recently steered by the **Co-op Hades conversion** iteration ([[Iteration_2026-07_CoopHades]], which
itself superseded the DR-037 → DR-042 expedition-driven line and the DR-035 end-of-month jam slice). LANTERN
keeps every locked **mechanical** pillar ([[Pillars]] #14 hold) but replaces the **fiction, the world
model, the death rules, the build/mutation system, and the combat feel target**. It is not a reskin — under
LANTERN's own load-bearing test, reskinning "light" would break persistence, death, relevancy, the economy,
and the treadmill at once. This is a genuine change of direction, so it is recorded as one.
## Decision
**LANTERN is the operative direction.** [[Identity_Lantern]] is the authoritative design; [[Roadmap_Lantern_Slice]]
is the operative roadmap. This DR is the **adoption gate** (Phase 0.1 of that roadmap).
1. **Supersession (archive, never delete).** LANTERN supersedes, as the *operative target*:
- the Awakening-Engine fiction — [[Identity]] / [[DR-015_The_Awakening_Engine_Fiction_Adoption]];
- the Co-op Hades iteration — [[Iteration_2026-07_CoopHades]];
- and by transitivity the direction line it carried (DR-037 expedition spine → DR-042 expedition-driven
win → DR-044/045/046 demo passes → DR-047 boon overhaul).
All of it is **kept as history and as salvage quarry** — banners point forward, nothing is removed. Prior
DRs stay valid as records of what was built and why.
2. **Existing code is quarry, not foundation.** Strip and reuse freely; no design decision bends to preserve
code. The system-by-system keep / rework / mothball calls live in [[Lantern_Strip_Mothball_Inventory]]
(Phase 0.2). Headline calls, from the roadmap's standing constraints: **combat feel layer + telegraphs =
keep**; **boon pipeline = rework into wild mutations**; **regions/relevancy, save system, hub lifecycle =
rework**; **sieges / Core / turret-ammo economy leftovers = mothball**.
3. **The mechanical pillars hold; the fiction and three subsystems change.** Unchanged: Unity DOTS +
Netcode for Entities, server-authoritative, input-only clients, client prediction, 24 co-op
([[Pillars]]). Changed by LANTERN: (a) **world model** → seed-pinned **pocket-graph** with light-as-
permanence (the tide-line); (b) **combat feel** → SoD-grade **manual-aim skillshots** (the soft
auto-target era ends as the target — see the pillars note); (c) **build system** → suit-frames + cultured
**Sparks** + wild **mutations** (the augment layer), replacing flat-stat boons.
4. **The slice's falsifiable test is the only gate that matters:** *does pinning a pocket feel like winning
something, and does a stranded suit feel worth a second descent?* Every deferred system is justified only
by these two.
5. **Phase 0 exit is NOT this DR alone.** The roadmap gates Phase 0 on **three** things: this DR merged **+**
the world-model design review passed ([[Lantern_World_Model_Spike]], ★review-first — not yet run) **+**
the A0 style-proof scene approved in-engine ([[Art_Direction_Lantern]], gate pending). This DR closes only
0.1; 0.2 (inventory) is delivered; **0.3 and 0.4's in-engine gates remain open.**
## Consequences
- **Naming.** Working title "LANTERN" has poor Steam-search uniqueness; a shipping-title pass is deferred to
a marketing milestone (per [[Identity_Lantern]]). "LANTERN" is the internal codename until then.
- **Vault surface updated this session (Phase 0 pivot):** [[Pillars]] (pointer + LANTERN locked decisions),
[[Identity]] + [[Iteration_2026-07_CoopHades]] + [[Path_to_Fun]] (superseded banners), [[Home]] (MoC +
current direction), [[Systems_Index]] (era note), `CLAUDE.md` (game-state/core-loop line → LANTERN pivot
pointer; verbose co-op-Hades invariants archived to `_Meta/CLAUDE_Build_Gotchas_Archive.md`). Prior DRs and
session logs are **not** rewritten — they are the record.
- **basic-memory** reindexes this DR and the new roadmap/vision docs on next index; native `memory/`
gets the [[lantern-direction-pivot]] operative-direction note. The old direction memory is kept as history.
- **What does NOT change yet:** no world code, no fiction rename in code, no ghost/RPC churn. The pivot is a
documentation + direction adoption; implementation begins at Phase 1 (combat gym) and only after the Phase 0
world-model review passes for anything world-touching.
- **Revisit when:** the slice test fails on either half (pinning doesn't feel like winning, or a stranded suit
doesn't pull a second descent) — that invalidates the direction, not a subsystem, and triggers a fresh
fork-locking ritual. Also revisit the "crews present-but-unlit vs gone" and shipping-title open forks at the
narrative/marketing milestones.
## Related
- [[Identity_Lantern]] — the design this adopts (authoritative)
- [[Roadmap_Lantern_Slice]] — the operative roadmap (this is its Phase 0.1)
- [[Lantern_Strip_Mothball_Inventory]] — Phase 0.2, the salvage map
- [[Lantern_World_Model_Spike]] — Phase 0.3, ★review-first (gate open)
- [[Art_Direction_Lantern]] — Phase 0.4 / Workstream A0 (in-engine gate open)
- [[Theme_Direction_Candidates]] — the exploration that produced the fork
- [[Identity]] · [[Iteration_2026-07_CoopHades]] · [[DR-047_Phase17_Boon_Overhaul_Mechanic_Changers]] — superseded as operative, kept as quarry
- [[Pillars]] — the mechanical constraints LANTERN was shaped inside (unchanged)
@@ -463,3 +463,11 @@ CLAUDE.md was chronically saturated (39.940.2 KB for a week; every gotcha add
- **Core loop = ready-check multi-room RUNS ★ (DR-044; DR-031/042 base-mining text archived 07-04):** base = pure SPEND hub (no base nodes; `Tuning.StartingOre` grubstake). `RunDirectorSystem` = sole `RunInfo` writer (`[UpdateBefore(CyclePhaseSystem)]`; NOTHING else in the room chain touches CyclePhase); banks Charge+retaliation once-per-`RunEpoch` on boss-clear ONLY; strips the boon band + every `BoonOffer` on exit; teleports ONLY launch-stamped **`RunParticipant`s** (released on Returning — dead-respawned re-conscript, late joiners stay home). Rooms spawn per `RoomEpoch` at ping-pong sub-slots, `RoomTag`-torn-down; first slot waits `Tuning.RoomEntryGraceTicks`. ★ a serialized prefab bool ignores the C# initializer — flip `CycleDirector.prefab`. **Demo (DR-045/046): `GoalProgress.Target`=2; `Health.Max` now `[GhostField]` (boss + enemy HP bars). Boss = scaled Charger + server-only `BossState` kit (sole `BossAISystem` mover: SLAM/phase-2 summon/knockback-immune). Grunt windup commits ~last 30%; Charger stagger + Spitter cornered-hold. Rooms gate on a PORTAL (`RunLifecycle.RoomExplore=6` loot window; `PortalInteractRequest`→server `PortalCommand`; empty expedition advances now); class picked + per-run PREP buffs spent at base each run (Staging-gated RPCs via the shared `ClassSwapUtil`; disjoint prep `StatModifier` band stripped on Returning).** See [[DR-044_Expedition_Redesign_Shipped_Demo_Polish]] · [[DR-045_Combat_Demo_Feel_Boss_Fight]] · [[DR-046_Base_Expedition_Ties_Portal_Class_Prep]].
Also this pass (earlier, same session): four stale netcode "1.13.2" stamps corrected to 6.5.0 (CreateLocalWorld is now PUBLIC — reflect-verified; NetCodeTestWorld still effectively unavailable), the dead `~/.claude/skills` path fixed to the in-repo skill, and the ctx7 netcode pin re-annotated (no 6.x docs set exists as of 07-07).
## 2026-07-13 — LANTERN pivot: co-op-Hades core-loop bullet archived (pays the direction pointer)
The project pivoted to **LANTERN** ([[DR-048_Lantern_Adoption_Full_Pivot]]; design [[Identity_Lantern]], roadmap [[Roadmap_Lantern_Slice]]). The co-op-Hades run-loop code is now **salvage quarry** ([[Lantern_Strip_Mothball_Inventory]]), not the operative direction, so its verbose CLAUDE.md core-loop bullet was condensed to a one-line direction pointer. The DR-044/045/046 invariants stay TRUE of the live code while it exists as quarry — preserved here verbatim (the pre-pivot CLAUDE.md "Core loop" bullet):
- **Core loop = ready-check multi-room RUNS ★ (DR-044/045/046):** base = pure SPEND hub. `RunDirectorSystem` = sole `RunInfo` writer (`[UpdateBefore(CyclePhaseSystem)]`; nothing else in the room chain touches CyclePhase); banks Charge+retaliation once-per-`RunEpoch` on boss-clear ONLY; strips the boon band + `BoonOffer`s on exit; teleports ONLY launch-stamped `RunParticipant`s (released on Returning). Rooms spawn per `RoomEpoch`, `RoomTag`-torn-down, gate on a PORTAL (`RunLifecycle.RoomExplore=6` loot window; `PortalInteractRequest`→server `PortalCommand`). Class + per-run PREP spent at base (Staging-gated RPCs via shared `ClassSwapUtil`; prep `StatModifier` band stripped on Returning). `Health.Max` is a `[GhostField]`. Boss = server-only `BossState`/`BossAISystem` (sole boss mover). ★ **a serialized prefab bool ignores the C# initializer — flip the value in the prefab.** Feel/tuning detail → [[DR-044_Expedition_Redesign_Shipped_Demo_Polish]] · [[DR-045_Combat_Demo_Feel_Boss_Fight]] · [[DR-046_Base_Expedition_Ties_Portal_Class_Prep]].
The general gotcha "a serialized prefab bool ignores the C# initializer — flip the value in the prefab" is kept inline in CLAUDE.md (broadly applicable beyond this loop).