Files
Project-M/Docs/Vault/06_Roadmap/Backlog.md
T
kronic 03f778085b Docs: loop re-shape to expedition-driven (DR-042) + consolidate; fix enemy health-bar fill
- DR-042 (new): canonical loop re-shape — win-driver moves from base-siege
  survival to expedition clears; blind scheduled siege retired; base siege
  becomes retaliation consequence. Build order A (coherence) -> B (retaliation)
  -> C (legibility) -> D (Slice 4 persistent meta).
- Backlog/Path_to_Fun/Home reconciled to the expedition-driven direction;
  Slice 3 + Combat Depth marked built.
- DR-036 (END-2) flagged superseded-in-part; DR-034 (END-1) repurposed (Core
  is a consequence, not the win-gate); DR-037 forward-pointer to DR-042.
- CombatFeedbackSystem: fix enemy health bar (sprite-less Filled Image ignored
  fillAmount -> size via anchorMax.x).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:07:33 -07:00

27 KiB
Raw Blame History

tags, updated, permalink
tags updated permalink
roadmap
backlog
slice
2026-06-13 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 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-ProgressionRE-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 (first): move the win-driver from base siegesexpedition clears (GoalProgress.Charge +1 on a cleared sortie); kill the AFK win (disable the blind scheduled siege as a progression source); final beat reached through the spine. Netcode-touching → design-review first.
  • 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: walls actually block (structures on the enemy collision filter); Aether-upgrade HUD button + cost; Biomass sink (or cut); cold-start ledger seed; hide dead Harvester/Conveyor/Pylon; expedition objective UI + gate prompt; reward scales with depth.
  • 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-DefendClearedVictory, 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 variantspartly 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 ceilingRegionRelevancySystem'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 meshesBlightClutter.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.