fix(artifacts): register RETROSPECTIVE.md as canonical planning artifact (#3200)

* fix(artifacts): register RETROSPECTIVE.md as canonical planning artifact

Adds RETROSPECTIVE.md to CANONICAL_EXACT in artifacts.cjs so gsd-health
no longer raises W019 after any /gsd-complete-milestone run. The file was
established as a living artifact in PR #644 but omitted from the W019
registry created in PR #2488.

Closes #3198

* chore(changeset): point pr metadata to #3200
This commit is contained in:
Tom Boucher
2026-05-06 21:51:29 -04:00
committed by GitHub
parent d42f273838
commit e9a55b4794
4 changed files with 11 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
---
type: Fixed
pr: 3200
---
`gsd-health` no longer raises W019 for `RETROSPECTIVE.md` — the file is now registered in `CANONICAL_EXACT` in `artifacts.cjs`, matching its established status as a living artifact produced by `/gsd-complete-milestone`.

View File

@@ -22,6 +22,7 @@ const CANONICAL_EXACT = new Set([
'THREADS.md',
'config.json',
'CLAUDE.md',
'RETROSPECTIVE.md',
]);
// Pattern-match canonical file names (regex tests on the basename)

View File

@@ -22,6 +22,7 @@ These files live directly at `.planning/` — not inside phase subdirectories.
| `THREADS.md` | *(inline)* | `/gsd-thread` | Persistent discussion threads |
| `config.json` | `config.json` | `/gsd-new-project`, `/gsd-health --repair` | Project-specific GSD configuration |
| `CLAUDE.md` | `claude-md.md` | `/gsd-profile` | Auto-assembled Claude Code context file |
| `RETROSPECTIVE.md` | *(inline)* | `/gsd-complete-milestone` | Living milestone retrospective updated at each milestone close |
### Version-stamped artifacts (pattern: `vX.Y-*.md`)

View File

@@ -47,6 +47,10 @@ describe('artifacts.cjs — isCanonicalPlanningFile', () => {
assert.ok(isCanonicalPlanningFile('v2.3.1-MILESTONE-AUDIT.md'));
});
test('returns true for RETROSPECTIVE.md (produced by /gsd-complete-milestone)', () => {
assert.strictEqual(isCanonicalPlanningFile('RETROSPECTIVE.md'), true);
});
test('returns false for clearly non-canonical names', () => {
assert.strictEqual(isCanonicalPlanningFile('MY-NOTES.md'), false);
assert.strictEqual(isCanonicalPlanningFile('scratch.md'), false);