* 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:
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
6
tests/fixtures/golden-install-parity/pi.json
vendored
6
tests/fixtures/golden-install-parity/pi.json
vendored
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"', () => {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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'));
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user