fix(#2204): phase-completion writes 'All phases complete' per ADR-2207 (#2259)

* fix(#2204): phase-completion writes 'All phases complete' per ADR-2207

completePhaseCore was writing the overloaded bare 'Milestone complete' on the
last phase — the same string space the milestone-close verb owns for terminal
state. Per ADR-2207, phase-completion now writes the existing intermediate
value 'All phases complete' (already used in gsd2-import.cts). Milestone
termination ('<version> milestone complete' / 'Awaiting next milestone')
remains solely with milestoneCompleteCore.

Status lifecycle: Ready to plan → All phases complete → <version> milestone
complete → Awaiting next milestone.

Changes:
- src/state-transition.cts: completePhaseCore status value
- src/phase.cts: #2028 guard comment
- tests/state-transition.test.cjs: assertion + test name
- tests/phase.test.cjs: 8 assertion updates (positive + negative)
- tests/state.test.cjs: normalizeStateStatus test case + reset regex
- tests/workstream.test.cjs: fixture status to terminal value
- gsd-core/workflows/progress.md: Route D label
- gsd-core/workflows/transition.md: Route B label
- CONTEXT.md: Status lifecycle glossary entry (ADR-2207)
- .changeset/brave-geese-jump.md

* test(#2204): regenerate golden-install-parity fixtures + workflow-size baseline

Workflow file edits (progress.md, transition.md) changed install payload
hashes and pushed past the committed workflow-size baseline. Regenerated
all 17 golden-install-parity fixtures + claude-local via the standalone gen
script (which now also covers the local-scope claude layout). Updated
workflow-size-baseline.json and agent-size-baseline.json via size:baseline.

* fix(#2204): correct claude-local golden hashes + document gen-script limitation

The gen-script's claude-local generation produces macOS-specific hashes
incompatible with Linux CI (local-scope install embeds platform-varying
node-runner paths). Reverted to manual update using Linux FAILURES.md
+actual hashes for the 2 changed workflow files. Added explanatory
comment in the gen script.

* test(#2204): add isCompletedInventory coverage + clarify CONTEXT.md glossary

Addresses orthogonal code-review findings (Medium #1 + #2):
- Add isCompletedInventory test cases for ADR-2207 status lifecycle
  (terminal 'milestone complete' → true; intermediate 'All phases
  complete' → false; archived → true; active statuses → false)
- Clarify CONTEXT.md glossary: note that isCompletedInventory
  intentionally excludes the intermediate value

* docs: backfill changeset PR number (#2259)

* docs(#2204): add Status lifecycle table to state-md reference (ADR-2207)
This commit is contained in:
Tom Boucher
2026-07-14 14:47:03 -04:00
committed by GitHub
parent c1885df9e5
commit 8b70db343b
33 changed files with 862 additions and 77 deletions

View File

@@ -279,7 +279,7 @@
"gsd-core/workflows/plant-seed.md": "6cf726be6427a35a",
"gsd-core/workflows/pr-branch.md": "dc5598ae8accdecd",
"gsd-core/workflows/profile-user.md": "355af92ac285567f",
"gsd-core/workflows/progress.md": "79a11ce798082054",
"gsd-core/workflows/progress.md": "4f0c285ce35553e3",
"gsd-core/workflows/quick.md": "424c0eb61769e747",
"gsd-core/workflows/reapply-patches.md": "4dcd6117d0a507ca",
"gsd-core/workflows/remove-phase.md": "23b9eb0858a2535e",
@@ -302,7 +302,7 @@
"gsd-core/workflows/stats.md": "b64bda5c0a1a06fb",
"gsd-core/workflows/sync-skills.md": "8326a7ff0411b077",
"gsd-core/workflows/thread.md": "31201839d0530e89",
"gsd-core/workflows/transition.md": "3eb5edaa5c95c0de",
"gsd-core/workflows/transition.md": "d3486f115d808175",
"gsd-core/workflows/ui-phase.md": "be51b5f5229ac856",
"gsd-core/workflows/ui-review.md": "ba558aaf1ad9f58d",
"gsd-core/workflows/ultraplan-phase.md": "d8e92b0b7214eba6",
@@ -328,7 +328,7 @@
"hooks/gsd-read-guard.js": "9e423cd03e2d1b16",
"hooks/gsd-read-injection-scanner.js": "eefea61f9b0e464c",
"hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
"hooks/gsd-statusline.js": "25996df685a0dac9",
"hooks/gsd-statusline.js": "8ae31be7a006204b",
"hooks/gsd-update-banner.js": "55143a25f978f301",
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",

View File

@@ -350,7 +350,7 @@
"gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede",
"gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b",
"gsd-core/workflows/profile-user.md": "14263db831230142",
"gsd-core/workflows/progress.md": "893aa3c36983f74b",
"gsd-core/workflows/progress.md": "281a77e800d11614",
"gsd-core/workflows/quick.md": "25f0cc40bc22ed3e",
"gsd-core/workflows/reapply-patches.md": "39050f72601aec89",
"gsd-core/workflows/remove-phase.md": "df9a45f0b1880999",
@@ -373,7 +373,7 @@
"gsd-core/workflows/stats.md": "76a42cbeaf6007c2",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "927e7eeefd2fcf5c",
"gsd-core/workflows/transition.md": "cb8ec5affb7ebba1",
"gsd-core/workflows/transition.md": "aea486bb7a0e80e7",
"gsd-core/workflows/ui-phase.md": "0ae35f603071630e",
"gsd-core/workflows/ui-review.md": "7acfc485526d064b",
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",
@@ -399,7 +399,7 @@
"hooks/gsd-read-guard.js": "9e423cd03e2d1b16",
"hooks/gsd-read-injection-scanner.js": "c8800819f7443a15",
"hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
"hooks/gsd-statusline.js": "2fab68f4fd190331",
"hooks/gsd-statusline.js": "3be32d2012c77fc1",
"hooks/gsd-update-banner.js": "55143a25f978f301",
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",

View File

@@ -278,7 +278,7 @@
"gsd-core/workflows/plant-seed.md": "af50e9f10d3cc6e1",
"gsd-core/workflows/pr-branch.md": "ab157cd8e49621dd",
"gsd-core/workflows/profile-user.md": "ff3820a27731ceb8",
"gsd-core/workflows/progress.md": "bd1ecf9207331bda",
"gsd-core/workflows/progress.md": "5ce5a11b468bd419",
"gsd-core/workflows/quick.md": "b4237633eaf5a246",
"gsd-core/workflows/reapply-patches.md": "ba9406b60f2c4041",
"gsd-core/workflows/remove-phase.md": "ada8a0546c686483",
@@ -301,7 +301,7 @@
"gsd-core/workflows/stats.md": "e7852c5d8f2b05a9",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "3b2c560d7189576d",
"gsd-core/workflows/transition.md": "f6731bbb766929e7",
"gsd-core/workflows/transition.md": "fb35a3de7feaa056",
"gsd-core/workflows/ui-phase.md": "05eb644af3a15516",
"gsd-core/workflows/ui-review.md": "7b488a7486a6b7cf",
"gsd-core/workflows/ultraplan-phase.md": "328664400a001fd5",
@@ -327,7 +327,7 @@
"hooks/gsd-read-guard.js": "9e423cd03e2d1b16",
"hooks/gsd-read-injection-scanner.js": "00d2449afefd2e5f",
"hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
"hooks/gsd-statusline.js": "4ad7c2f59577c5bc",
"hooks/gsd-statusline.js": "7c315416ffc99a9a",
"hooks/gsd-update-banner.js": "b457746cb76c1957",
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",

View File

@@ -282,7 +282,7 @@
"gsd-core/workflows/plant-seed.md": "a2cdd513663226f1",
"gsd-core/workflows/pr-branch.md": "9923878a4f6a2d91",
"gsd-core/workflows/profile-user.md": "26f74db0a7fcd268",
"gsd-core/workflows/progress.md": "9f326d63afb4b76b",
"gsd-core/workflows/progress.md": "c5ce768042ca9b8b",
"gsd-core/workflows/quick.md": "797b1c8d62c3d33d",
"gsd-core/workflows/reapply-patches.md": "eb4272145a117904",
"gsd-core/workflows/remove-phase.md": "e336350f8113a328",
@@ -305,7 +305,7 @@
"gsd-core/workflows/stats.md": "f9241bb65770c5a4",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "d71b1e815925c5cc",
"gsd-core/workflows/transition.md": "b9e41eb751375faf",
"gsd-core/workflows/transition.md": "6fa9751b097a3f52",
"gsd-core/workflows/ui-phase.md": "c7e6a2ab78e74c1b",
"gsd-core/workflows/ui-review.md": "8cd9605add21301e",
"gsd-core/workflows/ultraplan-phase.md": "ceff456b1e9d94d8",

View File

@@ -350,7 +350,7 @@
"gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede",
"gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b",
"gsd-core/workflows/profile-user.md": "4fa910d15dea5695",
"gsd-core/workflows/progress.md": "893aa3c36983f74b",
"gsd-core/workflows/progress.md": "281a77e800d11614",
"gsd-core/workflows/quick.md": "0bd83bd88c5e63d1",
"gsd-core/workflows/reapply-patches.md": "39050f72601aec89",
"gsd-core/workflows/remove-phase.md": "df9a45f0b1880999",
@@ -373,7 +373,7 @@
"gsd-core/workflows/stats.md": "76a42cbeaf6007c2",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "927e7eeefd2fcf5c",
"gsd-core/workflows/transition.md": "cb8ec5affb7ebba1",
"gsd-core/workflows/transition.md": "aea486bb7a0e80e7",
"gsd-core/workflows/ui-phase.md": "e4bef31fd9389c63",
"gsd-core/workflows/ui-review.md": "7acfc485526d064b",
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",
@@ -399,7 +399,7 @@
"hooks/gsd-read-guard.js": "9e423cd03e2d1b16",
"hooks/gsd-read-injection-scanner.js": "7f7a7615b303369a",
"hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
"hooks/gsd-statusline.js": "29cdce15038d1ab1",
"hooks/gsd-statusline.js": "ef8dcb6d64fd4493",
"hooks/gsd-update-banner.js": "55143a25f978f301",
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",

View File

@@ -385,7 +385,7 @@
"gsd-core/workflows/plant-seed.md": "5b07de07e4593281",
"gsd-core/workflows/pr-branch.md": "d13e1cc81de40896",
"gsd-core/workflows/profile-user.md": "05828c8cc61ef384",
"gsd-core/workflows/progress.md": "7bedc431bb55edb8",
"gsd-core/workflows/progress.md": "7ec6495e273904cf",
"gsd-core/workflows/quick.md": "bf70b7beb314aa50",
"gsd-core/workflows/reapply-patches.md": "26297b84736e66a4",
"gsd-core/workflows/remove-phase.md": "9ee0fddd11a0d9d4",
@@ -408,7 +408,7 @@
"gsd-core/workflows/stats.md": "6dfc500555849d74",
"gsd-core/workflows/sync-skills.md": "e2b793963799f8ce",
"gsd-core/workflows/thread.md": "3eef3b6baf50fbfa",
"gsd-core/workflows/transition.md": "423d12e392f5cb87",
"gsd-core/workflows/transition.md": "de3c63b3f62e6988",
"gsd-core/workflows/ui-phase.md": "989eefe25c06ae48",
"gsd-core/workflows/ui-review.md": "5768b7aac1429ea0",
"gsd-core/workflows/ultraplan-phase.md": "0bafc2af27be4591",

View File

@@ -280,7 +280,7 @@
"gsd-core/workflows/plant-seed.md": "21e461cd39e5181b",
"gsd-core/workflows/pr-branch.md": "2833905f119b5722",
"gsd-core/workflows/profile-user.md": "5cc032206c99ef71",
"gsd-core/workflows/progress.md": "6b9a84a43dc55af5",
"gsd-core/workflows/progress.md": "9bd7472d2efe14dd",
"gsd-core/workflows/quick.md": "4a53899b69b8c801",
"gsd-core/workflows/reapply-patches.md": "8fd59e24b486f180",
"gsd-core/workflows/remove-phase.md": "e262654e319d1bc4",
@@ -303,7 +303,7 @@
"gsd-core/workflows/stats.md": "1db01bd96aa570fe",
"gsd-core/workflows/sync-skills.md": "eca50ffe8320dba8",
"gsd-core/workflows/thread.md": "c5cbd66223906998",
"gsd-core/workflows/transition.md": "0bb671f58f9522f3",
"gsd-core/workflows/transition.md": "9219cd7c61e3323f",
"gsd-core/workflows/ui-phase.md": "646b99f22a6e4762",
"gsd-core/workflows/ui-review.md": "2851b3576894ee75",
"gsd-core/workflows/ultraplan-phase.md": "7217c34dc9eaf7bb",

View File

@@ -350,7 +350,7 @@
"gsd-core/workflows/plant-seed.md": "7bccd151ce7b69f2",
"gsd-core/workflows/pr-branch.md": "c67d90c65da47168",
"gsd-core/workflows/profile-user.md": "8c943983241260b5",
"gsd-core/workflows/progress.md": "65aabee5e8a6dd82",
"gsd-core/workflows/progress.md": "a980339715a431f0",
"gsd-core/workflows/quick.md": "3b37350964cfe391",
"gsd-core/workflows/reapply-patches.md": "ba9406b60f2c4041",
"gsd-core/workflows/remove-phase.md": "ada8a0546c686483",
@@ -373,7 +373,7 @@
"gsd-core/workflows/stats.md": "e7852c5d8f2b05a9",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "bf9a944978dad763",
"gsd-core/workflows/transition.md": "f6731bbb766929e7",
"gsd-core/workflows/transition.md": "fb35a3de7feaa056",
"gsd-core/workflows/ui-phase.md": "d1ae54a7ba413d69",
"gsd-core/workflows/ui-review.md": "4bc0fd55fc037998",
"gsd-core/workflows/ultraplan-phase.md": "466e01d65c350ef6",

View File

@@ -279,7 +279,7 @@
"gsd-core/workflows/plant-seed.md": "f862f77fca983749",
"gsd-core/workflows/pr-branch.md": "ecabd55e4eabf229",
"gsd-core/workflows/profile-user.md": "de5030437226cf2c",
"gsd-core/workflows/progress.md": "f18db000584d9cb1",
"gsd-core/workflows/progress.md": "2641aa5457ab784f",
"gsd-core/workflows/quick.md": "731c20b5605bd319",
"gsd-core/workflows/reapply-patches.md": "158083a310859594",
"gsd-core/workflows/remove-phase.md": "fce799aae3ab2715",
@@ -302,7 +302,7 @@
"gsd-core/workflows/stats.md": "49a991d0d3905a56",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "5a6759e01763c2a6",
"gsd-core/workflows/transition.md": "2f65c0e12675ea08",
"gsd-core/workflows/transition.md": "bcfaad44668d07fd",
"gsd-core/workflows/ui-phase.md": "a45a9409c26699f4",
"gsd-core/workflows/ui-review.md": "bc0ae72c0e1cab94",
"gsd-core/workflows/ultraplan-phase.md": "0d103bf2622436f7",
@@ -328,7 +328,7 @@
"hooks/gsd-read-guard.js": "1f58b020a91f032b",
"hooks/gsd-read-injection-scanner.js": "f358eca3fa1eab24",
"hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
"hooks/gsd-statusline.js": "884347ccd6549f29",
"hooks/gsd-statusline.js": "861808560e60b233",
"hooks/gsd-update-banner.js": "b457746cb76c1957",
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",

View File

@@ -350,7 +350,7 @@
"gsd-core/workflows/plant-seed.md": "ffa5774304243649",
"gsd-core/workflows/pr-branch.md": "ab157cd8e49621dd",
"gsd-core/workflows/profile-user.md": "203ebe3f8f3876a8",
"gsd-core/workflows/progress.md": "9381c59676ccb937",
"gsd-core/workflows/progress.md": "fb1ea7476a839fd8",
"gsd-core/workflows/quick.md": "4ddd6d3214f57f57",
"gsd-core/workflows/reapply-patches.md": "becf9728cdb124c4",
"gsd-core/workflows/remove-phase.md": "ada8a0546c686483",
@@ -373,7 +373,7 @@
"gsd-core/workflows/stats.md": "e7852c5d8f2b05a9",
"gsd-core/workflows/sync-skills.md": "dc7b8b015afa4b3b",
"gsd-core/workflows/thread.md": "3b2c560d7189576d",
"gsd-core/workflows/transition.md": "caf7616dc597ad86",
"gsd-core/workflows/transition.md": "590128488fe2ad66",
"gsd-core/workflows/ui-phase.md": "47ae6541bbfdf2b6",
"gsd-core/workflows/ui-review.md": "0fb289914252d53e",
"gsd-core/workflows/ultraplan-phase.md": "29245758b8497fa0",

View File

@@ -18,7 +18,7 @@
".kimi/hooks/gsd-read-guard.js": "9e423cd03e2d1b16",
".kimi/hooks/gsd-read-injection-scanner.js": "c519598b9257aafa",
".kimi/hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
".kimi/hooks/gsd-statusline.js": "be35341758d50fa5",
".kimi/hooks/gsd-statusline.js": "2736b0885aa97bbf",
".kimi/hooks/gsd-update-banner.js": "55143a25f978f301",
".kimi/hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
".kimi/hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",
@@ -343,7 +343,7 @@
"gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede",
"gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b",
"gsd-core/workflows/profile-user.md": "5abfae83739fa978",
"gsd-core/workflows/progress.md": "893aa3c36983f74b",
"gsd-core/workflows/progress.md": "281a77e800d11614",
"gsd-core/workflows/quick.md": "8dcda37c46954ebe",
"gsd-core/workflows/reapply-patches.md": "39050f72601aec89",
"gsd-core/workflows/remove-phase.md": "df9a45f0b1880999",
@@ -366,7 +366,7 @@
"gsd-core/workflows/stats.md": "76a42cbeaf6007c2",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "927e7eeefd2fcf5c",
"gsd-core/workflows/transition.md": "cb8ec5affb7ebba1",
"gsd-core/workflows/transition.md": "aea486bb7a0e80e7",
"gsd-core/workflows/ui-phase.md": "d02054ab9f01abb4",
"gsd-core/workflows/ui-review.md": "7acfc485526d064b",
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",

View File

@@ -350,7 +350,7 @@
"gsd-core/workflows/plant-seed.md": "b8dad652e31c2318",
"gsd-core/workflows/pr-branch.md": "929b7cb0c99c7b9e",
"gsd-core/workflows/profile-user.md": "248d59a31948e0ed",
"gsd-core/workflows/progress.md": "8fc3404087f50b95",
"gsd-core/workflows/progress.md": "8e01238a8ac6b73d",
"gsd-core/workflows/quick.md": "774d646560a74c93",
"gsd-core/workflows/reapply-patches.md": "a0e9b53f90abceb2",
"gsd-core/workflows/remove-phase.md": "dea4661e8f89596f",
@@ -373,7 +373,7 @@
"gsd-core/workflows/stats.md": "846cd2808461ccdc",
"gsd-core/workflows/sync-skills.md": "7e2c138cdbef4282",
"gsd-core/workflows/thread.md": "82652edb1883af59",
"gsd-core/workflows/transition.md": "a66f117fad29d65a",
"gsd-core/workflows/transition.md": "372b6fc7c0c68a89",
"gsd-core/workflows/ui-phase.md": "4d11cc725ebfe597",
"gsd-core/workflows/ui-review.md": "149f39373eee5c92",
"gsd-core/workflows/ultraplan-phase.md": "f4bad8de3fdb49fa",
@@ -399,7 +399,7 @@
"hooks/gsd-read-guard.js": "9e423cd03e2d1b16",
"hooks/gsd-read-injection-scanner.js": "f72060dfe035f706",
"hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
"hooks/gsd-statusline.js": "6fcb59ad86d2d0ea",
"hooks/gsd-statusline.js": "9c132b5985800462",
"hooks/gsd-update-banner.js": "55143a25f978f301",
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",

View File

@@ -246,7 +246,7 @@
"gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede",
"gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b",
"gsd-core/workflows/profile-user.md": "1bac7f69142801ef",
"gsd-core/workflows/progress.md": "893aa3c36983f74b",
"gsd-core/workflows/progress.md": "281a77e800d11614",
"gsd-core/workflows/quick.md": "31787c1e8a867e3f",
"gsd-core/workflows/reapply-patches.md": "39050f72601aec89",
"gsd-core/workflows/remove-phase.md": "df9a45f0b1880999",
@@ -269,7 +269,7 @@
"gsd-core/workflows/stats.md": "76a42cbeaf6007c2",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "927e7eeefd2fcf5c",
"gsd-core/workflows/transition.md": "cb8ec5affb7ebba1",
"gsd-core/workflows/transition.md": "aea486bb7a0e80e7",
"gsd-core/workflows/ui-phase.md": "d77fa19403a4684b",
"gsd-core/workflows/ui-review.md": "7acfc485526d064b",
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",
@@ -295,7 +295,7 @@
"hooks/gsd-read-guard.js": "9e423cd03e2d1b16",
"hooks/gsd-read-injection-scanner.js": "f454242c010804cf",
"hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
"hooks/gsd-statusline.js": "daa1a98fde95ccaf",
"hooks/gsd-statusline.js": "5539e1ae859b987e",
"hooks/gsd-update-banner.js": "55143a25f978f301",
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",

View File

@@ -279,7 +279,7 @@
"gsd-core/workflows/plant-seed.md": "0a92ba12993ac261",
"gsd-core/workflows/pr-branch.md": "cef0f65b16d500b4",
"gsd-core/workflows/profile-user.md": "263c0693563d98da",
"gsd-core/workflows/progress.md": "3b1b2142a74af85c",
"gsd-core/workflows/progress.md": "b1b3f88614d6b9cc",
"gsd-core/workflows/quick.md": "d0fffe516abaf47a",
"gsd-core/workflows/reapply-patches.md": "de0ee8acfe7245b2",
"gsd-core/workflows/remove-phase.md": "e8ae4fbbfac700f0",
@@ -302,7 +302,7 @@
"gsd-core/workflows/stats.md": "89a08155b92f4a2d",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "f24b6454c69d064a",
"gsd-core/workflows/transition.md": "9c615db5686219d0",
"gsd-core/workflows/transition.md": "a30cba2ad6920641",
"gsd-core/workflows/ui-phase.md": "041cb6bcb496881d",
"gsd-core/workflows/ui-review.md": "8b989f372684851f",
"gsd-core/workflows/ultraplan-phase.md": "49921383982474e0",
@@ -328,7 +328,7 @@
"hooks/gsd-read-guard.js": "2c8d417d12b51040",
"hooks/gsd-read-injection-scanner.js": "396574bd25e99ff9",
"hooks/gsd-session-state.sh": "e54379ba86bf1b6d",
"hooks/gsd-statusline.js": "2541196849ec5ffc",
"hooks/gsd-statusline.js": "739140996a3c0d49",
"hooks/gsd-update-banner.js": "b457746cb76c1957",
"hooks/gsd-validate-commit.sh": "bf5dd61d33cb3a38",
"hooks/gsd-windsurf-pre-command.js": "948be1c6d14c79cd",

View File

@@ -279,7 +279,7 @@
"gsd-core/workflows/plant-seed.md": "856ad565b2eb0c47",
"gsd-core/workflows/pr-branch.md": "79fd55b88ea2db9c",
"gsd-core/workflows/profile-user.md": "672821e6b1266645",
"gsd-core/workflows/progress.md": "94768f835b0b8908",
"gsd-core/workflows/progress.md": "e7d05715aff75881",
"gsd-core/workflows/quick.md": "0529abcf9913ec04",
"gsd-core/workflows/reapply-patches.md": "21b38c374f19fd78",
"gsd-core/workflows/remove-phase.md": "a46c2fe853bf4e86",
@@ -302,7 +302,7 @@
"gsd-core/workflows/stats.md": "e4f84542fb5721ef",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "0582c6be8a78bbd8",
"gsd-core/workflows/transition.md": "163d220813b0835f",
"gsd-core/workflows/transition.md": "45dc17cc631dc485",
"gsd-core/workflows/ui-phase.md": "0c4c1a26a4297ac3",
"gsd-core/workflows/ui-review.md": "4e70afbfd5601853",
"gsd-core/workflows/ultraplan-phase.md": "77b58ef8af5209bd",

View File

@@ -279,7 +279,7 @@
"gsd-core/workflows/plant-seed.md": "6cf61f540cdbd8b9",
"gsd-core/workflows/pr-branch.md": "acd59f915d018ad4",
"gsd-core/workflows/profile-user.md": "c4313672b81b5bcd",
"gsd-core/workflows/progress.md": "18813a345bd2343a",
"gsd-core/workflows/progress.md": "d4a4f96975419d09",
"gsd-core/workflows/quick.md": "71fbcf38e2305de0",
"gsd-core/workflows/reapply-patches.md": "d449a23d3acf6379",
"gsd-core/workflows/remove-phase.md": "e7a6af429b36e77b",
@@ -302,7 +302,7 @@
"gsd-core/workflows/stats.md": "d58325fc3fb8d1b6",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "d83a0d0bd0f94c4c",
"gsd-core/workflows/transition.md": "1bd8a772f0aac5ba",
"gsd-core/workflows/transition.md": "5e2c96544e9981ed",
"gsd-core/workflows/ui-phase.md": "829285b180dd7b9e",
"gsd-core/workflows/ui-review.md": "dca8100a43161ea7",
"gsd-core/workflows/ultraplan-phase.md": "53b77a8edf60acd0",

View File

@@ -350,7 +350,7 @@
"gsd-core/workflows/plant-seed.md": "10b92ae08a6fdede",
"gsd-core/workflows/pr-branch.md": "c87db7ac8c28be1b",
"gsd-core/workflows/profile-user.md": "e23bea0a69c0bb4b",
"gsd-core/workflows/progress.md": "893aa3c36983f74b",
"gsd-core/workflows/progress.md": "281a77e800d11614",
"gsd-core/workflows/quick.md": "7ad8d250c536c4dd",
"gsd-core/workflows/reapply-patches.md": "39050f72601aec89",
"gsd-core/workflows/remove-phase.md": "df9a45f0b1880999",
@@ -373,7 +373,7 @@
"gsd-core/workflows/stats.md": "76a42cbeaf6007c2",
"gsd-core/workflows/sync-skills.md": "b505e6f8331c0918",
"gsd-core/workflows/thread.md": "927e7eeefd2fcf5c",
"gsd-core/workflows/transition.md": "cb8ec5affb7ebba1",
"gsd-core/workflows/transition.md": "aea486bb7a0e80e7",
"gsd-core/workflows/ui-phase.md": "98d044ed4d7163d7",
"gsd-core/workflows/ui-review.md": "7acfc485526d064b",
"gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d",

View File

@@ -2940,7 +2940,7 @@ describe('phase complete command', () => {
assert.strictEqual(output.next_phase, null, 'no next phase');
const state = fs.readFileSync(path.join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
assert.ok(state.includes('Milestone complete'), 'status should be milestone complete');
assert.ok(state.includes('All phases complete'), 'status should be All phases complete');
});
// #1591: when the active milestone's phase checklist is wrapped in a
@@ -3031,8 +3031,8 @@ describe('phase complete command', () => {
// still in progress.
const state = fs.readFileSync(path.join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
assert.ok(
!/Milestone complete/i.test(state),
'a mid-milestone phase must not flip STATE.md to "Milestone complete" (#1591)',
!/Milestone complete|All phases complete/i.test(state),
'a mid-milestone phase must not flip STATE.md to milestone-complete (#1591)',
);
});
@@ -3101,8 +3101,8 @@ describe('phase complete command', () => {
const state = fs.readFileSync(path.join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
assert.ok(
!/Milestone complete/i.test(state),
'a mid-milestone phase must not flip STATE.md to "Milestone complete" — bold checklist (#1591)',
!/Milestone complete|All phases complete/i.test(state),
'a mid-milestone phase must not flip STATE.md to milestone-complete — bold checklist (#1591)',
);
});
@@ -3182,8 +3182,8 @@ describe('phase complete command', () => {
const state = fs.readFileSync(path.join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
assert.ok(
!/Milestone complete/i.test(state),
'a mid-milestone phase must not flip STATE.md to "Milestone complete" (#1752)',
!/Milestone complete|All phases complete/i.test(state),
'a mid-milestone phase must not flip STATE.md to milestone-complete (#1752)',
);
const tpMatch = state.match(/total_phases:\s*(\d+)/);
assert.ok(tpMatch, 'STATE.md must carry a total_phases value after phase.complete');
@@ -3747,7 +3747,7 @@ describe('phase complete command', () => {
assert.ok(result.success, `Command failed: ${result.error}`);
const state = fs.readFileSync(path.join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
assert.ok(state.includes('Milestone complete'), 'plain Status field should be updated');
assert.ok(state.includes('All phases complete'), 'plain Status field should be updated');
assert.ok(state.includes('Not started'), 'plain Plan field should be updated');
// Verify compound format preserved
assert.ok(state.match(/Phase:.*of\s+1/), 'should preserve "of N" in compound Phase format');
@@ -4169,7 +4169,7 @@ describe('#2028 — phase complete milestone-end + workstream guard', () => {
// A complement phase numbered AFTER Phase 9 but executed first. Completing the
// numerically-highest phase must not read as milestone-end while a lower phase
// is still outstanding (the isLastPhase blocks only checked for HIGHER phases).
test('does NOT stamp "Milestone complete" when a lower-numbered phase is still outstanding', () => {
test('does NOT stamp "All phases complete" when a lower-numbered phase is still outstanding', () => {
fs.writeFileSync(
path.join(tmpDir, '.planning', 'ROADMAP.md'),
`# Roadmap\n\n- [ ] Phase 9: Introspection\n- [ ] Phase 10: Complement\n\n### Phase 9: Introspection\n**Goal:** baseline\n\n### Phase 10: Complement\n**Goal:** complement\n`
@@ -4198,8 +4198,8 @@ describe('#2028 — phase complete milestone-end + workstream guard', () => {
const state = fs.readFileSync(path.join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
assert.ok(
!/Milestone complete/i.test(state),
'STATE.md must NOT flip to "Milestone complete" while a lower phase is outstanding',
!/Milestone complete|All phases complete/i.test(state),
'STATE.md must NOT flip to milestone-complete while a lower phase is outstanding',
);
assert.ok(/Ready to plan/i.test(state), 'status should be "Ready to plan"');
assert.match(
@@ -4236,7 +4236,7 @@ describe('#2028 — phase complete milestone-end + workstream guard', () => {
const output = JSON.parse(result.output);
assert.strictEqual(output.is_last_phase, true, 'all lower phases complete → Phase 10 is milestone-end');
const state = fs.readFileSync(path.join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
assert.ok(/Milestone complete/i.test(state), 'status should be "Milestone complete"');
assert.ok(/All phases complete/i.test(state), 'status should be "All phases complete"');
});
// The lower-phase scan must not treat an unrelated checklist line that merely
@@ -4318,9 +4318,9 @@ describe('#2028 — phase complete milestone-end + workstream guard', () => {
rootState,
'root STATE.md must NOT be written when --ws targets a workstream',
);
// The workstream's own STATE.md advanced (single phase → milestone complete).
// The workstream's own STATE.md advanced (single phase → all phases complete).
const wsState = fs.readFileSync(path.join(wsDir, 'STATE.md'), 'utf-8');
assert.match(wsState, /Milestone complete/i, "the workstream's STATE.md should be the one updated");
assert.match(wsState, /All phases complete/i, "the workstream's STATE.md should be the one updated");
});
// The guard only fires in workstream mode — a flat project (no workstreams dir)

View File

@@ -604,13 +604,13 @@ describe('ADR-1769 Phase 3: completePhase transition — body field updates', ()
assert.strictEqual(stateExtractField(result.content, 'Status'), 'Ready to plan');
});
test('Status becomes "Milestone complete" when isLastPhase is true', () => {
test('Status becomes "All phases complete" when isLastPhase is true', () => {
const result = transitionCore(
completePhaseBody(),
{ kind: 'completePhase', phaseNum: '5', nextPhaseNum: null, nextPhaseName: null, isLastPhase: true, planCount: 2, summaryCount: 2 },
deps,
);
assert.strictEqual(stateExtractField(result.content, 'Status'), 'Milestone complete');
assert.strictEqual(stateExtractField(result.content, 'Status'), 'All phases complete');
});
test('Current Plan resets to "Not started"', () => {

View File

@@ -498,6 +498,7 @@ stopped_at: Plan 2 of Phase 3
{ input: 'Ready to plan', expected: 'planning' },
{ input: 'Phase complete — ready for verification', expected: 'verifying' },
{ input: 'Milestone complete', expected: 'completed' },
{ input: 'All phases complete', expected: 'completed' },
];
for (const { input, expected } of statusTests) {
@@ -2053,7 +2054,7 @@ describe('progress counters correct after plan execution (#1589)', () => {
);
// Trigger a STATE.md write (e.g. state update Status)
const result = runGsdTools('state update Status "Milestone complete"', tmpDir);
const result = runGsdTools('state update Status "All phases complete"', tmpDir);
assert.ok(result.success, `Command failed: ${result.error}`);
// Read the frontmatter — percent must be derived from disk (4/4 = 100%), not from body "0%"
@@ -2296,7 +2297,7 @@ describe('updatePerformanceMetricsSection', () => {
const afterFirst = fs.readFileSync(statePath, 'utf-8');
// Reset state so we can complete again
let resetContent = afterFirst.replace(/Milestone complete|Ready to plan/, 'Executing Phase 5');
let resetContent = afterFirst.replace(/All phases complete|Ready to plan/, 'Executing Phase 5');
resetContent = resetContent.replace(/Not started/, '1');
fs.writeFileSync(statePath, resetContent);

View File

@@ -58,7 +58,7 @@
"plant-seed.md": 11785,
"pr-branch.md": 15963,
"profile-user.md": 21246,
"progress.md": 30599,
"progress.md": 30628,
"quick.md": 50699,
"reapply-patches.md": 20312,
"remove-phase.md": 8513,
@@ -81,7 +81,7 @@
"stats.md": 6762,
"sync-skills.md": 6125,
"thread.md": 12508,
"transition.md": 22060,
"transition.md": 22070,
"ui-phase.md": 26054,
"ui-review.md": 11216,
"ultraplan-phase.md": 10512,

View File

@@ -11,7 +11,7 @@ const fs = require('fs');
const path = require('path');
const { cleanup } = require('./helpers.cjs');
const { createFixture, seedWorkstream } = require('./fixtures/index.cjs');
const { buildWorkstreamInventory } = require('../gsd-core/bin/lib/workstream-inventory-builder.cjs');
const { buildWorkstreamInventory, isCompletedInventory } = require('../gsd-core/bin/lib/workstream-inventory-builder.cjs');
const { inspectWorkstream } = require('../gsd-core/bin/lib/workstream-inventory.cjs');
const STALE_STATE = 'status: executing\n';
@@ -101,3 +101,26 @@ describe('#1913 — workstream status derived from authoritative shipped signals
assert.equal(inv.status_conflict, false);
});
});
describe('isCompletedInventory — ADR-2207 status lifecycle', () => {
test('terminal "milestone complete" variants are completed', () => {
assert.ok(isCompletedInventory('1.0 milestone complete'));
assert.ok(isCompletedInventory('Milestone complete'));
assert.ok(isCompletedInventory('milestone complete'));
});
test('intermediate "All phases complete" is NOT completed (ADR-2207)', () => {
assert.ok(!isCompletedInventory('All phases complete'),
'All phases complete is an intermediate state — milestone not yet formally closed');
});
test('archived is completed', () => {
assert.ok(isCompletedInventory('archived'));
});
test('active statuses are NOT completed', () => {
assert.ok(!isCompletedInventory('Ready to plan'));
assert.ok(!isCompletedInventory('In progress'));
assert.ok(!isCompletedInventory('Executing'));
});
});

View File

@@ -600,7 +600,7 @@ describe('getOtherActiveWorkstreams', () => {
fs.writeFileSync(path.join(tmpDir, '.planning', 'workstreams', 'beta', 'STATE.md'),
'# State\n**Status:** In progress\n**Current Phase:** 5\n');
fs.writeFileSync(path.join(tmpDir, '.planning', 'workstreams', 'gamma', 'STATE.md'),
'# State\n**Status:** Milestone complete\n');
'# State\n**Status:** 1.0 milestone complete\n');
});
after(() => cleanup(tmpDir));