Design Re-Review 4: Base Building — 2026-08-27
Document reviewed:
design/gdd/base-building.md(1312 lines at review time; 1389 after revision)
Review mode: full, fresh session — 4 specialists + creative-director, scoped to CS-6/CS-7 per the third re-review's "pending fourth re-review of CS-6/CS-7 only"
Re-review: Yes — prior verdict NEEDS REVISION (narrow), 2026-08-27 (base-building-rereview-3-2026-08-27.md)
Specialists consulted: systems-designer, qa-lead, network-programmer, game-designer (all Sonnet)
Senior reviewer: creative-director (Opus)
Verdict: NEEDS REVISION (narrow — 4 blocking surfaces + recommended tail, all applied same day)
Zero mechanism redesign. CS-6 and CS-7 hold on their own surface — the 35–58 band, the placerHasExit mechanism, the FIFO tie-break, AC-14b's base case and AC-20b's mixed batch all re-derive correctly under independent check. What failed is one step outside the edited lines, in the same tables and paragraphs the change-sets touched.
Completeness: 8/8 · Dependency Graph: unchanged, all on disk
Retired-literal sweep before revision (25–57, 13–15, 60×4, 24×4): clean. After revision (gridCellSize ≥ placementReach, "zero-hop", wallCost 3–6): only historical citations inside the corrected cells.
CD-verified arithmetic
| Check | Result |
|---|---|
perimeterSegments 34/35/58/59 at hauls 58 and 138 | 1 (fail) / 3,2 / 4,2 / 5 (fail) — CS-6 holds |
| "two sessions at slow end for 15–29" | 58 < 4s ≤ 116 → exact |
wallCost at seg 50: 3/4/5/6 → sessions at haul 58 | 3 / 4 / 5 / 6 — 5 and 6 fail; marginal range is 3–4 |
wallCost 2 at haul 138 | ⌈100/138⌉ = 1 — floor is set by the fast end |
⌊placementReach/gridCellSize⌋ at equality | 1, not < 1 — prior EC17 gloss false at its own boundary |
workbenchCost ±50%, storageChestCost 4–12 vs bootstrapRatio | 0.242–0.339, 0.267–0.315 — pass |
Prior change-sets — status
| Status | |
|---|---|
| CS-6 knob-row bounds 35–58, gate subject | Holds. Blast radius not swept → wallCost row (CS-8), CI-gates "corner" sentence (CS-9) |
| CS-7 AC-14b/14c, host-exactness, maze boundary, EC17 row | Mechanism holds. New EC17 row wrong at its boundary (CS-10); AC-14b companion ambiguous, AC-14c unpinned (CS-11); pin (iii) ambiguous (CS-12); wording tail (CS-13–16) |
Required — applied
- CS-8 [main review, systems-designer; CD]
wallCostsafe range 3–6 → 3–4, both boundary cells rewritten with worked bounds at both extremes (the "too low" cell was also wrong in kind: nothing is "trivial in < 1 session" at the slow end). - CS-10 [main review, qa-lead; CD; user decision] EC17 row rebound to
placementReach < 2 × gridCellSize(bound ≤ 1 rejected). The CD's proposal "keep ≥, reason: 1 hop is too thin" was itself incoherent — it rejects equality while accepting every ratio in (1, 2) with the same 1-hop bound — surfaced during revision and re-decided by the user (bound < 2, so the 2×1 workbench is escapable). AC-64b rewritten with three reject vectors and a bound-2 companion; hop 0 = seed cell, never a candidate (EC21 pin (i), AC-14c). - CS-11 [qa-lead; CD] AC-14b companion pinned: candidate one cell further outward along the blocked-exit bearing, other conjuncts unchanged. AC-14c hop-2 coordinates pinned (origin; (1,1) vs (2,0); FIFO → (1,1)).
- CS-12 [network-programmer over qa-lead; CD] EC21 pin (iii): re-evaluation invokes the search fresh at the current cell against the live registry, never a stashed re-check; the W2-on-B sequence written out; the one-in-flight cap labelled a closure against future async, not an operative guard; accepted-race paragraph cross-linked.
Recommended — applied
- CS-9 CI-gates:
wallCost6 @ 58 was never a corner (58 is the live exported extreme); marginal ranges can fail at everyone else's defaults; green gates prove pacing only. - CS-13 F1
noPlayerOccupancyrow: "exact" = free of transport/interp staleness; current-frame position is a tick-ordering ADR input; read-ordering added to the ⚑ list;Teleport()vs plain write added. - CS-14 EC22 remedy tier split: footprint-on-own-cell → EC21 active correction; adjacent-to-seal → social-only.
- CS-15 AC-14d (maze legal until last-exit segment, sequential); coverage note fixed; observer asymmetry given owner + trigger (netcode ADR, first NGO integration story touching
NetworkTransform, user decision) in both BB EC21 and player-movement Rule 6; teleport-snap-vs-interpolated tension resolved (owner-side write, not observer treatment; must be a plain interpolated write). - CS-16 "walk-space" named as undefined — fit check is stated intent until authoring pins corridor width and perimeter shape; l.807 qualified into a home-island authoring constraint (user decision: qualify, not cut); drag-row no-lookahead limitation stated (user decision: state, not design lookahead); AC-46 pacing-only note.
- CS-17 "gate-safe" defined at first use; 35–58 carries no in-band preference; EC14 precedent for post-build anchor revision; AC-14c shares AC-14's
ITerrainQuery; "no way out" register marked convention (/ux-design-owned).
Rejected / downgraded
Downgraded to RECOMMENDED by CD: missing maze-sequence AC (coverage gap, not wrong number); EC22 tier (misclassification, not mechanism); l.807 unsealable room (benign failure). Not reopened: conjunct-over-document; D2 shelter gate-exempt; the asymmetry itself.
Disagreements adjudicated
- Pin (iii) vacuous (qa-lead) vs race-bearing (network-programmer) → network-programmer; both halves kept (labelling + fresh search).
- Scope of
wallCostrow and EC17 row → in scope: EC17/AC-64b were created by CS-7;wallCostis falsified by CS-6's own derivation. - Severity: 8 specialist BLOCKING → 4 surfaces confirmed (wrong-by-arithmetic, unpassable-as-written, race-bearing); wording-precision items RECOMMENDED.
Process finding [creative-director]
"Fix introduces the defect" recurred a fifth time, in three shapes: (A, new) the fix's own derivation proves an adjacent cell wrong and nobody runs it one row up; (B, new) a new guard row's justification is false at the boundary it polices — and the reviewer's corrective proposal failed the same check; (C, repeat) an AC whose GIVEN the text does not determine. Root cause restated: line-range scoping guarantees the adjacent cell is out of scope. Checklist amended in .claude/skills/design-review/SKILL.md: close over every cell/row/AC downstream of the re-derived constant, and check every new guard (and its proposed fix) at its own boundary.
Fifth re-review scope
CS-8–CS-16 only, with a mandatory closure step: re-run perimeterSessions against every Tuning Knobs row and every CI-gate example sentence; every load-time boundary at its own boundary. Applied once already in this session (clean). If a fifth pass surfaces a sixth instance, the CD's read is that the numeric surface needs a generated source of truth (the gate computing the ranges), which is a decision, not a finding.
Scope Signal
Revision: S. System: M (unchanged).
Files changed
design/gdd/base-building.md, design/gdd/systems-index.md, design/quick-specs/player-movement-2026-08-27.md, .claude/skills/design-review/SKILL.md.