添加 claude code game studios 到项目
This commit is contained in:
169
CCGS Skill Testing Framework/skills/sprint/changelog.md
Normal file
169
CCGS Skill Testing Framework/skills/sprint/changelog.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# Skill Test Spec: /changelog
|
||||
|
||||
## Skill Summary
|
||||
|
||||
`/changelog` is a Haiku-tier skill that auto-generates a developer-facing
|
||||
changelog by reading git commit history and closed sprint stories since the
|
||||
last release tag. It organizes entries into features, fixes, and known issues.
|
||||
No director gates are used. The skill asks "May I write to `docs/CHANGELOG.md`?"
|
||||
before persisting. Verdict is always COMPLETE.
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
- [ ] Contains verdict keyword: COMPLETE
|
||||
- [ ] Contains "May I write" language (skill writes changelog)
|
||||
- [ ] Has a next-step handoff (e.g., run /patch-notes for player-facing version)
|
||||
|
||||
---
|
||||
|
||||
## Director Gate Checks
|
||||
|
||||
None. Changelog generation is a fast compilation task; no gates are invoked.
|
||||
|
||||
---
|
||||
|
||||
## Test Cases
|
||||
|
||||
### Case 1: Happy Path — Multiple sprints since last release tag
|
||||
|
||||
**Fixture:**
|
||||
- Git history has a tag `v0.3.0` three sprints ago
|
||||
- Since that tag: 12 commits across sprints 006, 007, 008
|
||||
- Sprint story files reference task IDs matching commit messages
|
||||
- `docs/CHANGELOG.md` does not yet exist
|
||||
|
||||
**Input:** `/changelog`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads git log since `v0.3.0` tag
|
||||
2. Skill reads sprint stories to cross-reference task IDs
|
||||
3. Skill compiles entries into Features, Fixes, and Known Issues sections
|
||||
4. Skill presents draft to user
|
||||
5. Skill asks "May I write to `docs/CHANGELOG.md`?"
|
||||
6. User approves; file written; verdict COMPLETE
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Changelog covers commits since the most recent git tag
|
||||
- [ ] Entries are organized into Features / Fixes / Known Issues sections
|
||||
- [ ] Sprint story references are used to enrich commit descriptions
|
||||
- [ ] "May I write" prompt appears before file write
|
||||
- [ ] Verdict is COMPLETE after write
|
||||
|
||||
---
|
||||
|
||||
### Case 2: No Git Tags Found — All commits used, version baseline noted
|
||||
|
||||
**Fixture:**
|
||||
- Git repository has commits but no tags exist
|
||||
- 20 commits in history across 3 sprints
|
||||
|
||||
**Input:** `/changelog`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill checks for git tags — finds none
|
||||
2. Skill uses all commits in history as the baseline
|
||||
3. Skill notes in the output: "No version tag found — using full commit history; version baseline is unset"
|
||||
4. Skill still compiles organized changelog from available commits
|
||||
5. Skill asks "May I write" and writes on approval
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill does not error when no git tags exist
|
||||
- [ ] Output explicitly notes that no version baseline was found
|
||||
- [ ] Full commit history is used as the source
|
||||
- [ ] Changelog is still organized into sections despite missing tag
|
||||
|
||||
---
|
||||
|
||||
### Case 3: Commit Messages Without Task IDs — Grouped by date with note
|
||||
|
||||
**Fixture:**
|
||||
- Git log since last tag has 8 commits
|
||||
- 5 commits have no task ID in the message (e.g., "fix typo", "tweak values")
|
||||
- 3 commits reference task IDs matching sprint stories
|
||||
|
||||
**Input:** `/changelog`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads commits and sprint stories
|
||||
2. 3 commits are matched to sprint stories and placed in appropriate sections
|
||||
3. 5 untagged commits are grouped by date under a "Misc" or "Other Changes" section
|
||||
4. Output notes: "5 commits without task IDs — grouped by date"
|
||||
5. Skill writes changelog on approval
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Commits with task IDs are placed in appropriate sections (Features or Fixes)
|
||||
- [ ] Commits without task IDs are grouped separately with a note
|
||||
- [ ] Output flags the number of commits missing task references
|
||||
- [ ] No commits are silently dropped from the changelog
|
||||
|
||||
---
|
||||
|
||||
### Case 4: Existing CHANGELOG.md — New section prepended, old entries preserved
|
||||
|
||||
**Fixture:**
|
||||
- `docs/CHANGELOG.md` already exists with sections for `v0.2.0` and `v0.3.0`
|
||||
- New commits exist since `v0.3.0` tag
|
||||
|
||||
**Input:** `/changelog`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill detects that `docs/CHANGELOG.md` already exists
|
||||
2. Skill compiles new entries for the period since `v0.3.0`
|
||||
3. Skill presents draft with new section prepended above existing content
|
||||
4. Skill asks "May I write to `docs/CHANGELOG.md`?" (confirming prepend strategy)
|
||||
5. User approves; new content is prepended, old entries intact; verdict COMPLETE
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill reads existing changelog before writing to detect prior content
|
||||
- [ ] New section is prepended (not appended or overwriting) existing entries
|
||||
- [ ] Old changelog entries for v0.2.0 and v0.3.0 are preserved in the written file
|
||||
- [ ] "May I write" prompt reflects the prepend operation
|
||||
|
||||
---
|
||||
|
||||
### Case 5: Gate Compliance — No gate; read-then-write with approval
|
||||
|
||||
**Fixture:**
|
||||
- Git history has commits since last tag
|
||||
- `review-mode.txt` contains `full`
|
||||
|
||||
**Input:** `/changelog`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill compiles changelog in full mode
|
||||
2. No director gate is invoked (changelog generation is compilation, not a delivery gate)
|
||||
3. Skill runs on Haiku model — fast compilation
|
||||
4. Skill asks user for approval and writes file on confirmation
|
||||
|
||||
**Assertions:**
|
||||
- [ ] No director gate is invoked regardless of review mode
|
||||
- [ ] Output does not reference any gate result
|
||||
- [ ] Skill proceeds directly from compilation to "May I write" prompt
|
||||
- [ ] Verdict is COMPLETE
|
||||
|
||||
---
|
||||
|
||||
## Protocol Compliance
|
||||
|
||||
- [ ] Reads git log and sprint story files before compiling
|
||||
- [ ] Always asks "May I write" before writing changelog
|
||||
- [ ] No director gates are invoked
|
||||
- [ ] Verdict is always COMPLETE
|
||||
- [ ] Runs on Haiku model tier (fast, low-cost)
|
||||
|
||||
---
|
||||
|
||||
## Coverage Notes
|
||||
|
||||
- The case where git is not initialized in the repository is not tested;
|
||||
behavior would depend on git command failure handling.
|
||||
- Merge commits vs. squash commits are not explicitly differentiated in
|
||||
these tests; implementation detail of the git log parsing phase.
|
||||
- The `/patch-notes` skill should be run after `/changelog` for player-facing
|
||||
output; that handoff is verified in the patch-notes spec.
|
||||
171
CCGS Skill Testing Framework/skills/sprint/milestone-review.md
Normal file
171
CCGS Skill Testing Framework/skills/sprint/milestone-review.md
Normal file
@@ -0,0 +1,171 @@
|
||||
# Skill Test Spec: /milestone-review
|
||||
|
||||
## Skill Summary
|
||||
|
||||
`/milestone-review` generates a comprehensive review of a completed milestone:
|
||||
what shipped, velocity metrics, deferred items, risks surfaced, and retrospective
|
||||
seeds. In full mode the PR-MILESTONE director gate runs after the review is
|
||||
compiled (producer reviews scope delivery). In lean and solo modes the gate is
|
||||
skipped. The skill asks "May I write to `production/milestones/review-milestone-N.md`?"
|
||||
before persisting. Verdicts: MILESTONE COMPLETE or MILESTONE INCOMPLETE.
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
- [ ] Contains verdict keywords: MILESTONE COMPLETE, MILESTONE INCOMPLETE
|
||||
- [ ] Contains "May I write" language (skill writes review document)
|
||||
- [ ] Has a next-step handoff (what to do after review is written)
|
||||
|
||||
---
|
||||
|
||||
## Director Gate Checks
|
||||
|
||||
| Gate ID | Trigger condition | Mode guard |
|
||||
|---------------|--------------------------------|-------------------------|
|
||||
| PR-MILESTONE | After review document compiled | full only (not lean/solo) |
|
||||
|
||||
---
|
||||
|
||||
## Test Cases
|
||||
|
||||
### Case 1: Happy Path — Nearly complete milestone with one deferred story
|
||||
|
||||
**Fixture:**
|
||||
- `production/milestones/milestone-03.md` exists with 8 stories
|
||||
- 7 stories have `Status: Complete`
|
||||
- 1 story has `Status: Deferred` (deferred to milestone-04)
|
||||
- `review-mode.txt` contains `full`
|
||||
|
||||
**Input:** `/milestone-review milestone-03`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads `milestone-03.md` and all referenced sprint files
|
||||
2. Skill compiles: 7 shipped, 1 deferred; velocity; no blockers
|
||||
3. Skill presents review draft to user
|
||||
4. PR-MILESTONE gate invoked; producer approves
|
||||
5. Skill asks "May I write to `production/milestones/review-milestone-03.md`?"
|
||||
6. User approves; file is written; verdict MILESTONE COMPLETE
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Deferred story is noted in the review with its target milestone
|
||||
- [ ] Verdict is MILESTONE COMPLETE despite the one deferred story
|
||||
- [ ] PR-MILESTONE gate is invoked after draft compilation in full mode
|
||||
- [ ] Skill asks "May I write" before writing review file
|
||||
- [ ] Review document path matches `production/milestones/review-milestone-03.md`
|
||||
|
||||
---
|
||||
|
||||
### Case 2: Blocked Milestone — Multiple blocked stories
|
||||
|
||||
**Fixture:**
|
||||
- `production/milestones/milestone-03.md` exists with 5 stories
|
||||
- 2 stories have `Status: Complete`
|
||||
- 3 stories have `Status: Blocked` (named blockers listed in each story)
|
||||
- `review-mode.txt` contains `full`
|
||||
|
||||
**Input:** `/milestone-review milestone-03`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads milestone and sprint files
|
||||
2. Skill finds 3 blocked stories; compiles blocker details
|
||||
3. Verdict is MILESTONE INCOMPLETE
|
||||
4. PR-MILESTONE gate runs; producer notes the unresolved blockers
|
||||
5. Review is written with blocker list on approval
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Verdict is MILESTONE INCOMPLETE when any stories are Blocked
|
||||
- [ ] Each blocked story's name and blocker reason is listed in the review
|
||||
- [ ] PR-MILESTONE gate is still invoked in full mode even for INCOMPLETE verdict
|
||||
- [ ] "May I write" prompt still appears before file write
|
||||
|
||||
---
|
||||
|
||||
### Case 3: Full Mode — PR-MILESTONE returns CONCERNS
|
||||
|
||||
**Fixture:**
|
||||
- Milestone-03 has 6 complete stories but 2 were not in the original scope (added mid-sprint)
|
||||
- `review-mode.txt` contains `full`
|
||||
|
||||
**Input:** `/milestone-review milestone-03`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill compiles review; notes 2 out-of-scope stories shipped
|
||||
2. PR-MILESTONE gate invoked; producer returns CONCERNS about scope drift
|
||||
3. Skill surfaces the CONCERNS to the user and adds a "scope drift" note to the review
|
||||
4. User approves revised review; file written as MILESTONE COMPLETE with caveat
|
||||
|
||||
**Assertions:**
|
||||
- [ ] CONCERNS from PR-MILESTONE gate are shown to user before write
|
||||
- [ ] Scope drift is explicitly noted in the written review document
|
||||
- [ ] Verdict is MILESTONE COMPLETE (stories shipped) with CONCERNS annotation
|
||||
- [ ] Skill does not suppress gate feedback
|
||||
|
||||
---
|
||||
|
||||
### Case 4: Edge Case — No milestone file found for specified milestone
|
||||
|
||||
**Fixture:**
|
||||
- User calls `/milestone-review milestone-07`
|
||||
- `production/milestones/milestone-07.md` does NOT exist
|
||||
|
||||
**Input:** `/milestone-review milestone-07`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill attempts to read `production/milestones/milestone-07.md`
|
||||
2. File not found; skill outputs an error message
|
||||
3. Skill suggests checking available milestones in `production/milestones/`
|
||||
4. No gate is invoked; no file is written
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill does not crash when milestone file is absent
|
||||
- [ ] Output names the expected file path in the error message
|
||||
- [ ] Output suggests checking `production/milestones/` for valid milestone names
|
||||
- [ ] Verdict is BLOCKED (cannot review a non-existent milestone)
|
||||
|
||||
---
|
||||
|
||||
### Case 5: Lean/Solo Mode — PR-MILESTONE gate skipped
|
||||
|
||||
**Fixture:**
|
||||
- `production/milestones/milestone-03.md` exists with 5 complete stories
|
||||
- `review-mode.txt` contains `solo`
|
||||
|
||||
**Input:** `/milestone-review milestone-03`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads review mode — determines `solo`
|
||||
2. Skill compiles review draft
|
||||
3. PR-MILESTONE gate is skipped; output notes "[PR-MILESTONE] skipped — Solo mode"
|
||||
4. Skill asks user for direct approval of the review
|
||||
5. User approves; review file is written; verdict MILESTONE COMPLETE
|
||||
|
||||
**Assertions:**
|
||||
- [ ] PR-MILESTONE gate is NOT invoked in solo (or lean) mode
|
||||
- [ ] Skip is explicitly noted in skill output
|
||||
- [ ] User direct approval is still required before write
|
||||
- [ ] Verdict is MILESTONE COMPLETE after successful write
|
||||
|
||||
---
|
||||
|
||||
## Protocol Compliance
|
||||
|
||||
- [ ] Shows compiled review draft before invoking PR-MILESTONE or asking to write
|
||||
- [ ] Always asks "May I write" before writing review document
|
||||
- [ ] PR-MILESTONE gate only runs in full mode
|
||||
- [ ] Skip message appears in lean and solo output
|
||||
- [ ] Verdict is MILESTONE COMPLETE or MILESTONE INCOMPLETE, stated clearly
|
||||
|
||||
---
|
||||
|
||||
## Coverage Notes
|
||||
|
||||
- The case where the milestone has zero stories is not tested; it follows the
|
||||
MILESTONE INCOMPLETE pattern with a note suggesting the milestone may not
|
||||
have been planned.
|
||||
- Velocity calculation specifics (story points vs. story count) are not
|
||||
verified here; they are implementation details of the review compilation phase.
|
||||
170
CCGS Skill Testing Framework/skills/sprint/patch-notes.md
Normal file
170
CCGS Skill Testing Framework/skills/sprint/patch-notes.md
Normal file
@@ -0,0 +1,170 @@
|
||||
# Skill Test Spec: /patch-notes
|
||||
|
||||
## Skill Summary
|
||||
|
||||
`/patch-notes` is a Haiku-tier skill that generates player-facing patch notes
|
||||
from existing changelog content, stripping internal task IDs and technical
|
||||
jargon in favor of plain language. It filters entries to only those relevant
|
||||
to players (visible features and bug fixes; internal refactors are excluded).
|
||||
No director gates are used. The skill asks "May I write to
|
||||
`docs/patch-notes-vX.X.md`?" before persisting. Verdict is always COMPLETE.
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
- [ ] Contains verdict keyword: COMPLETE
|
||||
- [ ] Contains "May I write" language (skill writes patch notes file)
|
||||
- [ ] Has a next-step handoff (e.g., share with community manager)
|
||||
|
||||
---
|
||||
|
||||
## Director Gate Checks
|
||||
|
||||
None. Patch notes generation is a fast compilation task; no gates are invoked.
|
||||
|
||||
---
|
||||
|
||||
## Test Cases
|
||||
|
||||
### Case 1: Happy Path — Changelog filtered to player-facing entries
|
||||
|
||||
**Fixture:**
|
||||
- `docs/CHANGELOG.md` exists with 5 entries:
|
||||
- "Add dual-wield melee system" (Features — player-facing)
|
||||
- "Fix crash on level transition" (Fixes — player-facing)
|
||||
- "Add enemy patrol AI" (Features — player-facing)
|
||||
- "Refactor input handler to use event bus" (Fixes — internal only)
|
||||
- "Update dependency: Godot 4.6" (internal only)
|
||||
- Version is `v0.4.0`
|
||||
|
||||
**Input:** `/patch-notes v0.4.0`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads `docs/CHANGELOG.md`
|
||||
2. Skill filters to 3 player-facing entries; excludes 2 internal entries
|
||||
3. Skill rewrites entries in plain language (no task IDs, no tech jargon)
|
||||
4. Skill presents draft to user
|
||||
5. Skill asks "May I write to `docs/patch-notes-v0.4.0.md`?"
|
||||
6. User approves; file written; verdict COMPLETE
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Only 3 entries appear in the patch notes (2 internal entries excluded)
|
||||
- [ ] Entries are written in plain language without internal task IDs
|
||||
- [ ] File path matches `docs/patch-notes-v0.4.0.md`
|
||||
- [ ] "May I write" prompt appears before file write
|
||||
- [ ] Verdict is COMPLETE after write
|
||||
|
||||
---
|
||||
|
||||
### Case 2: No Changelog Found — Directed to run /changelog first
|
||||
|
||||
**Fixture:**
|
||||
- `docs/CHANGELOG.md` does NOT exist
|
||||
|
||||
**Input:** `/patch-notes v0.4.0`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill attempts to read `docs/CHANGELOG.md` — not found
|
||||
2. Skill outputs: "No changelog found — run /changelog first to generate one"
|
||||
3. No patch notes are generated; no file is written
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill does not crash when changelog is absent
|
||||
- [ ] Output explicitly directs user to run `/changelog`
|
||||
- [ ] No "May I write" prompt appears (nothing to write)
|
||||
- [ ] Verdict is BLOCKED (dependency not met)
|
||||
|
||||
---
|
||||
|
||||
### Case 3: Tone Guidance from Design Folder — Incorporated into output
|
||||
|
||||
**Fixture:**
|
||||
- `docs/CHANGELOG.md` exists with player-facing entries
|
||||
- `design/community/tone-guide.md` exists with guidance: "upbeat, encouraging tone; avoid passive voice"
|
||||
|
||||
**Input:** `/patch-notes v0.4.0`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads changelog
|
||||
2. Skill detects tone guide at `design/community/tone-guide.md`
|
||||
3. Skill applies tone guidance when rewriting entries in plain language
|
||||
4. Patch notes use upbeat, active-voice phrasing
|
||||
5. Skill presents draft, asks to write, writes on approval
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill checks `design/` for a community or tone guidance file
|
||||
- [ ] Tone guide content influences phrasing of patch note entries
|
||||
- [ ] Output reflects active voice and upbeat tone where applicable
|
||||
- [ ] Skill notes that tone guidance was applied
|
||||
|
||||
---
|
||||
|
||||
### Case 4: Patch Note Template Exists — Used instead of generated structure
|
||||
|
||||
**Fixture:**
|
||||
- `.claude/docs/templates/patch-notes-template.md` exists with a structured header format
|
||||
- `docs/CHANGELOG.md` exists with player-facing entries
|
||||
|
||||
**Input:** `/patch-notes v0.4.0`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads changelog and detects template exists
|
||||
2. Skill populates the template with player-facing entries
|
||||
3. Template header/footer structure is preserved in the output
|
||||
4. Skill asks "May I write" and writes on approval
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill checks for a patch notes template before generating from scratch
|
||||
- [ ] Template structure is used when found (not overridden by default format)
|
||||
- [ ] Player-facing entries are inserted into the correct template section
|
||||
- [ ] Output note confirms template was used
|
||||
|
||||
---
|
||||
|
||||
### Case 5: Gate Compliance — No gate; community-manager is separate
|
||||
|
||||
**Fixture:**
|
||||
- `docs/CHANGELOG.md` exists with player-facing entries
|
||||
- `review-mode.txt` contains `full`
|
||||
|
||||
**Input:** `/patch-notes v0.4.0`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill compiles patch notes in full mode
|
||||
2. No director gate is invoked (community review is a separate, manual step)
|
||||
3. Skill runs on Haiku model — fast compilation
|
||||
4. Skill notes in output: "Consider sharing draft with community manager before publishing"
|
||||
5. Skill asks user for approval and writes on confirmation
|
||||
|
||||
**Assertions:**
|
||||
- [ ] No director gate is invoked regardless of review mode
|
||||
- [ ] Output suggests (but does not require) community manager review
|
||||
- [ ] Skill proceeds directly from compilation to "May I write" prompt
|
||||
- [ ] Verdict is COMPLETE
|
||||
|
||||
---
|
||||
|
||||
## Protocol Compliance
|
||||
|
||||
- [ ] Reads `docs/CHANGELOG.md` before generating patch notes
|
||||
- [ ] Filters entries to player-facing items only
|
||||
- [ ] Rewrites entries in plain language without internal IDs
|
||||
- [ ] Always asks "May I write" before writing patch notes file
|
||||
- [ ] No director gates are invoked
|
||||
- [ ] Runs on Haiku model tier (fast, low-cost)
|
||||
|
||||
---
|
||||
|
||||
## Coverage Notes
|
||||
|
||||
- The case where all changelog entries are internal (zero player-facing items)
|
||||
is not tested; behavior is an empty patch notes draft with a warning.
|
||||
- Version number parsing from the changelog header is an implementation detail
|
||||
not verified here.
|
||||
- The community manager consultation noted in Case 5 is advisory; a separate
|
||||
skill or manual review handles that step.
|
||||
169
CCGS Skill Testing Framework/skills/sprint/retrospective.md
Normal file
169
CCGS Skill Testing Framework/skills/sprint/retrospective.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# Skill Test Spec: /retrospective
|
||||
|
||||
## Skill Summary
|
||||
|
||||
`/retrospective` generates a structured sprint or milestone retrospective
|
||||
covering three categories: what went well, what didn't, and action items.
|
||||
It reads sprint files and session logs to compile observations, then produces
|
||||
a retrospective document. No director gates are used — retrospectives are
|
||||
team self-reflection artifacts. The skill asks "May I write to
|
||||
`production/retrospectives/retro-sprint-NNN.md`?" before persisting.
|
||||
Verdict is always COMPLETE (retrospective is structured output, not a pass/fail
|
||||
assessment).
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
- [ ] Contains verdict keyword: COMPLETE
|
||||
- [ ] Contains "May I write" language (skill writes retrospective document)
|
||||
- [ ] Has a next-step handoff (what to do after retrospective is written)
|
||||
|
||||
---
|
||||
|
||||
## Director Gate Checks
|
||||
|
||||
None. Retrospectives are team self-reflection documents; no gates are invoked.
|
||||
|
||||
---
|
||||
|
||||
## Test Cases
|
||||
|
||||
### Case 1: Happy Path — Sprint with mixed outcomes
|
||||
|
||||
**Fixture:**
|
||||
- `production/sprints/sprint-005.md` exists with 6 stories (4 Complete, 1 Blocked, 1 Deferred)
|
||||
- `production/session-logs/` contains log entries for the sprint period
|
||||
- No prior retrospective exists for sprint-005
|
||||
|
||||
**Input:** `/retrospective sprint-005`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads sprint-005 and session logs
|
||||
2. Skill compiles three retrospective categories: went well (4 stories shipped),
|
||||
didn't (1 blocked, 1 deferred), and action items (address blocker root cause)
|
||||
3. Skill presents retrospective draft to user
|
||||
4. Skill asks "May I write to `production/retrospectives/retro-sprint-005.md`?"
|
||||
5. User approves; file is written; verdict COMPLETE
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Retrospective contains all three categories (went well / didn't / actions)
|
||||
- [ ] Blocked and deferred stories appear in the "what didn't" section
|
||||
- [ ] At least one action item is generated from the blocked story
|
||||
- [ ] Skill asks "May I write" before writing file
|
||||
- [ ] Verdict is COMPLETE after successful write
|
||||
|
||||
---
|
||||
|
||||
### Case 2: No Sprint Data — Manual input fallback
|
||||
|
||||
**Fixture:**
|
||||
- User calls `/retrospective sprint-009`
|
||||
- `production/sprints/sprint-009.md` does NOT exist
|
||||
- No session logs reference sprint-009
|
||||
|
||||
**Input:** `/retrospective sprint-009`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill attempts to read sprint-009 — not found
|
||||
2. Skill informs user that no sprint data was found for sprint-009
|
||||
3. Skill prompts user to provide retrospective input manually (went well, didn't, actions)
|
||||
4. User provides input; skill formats it into the retrospective structure
|
||||
5. Skill asks "May I write" and writes the document on approval
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill does not crash or produce an empty document when sprint file is absent
|
||||
- [ ] User is prompted to provide manual input
|
||||
- [ ] Manual input is formatted into the three-category structure
|
||||
- [ ] "May I write" prompt still appears before file write
|
||||
|
||||
---
|
||||
|
||||
### Case 3: Prior Retrospective Exists — Offer to append or replace
|
||||
|
||||
**Fixture:**
|
||||
- `production/retrospectives/retro-sprint-005.md` already exists with content
|
||||
- User re-runs `/retrospective sprint-005` after changes
|
||||
|
||||
**Input:** `/retrospective sprint-005`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill detects that `retro-sprint-005.md` already exists
|
||||
2. Skill presents user with choice: append new observations or replace existing file
|
||||
3. User selects "replace"; skill compiles fresh retrospective
|
||||
4. Skill asks "May I write to `production/retrospectives/retro-sprint-005.md`?" (confirming overwrite)
|
||||
5. File is overwritten; verdict COMPLETE
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill checks for existing retrospective file before compiling
|
||||
- [ ] User is offered append or replace choice — not silently overwritten
|
||||
- [ ] "May I write" prompt reflects the overwrite scenario
|
||||
- [ ] Verdict is COMPLETE after write regardless of append vs. replace
|
||||
|
||||
---
|
||||
|
||||
### Case 4: Edge Case — Unresolved action items from previous retrospective
|
||||
|
||||
**Fixture:**
|
||||
- `production/retrospectives/retro-sprint-004.md` exists with 2 action items marked `[ ]` (not done)
|
||||
- User runs `/retrospective sprint-005`
|
||||
|
||||
**Input:** `/retrospective sprint-005`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads the most recent prior retrospective (retro-sprint-004)
|
||||
2. Skill detects 2 unchecked action items from sprint-004
|
||||
3. Skill includes a "Carry-over from Sprint 004" section in the new retrospective
|
||||
4. The unresolved items are listed with a note that they were not followed up
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill reads the most recent prior retrospective to check for open action items
|
||||
- [ ] Unresolved action items appear in the new retrospective under a carry-over section
|
||||
- [ ] Carry-over items are distinct from newly generated action items
|
||||
- [ ] Output notes that these items were not followed up in the previous sprint
|
||||
|
||||
---
|
||||
|
||||
### Case 5: Gate Compliance — No gate invoked in any mode
|
||||
|
||||
**Fixture:**
|
||||
- `production/sprints/sprint-005.md` exists with complete stories
|
||||
- `production/session-state/review-mode.txt` contains `full`
|
||||
|
||||
**Input:** `/retrospective sprint-005`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill compiles retrospective in full mode
|
||||
2. No director gate is invoked (retrospectives are team self-reflection, not delivery gates)
|
||||
3. Skill asks user for approval and writes file on confirmation
|
||||
4. Verdict is COMPLETE
|
||||
|
||||
**Assertions:**
|
||||
- [ ] No director gate is invoked regardless of review mode
|
||||
- [ ] Output does not contain any gate invocation or gate result notation
|
||||
- [ ] Skill proceeds directly from compilation to "May I write" prompt
|
||||
- [ ] Review mode file content is irrelevant to this skill's behavior
|
||||
|
||||
---
|
||||
|
||||
## Protocol Compliance
|
||||
|
||||
- [ ] Always shows retrospective draft before asking to write
|
||||
- [ ] Always asks "May I write" before writing retrospective file
|
||||
- [ ] No director gates are invoked
|
||||
- [ ] Verdict is always COMPLETE (not a pass/fail skill)
|
||||
- [ ] Checks prior retrospective for unresolved action items
|
||||
|
||||
---
|
||||
|
||||
## Coverage Notes
|
||||
|
||||
- Milestone retrospectives (as opposed to sprint retrospectives) follow the
|
||||
same pattern but read milestone files instead of sprint files; not
|
||||
separately tested here.
|
||||
- The case where session logs are empty is similar to Case 2 (no data);
|
||||
the skill falls back to manual input in both situations.
|
||||
177
CCGS Skill Testing Framework/skills/sprint/sprint-plan.md
Normal file
177
CCGS Skill Testing Framework/skills/sprint/sprint-plan.md
Normal file
@@ -0,0 +1,177 @@
|
||||
# Skill Test Spec: /sprint-plan
|
||||
|
||||
## Skill Summary
|
||||
|
||||
`/sprint-plan` reads the current milestone file and backlog stories, then
|
||||
generates a new numbered sprint with stories prioritized by implementation layer
|
||||
and priority score. In full mode the PR-SPRINT director gate runs after the
|
||||
sprint draft is compiled (producer reviews the plan). In lean and solo modes
|
||||
the gate is skipped. The skill asks "May I write to `production/sprints/sprint-NNN.md`?"
|
||||
before persisting. Verdicts: COMPLETE (sprint generated and written) or
|
||||
BLOCKED (cannot proceed due to missing data or gate failure).
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
- [ ] Contains verdict keywords: COMPLETE, BLOCKED
|
||||
- [ ] Contains "May I write" language (skill writes sprint file)
|
||||
- [ ] Has a next-step handoff (what to do after sprint is written)
|
||||
|
||||
---
|
||||
|
||||
## Director Gate Checks
|
||||
|
||||
| Gate ID | Trigger condition | Mode guard |
|
||||
|-----------|--------------------------|--------------------|
|
||||
| PR-SPRINT | After sprint draft built | full only (not lean/solo) |
|
||||
|
||||
---
|
||||
|
||||
## Test Cases
|
||||
|
||||
### Case 1: Happy Path — Backlog with stories generates sprint
|
||||
|
||||
**Fixture:**
|
||||
- `production/milestones/milestone-02.md` exists with capacity `10 story points`
|
||||
- Backlog contains 5 unstarted stories across 2 epics, mixed priorities
|
||||
- `production/session-state/review-mode.txt` contains `full`
|
||||
- Next sprint number is `003` (sprints 001 and 002 already exist)
|
||||
|
||||
**Input:** `/sprint-plan`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads current milestone to obtain capacity and goals
|
||||
2. Skill reads all unstarted stories from backlog; sorts by layer + priority
|
||||
3. Skill drafts sprint-003 with stories fitting within capacity
|
||||
4. Skill presents draft to user before invoking gate
|
||||
5. Skill invokes PR-SPRINT gate (full mode); producer approves
|
||||
6. Skill asks "May I write to `production/sprints/sprint-003.md`?"
|
||||
7. User approves; file is written
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Stories are sorted by implementation layer before priority
|
||||
- [ ] Sprint draft is shown before any write or gate invocation
|
||||
- [ ] PR-SPRINT gate is invoked in full mode after draft is ready
|
||||
- [ ] Skill asks "May I write" before writing the sprint file
|
||||
- [ ] Written file path matches `production/sprints/sprint-003.md`
|
||||
- [ ] Verdict is COMPLETE after successful write
|
||||
|
||||
---
|
||||
|
||||
### Case 2: Blocked Path — Backlog is empty
|
||||
|
||||
**Fixture:**
|
||||
- `production/milestones/milestone-02.md` exists
|
||||
- No unstarted stories exist in any epic backlog
|
||||
|
||||
**Input:** `/sprint-plan`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads backlog — finds no unstarted stories
|
||||
2. Skill outputs "No unstarted stories in backlog"
|
||||
3. Skill suggests running `/create-stories` to populate the backlog
|
||||
4. No gate is invoked; no file is written
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Verdict is BLOCKED
|
||||
- [ ] Output contains "No unstarted stories" or equivalent message
|
||||
- [ ] Output recommends `/create-stories`
|
||||
- [ ] PR-SPRINT gate is NOT invoked
|
||||
- [ ] No write tool is called
|
||||
|
||||
---
|
||||
|
||||
### Case 3: Gate returns CONCERNS — Sprint overloaded, revised before write
|
||||
|
||||
**Fixture:**
|
||||
- Backlog has 8 stories totalling 16 points; milestone capacity is 10 points
|
||||
- `review-mode.txt` contains `full`
|
||||
|
||||
**Input:** `/sprint-plan`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill drafts sprint with all 8 stories (over capacity)
|
||||
2. PR-SPRINT gate runs; producer returns CONCERNS: sprint is overloaded
|
||||
3. Skill presents concern to user and asks which stories to defer
|
||||
4. User selects 3 stories to defer; sprint is revised to 5 stories / 10 points
|
||||
5. Skill asks "May I write" with revised sprint; writes on approval
|
||||
|
||||
**Assertions:**
|
||||
- [ ] CONCERNS from PR-SPRINT gate surfaces to user before any write
|
||||
- [ ] Skill allows sprint to be revised after gate feedback
|
||||
- [ ] Revised sprint (not original) is written to file
|
||||
- [ ] Verdict is COMPLETE after revision and write
|
||||
|
||||
---
|
||||
|
||||
### Case 4: Lean Mode — PR-SPRINT gate skipped
|
||||
|
||||
**Fixture:**
|
||||
- Backlog has 4 stories; milestone capacity is 8 points
|
||||
- `review-mode.txt` contains `lean`
|
||||
|
||||
**Input:** `/sprint-plan`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads review mode — determines `lean`
|
||||
2. Skill drafts sprint and presents it to user
|
||||
3. PR-SPRINT gate is skipped; output notes "[PR-SPRINT] skipped — Lean mode"
|
||||
4. Skill asks user for direct approval of the sprint
|
||||
5. User approves; sprint file is written
|
||||
|
||||
**Assertions:**
|
||||
- [ ] PR-SPRINT gate is NOT invoked in lean mode
|
||||
- [ ] Skip is explicitly noted in output
|
||||
- [ ] User approval is still required before write (gate skip ≠ approval skip)
|
||||
- [ ] Verdict is COMPLETE after write
|
||||
|
||||
---
|
||||
|
||||
### Case 5: Edge Case — Previous sprint still has open stories
|
||||
|
||||
**Fixture:**
|
||||
- `production/sprints/sprint-002.md` exists with 2 stories still `Status: In Progress`
|
||||
- Backlog has 5 new unstarted stories
|
||||
- `review-mode.txt` contains `full`
|
||||
|
||||
**Input:** `/sprint-plan`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads sprint-002 and detects 2 open (in-progress) stories
|
||||
2. Skill flags: "Sprint 002 has 2 open stories — confirm carry-over before planning sprint 003"
|
||||
3. Skill presents user with choice: carry stories over, defer them, or cancel
|
||||
4. User confirms carry-over; carried stories are prepended to new sprint with `[CARRY]` tag
|
||||
5. Sprint draft is built; PR-SPRINT gate runs; sprint is written on approval
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill checks the most recent sprint file for open stories
|
||||
- [ ] User is asked to confirm carry-over before sprint planning continues
|
||||
- [ ] Carried stories appear in the new sprint draft with a distinguishing label
|
||||
- [ ] Skill does not silently ignore open stories from the previous sprint
|
||||
|
||||
---
|
||||
|
||||
## Protocol Compliance
|
||||
|
||||
- [ ] Shows draft sprint before invoking PR-SPRINT gate or asking to write
|
||||
- [ ] Always asks "May I write" before writing sprint file
|
||||
- [ ] PR-SPRINT gate only runs in full mode
|
||||
- [ ] Skip message appears in lean and solo mode output
|
||||
- [ ] Verdict is clearly stated at the end of the skill output
|
||||
|
||||
---
|
||||
|
||||
## Coverage Notes
|
||||
|
||||
- The case where no milestone file exists is not explicitly tested; behavior
|
||||
follows the BLOCKED pattern with a suggestion to run `/gate-check` for
|
||||
milestone progression.
|
||||
- Solo mode behavior is equivalent to lean (gate skipped, user approval
|
||||
required) and is not separately tested.
|
||||
- Parallel story selection algorithms are not tested here; those are unit
|
||||
concerns for the sprint-plan subagent.
|
||||
167
CCGS Skill Testing Framework/skills/sprint/sprint-status.md
Normal file
167
CCGS Skill Testing Framework/skills/sprint/sprint-status.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# Skill Test Spec: /sprint-status
|
||||
|
||||
## Skill Summary
|
||||
|
||||
`/sprint-status` is a Haiku-tier read-only skill that reads the current active
|
||||
sprint file and the session state to produce a concise sprint health summary.
|
||||
It reports story counts by status (Complete / In Progress / Blocked / Not Started)
|
||||
and emits one of three sprint-health verdicts: ON TRACK, AT RISK, or BLOCKED.
|
||||
It never writes files and does not invoke any director gates. It is designed for
|
||||
fast, low-cost status checks during a session.
|
||||
|
||||
---
|
||||
|
||||
## 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: ON TRACK, AT RISK, BLOCKED
|
||||
- [ ] Does NOT require "May I write" language (read-only skill)
|
||||
- [ ] Has a next-step handoff (what to do based on the verdict)
|
||||
|
||||
---
|
||||
|
||||
## Director Gate Checks
|
||||
|
||||
None. `/sprint-status` is a read-only reporting skill; no gates are invoked.
|
||||
|
||||
---
|
||||
|
||||
## Test Cases
|
||||
|
||||
### Case 1: Happy Path — Mixed sprint, AT RISK with named blocker
|
||||
|
||||
**Fixture:**
|
||||
- `production/sprints/sprint-004.md` exists (active sprint, linked in `active.md`)
|
||||
- Sprint contains 6 stories:
|
||||
- 3 with `Status: Complete`
|
||||
- 2 with `Status: In Progress`
|
||||
- 1 with `Status: Blocked` (blocker: "Waiting on physics ADR acceptance")
|
||||
- Sprint end date is 2 days away
|
||||
|
||||
**Input:** `/sprint-status`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads `production/session-state/active.md` to find active sprint reference
|
||||
2. Skill reads `production/sprints/sprint-004.md`
|
||||
3. Skill counts stories by status: 3 Complete, 2 In Progress, 1 Blocked
|
||||
4. Skill detects a Blocked story and the approaching deadline
|
||||
5. Skill outputs AT RISK verdict with the blocker named explicitly
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Output includes story count breakdown by status
|
||||
- [ ] Output names the specific blocked story and its blocker reason
|
||||
- [ ] Verdict is AT RISK (not BLOCKED, not ON TRACK) when any story is Blocked
|
||||
- [ ] Skill does not write any files
|
||||
|
||||
---
|
||||
|
||||
### Case 2: All Stories Complete — Sprint COMPLETE verdict
|
||||
|
||||
**Fixture:**
|
||||
- `production/sprints/sprint-004.md` exists
|
||||
- All 5 stories have `Status: Complete`
|
||||
|
||||
**Input:** `/sprint-status`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads sprint file — all stories are Complete
|
||||
2. Skill outputs ON TRACK verdict or SPRINT COMPLETE label
|
||||
3. Skill suggests running `/milestone-review` or `/sprint-plan` as next steps
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Verdict is ON TRACK or SPRINT COMPLETE when all stories are Complete
|
||||
- [ ] Output notes that the sprint is fully done
|
||||
- [ ] Next-step suggestion references `/milestone-review` or `/sprint-plan`
|
||||
- [ ] No files are written
|
||||
|
||||
---
|
||||
|
||||
### Case 3: No Active Sprint File — Guidance to run /sprint-plan
|
||||
|
||||
**Fixture:**
|
||||
- `production/session-state/active.md` does not reference an active sprint
|
||||
- `production/sprints/` directory is empty or absent
|
||||
|
||||
**Input:** `/sprint-status`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads `active.md` — finds no active sprint reference
|
||||
2. Skill checks `production/sprints/` — finds no files
|
||||
3. Skill outputs an informational message: no active sprint detected
|
||||
4. Skill suggests running `/sprint-plan` to create one
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill does not error or crash when no sprint file exists
|
||||
- [ ] Output clearly states no active sprint was found
|
||||
- [ ] Output recommends `/sprint-plan` as the next action
|
||||
- [ ] No verdict keyword is emitted (no sprint to assess)
|
||||
|
||||
---
|
||||
|
||||
### Case 4: Edge Case — Stale In Progress Story (flagged)
|
||||
|
||||
**Fixture:**
|
||||
- `production/sprints/sprint-004.md` exists
|
||||
- One story has `Status: In Progress` with a note in `active.md`:
|
||||
`Last updated: 2026-03-30` (more than 2 days before today's session date)
|
||||
- No stories are Blocked
|
||||
|
||||
**Input:** `/sprint-status`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads sprint file and session state
|
||||
2. Skill detects the story has been In Progress for >2 days without update
|
||||
3. Skill flags the story as "stale" in the output
|
||||
4. Verdict is AT RISK (stale in-progress stories indicate a hidden blocker)
|
||||
|
||||
**Assertions:**
|
||||
- [ ] Skill compares story "last updated" metadata against session date
|
||||
- [ ] Stale In Progress story is flagged by name in the output
|
||||
- [ ] Verdict is AT RISK, not ON TRACK, when a stale story is detected
|
||||
- [ ] Output does not conflate "stale" with "Blocked" — the label is distinct
|
||||
|
||||
---
|
||||
|
||||
### Case 5: Gate Compliance — Read-only; no gate invocation
|
||||
|
||||
**Fixture:**
|
||||
- `production/sprints/sprint-004.md` exists with 4 stories (2 Complete, 2 In Progress)
|
||||
- `production/session-state/review-mode.txt` contains `full`
|
||||
|
||||
**Input:** `/sprint-status`
|
||||
|
||||
**Expected behavior:**
|
||||
1. Skill reads sprint and produces status summary
|
||||
2. Skill does NOT invoke any director gate regardless of review mode
|
||||
3. Output is a plain status report with ON TRACK, AT RISK, or BLOCKED verdict
|
||||
4. Skill does not prompt for user approval or ask to write any file
|
||||
|
||||
**Assertions:**
|
||||
- [ ] No director gate is invoked in any review mode
|
||||
- [ ] Output does not contain any "May I write" prompt
|
||||
- [ ] Skill completes and returns a verdict without user interaction
|
||||
- [ ] Review mode file is ignored (or confirmed irrelevant) by this skill
|
||||
|
||||
---
|
||||
|
||||
## Protocol Compliance
|
||||
|
||||
- [ ] Does NOT use Write or Edit tools (read-only skill)
|
||||
- [ ] Presents story count breakdown before emitting verdict
|
||||
- [ ] Does not ask for approval
|
||||
- [ ] Ends with a recommended next step based on verdict
|
||||
- [ ] Runs on Haiku model tier (fast, low-cost)
|
||||
|
||||
---
|
||||
|
||||
## Coverage Notes
|
||||
|
||||
- The case where multiple sprints are active simultaneously is not tested;
|
||||
the skill reads whichever sprint `active.md` references.
|
||||
- Partial sprint completion percentages are not explicitly verified; the
|
||||
count-by-status output implies them.
|
||||
- The `solo` mode review-mode variant is not separately tested; gate
|
||||
behavior in Case 5 applies to all modes equally.
|
||||
Reference in New Issue
Block a user