diff --git a/.changeset/3198-retrospective-canonical.md b/.changeset/3198-retrospective-canonical.md new file mode 100644 index 000000000..16b2c39b7 --- /dev/null +++ b/.changeset/3198-retrospective-canonical.md @@ -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`. diff --git a/get-shit-done/bin/lib/artifacts.cjs b/get-shit-done/bin/lib/artifacts.cjs index f0eaac96d..f90c0659f 100644 --- a/get-shit-done/bin/lib/artifacts.cjs +++ b/get-shit-done/bin/lib/artifacts.cjs @@ -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) diff --git a/get-shit-done/templates/README.md b/get-shit-done/templates/README.md index 0b9121f2d..f81318043 100644 --- a/get-shit-done/templates/README.md +++ b/get-shit-done/templates/README.md @@ -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`) diff --git a/tests/enh-2448-artifact-registry.test.cjs b/tests/enh-2448-artifact-registry.test.cjs index 6c683d2bd..2e98cd989 100644 --- a/tests/enh-2448-artifact-registry.test.cjs +++ b/tests/enh-2448-artifact-registry.test.cjs @@ -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);