Harvesting & Resource Nodes GDD — Independent Design Review
Date: 2026-08-26
Target:design/gdd/harvesting-system.md(post CD-GDD-ALIGN fixes)
Method: Three independent parallel reviewers — math/systems verification,
design-experience (explicitly told not to redo the pillar audit), structure &
cross-document consistency — synthesized by the session lead. Note: unlike the
combat review, the authoring and review-orchestration happened in the same
session; independence rests on the reviewers being fresh subagents with
file-only context. All numbers recomputed; 32 citations verified.
Verdict: NEEDS REVISION — all findings applied same day (this file
records them). Panel: math NEEDS REVISION · design NEEDS REVISION ·
consistency APPROVED WITH CONDITIONS.
Reviewer-error disclosure
The design reviewer's headline finding ("inventory-at-soft-close undefined — the fantasy has no teeth") was factually wrong: tide Rule 9 / AC-23 rules that a caught player is deposited home with carried inventory untouched. Cause: the reviewer's context list omitted the tide GDD (orchestration prompt gap). The residual fix is real and applied: harvesting now restates the deposit rule locally and names the sprint as texture, not a loss gate.
What held up
Diff schema identical across 4 sections; AC-10/11/17/27 and all F1–F3 worked examples recompute exactly; 27 of 32 cross-doc citations verified (tide H1, EC2/10/13/14, AC-22/30/31, Rule 9; combat EC1/3/15/17, Rule 3/13, F5 tiebreak, Hurt rule, peer note; art bible §1/§5.2/§5.4/§6.2/§9; bag constants); edge-case/AC numbering clean; structure compliant.
Findings and applied resolutions
CRITICAL / HIGH
- **C1 — Supply ratio misstated: 438/200 = 2.19, not "≥ 2.2", pinned into CI-gating AC-28. Trips and ratio were conflated. Applied**: ratio stated as 2.19 everywhere; trip count stated as ⌈2.19⌉ = 3 full trips; AC-28 corrected.
- **C2 — "Over 60% unharvested" only holds at the low end of its own 15–25 node range (63% at 15 nodes, 37% at 25). Applied**: both endpoints worked; strengthened with the honest stronger claim — even two full bags (400) cannot strip the 438-unit supply in one trip.
- C3 — Joint knob constraints not encoded (0.08+0.08 < 0.18 guard inside individual "safe" ranges — the exact trap the combat review fixed; monotonic-band rule had no load-time guard; "hard ceiling 2.0" was claimed but unenforced; warnCeiling=2.0 collapses the warn band). Applied: pairwise annotations on both phase knobs (combat's pattern); new Edge Case 10b (non-monotonic bands → loud reject) + AC-33b; Edge Case 9 now enforces
> 2.0 → loud rejectwith warn band(warnCeiling, 2.0]; warnCeiling safe range narrowed to 1.2–1.8. - H4 — No anticipatory tell for node-vs-enemy windup commitment; the player commits blind to which referent resolves. Applied: Rule 2 + Visual/Audio now require the windup tell to visibly commit to its referent before Active — deterministic anticipation, not just resolution.
- H5 — Post-memorization decision collapse: pure-function content + 2–3 MVP templates = solved routes by ~session 4; "always deciding" overclaims. Applied: Player Fantasy honesty clause (the bet narrows to execution under a known plan; that is the design, not a failure); Enemy AI dependency row now names per-docking guard variation as the load-bearing live-variance mechanism; new OQ8 owns repeat-docking Discovery coverage and reconciles the concept's "recurring lands return possibly changed" promise (owner: Land Dock/Undock + Enemy AI).
- H6 — Stale systems index + no registry entries (incl.
harvestModifierWarnCeiling, binding on the unwritten Crafting GDD). Applied: index row → Designed/Reviewed, tracker 4-of-13; registry gains the harvesting constants and the three material items.
MEDIUM
- M1 — Soft-close deposit not restated locally (the residual of the reviewer error above). Applied: new Edge Case 5b restating tide Rule 9 — caught players deposit home, bag intact; cost is position and the unharvested land, never bag contents.
- M2 — Trips are bag-capped, not time-capped, at current numbers — the fantasy's clock-pressure trip is rare as tuned. Applied: trip-texture note added beside the supply check; framed as aspirational pending the deferred travel-time companion check; OQ4 extended to test fatigue over a full trip, not one node.
- M3 — No discard-verb ruling. Applied: Rule 7 now rules explicitly — no voluntary discard at MVP; bank it or leave the vein; the forced return trip is intended (Inventory owns any future discard verb).
- M4 — No-op confusion under-prioritized ("bag full" vs "Alex got there first" is a coordination signal, not polish). Applied: OQ6 target escalated to before the first friend-group playtest.
- M5 — Inventory Rule 6 mis-citation (Rule 3 is the delegation source). Applied: Core Rule 7 reworded.
- **M6 — "Sparse-diff convention" attributed to tide text that never names it. Applied**: rephrased as behavioral consistency, not citation.
- M7 — F3's pacing math silently assumes all-shore trips. Applied: scope stated; mid/deep nodes-per-stack (2) noted — mixed pushes fill faster.
LOW (applied)
Tiebreak fairness note on Rule 8; Minecraft permanence divergence added to reference anchors ("the world heals — nothing you mine stays mined"); rounding worked example at modifier 1.5 (the one load-bearing midpoint case: 3×1.5→5, 5×1.5→8); nodesPerLand band-ratio preservation note; F4 example row added.
Conditions carried forward
- Enemy AI quick-spec: per-docking guard variation is now a load-bearing interface (H5), alongside the existing density AC and fauna-no-drops rules.
- Land Dock/Undock quick-spec: owns the deferred travel-time companion check and the "recurring lands possibly changed" reconciliation (OQ8).
- Crafting GDD:
harvestModifierhard ceiling 2.0 (now registry-registered and load-enforced), tool values, item definitions. /ux-designbefore the first friend playtest: distinct presentation cues for the no-op flavors (M4/OQ6).- Netcode ADR: intent RPC/state validation,
swingsRemainingreplication.