# 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.