From e9a55b4794a32980a7a63faadd0c8fd4ef7ec878 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Wed, 6 May 2026 21:51:29 -0400 Subject: [PATCH] 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 --- .changeset/3198-retrospective-canonical.md | 5 +++++ get-shit-done/bin/lib/artifacts.cjs | 1 + get-shit-done/templates/README.md | 1 + tests/enh-2448-artifact-registry.test.cjs | 4 ++++ 4 files changed, 11 insertions(+) create mode 100644 .changeset/3198-retrospective-canonical.md 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);