Docs: END-2 session log + DR-036; Backlog/Path_to_Fun/Milestones; CLAUDE.md END-2 line
Path A spine COMPLETE (14/14): Backlog SL-3 blocker cleared + marked done; Path_to_Fun END-2 done + banner; Milestones END-2 row. CLAUDE.md gains the END-2 gotcha line (replicate the outcome, don't client-derive; SiegeTimeout off during the final), net-zero via EB-1/EB-2/END-1/M7/inventory/build-grid condensations (40,445 then 40,510 w/ history note, under the 40,960 limit). DR-036 + session log capture the design, the operator forks (halt+banner, Target=4, SaveData v5), and the pre-coding + post-impl adversarial reviews. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -19,7 +19,7 @@ Last decluttered 2026-06-08 (removed all shipped `[x]` items; their context is p
|
||||
|
||||
**Already shipped & code-verified (do NOT rebuild — 13/14 slice systems):** movement, dash (MC-1, fun-gate PASSED 2026-06-10), melee combo (MC-4), ranged poke; base-local Ore mining (DR-031); Turret/Wall/Fabricator palette + UITK build HUD (DR-021); Ore→Fabricator→Charge→turret economy (EB-2 / DR-033); destructible structures (EB-1 / DR-032); soft-loss Engine Core integrity + overrun flash (END-1 / DR-034); SaveData v4 + frontend menu / Continue / build menu (DR-019). The audit: 9-agent grounded gap-analysis, 2026-06-13.
|
||||
|
||||
**The ONE blocker is END-2 (final siege + terminal win) — SL-3 below.** Today `GoalProgress.Charge` increments past `Target` forever with no clamp/consequence; there is a clear *loss* (Core overrun) but **no terminal *win***. END-2 must land by **June 26**. **Charge cadence LOCKED 2026-06-13: siege-survived-only** (goal +1 per survived siege; Path_to_Fun's "Both"/Aether-deposit cadence deferred post-slice). See [[DR-035_End_Of_Month_Slice_Adoption#Locked fork — END-2 charge cadence (2026-06-13)]].
|
||||
**END-2 (SL-3) is CODE-COMPLETE + validated (2026-06-13) — the Path-A blocker is CLEARED.** The goal meter now arms a visibly-larger final siege at `Charge>=Target` (=4) and latches a terminal **Victory** (survive it) / **Loss** (Core breached during it), with a HUD banner + run-halt. 342/342 EditMode green; Play-validated server==client + no ordering cycle; pre-coding + post-impl adversarial reviews. The **fun-gate** (does the climax land?) is the one open item → folds into SL-5. See [[DR-036_END2_Final_Siege_Win_Lose]] · [[2026-06-13_SL3_END2_Final_Siege_Win_Lose]]. **Charge cadence LOCKED 2026-06-13: siege-survived-only** (goal +1 per survived siege; "Both"/Aether-deposit deferred post-slice). See [[DR-035_End_Of_Month_Slice_Adoption#Locked fork — END-2 charge cadence (2026-06-13)]].
|
||||
|
||||
**Critical path:** SL-1 → SL-2 → **SL-3 (END-2)** → SL-5 → SL-6 → SL-7; SL-4 (visual) runs parallel, done by Jun 23. Every milestone ends with a **falsifiable play/fun-gate**, not a test count. Full vision + visual direction + cohesion checklist + Done Definition: [[End_Of_Month_Game_Jam_Slice]].
|
||||
|
||||
@@ -35,7 +35,8 @@ Last decluttered 2026-06-08 (removed all shipped `[x]` items; their context is p
|
||||
- **Fun-gate:** a fresh non-designer plays 5 min uncoached and reads mining as purposeful, building as a "prep" beat, waves as recognizable pressure, a siege death as "try again"; competent player finishes a run in 5–8 min.
|
||||
- **Deps:** SL-1.
|
||||
|
||||
### SL-3 — END-2: Final Siege & Win/Lose (PATH-A BLOCKER) `Jun 16-23 build, Jun 24 validate` · risk MED · **review-gated** ★
|
||||
### SL-3 — END-2: Final Siege & Win/Lose (PATH-A BLOCKER) ✅ CODE-COMPLETE + validated 2026-06-13 (fun-gate → SL-5) · **review-gated** ★
|
||||
> **Done 2026-06-13:** `RunPhase` (server-only) + `RunOutcome` (`[GhostField]`) on the CycleDirector ghost; new `GoalReachedSystem` arms the final siege (×live `FinalSiegeMultiplier`); `CyclePhaseSystem` latches Victory (final cleared) / Loss (Core breached) + halts the director; SaveData **v5** (a won/lost run loads finished, no re-arm); HUD terminal banner; `Target` 10→4. 342/342 EditMode green; Play-validated server==client + no ordering cycle. Spec/decisions [[DR-036_END2_Final_Siege_Win_Lose]] · session [[2026-06-13_SL3_END2_Final_Siege_Win_Lose]]. Open: operator fun-gate (climax feel) + SL-5's retry/quit-on-banner overlay + rich pre-final telegraph.
|
||||
- **Goal:** the goal meter means something — at `GoalProgress.Charge >= Target` arm a visibly-larger **final siege**; surviving it latches a **Victory**, breaching the Core during it latches a **Loss**; both fire a clear HUD banner. Spec: [[Path_to_Fun#END-2 — The charge means something: the cap arms a final siege, win or lose]].
|
||||
- **Charge cadence — LOCKED 2026-06-13: siege-survived-only** (goal +1 per survived siege, the existing single-writer; no Aether-deposit writer — "Both" deferred post-slice). [[DR-035_End_Of_Month_Slice_Adoption#Locked fork — END-2 charge cadence (2026-06-13)]].
|
||||
- **Tasks:** add `RunPhase{byte Normal|FinalDefense}` + `RunOutcome{byte InProgress|Victory|Loss}` on the CycleDirector (server-only single-writer, **NOT `[GhostField]`** — avoid the ghost re-hash; derive client-side) · new server-only `GoalReachedSystem` `[UpdateAfter(CyclePhaseSystem)]`: on the `Charge>=Target` edge (guarded `RunPhase==Normal` → exactly-once) **clamp `Charge`**, arm the final siege via the existing `ThreatState.PendingSiegeSize` (×`FinalSiegeMultiplier`), set `FinalDefense` · in `CyclePhaseSystem` (keep it the **sole** `WaveState`/`Phase` writer — no second writer, DR-017 cycle hazard): final-`DefendCleared`→`Victory`, final-overrun→`Loss` · add live `FinalSiegeMultiplier` (~2–3×) to `TuningConfig` · client-only HUD victory/loss banner reusing END-1's `OverrunTick` edge-detect pattern · **run the adversarial design review BEFORE coding** (netcode/determinism/single-writer) per [[validate-netcode-design-before-coding]] · 4 EditMode tests (arms once, Victory edge, Loss edge, Charge clamp).
|
||||
|
||||
@@ -41,5 +41,6 @@ permalink: gamevault/06-roadmap/milestones
|
||||
| **— 2026-06-11 EB-1 — machines can die (structure loss-state)** | Structures bake `Health`(`[GhostField]`)+`DamageEvent`+`Destructible`; `HealthApplyDamageSystem` destroys at 0 (occupancy auto-frees); `EnemyAISystem` fortress-targets weighted-nearest players+structures; loss VFX via `StructureFeedbackSystem`. SaveData v3 per-structure HP. | ✅ Done 2026-06-11 — [[DR-032_EB1_Machines_Can_Die]] · [[2026-06-11_EB1_Machines_Can_Die]] |
|
||||
| **— 2026-06-12 EB-2 felt spend + END-1 losable Core** | **EB-2:** turret ammo = shared `Charge` (`ResourceId` 4) on the existing ledger; `TurretFireSystem` soft-fail spend; ledger-fed `Fabricator` mints Ore→Charge live-in-loop. **END-1:** `CoreIntegrity{[GhostField] Current,Max; uint OverrunTick}` on the CycleDirector; `CoreDamageSystem`/`CoreRestoreSystem`; soft-loss edge in `CyclePhaseSystem` (transient overrun flash, NO latching win yet); Core = `EnemyAISystem` fallback target. SaveData **v4**. | ✅ Done 2026-06-12 — 330/330 EditMode. [[DR-033_EB2_Felt_Spend_Charge_Economy]] · [[2026-06-12_EB2_Felt_Spend]] · [[DR-034_END1_Losable_Core]] · [[2026-06-12_END1_Losable_Core]] |
|
||||
| **— 2026-06-13 End-of-Month Game Jam Slice (ACTIVE TARGET)** | Answer the Path A Decision Gate early as **ship the minimum**: "Awakening Engine Last Stand" — a compact ARPG / base-defense demo, 5–8 min win-or-lose in **one arena**, June 30. Code audit (9-agent): **13/14 slice systems shipped**; **END-2** (final siege + latching win) is the one blocker. Single-arena scope-down + visual cohesion + loop tuning + packaging. Full milestone breakdown (SL-1…SL-7) in [[Backlog#NEXT — Awakening Engine Last Stand (End-of-Month Slice) ★]]. | 🧭 **Direction set 2026-06-13** — [[End_Of_Month_Game_Jam_Slice]] · [[DR-035_End_Of_Month_Slice_Adoption]] |
|
||||
| **— 2026-06-13 END-2 — final siege + win/lose (slice SL-3)** | The slice's one blocker + the last Path A spine mechanic: at `Charge>=Target` (=4) `GoalReachedSystem` arms a larger final siege (×live `FinalSiegeMultiplier`); `CyclePhaseSystem` latches **Victory** (survive) / **Loss** (Core breached) + halts the director; `RunOutcome` (`[GhostField]`, server-only `RunPhase`) drives a HUD terminal banner; SaveData **v5** persists the outcome (a won/lost run loads finished). End-behavior locked **halt + banner** (retry/quit UX → SL-5). | ✅ Done 2026-06-13 — 342/342 EditMode; Play-validated server==client + no ordering cycle; pre-coding + post-impl adversarial reviews. **Path A spine COMPLETE.** [[DR-036_END2_Final_Siege_Win_Lose]] · [[2026-06-13_SL3_END2_Final_Siege_Win_Lose]] |
|
||||
|
||||
Promote items from [[Backlog]] here when committed. **The active target is the [[End_Of_Month_Game_Jam_Slice]]** (Path A spine ~done; END-2 the one blocker — see [[Backlog]]); the long-term plan remains [[Path_to_Fun]], answered at its [[Path_to_Fun#The Decision Gate (MANDATORY STOP after END-2)|Decision Gate]] *after* the slice ships. [[DR-035_End_Of_Month_Slice_Adoption]]
|
||||
Promote items from [[Backlog]] here when committed. **The active target is the [[End_Of_Month_Game_Jam_Slice]]** (Path A spine **COMPLETE** — END-2 shipped 2026-06-13 as SL-3; the rest of the slice is tuning + polish, not code — see [[Backlog]]); the long-term plan remains [[Path_to_Fun]], answered at its [[Path_to_Fun#The Decision Gate (MANDATORY STOP after END-2)|Decision Gate]] *after* the slice ships. [[DR-035_End_Of_Month_Slice_Adoption]]
|
||||
@@ -13,7 +13,7 @@ permalink: gamevault/06-roadmap/path-to-fun
|
||||
|
||||
# Path to Fun — the north-star roadmap
|
||||
|
||||
> **[ACTIVE JUNE 13–30 → the slice]** Path A's spine is built — a 2026-06-13 code audit found **13/14 systems shipped** (MC-0/1/4 · EB-1/2 · END-1). The operator answered the [Decision Gate](#the-decision-gate-mandatory-stop-after-end2) **early, as *ship the minimum***: the immediate target is the **[[End_Of_Month_Game_Jam_Slice]]** ("Awakening Engine Last Stand"), a compact single-arena base-defense demo due June 30. The one un-built spine mechanic — **END-2** (final siege + latching win, spec'd [below](#end-2--the-charge-means-something-the-cap-arms-a-final-siege-win-or-lose)) — is the slice's critical path. This doc stays the **north-star for the full game**; the slice scopes Path A to a deliverable. Milestone breakdown: [[Backlog#NEXT — Awakening Engine Last Stand (End-of-Month Slice) ★]] · adoption: [[DR-035_End_Of_Month_Slice_Adoption]]. *(Path B is untouched and provisional; the formal ship-vs-continue note is logged after June 30.)*
|
||||
> **[ACTIVE JUNE 13–30 → the slice]** Path A's spine is **COMPLETE** — all **14/14 systems shipped** (MC-0/1/4 · EB-1/2 · END-1 · **END-2 built 2026-06-13 as slice SL-3**, [[DR-036_END2_Final_Siege_Win_Lose]]). The operator answered the [Decision Gate](#the-decision-gate-mandatory-stop-after-end2) **early, as *ship the minimum***: the immediate target is the **[[End_Of_Month_Game_Jam_Slice]]** ("Awakening Engine Last Stand"), a compact single-arena base-defense demo due June 30. With END-2 in, the slice is **winnable end-to-end**; the remaining slice work is **tuning + polish, not code** (SL-1/2/4/5/6/7) — and the final-siege **fun-gate** is the one open operator validation. This doc stays the **north-star for the full game**; the slice scopes Path A to a deliverable. Milestone breakdown: [[Backlog#NEXT — Awakening Engine Last Stand (End-of-Month Slice) ★]] · adoption: [[DR-035_End_Of_Month_Slice_Adoption]]. *(Path B is untouched and provisional; the formal ship-vs-continue note is logged after June 30.)*
|
||||
|
||||
> The plan to turn an engineering-complete foundation into a game that's fun to play. Direction locked in [[DR-028_Combat_Primary_Verb_Depth_First]]. This is the **forward** plan; [[Milestones]] stays the historical record, [[Backlog]] the loose pool. Living doc: the [Path A contract table](#path-a--the-proven-path-to-a-point-committed) is the only committed scope; everything in [Path B](#path-b--the-forever-track-provisional-not-scheduled) is provisional and re-derived after Path A's fun-gates pass.
|
||||
|
||||
@@ -70,7 +70,7 @@ Green EditMode + server==client stay **necessary, not sufficient** — they were
|
||||
| **EB-1** | Machines can die: the structure loss-state | Economy | MED · review-gated | ~1.5–2.5 wk | a base you can lose; END-1's Core hook |
|
||||
| **EB-2** | The felt spend: output → depletable combat resource | Economy | MED | ~1–1.5 wk | factory→defense pipe; co-op shared spend |
|
||||
| **END-1** | The base can be lost: a Core with integrity | Endgame | MED | ~4–6 d | a real lose condition |
|
||||
| **END-2** | The charge means something: final siege, win/lose | Endgame | MED | ~2–4 d | a win beat; the minimum point |
|
||||
| **END-2** ✅ | The charge means something: final siege, win/lose | Endgame | MED | ~2–4 d | a win beat; the minimum point — **DONE 2026-06-13 (SL-3)** |
|
||||
|
||||
*Estimates are solo + Claude **coding-time only**. They are wider than the prior draft because several of these milestones are secretly 2–3 slices each (see the [secretly-multi note](#secretly-multi-milestones-why-the-estimates-widened)). **Fun-tuning is the unestimated, unbounded cost** — every milestone's real schedule risk is the playtest→tune→replaytest loop, not the code (see [Risk register](#risk-register) R1/R11). That is why every feel-critical value is a live server singleton, not a baked const (see [Tuning-knob surface](#tuning-knob-surface)), and why the [calendar conversion](#calendar-time-the-play-budget-assumption) below turns these into months.*
|
||||
|
||||
@@ -184,7 +184,9 @@ Depth = a **dialogue**. Enemies ask distinct, readable questions (a committed lu
|
||||
- **Claude:** the component, the 3 server systems, the HUD bar, the lose-resolution wiring (rollback or soft-drain per the fork), EditMode coverage (Core drains under siege, regens in Calm, lose-edge fires once). **Operator:** the fun-gate playtest (is defending the Core engaging?), the diegetic Core/Engine placement, the lose-severity decision.
|
||||
- **Dependencies:** EB-1 (the structure loss-state is the natural sibling; both make the siege threatening). **Kill-risk:** if defending the Core isn't fun, nothing downstream matters — a losable base only amplifies an already-good fight; shipping it before the fight earns it actively hurts.
|
||||
|
||||
### END-2 — The charge means something: the cap arms a final siege, win or lose `~2–4 d` · risk MEDIUM
|
||||
### END-2 — The charge means something: the cap arms a final siege, win or lose `~2–4 d` · risk MEDIUM · ✅ DONE (2026-06-13, as slice SL-3)
|
||||
> **Status (2026-06-13):** ✅ **CODE-COMPLETE + validated** — built as slice **SL-3**, COMPLETING Path A's spine. `RunPhase` (server-only) + `RunOutcome` (`[GhostField]`) on the CycleDirector ghost; new `GoalReachedSystem` arms the final siege at `Charge>=Target` (=4) ×live `FinalSiegeMultiplier`; `CyclePhaseSystem` latches **Victory** (final cleared) / **Loss** (Core breached) + halts the director; SaveData **v5** persists the outcome (a won/lost run loads finished). End-behavior LOCKED **halt + banner** (operator chose the clean terminal end over the spec's "keep playing"; the retry/quit overlay → SL-5, the pause menu is the in-session hatch). 342/342 EditMode green; Play-validated server==client + no ordering cycle; pre-coding + post-impl adversarial reviews. The **fun-gate** is the open operator item. See [[DR-036_END2_Final_Siege_Win_Lose]] · [[2026-06-13_SL3_END2_Final_Siege_Win_Lose]].
|
||||
|
||||
**Goal:** at `GoalProgress.Charge>=Target` the Engine begins opening the Wellspring — a final, larger escalating siege — and surviving it fires the WIN beat. The meter is no longer a number that stops at 10. **This is the minimum "the game has a point."**
|
||||
- **Scope:** a server-only `GoalReachedSystem` that, on the `Charge>=Target` edge (currently UNHANDLED — `CyclePhaseSystem` increments past it forever with no clamp), arms a FINAL siege via the existing `ThreatState.PendingSiegeSize` entry point (bigger size + a distinct telegraph) and sets a replicated `RunPhase{byte=FinalDefense}`. The WIN-edge — surviving the final siege during `RunPhase.FinalDefense` sets `RunOutcome{byte=Victory}`, fires the ending event (subtitle/banner first), and for the minimum simply flips into "keep playing, the base is yours" (the endless/NG+ curve is END-5, Path B). A single client-only WIN/LOSS banner in `HudSystem` (observe `RunOutcome`; reused by END-1's overrun banner). **Zero net-new writing** for the minimum (placeholder banner text), **zero new ghosts.**
|
||||
- **Build notes:** arm the final siege through the EXISTING single entry point — do NOT add a parallel siege path (`CyclePhaseSystem` stays the sole `WaveState` writer, DR-017's atomic Calm→Siege seed). `RunPhase`/`RunOutcome` are BYTES, single-writer, server-decided. The banner is client-only observe-only. Guard the `GoalReached` edge so it arms EXACTLY ONCE (a `RunPhase!=Normal` guard) — and **clamp the currently-uncapped `Charge`.** If cadence moves to Aether-deposited (the fork below), keep it a server-only single writer (avoid co-op double-count).
|
||||
|
||||
Reference in New Issue
Block a user