Design Re-Review 5: Base Building — 2026-08-27
Document reviewed:
design/gdd/base-building.md(1389 lines at review time; 1450 after revision)
Review mode: full, fresh session — 4 specialists + creative-director, scoped to CS-8–CS-16 per the fourth re-review, with the CD's mandatory closure step (re-runperimeterSessionsagainst every Tuning Knobs row and every CI-gate example sentence; every load-time boundary at its own boundary)
Re-review: Yes — prior verdict NEEDS REVISION (narrow), 2026-08-27 (base-building-rereview-4-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 — one blocking surface + recommended/nice tail, all applied same day as CS-18)
The numeric surface is clean for the first time in five passes. 24 main-review cells and 29 systems-designer cells — both knob rows and all four too-low/too-high cells, every CI-gate example sentence, the Formulas perimeter check (shelter 25, old anchor 60, the 2–4 band), the bootstrap sub-ranges, and every Edge Case 17 boundary at equality — all PASS. Harvesting's lowEndPartyHaul 165 / mixedHaulTimberPerSessionLow 58 / High 138 verified by name at harvesting-system.md:278-280.
What failed is a graph-semantics defect pinned in prose and cross-referenced from three places, not arithmetic.
Completeness: 8/8 · Dependency Graph: unchanged, all on disk
Closure table (main review)
| Cell | Arithmetic | Result |
|---|---|---|
wallCost 3 / 4 at 58 and 138 | 3,2 / 4,2 | PASS |
wallCost too-low 2 | 100/138 → 1; 100/58 → 2 | PASS |
wallCost too-high 5; CS-9 corner 6 | 250/58 → 5; 300/58 → 6 | PASS |
perimeterSegments 35 / 58 | 3,2 / 4,2 | PASS |
floor 4s > 138 → 35; ceiling 4s ≤ 232 → 58 | exact | PASS |
| too-low 34; too-high 59; "15–29 at slow end" | 1; 5; 58 < 4s ≤ 116 | PASS |
| Formulas: 200 timber 2–4; shelter 25 → 1; anchor 60 → 5 | exact | PASS |
| bootstrap 48/165 ≈ 0.29; +50% corner 0.436 | exact | PASS |
| workbench ±50% 0.242–0.339; chest 4–12 0.267–0.315 | in band | PASS |
EC17 reach < 2g ⇔ ⌊reach/g⌋ ≤ 1; AC-64b 0.5/1.0/1.99/2.0 | holds ∀ g > 0 | PASS (row since retired) |
| Reason-string order vs F1 conjunct order | identical | PASS |
Required — applied (CS-18)
- BFS traversal domain [main review; systems-designer; qa-lead; CD — user decision]. Edge Case 21 defined the correction as a FIFO BFS "over cells that are buildable terrain with no structure footprint" (clear-cells-only). CS-11's pinned AC-14c hop-2 case blocked all four hop-1 neighbours and asserted
(1,1)— unreachable under that rule; reachable only under expand-through-blocked traversal, which the game-designer and CD both rejected (a 6-hop pop through solid walls guts Edge Case 22's social rescue and "collision is the wall's entire function"). The main review took the CD's ruling one step further: under clear-cells-only with one predicate for traversal and acceptance, every clear hop-1 cell is returned before it is expanded from, so no search depth beyond one hop is reachable — the CD's own replacement rationale for the ≥2-hop bound ("a clear cell two hops away through a clear intermediary") contradicts itself, since a clear intermediary is a clear hop-1 neighbour. The hop bound, Edge Case 17's ratio row, AC-64b, and pin (i)'s⌊placementReach / gridCellSize⌋conversion were dead machinery. User decision: ring check. Edge Case 21 now specifies the four orthogonal neighbours in N, E, S, W order with a binding ~10-lineFindCorrectionCellreference block (user decision: pseudocode adopted); "enclosed" is a ring fact; the check reads no player positions (stated). Edge Case 17's row deleted with a retirement note; AC-64b retired as a stub; AC-14c rewritten (three constructible cases: order, none-with-a-falsified-implementation, out-of-region never returned); the Visual/Audio tell is "always exactly one cell";gridCellSizeis OQ6's snap constant only — no BB load-time relation toplacementReachexists.
Recommended — applied
- AC-14e [qa-lead]: pin (iii)'s fresh-check-at-current-cell now has an exercising test (W1→A moves P to B; W2→B via the stale read; check runs at B against W1+W2) plus an idempotent companion.
- AC-14b fixture constraints [qa-lead]:
gridCellSize≤ 3 u at reach 6, region ≥ 3 cells along the bearing — elsewithinReach/withinBoundsflip alongsideplacerHasExit. Teleport()claim [network-programmer, downgraded from BLOCKING by CD]: the requirement stands, the mechanism is now an ⚑ ADR input (does a one-cell discrete write surviveNetworkTransformsnap thresholds as interpolated; what does an observer see). "≤ N-cell nudge" → one-cell. Guardrail added: the owner rail stays the only writer of a player's transform.- F1
noPlayerOccupancyCS-13 text [network-programmer]: "liveTransformthe host owns — one value, no delayed copy"; the ADR unknown split into commit execution phase vs movement write phase (F1 row + ⚑ list). perimeterSegmentsrow [systems-designer]: reciprocal "Marginal only —wallCostat its default (4)".placementReach↔gridCellSizecross-reference andgridCellSize ≤ 0row [main; systems-designer]: moot — the relation no longer exists.
Nice — applied
EC23 CS-16 sentence scoped to the outside placer (inside still "no way out") [main; qa-lead]; "passes 4 sessions" → "exceeds" in both too-high cells [systems-designer]; AC-14d other-seven-conjuncts clause [qa-lead]; EC22 CS-14 "no placer exclusion" justified by Rule 5's zero-prediction ghost [network-programmer]; tier ladder labelled reviewer taxonomy [game-designer]; wallCost row annotated gate-derived (CD rejected demoting it) [game-designer]; AC-46 "does not assert the spatial fit check" [game-designer, downgraded]; EC17 "every displaced player" — moot with the row.
Rejected / downgraded
- network-programmer BLOCKING 1+2 (cross-
NetworkObjectreplication ordering) → rejected [main review; CD]. If W2 replicates before W1's correction runs, P is still at A and under nothing; W1's fresh check then sees W2 in the live registry and skips B. No ordering assumption is load-bearing; the only residual is the already-accepted stale-read race. - game-designer BLOCKING 3 (sealed-room "shape cap" on collective authorship) → rejected on merit [main review; CD]:
placerHasExitpolices the placer's own cell only; friends can enclose any room nobody stands in. The enforcement ask (make the authoring constraint checkable) is deferred to the home-island authoring pass — CS-16 qualified a pre-existing constraint, it did not create one. - game-designer BLOCKING 5 (fit check has no gate line item) → downgraded to the AC-46 line; the rest is CS-6-era and out of scope.
- game-designer 2 (demote
wallCostfrom the knob table) → not accepted; annotated instead.
Disagreements adjudicated
| Dispute | Ruling |
|---|---|
| BFS reading: game-designer ("text already pins clear-cells-only; correct design") vs systems/qa/main ("AC-14c only passes under expand-through-blocked") | Both right on their half. Clear-cells-only is the design; AC-14c was unreachable under it. The game-designer never walked the AC. |
| CD's ≥2-hop replacement rationale vs main review | Main review: under clear-cells-only depth > 1 is unreachable; the bound is retired, not re-justified. User decided. |
| Replication ordering | Main review. |
Teleport() assertion | Wording → ADR input. |
| EC23 shape cap | Main review (misread of placerHasExit's subject). |
Process finding [creative-director; main review]
The closure step closed the numeric class — keep it as a standing checklist item; do not build a number generator. The defect migrated to algorithmic semantics: CS-11 pinned coordinates to disambiguate a tie-break without checking whether the traversal rule admitted the configuration, and the CD's own corrective rationale then failed the same reachability walk. Root cause: a pinned GIVEN is a reachability claim against a rule stated elsewhere, and nobody was required to execute it. Two closures: (1) algorithmic rules carry a reference implementation in the GDD (done for Edge Case 21); (2) .claude/skills/design-review/SKILL.md gains the bullet "execute every pinned GIVEN against the governing rule or its reference block before accepting it."
Sixth re-review scope
None. CD gates the revision inline; the mechanism change (BFS → ring check) is the CD's stated condition-1 case and was decided by the user with the CD's reasoning in hand. Next: /consistency-check design/gdd/base-building.md (peer docs cite Edge Case 21's search only by name; the player-movement quick-spec's Rule 6 wording still matches).
Scope Signal
Revision: S. System: M (unchanged).
Files changed
design/gdd/base-building.md, design/gdd/systems-index.md, .claude/skills/design-review/SKILL.md, production/session-state/active.md, this file.