Files
Project-M/Docs/Vault/06_Roadmap/Backlog.md
T

151 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- roadmap
- backlog
- slice
updated: 2026-06-13
permalink: gamevault/06-roadmap/backlog
---
# Backlog
Open / candidate work only. **Done items live in [[Milestones]] + their DR / session log** (this file is intentionally
kept to the forward-looking pool — promote an item to [[Milestones|a milestone]] when committed, then drop it here).
Last decluttered 2026-06-08 (removed all shipped `[x]` items; their context is preserved in the linked records).
## NEXT — Co-op Roguelite Redirect (Procedural Expedition Spine + Two Classes + Persistent Meta) ★
**The operative target as of 2026-06-17 is [[DR-037_Procedural_Expedition_Spine_Two_Classes_Persistent_Meta]].** An operator playtest ([[Scratch Notes 6152026]]) found the single-arena slice **stale fast**; the operator answered the post-END-2 Decision Gate as **continue/expand** and re-scoped off the fixed June-30 deadline. New direction: a **co-op roguelite-ARPG** — base = persistent buildable **hub** (never resets), the procedural **Expedition region = the required combat spine**, **two classes** (Warrior melee / Ranger ranged), a **persistent meta layer** (SaveData v6), readability fixed first. **Mission-as-Sortie**, pillar-safe (fulfils pillar-#4, preserves the "never a run-reset" pillar). **No time estimates** (operator directive); every slice still ends with a falsifiable fun-gate + server==client validation; netcode-heavy slices run the adversarial design-review FIRST ([[validate-netcode-design-before-coding]]).
**Committed slices (sequence; ~70 % of the chassis already exists — reuse, don't rebuild):**
- **Slice 1 — Combat Readability & HUD Declutter** ✅ **BUILT + engineering-validated 2026-06-17 ([[DR-038_Slice1_Combat_Readability_HUD_Declutter]])** — on-damage-sticky **enemy health bars** (+fade, <25 %HP always-on) in `CombatFeedbackSystem` (`Health.Current` already replicated); **telegraph fix** (per-enemy baked `EnemyTelegraph` windup ramp replacing the hard-coded `22f` + windup 18→22 + a scale-pulse); **build-mode toggle** (client `BuildPaletteState.PaletteOpen` gates the palette + a "Tab/Y — BUILD" chip); **Charger committed-lunge tell** (`[GhostEnabledBit] IsLunging` derived once/tick — one Charger re-bake). 345/345 EditMode; Play-validated (handshake intact, bake correct, no runtime errors). **Open: operator visual fun-gate.**
- **Slice 2 — Two Classes (Warrior / Ranger)** ✅ **BUILT + validated 2026-06-18 ([[DR-039_Slice2_Two_Classes_Warrior_Ranger]])** — DRG-asymmetric (Warrior melee bruiser tankier/slower; Ranger ranged faster/squishier + co-op auto-assist hook); aim-directed Warrior cone (Cone archetype inline in `AbilityFireSystem`, server-only damage, same-tick); class carried on `GoInGameRequest.ClassId` (the per-world-`ConnectionConfig` blocker fixed) → `ClassTraits` seeds at spawn; character deltas via replicated `StatModifier` seeds on Default (no per-class blob); melee asymmetry folds in `MeleeComboSystem` (`StatTarget.MeleeDamage`/`MeleeRange`); menu class picker. 348/348 EditMode; Warrior Play-validated server==client (re-bake handshake intact). **Deferred polish:** cone client VFX + slash-arc reach. **Open: fun-gate (operator).**
- **Slice 3 — Expedition Combat Spine** ✅ **BUILT + verified 2026-06-21 ([[DR-040_Slice3_Expedition_Combat_Spine]]).** v1 loop: walk gate → fight an epoch-seeded enemy wave in the expedition → clear → return + Ore → escalated base siege. New `ZoneEnemyTag`/`ZoneEnemyDirector`/`ZoneEnemyState` + `ZoneEnemyDirectorSystem` (reuse Grunt/Charger prefabs, `RegionTag{Expedition}`, ring math, one-per-interval, Calm-only). All 4 netcode blockers landed; 368/368 EditMode + clean Play smoke (post-impl review caught a region-blind Core-breach cull → fixed Base-only). **Open: fun-gate playtest.**
- **Combat Depth (MC-2 + MC-3)** ✅ **BUILT + post-impl-reviewed 2026-06-24 ([[DR-041_Slice_Combat_Depth_Enemy_Variety_Impact]]).** *(Inserted, not a numbered slice — operator: "the combat needs a lot more work.")* Two new enemy questions — **Spitter** (ranged reposition) + **Swarmer** (surround) — + a 4-type weighted mix in both directors (fork-4a base siege too, mandatory `MaxAlive`) + MC-3 impact (magnitude-scaled hit punch + Spitter aim-lane). Real rigged models (Spitter = re-skinned Kaiju, Swarmer = Undead-Werewolf). 388/388 EditMode + two Play smokes. **Open: fun-gate playtest.**
- **Slice 4 — Persistent Meta-Progression** — **RE-FRAMED as phase D of the Loop Re-shape ([[DR-042_Loop_Reshape_Expedition_Driven]]).** **SaveData v6** (meta-currency, unlocked classes, persistent epoch); a between-runs growth surface at the hub; persist-the-seed-regenerate-the-layout. *Builds AFTER the loop-coherence phases AC below.*
### NEXT (operative) — Loop Coherence Re-shape: Expedition-Driven ★ ([[DR-042_Loop_Reshape_Expedition_Driven]], 2026-06-24)
A 5-subsystem loop evaluation found the loop has **two conflicting win-models bolted together**: the only path to victory is "survive 4 base sieges" (passively/AFK-reachable — scheduled sieges auto-arm + a 60 s timeout auto-clears them), while the **expedition (the stated combat spine, where all the new enemy variety lives) advances nothing toward winning.** Root cause: the END-1/END-2 base-siege win is a leftover from the superseded jam slice ([[DR-035_End_Of_Month_Slice_Adoption]]/[[DR-036_END2_Final_Siege_Win_Lose]]) that DR-037 never retired. **Operator chose (2026-06-24): commit to the expedition-driven vision.** Build order:
- **A — Coherence core — ✅ BUILT + validated (2026-06-25):** win-driver moved *base sieges → expedition clears*`ExpeditionGateSystem` is now the sole production writer of `GoalProgress.Charge` (+1/clear, credited **on RETURN** — the review overturned credit-on-clear, which would arm the undefended final siege → uncontestable Loss; credit-on-return keeps the player home). **AFK win killed** (`ScheduleEnabled` baked OFF, retaliation-only; survived sieges no longer credit). Final beat = the END-2 final **base** siege (operator-locked). 389/389 EditMode + clean Play smoke (no sort-cycle, `ScheduleEnabled=0`). Design-review-gated (`wf_ebef4e81-dba`). Fun-gate playtest pending. *Next: **C**.*
- **B — Retaliation connect:** post-expedition siege becomes THE base-siege source (fix the interference) — defending what you built becomes a *consequence* of sortieing, not the goal. *Netcode-touching → design-review.*
- **C — Legibility fixes — ✅ BUILT + validated (2026-06-25):** walls now block enemies (dedicated `Structure` physics layer; player passes own walls — Play-verified baked filters); Aether-upgrade HUD button + affordability tint; Biomass sink (Wall cost → Biomass, operator fork); cold-start Ore seed (kills the turret-before-fabricator deadlock); dead Harvester/Conveyor/Pylon hidden from palette + hotkeys; **expedition objective readout** (new replicated `ExpeditionObjective` GhostField) + gate prompt. Reward-depth scaling deferred (operator fork). Scoping/design-gated (`wf_7c5a555e-136`); 389/389 EditMode + Play smokes. *Visual fun-gate pending. Next: B (retaliation polish) → D.*
- **D — Persistent meta (= Slice 4):** SaveData v6 + between-runs growth (above).
**Consolidation:** [[DR-036_END2_Final_Siege_Win_Lose]]'s "survive-4-base-sieges" win is **superseded** (win-driver → expedition clears; the charge-cadence "siege-survived-only" lock is reversed); [[DR-034_END1_Losable_Core]]'s Core stays but as a **consequence of the retaliation siege**, not the win-gate. The health-bar fill bug-fix (sprite-less `Image.Filled` ignores `fillAmount` → size the RectTransform) rides the first commit.
**Per-slice forks to lock at each review:** expedition depth (one zone vs sequential+boss); shared expedition region vs per-party instances (shared recommended); zone-clear reward shape; class-select moment (menu vs at-base); meta unlock surface.
**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.
**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)]].
> **⚠️ SL-1…SL-7 below are SUPERSEDED (2026-06-17, [[DR-037_Procedural_Expedition_Spine_Two_Classes_Persistent_Meta]]) — kept as an archived reference.** The new committed work is Slices 14 above. SL-4's **visual cohesion** ("Aether Siege Outpost" palette + checklist) and SL-2's **loop-tuning** discipline still apply to the base hub and carry forward; SL-1's arena-cleanup and SL-3/END-2 (the final-siege win/lose, already shipped) remain in the build. The fixed June-30 packaging (SL-7) is dropped per the re-scope.
### SL-1 — Scope Lock & Arena Cleanup `Jun 13-15` · risk LOW
> **Largely DONE 2026-06-13** (with SL-4): ARPG camera locked to a research-grounded steeper telephoto (pitch 58 / dist 17 / FOV 44 so Core + arena read together); meadow noise removed (~390 cheer/village objects cut); the Ore annulus pulled into the arena (611.5 m, 12 nodes) + the Core staged as the hero. **Open:** the Pylon decision; final camera lock-in via the operator's playtest. See [[2026-06-13_SL1_SL4_Visual_Cohesion_Dark_Frontier]].
- **Goal:** one compact (<~20 m radius, single-camera) base-defense arena with the Core as the hero object; lock the slice doc as the frozen target; set ARPG camera framing.
- **Tasks:** confirm compact footprint + Core centered/dominant · hide/remove non-slice noise (expedition rift/warpgate/distracting props; keep perimeter dark & quiet) · tune `PrototypeCameraRig` (today Pitch 45° / Dist 13 / FOV 55 — verify player+enemies+2 structures+Core read in one view, dash trajectory visible) · verify Ore annulus (~1012 nodes) spacing reads · **decide Pylon** (give the 4th palette entry a job + cyan accent, or cut it — slice names only Turret/Wall/Fabricator) · confirm Save/Continue (SaveData v4) is ready, no extra polish.
- **Fun-gate:** a new viewer IDs player/Ore/Turret/Husk/Core/ground in <1 s; arena reads as a "small industrial clearing," not a meadow; camera neither too close nor too wide.
- **Deps:** none.
### SL-2 — Loop Tuning `Jun 16-19` · risk MED (live knobs)
- **Goal:** dial the 58 min run — mine → build → fight → defend with readable pacing, no dead time, no constant pressure.
- **Tasks:** baseline a full run (mine ~2 min, build 2 Turret + 1 Wall + 1 Fabricator, survive 3 sieges) · tune Ore spawn rate + build costs (Turret 10 / Wall 4 / Fabricator 30 / Pylon 2 Ore) vs the 45 s (`ScheduleIntervalTicks=2700`) siege cadence · tune Fabricator recipe (1 Ore→3 Charge/30 t) + `TurretChargeCostPerShot` so the **felt spend** bites (turrets dry out without upkeep) · tune turret damage (Husk dies in ~812 shots) + wave growth (`SizeBase` + `ScheduleSizePerWave`) · validate Grunt/Charger mix (Chargers occasional, lunge telegraph readable) · kill Calm "AFK >90 s" dead-time · all via the live `TuningConfig` overlay (MC-0).
- **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 58 min.
- **Deps:** SL-1.
### 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` (~23×) 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).
- **Fun-gate** (Path_to_Fun END-2): team sees the meter approach full + an Engine telegraph and **deliberately preps** (≥1 countable action); final siege `liveEnemyCount` peak ≥30 % over a normal siege; surviving fires a "we did it" banner read as game-end; final-overrun reads as "lost the final stand," distinct from a mid-run overrun.
- **Deps:** SL-1 (arena), SL-2 (tuned baseline). **No save-schema bump** (bytes derivable on load → SaveData stays v4).
### SL-4 — Visual Cohesion Pass `Jun 20-23` (parallel) · risk MED
> **Substantially DONE 2026-06-13** (research-grounded, screenshot-verified): the arena reads as a dark "Aether Siege Outpost" bullseye — dark teal-grey ground that recedes, cyan Core as the luminance peak, **amber** Ore ring, dark perimeter; ACES grade with gated bloom + cool-shadow/warm-highlight faction split + vignette; sun/ambient/fog darkened. **Faction palette COMPLETE 2026-06-13:** dark ground · cyan owned (Core bright + **structures** now cyan via `Mat_StructureOwned_Cyan`, muted below the Core) · amber Ore · orange Husks. Lighting **clarity-rebalanced** (`b10605a8c`) after the first pass over-darkened. **Remaining (polish + needs operator eyes):** orange-red Husk verification *during a siege*; the dark-when-unpowered structure dynamic (a small presentation system); 3 telegraphed spawn lanes + perimeter height-gate; minor (warm crate, Synty/Foliage grass shader). See [[2026-06-13_SL1_SL4_Visual_Cohesion_Dark_Frontier]] + the visual-direction research synthesis.
- **Goal:** "Aether Siege Outpost" read — dark/quiet ground, cyan owned vs orange-red hostile, Core as hero; pass the slice's Visual Cohesion Checklist (slice §203216).
- **Tasks:** darken ground + neutral props (~4050 %, recede them) · cyan emissive accents on player + all owned structures + Core (read at 13 m in motion) · orange-red on Husks + telegraphs · amber Ore legibility · 510 **dark** perimeter framing props (no sightline blockers, none brighter than Core) · post-FX: bloom only on Aether/Ore/attacks, reduce fog that washes silhouettes, subtle vignette, cool-shadow/warm-glow grade · re-test every asset import in Play (material-regression guard).
- **Fun-gate:** a blind watcher of a 5 s clip IDs Core="base defended", cyan="owned", orange="enemy", ground="background", arena="engineered space not meadow"; cyan/orange ≥2× brighter than ground.
- **Deps:** SL-1 (locked arena). Cut perimeter props first if it slips; keep darkening + emissive.
### SL-5 — Final Siege & Ending tuning `Jun 24-26` · risk MED
> **Code portion STARTED early 2026-06-13** (on the back of SL-3): the HUD **final-siege telegraph** (distinct "FINAL SIEGE INCOMING" / "HOLD THE ENGINE", derived from the replicated `Charge>=Target`) + the **retry/quit-on-banner overlay** (PLAY AGAIN = fresh Single run via `WorldLauncher.StartSession`; QUIT TO MENU = teardown; cursor kept visible via `AimReticleSystem`'s run-over exception) are SHIPPED + 342/342 green. **Remaining = tuning/playtest only:** `FinalSiegeMultiplier` values (2.0/2.5/3.0), the richer telegraph (Engine hum/sky shift), Victory/Loss banner feel, 3+ runs at 58 min, co-op desync check — and a Play **click-test** of the banner buttons. See [[2026-06-13_SL3_END2_Final_Siege_Win_Lose]].
- **Goal:** make the final siege feel climactic and the run a clear three-act (prep → conflict → climax/resolution); lock end-game messaging.
- **Tasks:** tune `FinalSiegeMultiplier` (test 2.0/2.5/3.0; final peak ≥30 % over normal) · add a final-siege **telegraph** (Engine hum/sky shift/HUD "FINAL SIEGE INCOMING", ≥35 s warning) · validate Victory banner only on final-`DefendCleared`, Loss banner distinct from mid-run overrun · autosave the victory/loss checkpoint + clean continue/retry/quit flow (no soft-lock) · clock 3+ runs at 58 min · co-op: both clients see the same outcome, no desync.
- **Fun-gate:** a new team unanimously reads the final siege as *different*, preps for it, and reads winning as winning (not "another siege cleared"); run duration 58 min ±1 across 3+ playthroughs.
- **Deps:** SL-3 (END-2), SL-4 (visual reads).
### SL-6 — Polish & Cut `Jun 27-29` · risk MED (scope-creep)
- **Goal:** play the whole run 5+× (solo + co-op), fix readability, cut confusing mechanics, tune feedback; screenshot-validate against the checklist.
- **Tasks:** 5+ full cycles, log confusing/dead/balance/clutter moments · HUD legibility at 1920×1080 (known vitals↔palette overlap — fix or accept) · combat feedback weight (hit freeze-frame/flash, turret-fire + Husk-death distinct, dash i-frame read) · structure-break + Core-breach feedback unmistakable · win/loss banner unmissable (play each 3×) · **enforce a code-freeze Jun 29 noon** (blockers + readability only after) · cut/defer anything unfinished (missing anims → placeholder vanish; responsive HUD → post-jam) · take 58 checklist screenshots · tag a stable backup.
- **Gate:** N/A (validation phase) — success = 5 clean playthroughs (no soft-lock/desync/progression-block), readable HUD, weighty feedback, unambiguous win/loss, screenshots match the checklist.
- **Deps:** SL-5.
### SL-7 — Package `Jun 30` · risk LOWMED (build regressions)
- **Goal:** a reliable playable build (or reliable play path) for external viewing; no new systems, blockers-only fixes.
- **Tasks:** build the Windows player (`ProjectM/Build`), launch → menu → Single/Host/Join → full loop → quit → Continue · verify no magenta materials / missing sprites / missing audio at 1920×1080 (watch the URP global-settings `m_AssetVersion` build blocker — reset the stamp, don't regenerate) · optional LAN Host↔Join smoke · **content + code freeze Jun 29 noon / Jun 30 8 am** · capture 23 hero screenshots · write a hand-off note (what shipped / known-good / deferred / next steps) + **log the formal Decision Gate** (ship-and-stop vs. one Path B milestone) per [[Path_to_Fun#The Decision Gate (MANDATORY STOP after END-2)]].
- **Gate:** end-to-end playable, no crashes/soft-locks; a new player gets a clear win or loss in one 58 min run; shippable for a friend / itch demo.
- **Deps:** SL-6. Fallback: keep the editor-Play path as the demo if the standalone build regresses.
> **Path B stays provisional & unscheduled** (pick ONE after the post-slice Decision-Gate note — re-estimate first): MC-2 ranged+swarm+mix-director · MC-3 pure juice · MC-5 downed/revive · MC-6 multi-slot kit · EB-3 base repair · EB-4 tool-gated harvest · EB-5 craft combat power · END-5 14p scaling + NG+. *(END-3 Echo narrative + END-4 content-treadmill remain CUT.)* Path B forks stay open, locked via the present-the-forks ritual ([[DR-029_Path_A_Fork_Locks]] · [[present-forks-dont-auto-decide]]). The deferred backlog below is the post-slice menu, NOT slice work.
## PAUSED — Inventory · Equipment · Progression (roadmap [[DR-026_Inventory_Equipment_Progression_Foundation]] / [[DR-027_Equipment_Slots_Phase1]])
> Paused 2026-06-08 ([[DR-028_Combat_Primary_Verb_Depth_First]]): Phases 24 are more breadth on systems whose payoff is combat power — resume once the fight is fun. Phases 01 shipped and stand.
Phases 0 (inventory backbone) + 1 (equipment slots) shipped 2026-06-08. Remaining phases, in order:
- [ ] **Phase 2 — tool-gated harvesting** (NEXT): bake `RequiredToolType`/`RequiredToolTier` on `ResourceNode`/`BlightClutter`; `ResourceHarvestSystem` gates + scales yield by the owner's equipped Tool-slot tier (the Tool slot is already reserved + baked). The gear-tier progression loop. "Need a [tool]" HUD cue.
- [ ] **Phase 3 — crafting + per-player persistence**: extend the Fabricator to craft *items* into a player's inventory; equip-tier gates; additive `SaveData` v3 that restores inventory + equipment AND **replays equip** on load (effects are event-driven, so a buffer restore alone wouldn't re-add the StatModifiers).
- [ ] **Phase 4 — (optional) multi-slot spell loadout**: expand the single `AbilityRef` into primary + 23 hotkey ability slots (subsumes the old "multi-ability slots" item). Per-slot cooldowns/inputs.
- [ ] **Items/abilities UI pipeline** (was the deferred M3 item): icons + descriptions via a managed lookup keyed by `ItemId`/`AbilityId`, off the blob (the HUD inventory/equipment panels show names only today).
- [ ] **Multi-prefab ability variants***partly addressed by Phase 1* ([[DR-027_Equipment_Slots_Phase1]]): different weapons already swap the projectile prefab via `AbilityRef.Id` + the catalog. Only multiple cosmetic prefab variants *per single ability* remain (needs `ProjectileClassificationSystem` generalized beyond one shared prefab).
## Combat / enemies
- [ ] **Live interactive fire test** (focused Play: press fire → predicted projectile + dummy/Husk HP drop) — the server loop + replication are validated; the input→`AbilityFireSystem`→predict-spawn→classify path is only validated structurally.
- [ ] **Ranged Husk (Spitter)** — a server-spawned enemy-projectile subsystem for dodge depth (melee-only today).
- [ ] **Boss / per-wave composition weighting** (brutes later, swarms early) instead of flat round-robin; a "broodmaker" that spawns.
- [ ] **Server perf under wave load** — validate in a real standalone build (in-editor multi-world cost ruled out Burst; single-process ServerWorld+ClientWorld+physics+waves is the likely factor).
- [ ] **Projectile/pickup visuals** — primitive meshes/materials today; optional predicted client-side auto-target if the soft server reconcile feels off.
## Automation (M7 follow-ups)
- [ ] **Throughput visuals** (item-on-belt) — server-only machine buffers don't reach clients (they see only `PlacedStructure.Type`); add one small replicated byte if live belt visuals are wanted.
- [ ] **Relevancy ceiling**`RegionRelevancySystem`'s O(structures×connections)/tick scan becomes load-bearing at high conveyor counts; batch it when counts grow.
- [ ] **Recipe depth** — multi-input fabricator recipes; fabricator→conveyor output chaining (give the fabricator a `MachineOutput`); per-machine distinct meshes (they reuse the Turret mesh as a placeholder).
## Frontend / infrastructure
- [ ] **Operator-run validation** — launch the Windows build → menu → Single/Host/Join; a real **2-build LAN Host↔Join**; MPPM co-op regression in default-editor mode.
- [ ] **Controls settings + key rebinding** (Input System rebinding UI) — out of the Graphics/Audio settings scope so far.
- [ ] **Full base-state saves** (placed structures done in M7; add threat/storage) — `SaveData` is versioned so this is additive.
- [ ] **Unity Relay** for remote (non-LAN) Host/Join — swap the endpoint source feeding `ConnectionConfig` (the frontend lifecycle is transport-agnostic).
- [ ] **Dedicated-server build** — the `RequestedPlayType==Server` auto-host branch is in but UNTESTED.
- [ ] **Volume-slider theming** — sliders render via the default runtime theme; swap to +/- cycle rows if a build shows them unstyled.
## Physics / character controller (M5b)
- [ ] **Multi-client CC interpolation validation** — live two-build/thin-client run to confirm remote-peer smoothness (predicted-only `CharacterInterpolation` variant is in; only single-client validated). Pairs with the M4 real-LAN two-build test.
- [ ] **Player-vs-player collision** — currently non-physical (`SimulateDynamicBody=false`); enable + handle masses if mutual push is wanted.
- [ ] **Gravity / verticality** — CC character is gravity-free + planar (no floor collider); add gravity + a ground collider + reconsider `SnapToGround` if terrain is introduced.
- [ ] **CC package version** — 1.4.2 declares `entities/physics@1.3.x` (resolves via SemVer floor); move to a CC build targeting Entities 6.x when published.
- [ ] **Physics-based hit detection** (lag compensation `NetCodePhysicsConfig` + `PhysicsWorldHistorySingleton`; projectiles as physics bodies; hard rotation lock via `PhysicsMass.InverseInertia=0`) — only if the swept-segment server check is replaced.
## World / visuals
- [ ] **Base-side cohesion accents** — cyan ordered-Aether lights + perimeter relief + tiled base ground (the Blightfield/biomes got the dressing budget; see [[DR-025_World_Environment_Redo_Natural_Frontier]]).
- [ ] **Clearing as a spatial mechanic** — cleared cells are juice + scrap only today; make them buildable / reveal hidden nodes (the "functional gating" fork).
- [ ] **Per-`Variant` clutter meshes**`BlightClutter.Variant` is replicated + round-robined but the prefab is single-mesh (additive, no schema change).
- [ ] **Ghost-prop Synty reskin** — Storage / UpgradePickup ghosts still use placeholder meshes.
- [ ] **Decor LOD → cosmetic-only** — cosmetic prop LODs are world GameObjects; keep them off the server tick budget.
- [ ] **VFX-Graph hit/beam packs** + **BioHorror corrupted-zone accent set** (deferred art); **material fidelity** (ORM repack / small ShaderGraph + baked reflection probe).
## Cleanup (low value, deliberately deferred)
- [ ] **Optional code-tidy** (no behaviour change): `SettingsService` migrate-then-clamp ordering; `ConveyorTransportSystem`'s 6 parallel snapshot arrays → one struct array; `WorldFeedbackSystem.TintForResource` if-chain → lookup; `PlayerInputGatherSystem` device-active dedup. [[2026-06-06_Cleanup_Alignment]].