DRIFTLANDS co-op survival on drifting tides — studio progress

Cross-GDD Review Report

Date: 2026-08-27
Skill: /review-all-gdds (full mode)
GDDs reviewed: 5 full GDDs (tide-scheduler, combat-system, harvesting-system, crafting-system, base-building) + 8 quick-specs (netcode-session, camera, save-persistence, player-movement, inventory-hauling, land-dock-undock, enemy-ai, ui-hud) — all 13 MVP systems — plus game-concept.md, systems-index.md, and the entity registry
Pillars: 1 Tide Waits for No One · 2 Home Is the Fixed Point · 3 Made by Our Hands · 4 Scrappy Hands, Serious World · 5 Four Freedoms
Anti-pillars: not RTS · not treadmill MMO · not punishing survival sim (+ nothing happens offline) · not public live-service
Registry: populated (3 entities, 9 items, 12 formulas, 30 constants) — used as the Phase 2 conflict baseline
Verdict: FAIL at first pass (5 blocking items + 1 scenario blocker) → all six ruled and applied the same day → since-last-review: CONCERNS (see final sections; no blockers remain)


Consistency Issues

Blocking (must resolve before architecture begins)

🔴 C1 — Disconnect while Downed: body persists (Combat) vs. despawns (Netcode)

Combat AC-41 and Netcode AC-3 cannot both pass. Netcode is the later document and declares its rails binding on every system, but never cites combat EC2. Also undefined under the despawn model: HP on rejoin (Save Rule 7's full-HP restore applies to load; combat EC2 says a live disconnect ≠ load, and its accepted "disconnect-to-heal" non-concern was reasoned against session restart, not a 30-second rejoin). One document must yield.

🔴 C2 — ItemStack = (itemId, count) cannot carry the maker's mark

Two binding data contracts disagree on the stack shape. A one-line fix in Inventory, but architecture must not inherit the 2-tuple.

🔴 C3 — LDU's party-clock CI gate can never pass

land-dock-undock-2026-08-27.md Rule 7 / AC-5:

tripsPossible   = ⌊W / (2 × shoreToDeepSecs + bagFillSecs)⌋
partyClockRatio = totalSupply / (bagSlots × maxStack × harvesters × tripsPossible)  ≥ 1.0 at harvesters = 5

With W = 158,400 s (44 h), bagFillSecs = 90, and any plausible shoreToDeepSecs (~20 s at 6 u/s): tripsPossible ≈ 1,200, ratio ≈ 438 / (200 × 5 × 1200) ≈ 0.0004. The formula treats the entire 44-hour dock window as continuous harvesting time.

harvesting-system.md (Formulas → Scope honesty, CD C1) cites this rule as the authoritative party-scale protection: "at party scale, Pillar 1 is protected by the clock (travel time inside W)." It is not — by a factor of ~2,500. The gate needs a session-length term (e.g. sessionWindowSecs, ~2 h) in place of W, and harvesting's C1 claim needs restating: at party scale Pillar 1 is protected by real-life session scarcity, not by the dock window.

Warnings (should resolve, but won't block)

⚠️ W1 — Two grace windows for one transition

tide-scheduler.md Rule 9 / Edge Case 11 / Tuning Knobs: EvictionGrace 20 s — drift-out cosmetic, violet held, server-authoritative force-relocation of unresponsive clients at expiry. land-dock-undock Tuning Knobs: teardownGraceMs 500 ms — "delay between soft-close resolution and visual despawn." If LDU despawns at +0.5 s, tide's +20 s AFK relocation guarantee targets a land that no longer exists. LDU should cite EvictionGrace rather than own a second window. (~2-minute edit.)

⚠️ W2 — Durability event providers missing (Crafting OQ5 still open)

Crafting Rule 9 drains durability on swing landed and hit absorbed — both Combat events, both at MVP (wear states ship at MVP even though cloth has no mechanical loss). combat-system.md Dependencies "provides to Crafting" lists only the two hook signatures; harvesting-system.md likewise omits tool-swing events (Tier 1). Crafting flagged this as a bidirectional fix-pass item on 2026-08-26; neither doc has it.

⚠️ W3 — Home-island harvest nodes: banned, permitted, and unrepresentable

Decide: no home nodes (delete Rule 11's clause and AC-25), or define their key and regrowth.

⚠️ W4 — moveSpeed ownership conflict

combat-system.md Tuning Knobs owns moveSpeed 6 u/s, safe 5–7. player-movement-2026-08-27.md Tuning Knobs owns moveSpeed 6 u/s, safe 5–8; Rule 7 claims the constant. design/registry/entities.yaml has two move_speed entries with different source: values. Combat's row should become "cited, not owned" (its own Interactions table already says Movement owns locomotion); the registry needs one entry.

⚠️ W5 — Dependency asymmetries

⚠️ W6 — Stale references and status annotations (30-second edits)

⚠️ W7 — "No mechanic branches on player count"

netcode-session Rule 3 states this as design law. combat-system.md Rule 9 makes Downed-vs-Dead depend on whether another living player is on the land; BB Edge Case 22's escape is social-only. Combat justifies its case explicitly; netcode's rule needs the carve-out (presence ≠ count) or it reads as a contradiction.

⚠️ W8 — "No tide replication exists"

netcode Rule 4 / AC-2 vs. tide-scheduler.md Rule 1: "the host replicates t (and its computed results) on join and on change." Both agree t is replicated and the host is authoritative; the wording conflict is whether derived booleans also travel. Pick one phrasing.

ℹ️ Info


Game Design Issues

Blocking

🔴 D1 — The deep band has no MVP payoff: Reinforced Garb's DamageReduction is undefined

crafting-system.md F2 locks the cloth tier at DamageModifier 1.0 / DamageReduction 0.0 / HarvestModifier 1.0 — per tier, not per item. Cloth Garb, Reinforced (8 fiber + 3 sinew, "the deep-band reward: sinew gates the best cloth armor") is cloth tier; nothing anywhere gives it a different value (entities.yaml: cloth_garb has hooks: DamageReduction 0.0; cloth_garb_reinforced has no hooks line). Read literally it is mechanically identical to Cloth Garb.

Consequence across systems: sinew — harvesting's deep-band reward, Bulwark-guarded per Enemy AI Rule 9, "never in any structure" per BB — has a lifetime sink of 3 units per player for zero benefit. Harvesting's anchor fantasy ("a violet-lit vein deep inland… you swing anyway") and Enemy AI's entire risk gradient reward nothing at MVP.

Fix: give F2 a per-item override (e.g. reinforced DR ≈ 0.10), re-run combat's TTD check, register the hook in entities.yaml.

🔴 D2 — Fresh-world bootstrap: there is no unarmed strike, and the first weapon needs guarded timber

Session one of every world starts in undefined territory: either fists exist with no number, or a new group must clear guards with no weapon — contradicting BB's "base-up requires no inland risk, ever" and Pillar 5's first-session guarantee. Decide: define an unarmed baseline in Combat, or guarantee ≥10 shore-band timber with a 0-guard approach (Harvesting band skew + LDU template authoring rule + Enemy AI shore density).

Warnings

⚠️ D3 — MVP economy: every sink is one-time; the faucet recurs forever

Sinks: bootstrap 48 units + perimeter 200 timber + chests (8 fiber each, fully refundable). Sources: 438 units per docking, every ~3 days, regrown on recurrence. Repair is free, gear indestructible, no consumables, no bag upgrade. By session 3–4 fiber and timber are worthless; per D1, sinew is worthless from session one. BB's economy note and OQ11 accept this for BB; crafting OQ9 and BB's honesty clause accept the "home-facing dead zone." No document states the sum: the concept's core beat — "the bag going home is the point" — has no destination after base-up. Not a contradiction; a scoping fact the gate-check must read whole. Options (a design decision, not this review's): state the MVP playtest hypothesis as "≤4 sessions," or add one cheap recurring sink.

⚠️ D4 — Four of five headline fantasies are deferred past MVP

Crafting (maker's signature — "a Tier 1+ target"), Base Building (walls-as-memory — "Tier 1+"), Combat (weeks-long skill arc — "carried by Tier 1's roster"), Harvesting (discovery narrows to execution by ~session 4, OQ8). Each admission is honest in isolation; together they mean MVP validates the mechanical skeleton and the tide fantasy only. Pair with D3 when scoping the friend-group playtest's question.

⚠️ D5 — Tide legibility at MVP

game-concept.md MVP Definition defers "tide-clock visual polish" to Tier 1 (systems index row 14: Tide-Tint Render Pipeline, Tier 1). Harvesting's push-vs-bail is designed as "distance-from-shore and the land's tide-color state read as one glance"; tide's Player Fantasy is an amber horizon. At MVP the only tide readout is the compass glint (UI/HUD Rule 1). Confirm the glint alone makes the deadline legible enough that a missed vein reads as "I knew and pushed anyway," or pull a minimal single-channel tint forward — otherwise the harvesting fantasy's central test can't be run at MVP.

⚠️ D6 — Tier 1 curve (advisory)

Crafting's provisional ladder already breaks combat's 2–4-hit TTK band at bronze (owned by crafting OQ1); at iron (2.2) every MVP archetype dies in 1–2 hits. Cross-system note only: crafting AC-56 pins a provisional value (iron 2.2) as a pass/fail test.

Checked and clean


Cross-System Scenario Issues

Scenarios walked: 6

Blockers

🔴 Strike near a node with a Rusher closing — Harvesting × Combat × Netcode

Trigger: strike input with a node in harvestRange and a hostile entering the arc.

Undefined: which message shape a strike sends; whether the referent is locked at windup or re-decided at resolution; which phase constants apply when the referent could flip. Both docs push the RPC shape to the netcode ADR, but when disambiguation is evaluated is a design rule nobody states.

🔴 Fresh-world session one → D2 (no unarmed strike; guarded timber before the first sword)

🔴 Disconnect while Downed, rejoin → C1 (persist vs. despawn; HP on rejoin undefined)

Warnings

⚠️ φ+W with a Downed player — Tide × Combat × LDU

Tide Rule 9 deposits everyone at depositPoint. Combat Rule 13: "arrives home still Downed, with the bleed-out timer running… if it expires they respawn normally, already home." Combat Edge Case 8: "Downed cannot exist at home — the home-island heal rule takes precedence and the player stabilizes." Combat Rule 6: HP restores to full while present at home. One tick after deposit the player's state is defined two ways, and the Rule 13 path lets a tide departure end in a Dead transition — brushing the "departure never converts to a death" invariant. Say explicitly whether home-heal applies to a deposited Downed body. The harvest and combat halves of this scenario are consistent (both resolve < φ+W, discard ≥ φ+W). W1's two teardown windows also land at this instant.

Info


GDDs Flagged for Revision

GDD Reason Type Priority
combat-system.mdC1 (Downed disconnect vs netcode); D2 (no unarmed strike); Rule 13 vs EC8 at home; W2 durability events; W4 moveSpeed; W6 stale statusConsistency + DesignBlocking
netcode-session-2026-08-27.mdC1 (despawn rule + rejoin HP); W7 carve-out; W8 wordingConsistencyBlocking
crafting-system.mdD1 (reinforced DR undefined); C2 tag contract; W6 stationPresent namingDesign + ConsistencyBlocking
inventory-hauling-2026-08-26.mdC2 (instanceTag in stack contract); W6 maxStack / singular containerConsistencyBlocking
land-dock-undock-2026-08-27.mdC3 (party-clock gate cannot pass); W1 teardownGraceConsistencyBlocking
harvesting-system.mdC3 (C1 "protected by the clock" claim); scenario 2 disambiguation timing; W3 home nodes; W2 / W5 / W6Consistency + DesignBlocking
player-movement-2026-08-27.mdW4 moveSpeed (registry dedupe)ConsistencyWarning
base-building.mdW5 dependency rows (Harvesting, Player Movement)ConsistencyWarning
tide-scheduler.mdW5 downstream table (Crafting, BB); W6 stale sentenceConsistencyWarning
game-concept.mdW6 "your drifted skills"ConsistencyWarning
enemy-ai-2026-08-27.mdD2 (mid-band guard floor vs bootstrap) — the decision may land hereDesignWarning
design/registry/entities.yamlDuplicate move_speed; entity referenced_by; reinforced hooksConsistencyWarning

Verdict: FAIL

Five blocking items (C1, C2, C3, D1, D2) plus the strike-disambiguation scenario blocker must be resolved before /create-architecture. All six are narrow: two are one-paragraph rulings (C1, disambiguation timing), two are single-line contract edits (C2, plus a number for D1), one is a formula fix (C3), one is a design decision (D2). None reopens a locked rule.

Required actions before re-running

Then re-run /review-all-gdds since-last-review.


Method note: Phases 2–4 were executed inline by the orchestrating session (all 13 documents fully loaded), not by parallel subagents — no context was lost to summarisation.


Rulings applied — 2026-08-27 (same session)

All six blockers were put to the user and resolved; edits applied the same day.

# Ruling Applied to
C1Despawn; session-scoped HP/Downed/timer persist. No offline bodies; host keeps HP, Downed status and remaining bleed-out timer; rejoin restores them (Downed-and-running → Downed, revivable; expired → Dead → respawn home; live → last HP, no disconnect-to-heal via rejoin). Session end alone resets to full HP.combat EC2 + AC-41; netcode Rule 5 + AC-3
C2ItemStack = (itemId, count, instanceTag?) — opaque, never interpreted, tagged stacks never merge.inventory Rule 2 + new AC; crafting Rule 4 / Interactions / Dependencies / OQ4 resolved
C3Party-clock invariant retired. A focused party can strip a land (harvesting Rule 12); Pillar 1's party-scale tension is per-session opportunity cost, not supply or the clock. LDU keeps traversalProfile and an informational stripTimeEstimate(h) readout (new knob nodeVisitSecs 20 s), no assertion.LDU Rule 7 + knobs + AC-5; harvesting Scope-honesty paragraph
D1Reinforced Garb DamageReduction 0.10 per-item override (Bulwark 26 → 23, budget 4 → 5; Rusher 16 → 14). F2 gains per-item override semantics; override must stay below bronze's provisional 0.12 (OQ1); dull state returns to tier baseline.crafting recipe table, F2, AC-55; combat TTD note; registry cloth_garb_reinforced
D2Unarmed strike: 14 base damage (half cloth, same arc/range/phases, stagger 18). Unarmed TTK Rusher 4–5 / Spacer 4–6 / Bulwark 7–8 — outside the 2–4 band by design. Knob unarmedBaseDamage 14 (10–18).combat baseline table, F1, AC-7b, knobs; crafting first-session note; BB bootstrap note; registry unarmed_base_damage
StrikeReferent locked at windup start; one unified intent (swingId, aimDirection, targetKind, nodeId?). Client picks by harvesting Rule 2's priority; phase constants follow the referent; host resolves node-intents against the three harvest gates only — a late hostile never hijacks a harvest swing.harvesting Rule 2 + Rule 6 + AC-5; combat Rule 7

Not applied (warnings, still open): W1–W8, D3–D6, the Rule 13 vs EC8 home-deposit question, and the registry move_speed duplicate. Next: /review-all-gdds since-last-review to confirm the blockers are closed, then the warnings bundle.

Since-last-review pass — 2026-08-27 (same session)

Scope: the 8 edited docs + registry, checked against their untouched dependents (Save, Player Movement, Enemy AI, Tide, UI/HUD). Verdict: CONCERNS. All six blockers verified closed on both sides of each contract. Five residue references introduced by the changeset were found and fixed (harvesting Trip-texture note, AC-6, AC-13; crafting F3 itemValue + OQ1 clause (c); combat F4 unarmed contribution).

Warnings applied same session: W1 (LDU cites tide's EvictionGrace; teardownGraceMs retired), W2 (combat provides SwingLanded/DamageAbsorbed, harvesting provides HarvestSwingLanded Tier 1; crafting OQ5 resolved), W4 (combat moveSpeed row cited-not-owned; registry combat entry superseded), W5 (tide downstream rows for Crafting + BB; BB upstream rows for Harvesting + Player Movement; harvesting downstream row for BB), W6 (concept "drifted skills"; combat/harvesting/tide status strings; combat OQ2 + harvesting OQ5 resolved; inventory maxStack + plural containers; crafting F1 → stationPresentExact; registry entity referenced_by), W7 (netcode presence-vs-count carve-out), W8 (netcode tide-replication wording).

Still open (decisions): W3 home-island nodes; combat Rule 13 vs Edge Case 8 (deposited-Downed at home). Still open (design holism, playtest-scoped): D3 sink saturation, D4 deferred fantasies, D5 tide legibility at MVP, D6 Tier 1 curve. Systems index rows restored to Reviewed/Designed.

Final two rulings (same session): W3 → no home-island harvest nodes (harvesting Player Fantasy, Rule 11, AC-25 now a schema-negative load reject; crafting first-session note points at the docked land's shore). Rule 13 vs Edge Case 8 → home stabilizes a deposited Downed player at reviveHPFraction, timer cancelled (combat Rule 13 bullet, EC8, state table row, AC-35). Remaining open items are all playtest-scoped (D3–D6). Committed the same day.

Post-gate rulings (2026-08-27, Technical Setup gate): D5 resolved — minimal single-channel tide tint pulled into MVP (index row 14 MVP, new row 15 Tier 1 polish; art bible §8.B.3 MVP scope + §8.A.4 combat-sprite exemption; concept MVP Definition + Scope Tiers). D3/D4 accepted with the hypothesis window stated — concept Core hypothesis now "first 3–4 sessions; skeleton + tide fantasy". D6 addressed — crafting AC-56 tests the TTK band, not iron 2.2. BB OQ4 carries a provisional Tier 1 building sizing note (~2–3 weeks part-time).