Gate Check: Technical Setup → Pre-Production
Date: 2026-09-02
Checked by: gate-check skill
Review mode: full (all four directors spawned)
Verdict: CONCERNS — advanced by user decision with concerns acknowledged (stage.txt→ Pre-Production, 2026-09-02)
Director panel: CD CONCERNS · TD CONCERNS · PR CONCERNS · AD CONCERNS — no NOT READY
Chain-of-Verification: 5 questions checked (3 tool actions) — verdict unchanged
Required Artifacts: 12/13 present
- [x] Engine chosen — Unity 6.3 LTS (6000.3) in
CLAUDE.md; not[CHOOSE] - [x]
.claude/docs/technical-preferences.md— populated: naming conventions, performance budgets, forbidden patterns, engine specialists - [x]
design/art/art-bible.md— all 9 sections; AD-ART-BIBLE sign-off: APPROVED 2026-08-25 - [x] ≥3 Foundation-layer ADRs — 10 ADRs, all status
Accepted(0001–0007, 0013, 0014, 0015) - [x]
docs/engine-reference/unity/— VERSION, breaking-changes, deprecated-apis, current-best-practices, 8 module refs, plugins - [x]
tests/unit/andtests/integration/— directories exist - [x]
.github/workflows/tests.yml— game-ciunity-test-runner@v4, editmode + playmode jobs - [x] ✅ At least one example test file — CLEARED 2026-09-02, same day (commit
25b411e):UnityProject/Assets/Driftlands/Tests/EditMode/TideMathTests.cs, 14/14 passing on 6000.3.18f1. Mutation-checked (naiveFloorDivturned 3 red, green on restore), so the suite demonstrably can go red.ProjectVersion.txtnow corroborates the CI pin instead of the pin guessing, andpackages-lock.jsonis committed. - [x]
docs/architecture/architecture.md— present - [x] Architecture traceability index —
traceability-index.md(see note) - [x]
/architecture-reviewhas been run — two reports: 2026-08-28, 2026-09-01 - [x]
design/accessibility-requirements.md— committed tier: Standard (+ 4 Comprehensive features pulled in) - [x]
design/ux/interaction-patterns.md— v0.19
Filename note (not a gap): the checklist names docs/architecture/requirements-traceability.md. The /architecture-review skill writes that filename only in rtm mode, which requires stories and test files that do not exist yet (skill line 26). traceability-index.md is the correct artifact for this stage and carries the full matrix. Satisfied in substance.
Quality Checks: 9/9 passing
- [x] Architecture covers rendering (ADR-0013), input (ADR-0007), state management (ADR-0002/0004)
- [x] Naming conventions + performance budgets set in technical-preferences
- [x] Accessibility tier defined and documented — Standard
- [x] At least one screen's UX spec started — 7 APPROVED specs, far exceeding the bar
- [x] All 10 ADRs have an Engine Compatibility section with the engine version stamped
- [x] All 10 ADRs have a GDD Requirements Addressed section
- [x] All 10 ADRs have an ADR Dependencies section
- [x] No deprecated-API references — every occurrence is in "don't use" / "renamed to" context; ADR-0014 correctly targets
AccessibilityNode.invoked(the 6.3 replacement), not the deprecated.selected - [x] All four 6.3 HIGH-risk domains explicitly addressed — URP Compatibility Mode removed (ADR-0013), NGO 1.x deprecated (5 ADRs), strict USS (2 ADRs),
SerializeFieldfields-only (5 ADRs) - [x] Foundation layer: 0 traceability gaps (Presentation is gap-free too)
ADR circular dependency check: PASS. No cycles. ADR-0013 → 0001/0003/0005; ADR-0014 → 0003/0004/0006/0007 — all targets Accepted. The 2026-08-28 declared cycle (C3) was resolved by relabelling.
Director Panel Assessment
Creative Director: CONCERNS Vision is coherent and unusually well-guarded — the five pillars have visibly won arguments (skill-drift cut, party-clock invariant retired, tint pulled into MVP), and the anti-pillars are mechanized as Forbidden Patterns. The anchor promise is enforced by the type system, not discipline: tide AC-27 means the HUD only ever receives TintFloats, so a countdown is impossible by API. Four conditions raised — see Concerns 1–4 below.
Technical Director: CONCERNS Explicitly rejects conflating the two missing artifacts: "The missing Unity project is correct, not a defect" — creating it earlier would have produced a manifest.json of guessed versions that the ADRs then treat as ground truth. The missing test file is a real but narrow gate failure. Notes the CI workflow is an honest declared placeholder (its own header says it fails until tests exist) — the correct failure mode, loud not silent. Verification culture is working: E14/E15 caught a silent no-op and the test that would have passed on it.
Producer: CONCERNS Design/architecture substrate genuinely ready to plan against; the production apparatus is not, which is expected. Flags one pattern: the friend playtest + Steam transport choice has been open six days past its week-1 deadline while 44 commits of other work flowed around it, and it carries an unpriced 1–2 day transport integration prerequisite that appears on no task list.
Art Director: CONCERNS Art bible is genuinely production-ready; all three ADR-0013 corrections landed correctly and would lead an artist to do the right thing today. Atlas strategy is consistent between art bible §8.A.5 and ADR-0005 (numbers agree exactly). Gap is entirely "artifact doesn't exist yet" — no entity inventory, no per-asset specs, no pal_home_master.aseprite.
Blocker — ✅ CLEARED SAME DAY (2026-09-02, commit 25b411e)
The single blocker below was resolved hours after this gate ran, in the way the
verdict predicted: it was the phase's own first task.UnityProject/now exists
withDriftlands.Tide(noEngineReferences: true, per ADR-0003) and a 14/14
EditMode suite covering tide F0–F2. Both aggravating factors are also closed —ProjectVersion.txtconfirms 6000.3.18f1 (the guessed6000.3.0f1pin was not
just unverified, it was wrong, and would have failed on Docker image resolution),
andpackages-lock.jsonpins the package set. **A re-run of this gate would now
return PASS on artifacts.** The original finding is preserved below as the record.
1. No example test file exists. tests/ holds seven READMEs and nothing else, and there is no Unity project (Assets/, Packages/manifest.json, ProjectSettings/ all absent) to host one. The gate requires this explicitly.
Two aggravating factors found during the check:
unityVersion: 6000.3.0f1in the CI workflow is a guessed patch version. NoProjectSettings/ProjectVersion.txtexists to corroborate it. If that patch was never published, the first CI run fails on image resolution and will be misread as a licence or test problem.- Every package version across the ADRs is aspirational and unpinned (NGO 2.13.2, Input System 1.20, Addressables 2.x, Shader Graph 17.x). Individually minor; collectively the largest source of "the ADR says X, the project does Y" drift. Flagged as E11 on 2026-08-28, still open.
Concerns (carried into Pre-Production)
- The MVP tint shape may not carry the harvesting fantasy — and no document says so. Verified:
arrivalWindowFrac = 0.15+driftOutWindowFrac = 0.25leave ~60 % of every docking tint-neutral, with visible violet only ~4.4 h of a 44 h window. Butharvesting-system.md's anchor fantasy is "a violet-lit vein deep inland" and Rule 11 requires distance-from-shore and tide-colour to read "as one glance." The two-lobe shape is probably right (a constantly-tinted world signals nothing); the risk is a playtest misread — a group playing mid-docking reports "the tide isn't legible" and the team pulls the wrong lever (add UI, break the anchor). Action: state ingame-concept.md's MVP Definition that the anchor test is only meaningful when the session overlaps a tint lobe. - D3 (sink saturation) is accepted but not designed. Every MVP sink is one-time; the faucet recurs forever. By session 3–4 fiber and timber are worthless. The hypothesis window is scoped to ≤4 sessions — but a friend group will play a fifth session, and that is exactly when the economy is flat. Action: decide explicitly — hold the ≤4-session hypothesis and brief the group in advance, or scope one cheap recurring sink into the slice.
- Pillar 3 ("Made by Our Hands") is structurally unvalidatable at MVP. Cloth-only MVP cannot violate it because nothing exists to violate. A successful playtest is therefore not evidence the pillar lands. Documented in three separate honesty clauses but nowhere gate-facing. Action: restate as a gate condition — MVP success ≠ Pillar 3 confirmation.
- Tritanopia gap on the anchor's primary channel. Amber and violet both desaturate toward grey; the MVP backup (glint position + physical presence) is thin. a11y OQ 2 and OQ 3 are the same question and cost one message. Action: ask the friend group now.
- Playtest + Steam transport undated, 6 days past deadline, with an unpriced 1–2 day integration spike as a hidden prerequisite. The prototype ran UnityTransport on localhost with simulated latency — its own report says "the Steam transport + real-network session is still pending." Highest-priority item; longest lead time; gates 11 of the 12 open TRs.
- Gate 0 has eroded from blocking to advisory without a decision.
game-concept.mdline 375 declares the netcode spike blocking ("no art, no crafting, no world systems until this passes"); 7 UX specs and 2 Presentation ADRs have been authored past it. Those were correctly sequenced as netcode-independent work — but the document and the behaviour now disagree. Action: re-affirm or formally amend. - ADR-0015 registers no per-frame ms budget. Registered budgets sum to 1.5 ms of 16.6 — combat, plausibly the largest per-frame consumer, is a hole in an otherwise disciplined registry. A slice that hits 60 fps tells you nothing about headroom if the biggest consumer was never budgeted.
- No entity inventory / per-asset specs / master palette file.
design/assets/entity-inventory.mdabsent;pal_home_master.aseprite(art bible §8.A.4's single source of truth for every DriftLayer palette) does not exist. Without these, artists improvise names and the naming convention is theoretical. - Base-building AC count (83) is disproportionate to its MVP role — six review rounds for "walls, workbench, storage." Derive a reduced MVP subset before story breakdown.
- No velocity data exists. All sprint-1 estimates are hypotheses; re-baseline the "2–3 month" MVP figure at the sprint-1 retro, not before.
production/risk-register/still absent and Inventory & Hauling micro-spike not done — both ordered at the previous gate.modules/rendering.mdandui.mdlack DEPRECATED banners;rendering.mdline 65 still shows the pre-Render-GraphAddRenderPasses(ScriptableRenderer, ref RenderingData)signature.
Fixed during this gate check
Five items surfaced by the panel were verified and corrected in-session:
| Item | Source | Fix |
|---|---|---|
ADR-0013 + ADR-0014 both still said "This ADR is Proposed … NOT YET APPLIED" while their headers read Accepted and the amendments had in fact landed | AD | Both blocks retitled "Applied on Acceptance — ✅ ALL APPLIED 2026-09-01" and reframed as historical record |
QQ-10 still open in architecture.md despite ADR-0013's live verification resolving it (QQ-06/07/08/09/11/12 all had proper strikethrough treatment) | TD | Closed with the E14 finding recorded — the verification changed the design |
| art bible §4.5 crimson note left "Art-director to confirm at the next pass" | CD ruling | AD confirmed 2026-09-02 — the HUD wins, no low-HP alarm ships |
systems-index.md duplicate row 15 (flagged at three consecutive reviews; had begun propagating into a11y doc prose) | CD/TD | Renumbered 15–22, now unique and sequential; ADR-0013's "row 15 = Tide-Tint Polish" still resolves |
| a11y doc cited the row-15 defect in a live requirement | — | Updated to reference the fix |
Verification spike order (TD, by blast radius)
P0 — before any feature code
- ADR-0013 V1 — a
Scope = Globalblackboard property receivesShader.SetGlobaland is absent from the material property block (FindPropertyIndex(...) == -1, not*HideInInspector). The ADR has already been wrong here once. - ADR-0001 V1+V2 —
noEngineReferences: trueasmdef compiles on 6000.3; 0-alloc verified in the Unity Editor profile (the claim was measured on dotnet 10, not Mono). - Project creation +
packages-lock.jsonpinned + one green EditMode test in CI — retires the6000.3.0f1guess and the package-drift risk simultaneously.
P1 — before the systems they gate
- ADR-0002 V1–V2 (player-loop stage probe; note MPPM 2.0.x is not a valid automated-test vehicle on 6.3)
- ADR-0014 V1 (
PanelSettings.scalelive re-layout — the HUD panel has no natural reopen moment, so the primary fallback does not apply to it) - ADR-0004 V1–V2 (JSON library;
File.Replaceatomicity per OS) - ADR-0001 V3 (byte-identical fixture on an IL2CPP standalone build, not two Mono editors)
P2 — ADR-0014 V2 (USS lint), ADR-0007 V1–V4, ADR-0005 Addressables/Awaitable interop, ADR-0014 V3 (accessibility compile).
What would make a vertical slice misleading (TD)
- Measuring on Mono only — determinism and 0-alloc are Editor-measured claims about an IL2CPP shipping target.
- Draw-call checks reported as totals — both ADR-0013 V4 and ADR-0014 V7 already mandate marginal delta; a total under 100 "passes trivially when the total is 40."
- A single-socket slice generalising to
N > 1— confirm themaxSocketsSupported = 1boot-failing guard ships with the MVP story, or the cliff is discovered at Tier 1. - Combat unbudgeted — see Concern 7.
Recommended first three actions (PR)
- Pick the Steam transport package and put the friend playtest on a real calendar date — today. Book the 1–2 day transport integration spike before that date. Longest lead time, six days overdue, gates 11 of 12 open TRs, and friend availability is the one variable not under your control.
- Scaffold the Unity project (
Assets/,Packages/manifest.json,ProjectSettings/) and land one real passing test — port the tide scheduler contract test from the existing 9/9 spike. Turns a red-by-design CI green and clears the gate's one blocker. /create-epicsscoped to Foundation + Presentation only (explicitly excluding anything routing through ADR-0008–0012), then/sprint-plan. In the same session writeproduction/risk-register/.
Highest-risk sequencing mistake to avoid: writing epics and stories for the whole MVP before the playtest and before a Steam transport package is chosen. Stories touching ADR-0008–0012 would be rewritten.
Verdict: CONCERNS
Not PASS: one required artifact is genuinely absent — no example test file has ever proven the CI pipeline works, and the Unity version it pins is a guess. All four directors returned CONCERNS, which per the gate rules caps the verdict at CONCERNS regardless.
Not FAIL: no director returned NOT READY. Foundation and Presentation layers are traceability-gap-free, all 10 ADRs are Accepted with no dependency cycles, no deprecated-API usage, and all four 6.3 HIGH-risk domains are addressed. The missing Unity project is correct for this gate — Pre-Production is where it gets created, and creating it earlier would have baked guessed versions into the ADRs. The blocker is narrow and is itself the natural first task of the phase being entered.
The gate's own escape hatch applies: this checklist requires an example test file, but the only sane place to author one is inside a Unity project that this phase exists to create. Holding the phase closed until a test exists would deadlock the project against its own gate. The honest reading is: enter Pre-Production, and make project-creation-plus-one-green-test the first story rather than a later one.
We will know this gate was called correctly if: the playtest is dated within one week; project scaffold + one green CI test lands as story #1; the P0 spikes run before feature work; and sprint 1 closes with Foundation stories done and no rework caused by an undecided ADR.
Chain-of-Verification
Five challenge questions, three answered with tool actions:
- Did I mark any MANUAL CHECK item as passing without confirmation? — No. The one blocker is file-system verifiable and was verified.
- [TOOL ACTION] Is
tests/really empty of test files, or did my glob miss a pattern? — Re-ranfind tests -type f: seven files, all.md. Confirmed. - [TOOL ACTION] Are the director findings real or plausible-sounding? — Spot-checked four independently: the stale "Proposed" blocks (found in both ADRs, not just 0013), QQ-10 still open, the guessed
unityVersionwith noProjectVersion.txt, and the two-lobe fractions (0.15/0.25) against harvesting's "one glance" Rule 11. All four confirmed; all corrected or recorded. - [TOOL ACTION] Does the missing
requirements-traceability.mdconstitute a real gap? — Read the architecture-review skill: that filename isrtm-mode-only and requires stories/tests that do not exist. Not a gap. - Do the concerns together create a blocking problem even if each is minor alone? — No, but concerns 1, 2 and 5 compound: the slice tests the half of the fantasy the group did not name as their motivation, on a ≤4-session window, with an economy that flattens at session 3–4, before a playtest that is still undated. That compound is the single most valuable output of this gate and is recorded as such.
Verdict unchanged: CONCERNS.