Fix release for 1.1.1: the minimal path end to end, engine commands that run on Godot, Unity and Unreal, hook warnings you can see, and verdicts that say when they could not check. Details in CHANGELOG.md; upgrade steps in UPGRADING.md (v1.1.1 → v1.1.2). Fixes #67 Fixes #131 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WuJn2FdynEybfL5KC697nJ
21 KiB
Skill Test Spec: /gate-check
Skill Summary
/gate-check validates whether the project is ready to advance to the next
development phase. It resolves artifact existence with
.claude/scripts/artifact-check.sh, spot-reads the artifacts the verdict turns
on, runs the target gate's quality checks (loaded from one file under
.claude/skills/gate-check/references/), asks the user about unverifiable
items, runs a director panel whose existence is set by review_mode and whose
width is set by workflow, and produces a PASS / CONCERNS / NOT ASSESSED / FAIL
verdict. On PASS with user confirmation it writes the new stage to
project.stage in project.yaml and to the legacy production/stage.txt. It
governs all 6 phase transitions.
The resolved config block at the top of the skill decides the tier. With no
project.yaml, modes.rigor defaults to minimal, which resolves
workflow: minimal and review_mode: solo — so every fixture below pins the
keys it depends on.
Static Assertions (Structural)
Checked against the SKILL.md by /skill-test spec — no fixture needed.
- Has required frontmatter fields:
name,description,argument-hint,user-invocable,allowed-tools - Has ≥2 phase headings (numbered Phase N or ## sections)
- Contains verdict keywords: PASS, CONCERNS, NOT ASSESSED, FAIL
- Contains "May I" write-approval language for the stage update
- Has a next-step handoff at the end (Follow-Up Actions section)
Test Cases
Case 1: Happy Path — All Concept artifacts present, advancing to Systems Design
Fixture:
project.yamlsetsmodes.workflow: fullandmodes.review_mode: solodesign/gdd/game-concept.mdexists with real content: core loop, target audience, a pillars section, and a Visual Identity Anchor section holding a one-line visual rule and 2 supporting visual principles- No systems index and no art bible yet.
artifact-check.sh --phase conceptreports those catalog steps (required=true) as ABSENT, but neither is an item in the Concept → Systems Design gate file, and the loaded gate file decides what this gate requires - No
/design-reviewrecord for the concept
Input: /gate-check systems-design
Expected behavior:
- Skill loads only
.claude/skills/gate-check/references/gate-systems-design.md - Skill runs
bash .claude/scripts/artifact-check.sh --phase conceptto resolve existence, then spot-readsdesign/gdd/game-concept.mdto confirm it has real content (not a template skeleton) - Skill checks pillars, the Visual Identity Anchor, core loop and target audience
- Skill cannot find a review record, marks "Game concept has been reviewed"
[?] MANUAL CHECK NEEDEDand asks the user; the user confirms it was reviewed - Skill prints "Director Panel skipped — Solo mode. Gate verdict based on artifact and quality checks only."
- Skill outputs the Section 5 report, then the Chain-of-Verification line
- On PASS, skill asks "May I update
project.stageinproject.yamlto 'Systems Design' (and the legacyproduction/stage.txt)?" - After the user confirms, skill writes both, re-reads both and confirms they agree
Assertions:
- Existence is resolved via
artifact-check.sh --phase concept, not by opening files to see what exists - The ABSENT systems-index and art-bible catalog steps are not reported as blockers — the catalog's
required=flag is an observation; the gate file's checklist is what this gate requires design/gdd/game-concept.mdis spot-read for real content before it is marked[x]- Output includes a "Required Artifacts: [X/Y present]" section and a "Quality Checks: [X/Y passing]" section
- The unconfirmed review item is asked about, not assumed PASS
- Output includes a
### Verdict:line with one of PASS / NOT ASSESSED / CONCERNS / FAIL - Output includes
Chain-of-Verification: [N] questions checked — verdict [unchanged | revised from X to Y] - Skill asks before writing, and writes BOTH
project.yaml(project.stage) andproduction/stage.txtonly after confirmation - After writing, skill re-reads both files and reports any divergence instead of continuing
- The next-step recommendation is
/map-systems(no systems index exists yet), not/create-architecture - Variant: with
design/gdd/systems-index.mdalready written (the catalog orders/map-systemsin Concept), option [A] is/design-systemfor the first system in its design order instead
Case 2: Failure Path — Missing required artifacts for Concept → Systems Design
Fixture:
project.yamlsetsmodes.workflow: fulldesign/gdd/game-concept.mddoes NOT exist- No game pillars document exists
design/gdd/directory is empty or absent
Input: /gate-check systems-design
Expected behavior:
artifact-check.shreports the game-concept stepABSENT- Skill marks the required artifact missing (a blocker at
full) - Skill outputs FAIL verdict
- Skill lists the missing concept document under Blockers
- Skill recommends
/brainstormto create one - Skill does not create the missing file itself
Assertions:
- Verdict is FAIL (not PASS, CONCERNS or NOT ASSESSED) — FAIL is evaluated first in the precedence order
- Output explicitly names
design/gdd/game-concept.mdas missing - Output includes a "Blockers" section with at least 1 item
- Output recommends
/brainstormas the remediation action - Skill does NOT write
project.yamlorproduction/stage.txtwhen the verdict is FAIL - Skill does NOT create
design/gdd/game-concept.mdor any other missing artifact to manufacture a PASS
Case 3: No Argument — Auto-detect current stage
Fixture:
project.yamlsetsmodes.workflow: fulland has noproject:block;production/stage.txtcontainsConcept, so the config block reportsproject.stage: Concept (production/stage.txt)from the legacy mirror (with noproject.yamlat all the tier would resolve tominimal, whose gate target isdesign/game-brief.md, not the concept doc below)design/gdd/game-concept.mdexists with content- No systems index yet
Input: /gate-check (no argument)
Expected behavior:
- Skill takes the current stage from the resolved config block (legacy
production/stage.txtmirror) / project-stage-detect heuristics - Skill confirms with
AskUserQuestion: "Detected stage: Concept. Running gate for Concept → Systems Design transition. Is this correct?" with options[A] Yes — run this gate/[B] No — pick a different gate - On
[A], skill runs the Concept → Systems Design checks - Output header names the transition being validated
Assertions:
- Current stage comes from
production/stage.txt(via the resolved config block) or project-stage-detect heuristics - Skill confirms the detected transition with
AskUserQuestionbefore running checks — this step is never skipped when no argument is given - The full list of six gates is shown only if the user picks
[B] No — pick a different gate - Output header names both phases: "Gate Check: Concept → Systems Design"
Case 4: Edge Case — Manual check items: "I don't know" is not "not yet"
Fixture:
project.yamlsetsmodes.workflow: fullandmodes.review_mode: solo- All required artifacts for Concept → Systems Design are present, and every
other check passes:
design/gdd/game-concept.mdholds real content with a pillars section, a core loop, a target audience, and a Visual Identity Anchor with a one-line visual rule and 2 supporting principles - No review record exists (the "Game concept has been reviewed" check cannot be auto-verified)
Input: /gate-check systems-design
Expected behavior:
- Skill verifies all artifacts exist
- Skill reaches "Game concept has been reviewed (
/design-reviewverdict not MAJOR REVISION NEEDED)" - No review record → item marked
[?] MANUAL CHECK NEEDED - Skill asks the user whether the concept has been reviewed
Case 4a — the user answers "I don't know": the item stays unresolved, so the verdict is NOT ASSESSED, not PASS.
Case 4b — the user answers "Not yet": the check has an answer — the concept
was not reviewed — so it ran and failed. Nothing is unknown: the verdict is
CONCERNS or FAIL (FAIL and CONCERNS are evaluated before NOT ASSESSED), with
/design-review named as the fix.
Assertions:
- Items that cannot be auto-verified are marked
[?] MANUAL CHECK NEEDEDrather than assumed PASS - Skill uses a question to the user for at least one unverifiable quality item
- Skill does not mark unverifiable items as PASS by default
- 4a: a
MANUAL CHECK NEEDEDitem the user never resolved yields NOT ASSESSED (it outranks PASS), naming the item and why in the Blockers section - 4b: a "not yet" answer is a failed check, never an unknown — the verdict is CONCERNS or FAIL, not NOT ASSESSED and not PASS, and the output names
/design-review(the one exception is the Production gate's play questions, where "not yet" means nobody has played it — Case 8) - Skill does not write the stage on a NOT ASSESSED or FAIL verdict, nor on CONCERNS unless the user explicitly accepts the listed risks (Case 7)
Case 5: Director Gate — panel existence (review_mode) vs panel width (workflow)
Fixture (all sub-cases):
- All required artifacts for Concept → Systems Design are present
design/gdd/game-concept.mdexists- Review mode comes from
modes.review_modeinproject.yaml(legacy mirror:production/review-mode.txt) or an inline--reviewflag
Case 5a — full panel: modes.review_mode: full, modes.workflow: full
Input: /gate-check systems-design
Expected behavior:
- Skill takes
review_mode: fullandworkflow: fullfrom the resolved block - Skill spawns all 4 PHASE-GATE directors in parallel:
- CD-PHASE-GATE (creative-director)
- TD-PHASE-GATE (technical-director)
- PR-PHASE-GATE (producer)
- AD-PHASE-GATE (art-director)
- Director verdicts are READY / CONCERNS / NOT READY, or NOT ASSESSED when a gate input was missing; any CONCERNS → overall verdict at minimum CONCERNS; any NOT READY → overall verdict at minimum FAIL; any NOT ASSESSED (with no NOT READY or CONCERNS) → overall verdict at best NOT ASSESSED, naming the missing input
- All verdicts are collected before the Director Panel summary is printed
Assertions (5a):
- Skill reads the resolved
review_modebefore deciding whether the panel runs - All 4 PHASE-GATE directors are spawned (panel width comes from
workflow: full) - Directors are spawned in parallel (all
Agentcalls issued before any result is awaited) - A CONCERNS verdict from any one director propagates to at least CONCERNS overall
- A NOT READY verdict from any director makes the overall verdict at least FAIL — never auto-PASS
- A director's NOT ASSESSED is never counted as READY: with no NOT READY or CONCERNS alongside it, the overall verdict is NOT ASSESSED, and the Director Panel summary shows it for that director
Case 5b — solo mode: modes.review_mode: solo (or --review solo)
Expected behavior:
- Skill determines
solo - No director spawns
- Output states: "Director Panel skipped — Solo mode. Gate verdict based on artifact and quality checks only."
- Gate verdict is derived from artifact/quality checks only
Assertions (5b):
- No director gates are spawned in solo mode
- The skip is stated in the output ("Director Panel skipped — Solo mode"), not silent
- Verdict is based on artifact and quality checks only
- The narrowed/skipped panel alone does not make the verdict NOT ASSESSED
Case 5c — width follows workflow, not review_mode: modes.review_mode: full, modes.workflow: standard
Expected behavior:
- Panel runs (review mode is not
solo) at thestandardwidth:technical-director+produceronly - Output names the omission, e.g. "Panel: 2 of 4 (
workflow: standard). Creative and Art perspectives not consulted. Setmodes.workflow: fullfor the complete panel." —workflowis set on its own here, so raisingmodes.rigorwould not change it
Assertions (5c):
- Exactly TD-PHASE-GATE and PR-PHASE-GATE are spawned —
review_mode: fulldoes not widen the panel - Output names the perspectives that did not run and how to get them:
modes.workflow: full, the source the config block shows forworkflow - Output never suggests
--review fullto widen the panel —--reviewdecides whether the panel runs, not its width - The deliberately narrow panel does not by itself produce NOT ASSESSED
Case 5d — lean mode, width from rigor: the panel runs in lean (phase gates
are what lean mode keeps); its width still follows workflow.
- (i)
project.yamlsets onlymodes.rigor: standard→ the block resolvesreview_mode: leanandworkflow: standard, both fromrigor:standard - (ii)
project.yamlsetsmodes.rigor: minimalandmodes.review_mode: lean(explicit —rigor: minimalalone would resolvesoloand skip the panel), plus a filleddesign/game-brief.md→workflow: minimal
Assertions (5d):
- (i): exactly TD-PHASE-GATE and PR-PHASE-GATE are spawned, and the output reads "Panel: 2 of 4" and points to raising
modes.rigortofull(that is whereworkflowcame from) - (ii): only PR-PHASE-GATE is spawned, and the output reads "Panel: 1 of 4", naming the three perspectives that did not run
- In both, lean mode does not skip the panel, and the narrow panel alone does not produce NOT ASSESSED
Case 6: Director context — a later phase's artifact is "not expected", never "none"
Fixture:
project.yamlsets onlymodes.rigor: standard→workflow: standard,review_mode: lean, so the panel istechnical-director+producer- The engine is configured;
design/gdd/systems-index.mdenumerates 3 MVP systems, each with a GDD holding the 5 standard sections, each reviewed, and a/review-all-gddsreport with verdict PASS; the systems index maps dependencies both ways and defines the MVP tier - No
docs/architecture/at all (no architecture document, no ADRs), noproduction/sprints/, no stories
Input: /gate-check technical-setup
Expected behavior:
- Skill loads
gate-technical-setup.mdand applies itsstandardreduction - Skill spawns TD-PHASE-GATE and PR-PHASE-GATE in parallel, passing each the
target phase,
workflow: standard, and the gate's required and recommended artifacts at that tier - The TD context passes the architecture document and the ADR list as "not expected before Pre-Production"; the PR context passes the sprint plan as "not expected before Production" — neither as "none"
- Both directors return READY; every artifact and quality check passes; the verdict is PASS and the stage write is offered
Variant (ii): the same project at /gate-check pre-production (target
Pre-Production, which requires the architecture document at standard) with
the architecture document still absent: the TD context passes it as "none", a
finding for the director (CONCERNS or NOT READY), and the verdict is not PASS.
Assertions:
- Each director receives the target gate's required and recommended artifacts at the resolved tier, not only the phase name
- No director context passes "none" for an artifact the target gate does not require at this tier — it reads "not expected before [phase]" (or "not required at
workflow: [tier]") - With every director READY and every check passing, the verdict is PASS — the absent architecture document and sprint plan do not turn it into CONCERNS
- Variant (ii): an artifact the target gate requires and that does not exist is passed as "none", never "not expected", and the verdict is not PASS
Case 7: CONCERNS override — the user accepts the risks; a FAIL is never overridden
Fixture:
project.yamlsetsmodes.workflow: standardandmodes.review_mode: solodesign/gdd/game-concept.mdholds a core loop and a target audience, and the user confirms it was reviewed; it has no pillars section and no Visual Identity Anchor — both recommended atstandard, so absent → CONCERNS
Input: /gate-check systems-design, then, after the CONCERNS verdict, the
user says "advance anyway"
Expected behavior:
- Verdict is CONCERNS, naming the missing pillars and Visual Identity Anchor; the stage write is not offered by default
- On the user's request, skill lists both concerns and asks one question that
both accepts them and asks to write: "…Accept these risks — [list] — and may
I update
project.stageinproject.yamlto 'Systems Design' (and the legacyproduction/stage.txt)?" - On an explicit yes, the gate report gains an
### Accepted Riskssection (each concern, accepted by the user, dated) and both stage files are written and re-read
Variant (FAIL): design/gdd/game-concept.md does not exist, the verdict is
FAIL, and the user says "advance anyway": the skill does not write the stage —
no override turns a FAIL into a stage change — and names the blockers and
/brainstorm instead.
Assertions:
- On CONCERNS the stage is written only after the user explicitly accepts the listed risks, never by default
- The report records the accepted risks under
### Accepted Risks - Variant: on FAIL the stage is never written, whatever the user asks; the same holds for NOT ASSESSED
Case 8: /gate-check production at workflow: minimal — the slice items drop
Fixture:
project.yamlsets onlymodes.rigor: minimal→workflow: minimal,qa.level: minimal,review_mode: solodesign/game-brief.mdis filled, with a Build order of three MVP features- Three story files under
production/epics/core/, one per feature - No
prototypes/, no Vertical Slice, no sprint plan, no playtest report
Input: /gate-check production; the user answers yes to both current-build
questions (the core loop is fun; one start → challenge → resolution cycle runs
end to end)
Expected behavior:
- Skill runs
artifact-check.sh --phase pre-productionandartifact-check.sh --path minimal; thegame-briefandcreate-storiesrows are the floor - The Vertical Slice items are not in the Required Artifacts list and raise no
CONCERNS — at
minimalthey drop, and the two current-build checks replace them - Verdict is PASS; the stage write is offered, then the one-line rigor-fit
nudge (Production on
rigor: minimal)
Variants: "no" to "it runs end to end" → FAIL (a broken build does not advance, as a broken slice does not at the other tiers); "not yet" to "the core loop is fun" → NOT ASSESSED (nobody has played the build).
Assertions:
- No Vertical Slice item is listed as missing or turned into CONCERNS at
minimal - The two current-build checks are asked and carry the verdict: both yes → PASS; a "no" → FAIL; "not yet" on the fun question → NOT ASSESSED
- The floor is read from
artifact-check.sh --path minimal, not by opening files to see what exists
Case 9: A gate its tier file marks "not applicable"
Fixture: project.yaml sets modes.rigor: minimal and modes.review_mode: lean (so a panel would otherwise run); a filled design/game-brief.md; no GDDs
Input: /gate-check technical-setup
Expected behavior: the Systems Design → Technical Setup gate is not
applicable at minimal: the verdict is PASS with the gate file's note ("No
design gate at minimal workflow…"), the output says "Director Panel skipped —
gate not applicable at workflow: minimal", and the stage write is still asked
before it is made.
Assertions:
- Verdict is PASS, not NOT ASSESSED — the not-applicable gate is the named exception to "a gate with no required artifacts left may not PASS"
- The gate file's note is printed, and no director is spawned
- Absent GDDs are not reported as blockers
Protocol Compliance
- Asks before updating the stage ("May I update
project.stageinproject.yaml… (and the legacyproduction/stage.txt)?") - Presents the full checklist report before asking for write approval
- Ends with a "Follow-Up Actions" section listing next steps per verdict
- Never advances the stage without explicit user confirmation — never on NOT ASSESSED or FAIL, and on CONCERNS only after the user explicitly accepts the listed risks, which the report records under
### Accepted Risks - Never auto-creates
production/stage.txtorproject.yamlwithout asking - Never creates missing artifacts to turn a FAIL into a PASS
Coverage Notes
- The Production → Polish and Polish → Release gates are not covered here because they require complex multi-artifact setups (sprint plans, playtest data, QA sign-off); these are deferred to dedicated follow-up specs.
- The
minimal-tier Concept gate target (design/game-brief.mdinstead ofgame-concept.md) andsystem_overrideskey validation are not covered. - The Vertical Slice validation block (Pre-Production → Production gate at
standard/full) is not covered because it requires a playable build context that cannot be expressed as a document fixture; atminimalit drops (Case 8).