DRIFTLANDS co-op survival on drifting tides — studio progress

Design Re-Review 2: Base Building — 2026-08-27

Document reviewed: design/gdd/base-building.md (1170 lines at review time)
Review mode: full, fresh session — 4 specialists + creative-director, scoped to CS-1..3 per the prior re-review's "do not re-open the approved surface"
Re-review: Yes — prior verdict NEEDS REVISION (narrow), 2026-08-27 (base-building-rereview-2026-08-27.md)
Specialists consulted: systems-designer, qa-lead, network-programmer, game-designer
Senior reviewer: creative-director

Verdict: NEEDS REVISION (narrow — 2 change-sets, both applied same day)

Zero mechanism redesign. CS-1 closed clean. CS-2's residue was one table row and one AC; CS-3's residue was placerHasExit's specification, not its design.

Completeness: 8/8 · Dependency Graph: all on disk

Cross-refs re-verified by line: harvesting 165/58/138 derive (harvesting:278–280); depositPoint in tide Rule 9 (l.142) and LDU Rule 8 (l.93); crafting stationRange row carries the BB warning (crafting:565).

Prior change-sets — status

Status
CS-1 refund exceptionHOLDS — all 6 restatements consistent [systems-designer]
CS-2 anchor 60→50Partial — constants derive; Tuning Knobs row and AC-20b not swept → CS-4
CS-3 enclosure clusterPartial — mechanism stands; placerHasExit under-specified → CS-5

Required — applied

CS-4 [systems-designer, game-designer, network-programmer] perimeterSegments row still computed with the retired 60; safe range 40–60 failed the CI gate at its own ceiling with one knob moved (⌈240/58⌉ = 5); "too low = one session" false at 40 (3 sessions) and contradicted Formulas' 25-seg shelter. AC-20b asserted the unconditional ClientId ordering EC1 disavows. Fix (user decision: floor 25): range 25–57 with worked bounds; "never one trivial session" scoped to the 50-seg perimeter; anchor named as session-length-derived; AC-20b GIVEN narrowed to arrival-order-indistinguishable batches + companion arrival-preserving case.

CS-5 [network-programmer, qa-lead, game-designer] placerHasExit read the placer's host-known position (one RTT stale for non-host) with none of noPlayerOccupancy's caveats; out-of-region neighbours undefined; candidate-footprint role ambiguous; the Pillar 5 agency trade unrecorded. Fix: F1 row rewritten (in-region + buildable + no footprint incl. candidate; exact for host, best-effort for non-host → EC22 widened to cover non-host self-enclosure); EC23 records the trade; reason string → "no way out" (user decision); AC-14b edge-of-region. EC21 pinned: BFS bound ⌊placementReach / gridCellSize⌋ hops, re-check before write, one in-flight correction per player, registered as third teleport-snap event in player-movement Rule 6; displaced-player tell in Visual/Audio.

Recommended — applied

AC-14c (pure BFS [UNIT]); AC-63c (deposit shore clause); coverage note 13–23 → 13–19; three netcode-ADR forward-refs; EC13 player-facing discovery path; save quick-spec "13–15" → "13–16".

Rejected

qa-lead Q3 (placer inside own footprint) — noPlayerOccupancy short-circuits it; host position is exact.

Disagreements adjudicated

"Too low" cell: systems-designer REC vs game-designer BLOCKING → BLOCKING. placerHasExit: network correctness hole vs game-designer reopen-the-trade → merged; the 2026-08-27 conjunct ruling stands, the trade is recorded.

Process finding [creative-director]

The "fix introduces the defect" class recurred a third time, as retired literals not swept and a new predicate not inheriting its neighbour's caveats. Two lines added to .claude/skills/design-review/SKILL.md's revision-pass checklist.

Scope Signal

Revision: S. System: M (unchanged).

Files changed

design/gdd/base-building.md, design/quick-specs/save-persistence-2026-08-26.md, design/quick-specs/player-movement-2026-08-27.md, design/gdd/systems-index.md, .claude/skills/design-review/SKILL.md.