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-system.mdEdge Case 2 + AC-41: "the Downed body persists host-side — the bleed-out timer keeps running, allies can still revive it… on reconnect the player resumes that entity in whatever state it is in."netcode-session-2026-08-27.mdRule 5 + AC-3: "their character despawns (no offline bodies — nothing simulates for the absent)… a rejoin after disconnect is simply a late join — no separate reconnect path exists."
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
inventory-hauling-2026-08-26.mdRule 2:ItemStack = (itemId, count).crafting-system.mdRule 4: gear instance identity rides the stack as an opaqueinstanceTag("⚑ proposed additive extension to Inventory's contract — flagged for its quick-spec"); AC-37 asserts the mark survives CARRY→STORAGE→CARRY and save/load.save-persistence-2026-08-26.mdRule 5 already assumes tags exist ("tag-without-row → mystery gear").- Crafting OQ4 ("
instanceTagadditive extension — Inventory quick-spec sign-off") is still open; the Inventory quick-spec was never updated.
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
harvesting-system.mdPlayer Fantasy: "No safe, no-deadline resource tap may ever exist — every harvestable sits inside a docking window."- Same doc, Rule 11 / AC-25: home-island nodes exist, "minor / shore-tier only."
- F4's
HarvestDiffkey is(epochIndex, socket, cycleIndex, nodeId)— a home node has no socket or cycleIndex, so its depletion either can't persist (an infinite regrowing tap) or can't be stored at all. crafting-system.md("a first-session friend gears up from the beach") andbase-building.md(bootstrap order "dock → harvest shore+mid") are ambiguous about whether the beach is home or the docked land.
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
- BB ↔ Harvesting: BB's CI gates (AC-45/46) bind by name to harvesting's exported constants (
lowEndPartyHaul,mixedHaulTimberPerSessionLow/High); harvesting names BB as "known consumer" in prose — but neither system's Dependencies table lists the other. - Tide downstream table omits Crafting (
craftedAtCycleconsumer; crafting lists Tide as soft upstream) and Base Building (socket positions /depositPoint; BB lists Tide as soft upstream). - BB ↔ Player Movement: movement Rule 4 cites BB AC-27 and Rule 6 registers BB Edge Case 21's snap event; BB's Dependencies tables have no Player Movement row.
⚠️ W6 — Stale references and status annotations (30-second edits)
game-concept.mdline 167: "Investment: the base, the gear you personally forged, your drifted skills" — skill-drift was cut 2026-08-25.combat-system.mdDependencies: "Player Movement quick-spec not yet written", "Crafting & Gear GDD pending", Netcode/UI "pending" — all exist. Combat OQ2 (dash/knockback at water edges) is answered by movement Rule 4 ("collision blocks, never damages; water is a hard edge") and can close.harvesting-system.mdDependencies: LDU "Quick-spec not yet written"; OQ5 (how carcass nodes spawn) is answered by LDU Rule 2 + Enemy AI Rule 10.tide-scheduler.mdDependencies: "none of the dependent GDDs exist yet."inventory-hauling-2026-08-26.mdknob row:maxStack"Placeholder until Crafting locks per-item values" (locked 2026-08-26, registry entry superseded); Rule 1 "a host-authoritative shared container" (singular — BB now instantiates unbounded chests, each aSharedStorage).crafting-system.mdF1 still callsstationPresent(tier); BB F3 split it intostationPresentExact/stationPresentAtLeastand requires each caller to name which.entities.yaml: rusher / spacer / bulwarkreferenced_bylack the Enemy AI quick-spec;cloth_garb_reinforcedhas no hooks line (see D1).
⚠️ 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
- UI/HUD Rule 1's closed HUD list omits combat's host-confirmed damage numbers and harvesting's yield flyouts (each claims to be "the only numeric feedback") — clarify they are world-space, not screen-space HUD.
- The "equipped-tool/hotbar" HUD slot has nothing to hold at MVP (2 equipment slots, zero consumables, zero tools).
- Crafting Rule 3(b) needs a material→source-template mapping in data; no document names its owner.
- Harvesting Edge Case 6 calls its last-tick rule "deliberately inverted from combat Rule 13"; both docs actually agree (resolve
< φ+W, discard≥ φ+W) — the phrasing overstates the difference.
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
- Combat F1 draws
weaponBaseDamagefrom "the equipped weapon"; the only defined value is the cloth sword's 28. No unarmed damage (or explicit "unarmed does 0") exists. - Crafting: "no starting-inventory or pre-placed-structure system exists anywhere."
- The sword needs a workbench (BB); the workbench needs 10 timber; timber is mid-band-heavy (harvesting Rule 11: "Shore: fiber-heavy · Mid: timber-heavy"); Enemy AI Rule 9 puts 1–2 guards on every mid approach (
guardDensityByBandmid = 1–2). - Harvesting F1 mentions a "top-tier-to-bare-hands ratio," implying unarmed harvesting exists.
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
- Attention budget: ≈ 4 concurrent active systems during a deep push (combat, harvest swing, bag/bank decision, tide read + voice) — within the 3–4 comfort limit.
- Pillar alignment: every system maps to a pillar; no anti-pillar violations found. BB's
placerHasExitPillar 5 cost is CD-ruled and recorded. - Player fantasy coherence: one identity (scrappy hauler-maker in a friend group) seen from five angles — no conflicts.
- Dominant-strategy watch items (dash-through, chest-carpeting) are already owned by combat OQ8 / BB OQ11.
Cross-System Scenario Issues
Scenarios walked: 6
- Fresh-world session one (bootstrap chain)
- Strike near a node with a Rusher closing
- Disconnect while Downed on a docked land, rejoin 30 s later
φ+Wwith a Downed player, an enemy mid-windup, and a last-tick harvest- Wall placement racing a craft draw and a chest demolish
- Reload mid-docking
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.
- Harvesting Rule 6: client sends
(nodeId, swingId)at windup start. Combat Rule 7: client sends(aimDirection, swingId). - Harvesting Rule 2: "if a swing's test window contains both a live hostile and a node, the hit applies to the hostile" — the test window is the host's resolution instant — yet Rule 6's host resolution runs three gates (
Docked,swingsRemaining,CanAdd) with no hostile check. - Harvesting Rule 2 (H4): the windup tell "must visibly commit to its referent — node or enemy — before Active begins" (i.e. at intent time).
- Harvesting and Combat deliberately own separate windup/active constants (harvesting Rule 1).
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
- ℹ️ Wall placement racing a craft draw / chest demolish — fully covered by BB Edge Cases 1–6 and crafting Edge Case 2; the single-ordered-host-channel assumption is correctly flagged to the ADR by BB Edge Case 1.
- ℹ️ Reload mid-docking — enemies re-derive (Enemy AI Rule 7, accepted), harvest diffs persist, position on a still-docked land is unchanged; consistent across Save / LDU / Harvesting / Enemy AI.
GDDs Flagged for Revision
| GDD | Reason | Type | Priority |
|---|---|---|---|
| combat-system.md | C1 (Downed disconnect vs netcode); D2 (no unarmed strike); Rule 13 vs EC8 at home; W2 durability events; W4 moveSpeed; W6 stale status | Consistency + Design | Blocking |
| netcode-session-2026-08-27.md | C1 (despawn rule + rejoin HP); W7 carve-out; W8 wording | Consistency | Blocking |
| crafting-system.md | D1 (reinforced DR undefined); C2 tag contract; W6 stationPresent naming | Design + Consistency | Blocking |
| inventory-hauling-2026-08-26.md | C2 (instanceTag in stack contract); W6 maxStack / singular container | Consistency | Blocking |
| land-dock-undock-2026-08-27.md | C3 (party-clock gate cannot pass); W1 teardownGrace | Consistency | Blocking |
| harvesting-system.md | C3 (C1 "protected by the clock" claim); scenario 2 disambiguation timing; W3 home nodes; W2 / W5 / W6 | Consistency + Design | Blocking |
| player-movement-2026-08-27.md | W4 moveSpeed (registry dedupe) | Consistency | Warning |
| base-building.md | W5 dependency rows (Harvesting, Player Movement) | Consistency | Warning |
| tide-scheduler.md | W5 downstream table (Crafting, BB); W6 stale sentence | Consistency | Warning |
| game-concept.md | W6 "your drifted skills" | Consistency | Warning |
| enemy-ai-2026-08-27.md | D2 (mid-band guard floor vs bootstrap) — the decision may land here | Design | Warning |
| design/registry/entities.yaml | Duplicate move_speed; entity referenced_by; reinforced hooks | Consistency | Warning |
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
- Combat + Netcode: rule on Downed-disconnect (persist vs despawn) and rejoin HP; update combat EC2/AC-41 or netcode Rule 5/AC-3 to match. Add the "presence ≠ count" carve-out to netcode Rule 3.
- Inventory: add the opaque
instanceTagto theItemStackcontract (closes crafting OQ4). - LDU + Harvesting: replace
Win the party-clock gate with a session-length term; restate harvesting's C1 party-scale claim honestly. - Crafting: define Reinforced Garb's
DamageReduction(per-item override on F2); register it; re-run combat's TTD check. - Combat (+ Harvesting / LDU / Enemy AI as needed): define an unarmed strike, or guarantee a guard-free timber path for the first workbench.
- Harvesting: state when enemy-vs-node disambiguation is evaluated (intent or resolution) and what intent shape a strike sends; combat mirrors it.
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 |
|---|---|---|
| C1 | Despawn; 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 |
| C2 | ItemStack = (itemId, count, instanceTag?) — opaque, never interpreted, tagged stacks never merge. | inventory Rule 2 + new AC; crafting Rule 4 / Interactions / Dependencies / OQ4 resolved |
| C3 | Party-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 |
| D1 | Reinforced 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 |
| D2 | Unarmed 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 |
| Strike | Referent 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).