Files
Claude-Code-Game-Studios/CCGS Skill Testing Framework/skills/gate/gate-check.md
T
DonchitosandClaude Opus 5.5 b21fa0f7f2 Release 1.1.2 — the default path works end to end
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
2026-09-29 21:32:19 +10:00

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.yaml sets modes.workflow: full and modes.review_mode: solo
  • design/gdd/game-concept.md exists 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 concept reports 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-review record for the concept

Input: /gate-check systems-design

Expected behavior:

  1. Skill loads only .claude/skills/gate-check/references/gate-systems-design.md
  2. Skill runs bash .claude/scripts/artifact-check.sh --phase concept to resolve existence, then spot-reads design/gdd/game-concept.md to confirm it has real content (not a template skeleton)
  3. Skill checks pillars, the Visual Identity Anchor, core loop and target audience
  4. Skill cannot find a review record, marks "Game concept has been reviewed" [?] MANUAL CHECK NEEDED and asks the user; the user confirms it was reviewed
  5. Skill prints "Director Panel skipped — Solo mode. Gate verdict based on artifact and quality checks only."
  6. Skill outputs the Section 5 report, then the Chain-of-Verification line
  7. On PASS, skill asks "May I update project.stage in project.yaml to 'Systems Design' (and the legacy production/stage.txt)?"
  8. 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.md is 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) and production/stage.txt only 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.md already written (the catalog orders /map-systems in Concept), option [A] is /design-system for the first system in its design order instead

Case 2: Failure Path — Missing required artifacts for Concept → Systems Design

Fixture:

  • project.yaml sets modes.workflow: full
  • design/gdd/game-concept.md does NOT exist
  • No game pillars document exists
  • design/gdd/ directory is empty or absent

Input: /gate-check systems-design

Expected behavior:

  1. artifact-check.sh reports the game-concept step ABSENT
  2. Skill marks the required artifact missing (a blocker at full)
  3. Skill outputs FAIL verdict
  4. Skill lists the missing concept document under Blockers
  5. Skill recommends /brainstorm to create one
  6. 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.md as missing
  • Output includes a "Blockers" section with at least 1 item
  • Output recommends /brainstorm as the remediation action
  • Skill does NOT write project.yaml or production/stage.txt when the verdict is FAIL
  • Skill does NOT create design/gdd/game-concept.md or any other missing artifact to manufacture a PASS

Case 3: No Argument — Auto-detect current stage

Fixture:

  • project.yaml sets modes.workflow: full and has no project: block; production/stage.txt contains Concept, so the config block reports project.stage: Concept (production/stage.txt) from the legacy mirror (with no project.yaml at all the tier would resolve to minimal, whose gate target is design/game-brief.md, not the concept doc below)
  • design/gdd/game-concept.md exists with content
  • No systems index yet

Input: /gate-check (no argument)

Expected behavior:

  1. Skill takes the current stage from the resolved config block (legacy production/stage.txt mirror) / project-stage-detect heuristics
  2. 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
  3. On [A], skill runs the Concept → Systems Design checks
  4. 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 AskUserQuestion before 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.yaml sets modes.workflow: full and modes.review_mode: solo
  • All required artifacts for Concept → Systems Design are present, and every other check passes: design/gdd/game-concept.md holds 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:

  1. Skill verifies all artifacts exist
  2. Skill reaches "Game concept has been reviewed (/design-review verdict not MAJOR REVISION NEEDED)"
  3. No review record → item marked [?] MANUAL CHECK NEEDED
  4. 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 NEEDED rather 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 NEEDED item 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.md exists
  • Review mode comes from modes.review_mode in project.yaml (legacy mirror: production/review-mode.txt) or an inline --review flag

Case 5a — full panel: modes.review_mode: full, modes.workflow: full

Input: /gate-check systems-design

Expected behavior:

  1. Skill takes review_mode: full and workflow: full from the resolved block
  2. 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)
  3. 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
  4. All verdicts are collected before the Director Panel summary is printed

Assertions (5a):

  • Skill reads the resolved review_mode before deciding whether the panel runs
  • All 4 PHASE-GATE directors are spawned (panel width comes from workflow: full)
  • Directors are spawned in parallel (all Agent calls 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:

  1. Skill determines solo
  2. No director spawns
  3. Output states: "Director Panel skipped — Solo mode. Gate verdict based on artifact and quality checks only."
  4. 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:

  1. Panel runs (review mode is not solo) at the standard width: technical-director + producer only
  2. Output names the omission, e.g. "Panel: 2 of 4 (workflow: standard). Creative and Art perspectives not consulted. Set modes.workflow: full for the complete panel." — workflow is set on its own here, so raising modes.rigor would not change it

Assertions (5c):

  • Exactly TD-PHASE-GATE and PR-PHASE-GATE are spawned — review_mode: full does 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 for workflow
  • Output never suggests --review full to widen the panel — --review decides 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.yaml sets only modes.rigor: standard → the block resolves review_mode: lean and workflow: standard, both from rigor:standard
  • (ii) project.yaml sets modes.rigor: minimal and modes.review_mode: lean (explicit — rigor: minimal alone would resolve solo and skip the panel), plus a filled design/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.rigor to full (that is where workflow came 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.yaml sets only modes.rigor: standard → workflow: standard, review_mode: lean, so the panel is technical-director + producer
  • The engine is configured; design/gdd/systems-index.md enumerates 3 MVP systems, each with a GDD holding the 5 standard sections, each reviewed, and a /review-all-gdds report 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), no production/sprints/, no stories

Input: /gate-check technical-setup

Expected behavior:

  1. Skill loads gate-technical-setup.md and applies its standard reduction
  2. 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
  3. 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"
  4. 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.yaml sets modes.workflow: standard and modes.review_mode: solo
  • design/gdd/game-concept.md holds 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 at standard, so absent → CONCERNS

Input: /gate-check systems-design, then, after the CONCERNS verdict, the user says "advance anyway"

Expected behavior:

  1. Verdict is CONCERNS, naming the missing pillars and Visual Identity Anchor; the stage write is not offered by default
  2. 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.stage in project.yaml to 'Systems Design' (and the legacy production/stage.txt)?"
  3. On an explicit yes, the gate report gains an ### Accepted Risks section (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.yaml sets only modes.rigor: minimal → workflow: minimal, qa.level: minimal, review_mode: solo
  • design/game-brief.md is 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:

  1. Skill runs artifact-check.sh --phase pre-production and artifact-check.sh --path minimal; the game-brief and create-stories rows are the floor
  2. The Vertical Slice items are not in the Required Artifacts list and raise no CONCERNS — at minimal they drop, and the two current-build checks replace them
  3. 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.stage in project.yaml … (and the legacy production/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.txt or project.yaml without 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.md instead of game-concept.md) and system_overrides key 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; at minimal it drops (Case 8).