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
14 KiB
Skill Test Spec: /content-audit
Skill Summary
/content-audit [system-name | --summary] compares the content counts the design
specifies against what has been built. It reads design/gdd/systems-index.md
for systems and their MVP/priority tier, takes the planned named content from the
entities: and items: sections of design/registry/entities.yaml when the
registry has entries, and pre-scans GDDs with two greps (Summary presence and
digit-plus-content-noun counts) before full-reading only the GDDs it needs
(Phase 1). It then globs the implementation directories for each content type —
assets/data/**/enemies/**, assets/data/**/items/**, scene files under the
resolved code root, and so on (Phase 2) — and produces a gap table
System | Content Type | Specified | Found | Gap | Status with per-row Status
COMPLETE / IN PROGRESS / EARLY / NOT STARTED, HIGH PRIORITY flags, and a summary
line (Phase 3). The full report is written to docs/content-audit-[YYYY-MM-DD].md
only after "May I write"; --summary writes nothing. modes.workflow sets the
scope: full audits every GDD count, standard only counts in the required GDD
sections (naming any left out), and minimal has no systems index to audit
against. The run closes COMPLETE, or NOT ASSESSED — NO DATA when a required
input is absent, nothing in scope gives a count, or a Found count could not be
taken (code root unresolved) — never COMPLETE for a run that could not compute a
gap. No director gates are invoked.
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 status and verdict keywords: COMPLETE, IN PROGRESS, EARLY, NOT STARTED, NOT ASSESSED
- Contains "May I write" before the optional report write to
docs/content-audit-[YYYY-MM-DD].md - Has a next-step handoff (what to do after gap table is reviewed)
Director Gate Checks
None. Content audit is an analysis skill; no gates are invoked.
Test Cases
Case 1: Happy Path — All specified content present
Fixture:
modes.workflowresolves tofulldesign/gdd/systems-index.mdlists Enemies (MVP) and Items (MVP)design/registry/entities.yamlhas no entriesdesign/gdd/enemies.mdspecifies "4 enemy types: Grunt, Sniper, Tank, Boss"design/gdd/items.mdspecifies "3 items"assets/data/enemies/containsgrunt.json,sniper.json,tank.json,boss.jsonassets/data/items/contains 3 item.jsonfiles
Input: /content-audit
Expected behavior:
- Skill reads the systems index; the empty registry is skipped and the GDD scan is used
- The pre-scan greps find both GDDs declare content counts; both are full-read
- Skill globs
assets/data/**/enemies/**andassets/data/**/items/** - Gap table: Enemies — Specified 4, Found 4, Gap 0, COMPLETE; Items — Specified 3, Found 3, Gap 0, COMPLETE
- Summary line: 7 specified, 7 found, overall gap 0%
- Skill presents the table and asks "May I write the full report to
docs/content-audit-[YYYY-MM-DD].md?" - Output ends with
Verdict: COMPLETE — content audit finished.
Assertions:
- Gap table uses the columns System, Content Type, Specified, Found, Gap, Status
- Both rows show Specified = Found, Gap 0 and Status COMPLETE
- Summary line reports 7 specified, 7 found and 0% gap
- No HIGH PRIORITY flag is raised
- No file is written before the "May I write" ask is answered yes
Case 2: Gaps Found — MVP enemy content barely started
Fixture:
modes.workflowresolves tofulldesign/gdd/systems-index.mdtags Enemies as MVPdesign/gdd/enemies.mdspecifies "3 enemy types: Grunt, Sniper, Boss"assets/data/enemies/contains onlygrunt.json
Input: /content-audit enemies
Expected behavior:
- Single-system audit: skill skips the pre-scan and full-reads
design/gdd/enemies.md - Skill finds 1 enemy definition file
- Gap table row: Enemies — Specified 3, Found 1, Gap 2, Status EARLY (33%)
- Enemies is flagged HIGH PRIORITY: status EARLY and MVP-tagged
- Skill asks "May I write the full report to
docs/content-audit-[YYYY-MM-DD].md?"; on yes, the report's HIGH PRIORITY Gaps section lists Enemies with its rationale - Next steps include "Run
/create-stories [epic-slug]for each HIGH PRIORITY gap."
Assertions:
- Specified (3), Found (1) and Gap (2) are all shown
- Status is EARLY for 1 of 3 (33%), not IN PROGRESS or NOT STARTED
- Enemies is flagged HIGH PRIORITY because it is EARLY and MVP-tagged
- Skill flags the gap now; it does not assume the content will be added later
- Next steps point to
/create-storiesfor the HIGH PRIORITY gap
Case 3: No Design Inputs — Nothing to audit against
Fixture:
modes.workflowresolves tofulldesign/gdd/systems-index.mddoes not existdesign/gdd/contains no GDDsdesign/registry/entities.yamlhas no entries
Input: /content-audit
Expected behavior:
- Skill records its inputs as FOUND / ABSENT; the systems index, GDDs and registry entries are all ABSENT
- Every required input is ABSENT, so the skill stops
- Output reports
NOT ASSESSED — NO DATA, naming the missing systems index and GDDs and the skills that produce them (/map-systems,/design-system) - No gap table and no gap percentage are produced (no division by zero)
- No report write is offered and no file is written
Assertions:
- Verdict is
NOT ASSESSED — NO DATA, not COMPLETE - No gap table or overall gap percentage is produced
- Output names the missing inputs and the skills that produce them
- No "May I write" prompt appears and no file is written
Case 3b: No Counts Anywhere — GDDs exist but none gives a count
Fixture:
modes.workflowresolves tofulldesign/gdd/systems-index.mdlists Core Loopdesign/gdd/core-loop.mdhas a## Summaryand describes mechanics only — no content count, no named listdesign/registry/entities.yamlhas no entries
Input: /content-audit
Expected behavior:
- The systems index and the GDD are FOUND, so the skill does not stop at the insufficient-input check
- Scan (b) matches nothing;
core-loop.mdhas a Summary, so it is noted "No auditable content counts" without a full read - No row carries a Specified count, so no Gap, Status or overall gap percentage is computed (Specified is 0)
- The run closes
Verdict: NOT ASSESSED — NO DATA, saying no GDD gives a count and naming/design-systemto add counts
Assertions:
- No overall gap percentage is computed and no row is marked COMPLETE
- Verdict is
NOT ASSESSED — NO DATA, never COMPLETE over an empty gap table - Output says no GDD gives a count and names
/design-system
Case 4: Edge Case — A pre-Summary GDD describes content without a count
Fixture:
modes.workflowresolves tofulldesign/gdd/systems-index.mdlists Enemies and Questsdesign/gdd/enemies.mdhas a## Summaryand specifies "3 enemy types: Grunt, Sniper, Boss";assets/data/enemies/has all 3design/gdd/quests.mdhas no## Summarysection and says the game has "a handful of side quests" with no number or named list- User answers yes to the report write
Input: /content-audit
Expected behavior:
- Skill globs
design/gdd/*.mdfor the denominator: N = 3, since the glob also countssystems-index.md(read in step 1; it has no## Summary); the Summary grep matches onlyenemies.md; the content-count grep matches onlyenemies.md - Failing open on the missing Summary, the skill full-reads
quests.mdrather than treating it as out of scope — the fail-open rule wins over the content-count narrowing - Skill records the Quests content type as "Unspecified" and flags it as a design gap; it does not invent a count
- Enemies row is COMPLETE (3 of 3)
- The written report
docs/content-audit-[YYYY-MM-DD].mdlistsquests.mdunder "Unspecified Content Counts" - The report notes that counts are approximations based on file scanning
Assertions:
quests.mdis full-read because it lacks## Summary, even though the content-count grep did not match it- The Quests content is recorded as "Unspecified", never given an estimated count
- The Unspecified Content Counts section of the report names
quests.md - The Enemies row is still audited normally (Specified 3, Found 3, COMPLETE)
- The report carries the approximation caveat
Case 5: Gate Compliance — No gate; optional report requires approval
Fixture:
project.yaml:modes.workflow: full,modes.review_mode: full- GDDs specify 10 content items; 9 are found in the implementation directories
Input: /content-audit
Expected behavior:
- Skill reads the design inputs and scans the implementation; produces the gap table
- No director gate is invoked regardless of review mode
- Skill presents the gap table and summary before any write
- Skill asks "May I write the full report to
docs/content-audit-[YYYY-MM-DD].md?" - If the user says no, nothing is written; no asset file is ever modified
Assertions:
- No director gate is invoked in any review mode
- Gap table is presented without auto-writing any file
- The report write is offered for
docs/content-audit-[YYYY-MM-DD].mdbut not forced - Skill does not modify any asset files
Case 6: Standard Workflow — Only counts in the required sections are audited
Fixture:
modes.workflowresolves tostandarddesign/gdd/systems-index.mdlists Enemies (MVP)design/gdd/enemies.md## Detailed Designspecifies "3 enemy types: Grunt, Sniper, Boss"; its## Tuning Knobssection mentions "2 elite variants"assets/data/enemies/containsgrunt.json,sniper.json,boss.json
Input: /content-audit
Expected behavior:
- The count in
## Detailed Design, a required section atstandard, is audited: Enemies — Specified 3, Found 3, Gap 0, COMPLETE - The "2 elite variants" count sits in
## Tuning Knobs, whichstandarddoes not require; it gets no gap row and is listed as not audited at this tier - Output ends with
Verdict: COMPLETE — content audit finished.
Assertions:
- The Detailed Design count is audited and the Enemies row is COMPLETE
- The Tuning Knobs count is not in the gap table or the totals
- The output names the Tuning Knobs count as not audited at
standardrather than dropping it silently
Case 7: Minimal Workflow — No systems index to audit against
Fixture:
project.yaml:modes.rigor: minimal(workflowresolves tominimal)design/game-brief.mdexists;design/gdd/systems-index.mddoes not
Input: /content-audit
Expected behavior:
- The systems index is ABSENT, as it normally is at
minimal - Output reports
NOT ASSESSED — NO DATA, naming the missing systems index and/map-systems, which creates it - No gap table, no gap percentage and no report write
Assertions:
- Verdict is
NOT ASSESSED — NO DATA, not COMPLETE - Output names
design/gdd/systems-index.mdas missing and/map-systemsas the skill that produces it - No gap percentage is computed and no file is written
Case 8: Code Root Unresolved — The level count is not taken
Fixture:
modes.workflowresolves tofullproject.yamlhas noengine.name;.claude/docs/technical-preferences.mdreads[TO BE CONFIGURED]; bothsrc/andSource/exist, so the tree does not decide the rootdesign/gdd/systems-index.mdlists Levels (MVP) and Enemies (MVP)design/gdd/levels.mdspecifies "6 levels";design/gdd/enemies.mdspecifies "3 enemy types: Grunt, Sniper, Boss"assets/data/enemies/contains 3 enemy files; no scene files exist underassets/
Input: /content-audit
Expected behavior:
- Enemies is audited from
assets/data/: Specified 3, Found 3, COMPLETE - The level scan needs the code root, which is unresolved: the Levels row's Found is
NOT ASSESSED — code root unresolved— not 0, and its Status is not NOT STARTED - Levels gets no HIGH PRIORITY flag and stays out of both summary totals; the summary names it
- The run closes
Verdict: NOT ASSESSED — NO DATA, naming the unresolved code root
Assertions:
- The Levels row reads
NOT ASSESSED — code root unresolved, never Found 0 or NOT STARTED - The summary totals leave Levels out and say so
- Verdict is NOT ASSESSED, not COMPLETE
Protocol Compliance
- Reads the systems index, the registry (when it has entries) and the in-scope GDDs before scanning the implementation
- A GDD with no
## Summaryis full-read even when the content-count grep did not match it - Applies the resolved
modes.workflow:standardaudits only counts in the required GDD sections and names any it left out - Gap table shows System, Content Type, Specified, Found, Gap, Status
- Row Status is one of: COMPLETE, IN PROGRESS, EARLY, NOT STARTED; a row whose Found could not be taken is
NOT ASSESSEDand stays out of the totals - Writes only after "May I write" and only to
docs/content-audit-[YYYY-MM-DD].md;--summarywrites nothing - A missing required input, a scope with no counts, or an untaken Found count yields
NOT ASSESSED — NO DATA, never a computed gap percentage or COMPLETE - No director gates are invoked
- On Unity, every content glob also runs under
Assets/without adata/segment (e.g.Assets/**/Items/**,*Item*.asset) — a Unity project's items, abilities, quests and dialogue are never reported NOT STARTED from anassets/data/-only scan
Coverage Notes
--summarymode (prints the table, writes nothing, ends with "Run/content-auditwithout--summaryto write the full report.") is not given its own case.- Unity levels are found under the code root (
Assets/,*.unity) and the other content types underAssets/(asserted in Protocol Compliance); Unreal levels underContent/(*.umap, with data assets as*.uasset); neither engine has its own case. - Asset naming, size and format compliance is
/asset-audit's job, not this skill's.