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
15 KiB
Skill Test Spec: /consistency-check
Skill Summary
/consistency-check [full | since-last-review | entity:<name> | item:<name>]
compares every in-scope GDD in design/gdd/ against the entity registry
(design/registry/entities.yaml). It reads the registry once, builds entity,
item, formula and constant lookups, then greps each GDD for each registered name
(-C 3) instead of reading whole documents; only conflicts get a targeted
section read. The registry entry's source: GDD is the authoritative owner.
In a GDD whose effective tier is standard — the project tier, or that
system's system_overrides row — only the required GDD sections are compared
(plus Tuning Knobs when workflow_overrides.tuning_knobs is true), and the
report says so. Findings are classified 🔴 CONFLICT, ⚠️ STALE REGISTRY or ℹ️ UNVERIFIABLE, and the
report verdict is PASS or CONFLICTS FOUND — or NOT ASSESSED when the registry is
empty, a named entity is not in it, or no GDD is in scope, since a scan of
nothing is not a PASS. Registry corrections are written only
after a "May I update / May I add" ask; afterwards the verdict is COMPLETE, or
BLOCKED while conflicts remain. Every 🔴 CONFLICT is appended to
docs/consistency-failures.md after a "May I append" ask, a breadcrumb is appended to
production/session-state/active.md, and the skill closes with an
AskUserQuestion widget (collaborative and guided modes). No director gates.
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
- Contains verdict keywords: PASS, CONFLICTS FOUND, NOT ASSESSED, COMPLETE, BLOCKED
- The analysis phases (1–5) are read-only
- Has a next-step handoff at the end
- Registry writes are preceded by "May I update" / "May I add" language naming
design/registry/entities.yaml - The conflict log write is preceded by "May I append" language naming
docs/consistency-failures.md
Director Gate Checks
No director gates — this skill spawns no director gate agents. Consistency checking is a mechanical scan; no creative or technical director review is required as part of the scan itself.
Test Cases
Case 1: Happy Path — Registry and 4 GDDs agree
Fixture:
modes.workflowresolves tofull;modes.automationresolves tocollaborativedesign/registry/entities.yamlhas 3 entities and 2 constants, each with asource:GDDdesign/gdd/contains 4 system GDDs plusgame-concept.md,systems-index.mdand agdd-cross-review-[date].md- Every value the GDDs state for a registered name matches the registry
Input: /consistency-check
Expected behavior:
- Skill reads the registry and reports
Registry loaded: 3 entities, 0 items, 0 formulas, 2 constantsandScope: full - Skill globs
design/gdd/*.md, excludesgame-concept.md,systems-index.mdand the cross-review report, and reports the 4 in-scope GDDs before scanning - Each registered name is grepped across the in-scope GDDs with 3 lines of context; no GDD is read in full
- No conflicts or stale entries; the report's Clean Entries line reads
✅ 5 registry entries verified across all GDDs with no conflicts. - Verdict: PASS
- Nothing is appended to
docs/consistency-failures.md; the breadcrumb is appended toproduction/session-state/active.md - Closes with the
AskUserQuestionwidget (Fix / Run/design-review/ Stop)
Assertions:
- The in-scope GDD list (4 GDDs, non-system docs excluded) is reported before the scan
- The scan greps for registered names rather than fully reading each GDD
- Verdict is PASS when registry and GDDs agree
design/registry/entities.yamlanddocs/consistency-failures.mdare not written; the only write is theactive.mdbreadcrumb- The breadcrumb names
docs/consistency-failures.md, not an invented report file - The skill closes with the
AskUserQuestionwidget, not plain text
Case 2: Failure Path — A GDD contradicts a registered constant
Fixture:
modes.workflowresolves tofull- Registry
constants:hascrit_multipliervalue 1.5,source: design/gdd/combat.md,referenced_by: [combat.md, loot.md] design/gdd/combat.mdstatescrit_multiplier = 1.5design/gdd/loot.mdstatescrit_multiplier = 2.0- The registry entry is newer than the last commit to
combat.md(not stale)
Input: /consistency-check
Expected behavior:
- The constant scan (3d) greps
crit_multiplierand finds 2.0 inloot.md - Phase 4 does a targeted read of the conflicting section and uses the registry
source:to decidecombat.mdis authoritative - Report lists
🔴 crit_multiplier: Registry (source: combat.md) = 1.5; Conflict in loot.md = 2.0; Resolution: changeloot.mdto 1.5 - Verdict: CONFLICTS FOUND
- Skill asks "May I append 1 entries to
docs/consistency-failures.md(creating it if absent)?"; on approval an entry for the conflict is appended (the file is created with its header first if absent), namingcombat.mdvsloot.md - No GDD is edited automatically; with the conflict unresolved the final verdict is BLOCKED
Assertions:
- Verdict is CONFLICTS FOUND (not PASS)
- The conflict entry names both GDDs and shows both values (1.5 and 2.0)
- The conflict is classified 🔴 CONFLICT, and the resolution targets the non-source GDD (
loot.md) - A reflexion-log entry is appended to
docs/consistency-failures.md, only after the "May I append" ask naming it is approved - Skill does NOT auto-resolve the conflict — neither GDD is edited without the user choosing to fix it
- Final verdict is BLOCKED while the conflict is unresolved
Case 3: Stale Registry — The source GDD changed after the registry entry
Fixture:
modes.workflowresolves tofull- Registry
entities:hasgoblinwithhealth: 40,source: design/gdd/combat.md design/gdd/combat.mdnow says goblin health is 50;git logshows it changed after the registry entry was written- No other GDD states a goblin health value
Input: /consistency-check entity:goblin
Expected behavior:
- Scope is limited to the
goblinentity across all GDDs; the report showsScope: entity:goblin - The mismatch is found in the source GDD itself; Phase 4 checks git history and classifies it ⚠️ STALE REGISTRY, not 🔴 CONFLICT
- Report lists it under Stale Registry Entries: registry says 40, source GDD now says 50
- Skill asks: "May I update
design/registry/entities.yamlto fix the 1 stale entries?" - On approval:
healthbecomes 50,revised:is set to today, and a# was: 40 before [date]comment is added; nothing is deleted - After writing, verdict is COMPLETE
- No entry is appended to
docs/consistency-failures.md(only 🔴 CONFLICT entries are logged)
Assertions:
- The finding is classified ⚠️ STALE REGISTRY, distinct from 🔴 CONFLICT
- The registry is not written until the "May I update
design/registry/entities.yaml" ask is approved - The approved update sets
revised:and keeps the old value in a# was:comment - Verdict after the write is COMPLETE
docs/consistency-failures.mdis not written for a stale-registry finding
Case 4: Edge Case — Empty registry, no GDDs
Fixture:
modes.workflowresolves tofulldesign/registry/entities.yamlis the shipped stub with no entriesdesign/gdd/is empty
Input: /consistency-check
Expected behavior:
- Skill reads the registry and finds no entries
- Skill outputs: "Entity registry is empty. Run
/design-systemto write GDDs — the registry is populated automatically after each GDD is completed. Nothing to check yet." - Verdict: NOT ASSESSED — entity registry empty; the skill stops without scanning
- No file is written — not the registry, not the reflexion log, not the session-state breadcrumb
Assertions:
- Skill outputs the empty-registry message naming
/design-system - Verdict is NOT ASSESSED, naming the empty registry as the reason — never PASS, CONFLICTS FOUND, COMPLETE or BLOCKED, and never no verdict at all (
.claude/rules/skill-authoring.mdobligation 1) - No file is written, including
production/session-state/active.md - Skill does NOT crash or produce a partial report
Case 4b: Edge Case — Registry populated, but no GDD in scope
Fixture:
modes.workflowresolves tofulldesign/registry/entities.yamlhas 3 entities, each with asource:GDDdesign/gdd/gdd-cross-review-[date].mdexists, and no system GDD has changed since it
Input: /consistency-check since-last-review
Expected behavior:
- Skill reads the registry and reports what it loaded
- The
since-last-reviewfilter finds zero changed GDDs; the in-scope list is empty - Verdict: NOT ASSESSED — no GDDs in scope, naming
since-last-reviewas the filter that produced zero; the skill stops without scanning
Assertions:
- Verdict is NOT ASSESSED, never PASS — nothing was compared
- The output names the filter that produced the empty scope
- No GDD is scanned and no conflict log entry is written
Case 4c: Edge Case — Named entity is not in the registry
Fixture:
modes.workflowresolves tofulldesign/registry/entities.yamlhas entitiesgoblinandorc_warlorddesign/gdd/contains 3 system GDDs; one mentions agoblin_shaman
Input: /consistency-check entity:goblin_shaman
Expected behavior:
- Skill reads the registry and reports what it loaded,
Scope: entity:goblin_shaman goblin_shamanhas no registry entry- Verdict: NOT ASSESSED —
goblin_shamanis not in the registry, listing the closest registered names (goblin); the skill stops without scanning
Assertions:
- Verdict is NOT ASSESSED naming the unregistered entity — never PASS
- The closest registered names are listed
- No GDD is scanned and nothing is written
Case 5: Director Gate — No gate spawned in full review mode
Fixture:
project.yaml:modes.review_mode: full,modes.workflow: fulldesign/registry/entities.yamlhas entriesdesign/gdd/contains ≥2 GDDs
Input: /consistency-check
Expected behavior:
- Skill loads the registry and runs the consistency scan
- The review mode plays no part: the skill's config block resolves only
automation,workflowandsystem_overrides - No director gate agents are spawned at any point
- Report and verdict are produced normally
Assertions:
- No director gate agents are spawned (no CD-, TD-, PR-, AD- prefixed gates)
- The skill does not resolve or read the review mode — its config block asks only for
automation,workflowandsystem_overrides - Output contains no "Gate: [GATE-ID]" or gate-skipped entries
- Review mode
fullhas no effect on this skill's behavior
Case 6: Standard Workflow — Only the required GDD sections are compared
Fixture:
modes.workflowresolves tostandard- Registry
constants:hascrit_multipliervalue 1.5,source: design/gdd/combat.md design/gdd/combat.md## Detailed Designstatescrit_multiplier = 1.5design/gdd/loot.mdstatescrit_multiplier = 2.0only in its## Tuning Knobssection, whichstandarddoes not require; no required section ofloot.mdstates a value for it
Input: /consistency-check
Expected behavior:
- Only hits inside the sections
standardrequires are compared - The
loot.mdvalue in## Tuning Knobsis not compared: no 🔴 CONFLICT is raised for it and nothing is appended todocs/consistency-failures.md - The report's Scope line says the check covered the required sections only, and lists the
loot.mdTuning Knobs mention as not checked at this tier - Verdict: PASS — the required sections agree with the registry
Assertions:
- The Tuning Knobs value is not reported as a 🔴 CONFLICT at
standard - The report states the required-sections-only scope and names the mention it did not check — the narrower scan is not silent
- Verdict is PASS
Case 6b: Standard Workflow — A per-system override makes one GDD full
Fixture:
modes.workflowresolves tostandard;project.yamlhasworkflow_overrides.system_overrides.loot: full- Registry
constants:hascrit_multipliervalue 1.5,source: design/gdd/combat.md design/gdd/combat.md## Detailed Designstatescrit_multiplier = 1.5design/gdd/loot.mdstatescrit_multiplier = 2.0only in its## Tuning Knobssection
Input: /consistency-check
Expected behavior:
- The config block lists
system_overrides: loot=full, soloot.md's effective tier isfulland every one of its sections is compared;combat.mdstays atstandard - The
loot.mdTuning Knobs value is compared and raised as🔴 crit_multiplier(registry 1.5,loot.md2.0) - The report's Scope line names
loot.mdas checked atfull - Verdict: CONFLICTS FOUND
Assertions:
- The Tuning Knobs value in
loot.mdis compared, because its effective tier isfull— the project tier alone would have skipped it (Case 6) - The report names the GDD whose effective tier differs from the project's
- Verdict is CONFLICTS FOUND, not PASS
Protocol Compliance
- Reads the registry once, then greps GDDs; full-section reads happen only for conflicts
- The report is shown in full before any registry write ask
- Report verdict is PASS, CONFLICTS FOUND or NOT ASSESSED (empty registry, unregistered name, or no GDD in scope — never PASS over nothing compared); post-correction verdict is COMPLETE or BLOCKED
- Applies each GDD's effective tier (the resolved
modes.workflow, or that system'ssystem_overridesrow): atstandard, compares the required GDD sections only (plus Tuning Knobs whenworkflow_overrides.tuning_knobsis true) and says so in the report - No director gates — the review mode is not an input
- Registry writes are gated by "May I update" / "May I add"; entries are never deleted (
status: deprecatedinstead) - Every 🔴 CONFLICT is appended to
docs/consistency-failures.mdafter a "May I append" ask that names it - Closes with
AskUserQuestionin collaborative and guided modes; in autonomous mode prints findings and records vialog_decision
Coverage Notes
- This skill checks registered facts across GDDs. Deep design theory analysis
(pillar drift, dominant strategies) is handled by
/review-all-gdds. - Facts that are not in the registry are not compared; two GDDs that disagree on an unregistered value are not detected. Phase 6 offers to register names that appear in more than one GDD.
since-last-reviewis tested only on its empty-scope path (Case 4b), not on a run that finds changed GDDs.modes.workflow: minimalis not tested separately: a minimal project normally has no GDDs, and an empty scope ends NOT ASSESSED as in Cases 4 and 4b.