Docs: LANTERN Phase 1 combat review-hardened — Build Spec + DR-050

Adversarial pre-code review (wf_c7575828-934; 23 agents, 0 failures) over the Phase 1
combat-gym design raised 19 findings (8 CONFIRMED + 11 PARTIAL, 0 refuted) and caught
design-breakers before code:
- SpawnId bit budget exhausted (owner16|fireCount12|fork4) -> repack owner14|socket2|
  fireCount12|fork4 so 4 sockets don't collide/desync.
- "KEEP as-is" client feel layer is a real migration (CombatFeedback/PlayerAnimationDrive/
  HUD read the reworked AbilityRef/AbilityCooldown) + needs a new replicated class signal.
- predict-spawn is Projectile-only (Aoe/Hitscan/decoy = Cone-precedent server-only spawn);
  Blink = velocity-blink in its own system (not a transform teleport); SocketCooldown hot
  not cold; EffectiveAbilityStats 4-wide; windup needs a rollback-safe resolve tick;
  Harpooner reel + player zone = new server-only code, not salvage.

Verdict: pass-with-changes on all 3 lenses, no redesign. Phase1_Combat_Gym_Build_Spec =
the implementation contract (8-step build order, wire/bake churn, open risks, ledger).
DR-050 records it; pre-review design -> superseded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-14 08:57:11 -07:00
parent 831c41c711
commit 6474e8faff
5 changed files with 345 additions and 2 deletions
@@ -0,0 +1,72 @@
---
id: DR-050
title: LANTERN Phase 1 combat gym — 4-socket manual-aim kit design (review-hardened)
status: accepted
date: 2026-07-14
tags: [decision, lantern, combat, phase-1, netcode, review]
permalink: gamevault/07-sessions/decisions/dr-050-lantern-phase1-combat-design
---
# DR-050 — LANTERN Phase 1 combat gym design (review-hardened)
## Context
Phase 1 of [[Roadmap_Lantern_Slice]] is the primary verb — two suit-frames + a 4-socket **manual-aim
skillshot kit** + the first 5 Sparks, in a gym (no world). Operator selected it as the first build target
(2026-07-14) with forks locked in [[Lantern_Operator_Questions]]: 4 discrete ability buttons · manual aim
(soft auto-target cut) · Harpooner reel = pull-target-to-you · the roadmap 5 Sparks. It's netcode-touching
(new player ghost fields + input surface), so per the standing ★-review authorization it went through the
adversarial pre-code design review before any code.
## Decision
**Adopt [[Phase1_Combat_Gym_Build_Spec]] (review-hardened) as the implementation contract.** No Phase 1 code
is written outside it.
The review (`wf_c7575828-934`; 23 agents, **0 failures** — findings verified real) ran netcode/reuse/
determinism lenses with refute-first critics: **19 findings, 8 CONFIRMED + 11 PARTIAL, 0 refuted.** Verdict:
**pass-with-changes on all three lenses — no redesign; the substrate is sound and the socket grammar reworks
on top.** The HIGHs cluster on two coupled issues, both now resolved in the spec:
1. **The `SpawnId` key is exhausted (NP-1/RS-1/DB-3).** It packs `owner(16)|fireCount(12)|fork(4)` = all 32
bits; 4 sockets carry no discriminator → same-tick multi-socket projectiles collide → mis-classify/desync.
**LOCKED: repack to `owner(14)|socket(2)|fireCount(12)|fork(4)`**, count sourced from the firing socket,
fork bits untouched (Phase-4 mutations still need them). Projectile Sparks stay one shared ghost prefab
(bake-time guard); classifier generalization deferred.
2. **The "KEEP as-is" client feel layer isn't (NP-5/RS-2).** `CombatFeedbackSystem`, `PlayerAnimationDriveSystem`,
`ClassPrepPortalHudSystem`, `MetaShopHudSystem`, `HudSystem` all resolve archetype/cooldown/class off the
single `AbilityRef`/`AbilityCooldown` being reworked → a real migration, + a **new replicated class signal**
(`FrameId`/promoted `PlayerClass` `[GhostField]`) since no ability id maps 1:1 to a class under sockets.
Other confirmed reworks: predict-spawn is **Projectile-only** — Aoe/Hitscan/decoy follow the **Cone precedent**
(server-only spawn/effect, cooldown both worlds) never predict-spawn (NP-6/RS-4); **Blink is a velocity-blink**
in its own `BlinkSystem` (never a `LocalTransform` write, never inside the predict-spawn gate — DB-5/NP-3/RS-3);
`SocketCooldown` is a **hot owner-predicted scalar-shaped** cooldown (NOT the cold `EquipmentSlot` — NP-4);
`EffectiveAbilityStats` goes **4-wide** (RS-7/DB-2); the 7-arg cap is fixed by **dropping `AbilityRef`/
`AbilityCooldown` from the query + `BufferLookup`s** (DB-1); windups need a **rollback-safe resolve tick** via
`GetDataAtTick(serverTick WindupTicks)` (DB-6); the **Harpooner reel** (RS-6) and **player zone** (RS-5) are
**new server-only code**, not salvage (the pull flag doesn't home on the caster; the geyser chassis friendly-
fires + doesn't credit the caster).
## Consequences
- **Build order (spec §Build order):** 1 socket data model (+1b per-socket stats) → 2 `AbilityFireSystem`
restructure + `SpawnId` repack (+2.5 client-feel/class migration) → 3 Aoe/Hitscan branches + decoy/zone
ghosts → 4 Spark defs + Blink + reel + zone → 5 two frames → 6 manual-aim windups → 7 underwater feel →
8 light-relevancy (deferred to the world-model review). Steps 12/2.5 **re-bake the player ghost + change
the command-collection hash** (must match across peers). Everything else is additive.
- **Implementation proceeds incrementally** — each step ends compile+`read_console` clean + its L2 test; the
wire-churn steps (12) get an L3 two-player Play smoke + an induced-rollback test for the predicted
`SocketCooldown` (NP-4 gate) before relying on it.
- **Open risks tracked** (spec §implementer-watch): classifier single-type (shared-prefab lock holds),
`SocketCooldown` predicted-buffer restore, dash+blink MoveVelocity precedence, windup resolve-tick
divergence, zone attribution, reel-needs-live-Husks, 7-arg regressions, sort-cycle (Play-only).
- **Revisit when:** implementation contradicts the spec (mini-review), or the 15-min two-player gym fun-gate
fails.
## Related
- [[Phase1_Combat_Gym_Build_Spec]] — the durable contract this accepts (19 findings folded)
- [[Lantern_Phase1_Combat_Gym_Build_Spec]] — the pre-review design (superseded)
- [[DR-048_Lantern_Adoption_Full_Pivot]] · [[DR-049_Lantern_World_Model_Design]] · [[Roadmap_Lantern_Slice]] Phase 1
- [[Lantern_Operator_Questions]] — the locked forks · [[validate-netcode-design-before-coding]] — the ritual