- New skill: /skill-test (static | spec | audit modes) - static: 7-check structural linter per skill file - spec: Claude-evaluated behavioral assertions against test specs - audit: coverage report across all 52 skills with priority gaps - New hook: validate-skill-change.sh — advisory reminder to lint after skill edits - New template: skill-test-spec.md — standard structure for authoring test specs - New: tests/skills/catalog.yaml — machine-readable coverage index (52 skills) - New: tests/skills/_fixtures/ — shared fixtures (complete concept, incomplete GDD) - New: 4 seed test specs for critical gate skills (gate-check, design-review, story-readiness, story-done) — 4 cases each - Modified: settings.json — validate-skill-change.sh added to PostToolUse hook Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6.0 KiB
Skill Test Spec: /story-readiness
Skill Summary
/story-readiness validates that a story file is ready for a developer to
pick up and implement. It checks four dimensions: Design (embedded GDD
requirements), Architecture (ADR references and status), Scope (clear
boundaries and DoD), and Definition of Done (testable criteria). It produces
a READY / NEEDS WORK / BLOCKED verdict. It is a read-only skill and runs
before any developer picks up a story.
Static Assertions (Structural)
Verified automatically by /skill-test static — no fixture needed.
- Has required frontmatter fields:
name,description,argument-hint,user-invocable,allowed-tools - Has ≥2 phase headings or numbered check sections
- Contains verdict keywords: READY, NEEDS WORK, BLOCKED
- Does NOT require "May I write" language (read-only skill)
- Has a next-step handoff (what to do after verdict)
Test Cases
Case 1: Happy Path — Fully ready story
Fixture:
- Story file exists at
production/epics/core/story-light-pickup.md - Story contains:
TR-ID: TR-light-001(GDD requirement reference)ADR: docs/architecture/adr-003-inventory.md- Referenced ADR exists and has status
Accepted - Referenced TR-ID exists in
docs/architecture/tr-registry.yaml - Story has
## Acceptance Criteriawith ≥3 testable items - Story has
## Definition of Donesection - Story has
Status: Ready for Dev - Manifest version in story header matches current
docs/architecture/control-manifest.md
Input: /story-readiness production/epics/core/story-light-pickup.md
Expected behavior:
- Skill reads the story file
- Skill reads the referenced ADR — verifies status is
Accepted - Skill reads
docs/architecture/tr-registry.yaml— verifies TR-ID exists - Skill reads
docs/architecture/control-manifest.md— verifies manifest version matches - Skill evaluates all 4 dimensions (Design, Architecture, Scope, DoD)
- Skill outputs READY verdict with all checks passing
Assertions:
- Skill reads the referenced ADR file (not just the story)
- Skill verifies ADR status is
Accepted(notProposed) - Skill reads
tr-registry.yamlto verify TR-ID exists - Output includes check results for all 4 dimensions
- Verdict is READY when all checks pass
- Skill does not write any files
Case 2: Blocked Path — Referenced ADR is Proposed (not Accepted)
Fixture:
- Story file exists with
ADR: docs/architecture/adr-005-light-system.md adr-005-light-system.mdexists but hasStatus: Proposed- All other story content is otherwise complete
Input: /story-readiness production/epics/core/story-light-system.md
Expected behavior:
- Skill reads the story
- Skill reads
adr-005-light-system.md— findsStatus: Proposed - Skill flags this as a BLOCKING issue (cannot implement against unaccepted ADR)
- Skill outputs BLOCKED verdict
- Skill recommends: accept or reject the ADR before picking up the story
Assertions:
- Verdict is BLOCKED (not NEEDS WORK or READY) when ADR is Proposed
- Output explicitly names the Proposed ADR as the blocker
- Output recommends resolving ADR status before proceeding
- Skill does not output READY regardless of other checks passing
Case 3: Needs Work — Missing Acceptance Criteria
Fixture:
- Story file exists but has no
## Acceptance Criteriasection - ADR reference exists and is
Accepted - TR-ID exists in registry
- Manifest version matches
Input: /story-readiness production/epics/core/story-oxygen-drain.md
Expected behavior:
- Skill reads the story
- Skill finds no Acceptance Criteria section
- Skill flags this as a NEEDS WORK issue (story is incomplete, not blocked)
- Skill outputs NEEDS WORK verdict
- Skill names the missing section and suggests adding measurable criteria
Assertions:
- Verdict is NEEDS WORK (not BLOCKED or READY) when Acceptance Criteria section is absent
- Output identifies the missing Acceptance Criteria section specifically
- Output suggests adding testable/measurable criteria
- Skill distinguishes NEEDS WORK (fixable without external dependencies) from BLOCKED (requires outside action)
Case 4: Edge Case — Stale manifest version
Fixture:
- Story file has
Manifest Version: 2026-01-15in its header docs/architecture/control-manifest.mdhasManifest Version: 2026-03-10- Versions do not match (story was created before manifest was updated)
Input: /story-readiness production/epics/core/story-mirror-rotation.md
Expected behavior:
- Skill reads the story and extracts manifest version
2026-01-15 - Skill reads control manifest header and extracts current version
2026-03-10 - Skill detects version mismatch
- Skill flags this as an ADVISORY issue (not blocking, but worth noting)
- Verdict is NEEDS WORK with manifest staleness noted
Assertions:
- Skill reads
docs/architecture/control-manifest.mdto get current version - Skill compares story's embedded manifest version against current manifest version
- Stale manifest version results in NEEDS WORK (not BLOCKED, not READY)
- Output explains that the story's embedded guidance may be outdated
Protocol Compliance
- Does NOT use Write or Edit tools (read-only skill)
- Presents complete check results before verdict
- Does not ask for approval (no file writes)
- Ends with recommended next step (fix issues or proceed to implementation)
- Distinguishes three verdict levels clearly (READY vs NEEDS WORK vs BLOCKED)
Coverage Notes
- Case where TR-ID is missing from the registry entirely is not explicitly tested here; it follows the same NEEDS WORK pattern as Case 3.
- The "no argument" path (skill auto-detecting the current story) is not
tested because it depends on
production/session-state/active.mdcontent, which is hard to fixture reliably. - Stories with multiple ADR references are not tested; behavior is assumed to be additive (all ADRs must be Accepted for READY verdict).