Combat System GDD — Independent Design Review
Date: 2026-08-26
Target:design/gdd/combat-system.md(Last Updated 2026-08-26, CD-GDD-ALIGN APPROVED)
Method: Three independent parallel reviewers — systems/math verification,
design theory & experience coherence, structure & cross-document consistency —
synthesized by the session lead. All formula examples recomputed by hand; all
art-bible/tide/prototype/registry citations verified against source files.
Verdict: NEEDS REVISION — one documentation fix-pass, no design
re-architecture. All findings applied same day (this file records them).
Panel verdicts: math NEEDS REVISION · design theory APPROVED WITH CONDITIONS ·
structure/consistency APPROVED WITH CONDITIONS.
What held up under verification
- Zero-variance damage, host-authoritative no-history hit resolution, the flat-stats/gear-hook split, and the stagger/knockback co-op rules are rigorous and correctly traced to Pillars 4/5.
- Recomputed clean: F1, F2, F3, F5 worked examples; TTK bands (Rusher 2–3, Spacer 2–3, Bulwark 4 across the whole 90–112 band); TTD mistake budgets; the 400 ms telegraph derivation at default (400 − 70 = 330 ms).
- Verified clean: all registry constants (
design/registry/entities.yamlmatches the GDD exactly); all prototype citations (141 ms RTT, ~150 ms hit→stagger, hypothesis CONFIRMED); 9 of 10 art-bible citations; AC numbering/mapping and GIVEN/WHEN/THEN testability; terminology (Rusher/Spacer/Bulwark, Stagger White, Downed,Docked, φ+W) consistent within the doc and across siblings.
Findings and applied resolutions
CRITICAL
- C1 — F4 stagger worked example unreachable from the doc's own constants. Used a "+50 full-value hit" (cloth
staggerHitContribution= 35 everywhere else) and deducted 1 s of decay for a stated 2 s gap; stated result 87.5 is not producible under any consistent reading. Applied: example rewritten with 35-value hits, 1 s gaps, correct decay; narrative payoff re-verified (87.5 + 17.5 ≥ 100 fires the stagger). - **C2 — Telegraph hard floor (350 ms) contradicted Rule 11 and failed its own dodge-margin derivation.** Rule 11 mandates ≥400 ms; the knob table legalized 350 ms (350 − 70 = 280 ms remaining — under the doc's implied reaction budget), and AC-20 admitted exactly-350 configs with no AC testing the floor. Applied (judgment call, recommended resolution): hard floor raised to 400 ms (safe range 400–600) so knob, Rule 11, and AC-20 agree; the floor case is now the default case, which AC-25 already tests. Reaction-time assumption (~250 ms visual-motor; dash i-frames start on input) stated explicitly in Rule 11.
- C3 — Stale cross-document claim. The Dependencies section asserted the tide-scheduler GDD "has no Combat row" and routed a fix to the tide fix-pass list — but tide-scheduler.md already carries that Combat row and lists Combat as a Hard dependent (fixed same-day in the tide fix-pass; never reconciled here). Applied: obligation replaced with a verified-consistent statement.
HIGH
- H1 — Swing-phase guard violable within individually listed safe ranges (0.08 + 0.08 = 0.16 s < 0.18 s guard). Applied: both knob rows annotated with the conditional pair constraint.
- H2 — Dodge economy worst case unquantified and failing. Even at defaults,
dashCooldown0.45 s >telegraphFloor0.40 s: a telegraph starting just after a dash can be unanswerable by dash. Applied: worst-case math stated in the knob-interaction warning, with the explicit design position that dash is not a guaranteed answer — movement/positioning remains the fallback dodge; "usually answerable" is now quantified, not asserted. - H3 — F5
argmaxtie undefined — a determinism bug risk against the zero-variance mandate (two identical weapons same tick is routine co-op). Applied (judgment call, recommended resolution): lowestOwnerClientIdwins on an exact magnitude tie (host-stable, deterministic); AC-17b added. - H4 — No party-size damage contract. F1/F2 have no group term — 5 simultaneous strikes fully stack, which pre-forecloses Enemy AI's anti-mob-shredding levers. Applied: Dependencies row now assigns the lever explicitly (enemy HP bands / spawn density, never per-hit damage reduction).
- H5 — New-friend gear shareability unstated (Pillar 5 load-bearing assumption). Applied: binding constraint added to the Crafting & Gear dependency rows — gear equippable by any party member regardless of crafter.
- H6 — Edge Case 16 has no jitter acceptance criterion — the CD's #1 watch item was only tested at fixed RTT, where it never fires. Applied: AC-24b
[MANUAL]jitter-frequency criterion added; swing-phase guard's second purpose (narrowing the dash-state race window) documented in the knob table.
MEDIUM
- M1 — Art bible §8.A.4 citation overreach (that section scopes tinting to
DriftLayersprites, not combat sprites). Applied: citations reworded to state the exemption reasoning; art-bible fix-pass item flagged to state the combat-sprite exemption explicitly in §8. - M2 — Wrong tide citation ("tide Edge Case 9" does not cover re-sample-at-resolution). Applied: corrected to tide Edge Case 2 + H1.
- M3 —
round()mode unpinned (C# defaults to banker's rounding). Applied: pinned to round-half-away-from-zero (MidpointRounding.AwayFromZero) in a Formulas preamble note. - M4 —
weaponBaseDamage= 32 "Rusher one-shot territory" is false (45/32 → 2 hits). Applied: consequence corrected (band compresses toward a flat 2-hit kill). - M5 — No-mercy-wipe wording conflict (Edge Case 4 read as locked; Open Question 5 reads as pending). Applied: ruling marked provisional, owned by OQ 5.
- M6 — Telegraph-density lockout constraint was advisory-only. Applied: promoted to a binding inherited constraint requiring an acceptance criterion in the Enemy AI quick-spec.
- M7 — Missing Open Questions: dash-through dominance; 5-player revive/bleed-out pacing (defaults are 2-player-MVP calibrated). Applied: OQ 8 and OQ 9 added.
LOW (applied where cheap; two deferred)
- Skill-curve claim scoped honestly (MVP validates the first sessions; the weeks-long arc is carried by Tier 1 roster + gear tiers). Applied.
- Hades reference-anchor divergences stated (no attack-cancel; no netcode precedent for Edge Case 16). Applied.
- Bulwark TTK phrasing (whole band is 4 hits, not just the cap). Applied.
- TTD ceiling notation
⌈100/26⌉ = 4. Applied. - F6 format exemption made self-consistent (points at the Tuning Knobs table). Applied.
- Rule 9 presence-dependency reasoned against the async-tone rule in one sentence. Applied.
- Deferred: section heading "Detailed Design" vs the rule-mandated "Detailed Rules" — shared with tide-scheduler.md, so a combat-only rename would create sibling inconsistency; recommend amending
.claude/rules/design-docs.md(or renaming both docs) in a separate pass. - Deferred: Edge Case 3 (host quits) deliberately has no AC — self-declared in the doc; QA handoff should not mistake it for an oversight.
Conditions carried forward (not closable in this doc)
- Enemy AI quick-spec must carry the telegraph-density AC (M6) and the party-size scaling lever (H4).
- Crafting GDD must honor the gear-shareability constraint (H5) and the pinned rounding mode when choosing tier values (M3).
- Art bible fix-pass: state the combat-sprite tide-tint exemption (M1).
- Netcode ADR: restate the no-history rationale (already required by Rule 7) and confirm telegraph phase as a synced NetworkVariable (Edge Case 17).
- Friend-group playtest must probe OQ 5–9, including the new jitter protocol (AC-24b).