From b55a2e76559f8163df7111586976ba03a1b7a713 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Sat, 11 Jul 2026 22:10:33 -0400 Subject: [PATCH] fix(#2117): distinguish not-yet-validated phase from validated failure in audit-milestone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit audit-milestone's Nyquist scan classified a phase from `nyquist_compliant` alone, so a phase seeded by plan-phase but never run through validate-phase read PARTIAL — identical to a phase that validated and genuinely failed. The template's `status` field could discriminate the two, but no workflow ever promoted it off `draft`, so it was dead. Make `status` live and read it: - validate-phase.md §6: set `status: validated` in both the create (State B) and update (State A) VALIDATION.md paths. - audit-milestone.md §5.5: parse `status`; add a distinct NOT-VALIDATED bucket keyed on `status: draft`, gate COMPLIANT/PARTIAL on `status: validated`, and report `not_validated_phases` in the audit YAML. - VALIDATION.md template: document the draft → validated lifecycle. Tests & generated artifacts: - Regression test folded into policy-138 (owning workflow-contract file); fail-first verified vs origin/next (0 matches pre-fix). - Regenerate golden-install-parity fixtures cleanly: adds the previously-missed qwen.json and removes a contaminated `settings.local.json` entry that had leaked into claude-local.json (the harness excludes hook-config files). - Correct a stale validate-phase.md workflow-size-baseline entry. Closes #2117 Co-Authored-By: Claude Opus 4.8 (1M context) --- .changeset/witty-dogs-hop.md | 5 ++ gsd-core/templates/VALIDATION.md | 2 + gsd-core/workflows/audit-milestone.md | 11 ++-- gsd-core/workflows/validate-phase.md | 4 +- .../golden-install-parity/antigravity.json | 6 +- .../golden-install-parity/augment.json | 6 +- .../golden-install-parity/claude-local.json | 6 +- .../golden-install-parity/claude.json | 6 +- .../fixtures/golden-install-parity/cline.json | 6 +- .../golden-install-parity/codebuddy.json | 6 +- .../fixtures/golden-install-parity/codex.json | 6 +- .../golden-install-parity/copilot.json | 6 +- .../golden-install-parity/cursor.json | 6 +- .../golden-install-parity/hermes.json | 6 +- .../fixtures/golden-install-parity/kilo.json | 6 +- .../fixtures/golden-install-parity/kimi.json | 6 +- .../golden-install-parity/opencode.json | 6 +- tests/fixtures/golden-install-parity/pi.json | 6 +- .../fixtures/golden-install-parity/qwen.json | 6 +- .../fixtures/golden-install-parity/trae.json | 6 +- .../golden-install-parity/windsurf.json | 6 +- .../fixtures/golden-install-parity/zcode.json | 6 +- ...policy-138-nyquist-config-default.test.cjs | 57 +++++++++++++++++++ tests/workflow-size-baseline.json | 4 +- 24 files changed, 129 insertions(+), 62 deletions(-) create mode 100644 .changeset/witty-dogs-hop.md diff --git a/.changeset/witty-dogs-hop.md b/.changeset/witty-dogs-hop.md new file mode 100644 index 000000000..98c5f1d13 --- /dev/null +++ b/.changeset/witty-dogs-hop.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 2209 +--- +**Milestone audit no longer flags a not-yet-validated phase as a Nyquist failure** — a phase that was planned but never run through `validate-phase` now reports as NOT-VALIDATED (a "run validate-phase" TODO) instead of collapsing into PARTIAL alongside phases whose validation genuinely failed. (#2117) diff --git a/gsd-core/templates/VALIDATION.md b/gsd-core/templates/VALIDATION.md index 6adaf46d6..376e29e6f 100644 --- a/gsd-core/templates/VALIDATION.md +++ b/gsd-core/templates/VALIDATION.md @@ -1,6 +1,8 @@ --- phase: {N} slug: {phase-slug} +# status lifecycle: draft (seeded by plan-phase) → validated (set by validate-phase §6) +# audit-milestone §5.5 distinguishes NOT-VALIDATED (draft) from PARTIAL (validated + nyquist_compliant: false) (#2117) status: draft nyquist_compliant: false wave_0_complete: false diff --git a/gsd-core/workflows/audit-milestone.md b/gsd-core/workflows/audit-milestone.md index ce726e2db..b42cb3c31 100644 --- a/gsd-core/workflows/audit-milestone.md +++ b/gsd-core/workflows/audit-milestone.md @@ -153,17 +153,20 @@ Resolve active step hooks from `VERIFY_POST_HOOKS_JSON` where `kind == "step"` a If no active validate-phase step hook exists: skip entirely. -For each phase directory, check `*-VALIDATION.md`. If exists, parse frontmatter (`nyquist_compliant`, `wave_0_complete`). +For each phase directory, check `*-VALIDATION.md`. If exists, parse frontmatter (`status`, `nyquist_compliant`, `wave_0_complete`). Classify per phase: | Status | Condition | |--------|-----------| -| COMPLIANT | `nyquist_compliant: true` and all tasks green | -| PARTIAL | VALIDATION.md exists, `nyquist_compliant: false` or red/pending | +| COMPLIANT | `status: validated` and `nyquist_compliant: true` and all tasks green | +| PARTIAL | `status: validated` and (`nyquist_compliant: false` or red/pending) | +| NOT-VALIDATED | `status: draft` (or absent) — validate-phase has not yet reconciled this file (#2117) | | MISSING | No VALIDATION.md | -Add to audit YAML: `nyquist: { compliant_phases, partial_phases, missing_phases, overall }` +> **NOT-VALIDATED vs PARTIAL (#2117):** A phase reads `status: draft` when it was seeded by plan-phase but never reconciled by validate-phase, OR when its `VALIDATION.md` predates the `status` field (files written before #2117 stay `draft` whether or not validation ran). In both cases `nyquist_compliant` is not authoritative, so this is a coverage TODO ("run validate-phase") — not a compliance failure. Re-running validate-phase promotes the file to `status: validated` and yields the real COMPLIANT/PARTIAL verdict. Only `status: validated` + `nyquist_compliant: false` is a genuine PARTIAL. + +Add to audit YAML: `nyquist: { compliant_phases, partial_phases, not_validated_phases, missing_phases, overall }` Discovery only — never auto-calls `/gsd:validate-phase`. diff --git a/gsd-core/workflows/validate-phase.md b/gsd-core/workflows/validate-phase.md index d529c64c3..f2e817189 100644 --- a/gsd-core/workflows/validate-phase.md +++ b/gsd-core/workflows/validate-phase.md @@ -122,11 +122,11 @@ Handle return: **State B (create):** 1. Read template from `~/.claude/gsd-core/templates/VALIDATION.md` -2. Fill: frontmatter, Test Infrastructure, Per-Task Map, Manual-Only, Sign-Off +2. Fill: frontmatter (**set `status: validated`**), Test Infrastructure, Per-Task Map, Manual-Only, Sign-Off 3. Write to `${PHASE_DIR}/${PADDED_PHASE}-VALIDATION.md` **State A (update):** -1. Update Per-Task Map statuses, add escalated to Manual-Only, update frontmatter +1. Update Per-Task Map statuses, add escalated to Manual-Only, update frontmatter (**set `status: validated`**) 2. Append audit trail: ```markdown diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 0aff340e1..d8ae76854 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -155,7 +155,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "8797c0c7da927c8e", "gsd-core/templates/codebase/architecture.md": "282db635ba093b1a", "gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5", @@ -203,7 +203,7 @@ "gsd-core/workflows/ai-integration-phase.md": "22f5466085c47c00", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "3ecffffe78021e0a", - "gsd-core/workflows/audit-milestone.md": "77089ccd7b45c0f0", + "gsd-core/workflows/audit-milestone.md": "280cd85908dd45cb", "gsd-core/workflows/audit-uat.md": "ea8ddd910ed16ba4", "gsd-core/workflows/autonomous.md": "603ce2019835f00e", "gsd-core/workflows/check-todos.md": "5a62092df800ad7c", @@ -308,7 +308,7 @@ "gsd-core/workflows/ultraplan-phase.md": "d8e92b0b7214eba6", "gsd-core/workflows/undo.md": "6ab639d1fc7e0721", "gsd-core/workflows/update.md": "2c58df5e21c41c31", - "gsd-core/workflows/validate-phase.md": "6c0ab739d15709fa", + "gsd-core/workflows/validate-phase.md": "ae3f0180a2316fcd", "gsd-core/workflows/verify-phase.md": "0eefbb6bb1b0bed6", "gsd-core/workflows/verify-work.md": "59276d94999ee022", "hooks/gsd-check-update-worker.js": "fa301e6366270d5f", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index 3f6666560..7c3f5e54d 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -226,7 +226,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e", + "gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1", "gsd-core/templates/claude-md.md": "d1d333e4b963c0d2", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -274,7 +274,7 @@ "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", "gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575", - "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", + "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", @@ -379,7 +379,7 @@ "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "fd160e13f8b7e83c", - "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", + "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", "gsd-core/workflows/verify-phase.md": "22f18492581f1da5", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "hooks/gsd-check-update-worker.js": "cc1ef5f840f9dfc9", diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json index 061264898..7a1ffb44a 100644 --- a/tests/fixtures/golden-install-parity/claude-local.json +++ b/tests/fixtures/golden-install-parity/claude-local.json @@ -225,7 +225,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "d8f0fe8dba3bb28a", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -273,7 +273,7 @@ "gsd-core/workflows/ai-integration-phase.md": "3503f52a7356caf0", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "816c71b0ef2d8c1d", - "gsd-core/workflows/audit-milestone.md": "a35795246b955bdb", + "gsd-core/workflows/audit-milestone.md": "ae8605b4ecc37c0b", "gsd-core/workflows/audit-uat.md": "1c4a02a8c1ab930f", "gsd-core/workflows/autonomous.md": "6adf957e64518d15", "gsd-core/workflows/check-todos.md": "8f2c6b27f18cc5e2", @@ -378,7 +378,7 @@ "gsd-core/workflows/ultraplan-phase.md": "b926ba7e4de0c76d", "gsd-core/workflows/undo.md": "d759702f84e308fa", "gsd-core/workflows/update.md": "2a59b4edf4a3c8c7", - "gsd-core/workflows/validate-phase.md": "83eeefeeca31c2b5", + "gsd-core/workflows/validate-phase.md": "3150904744b4a1bd", "gsd-core/workflows/verify-phase.md": "6ae6f159be75dcdd", "gsd-core/workflows/verify-work.md": "de14acdc8e925338", "hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index 5d487ada6..1806cb45a 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -154,7 +154,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "d8f0fe8dba3bb28a", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -202,7 +202,7 @@ "gsd-core/workflows/ai-integration-phase.md": "a898d99b8d844215", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575", - "gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8", + "gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710", "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", "gsd-core/workflows/autonomous.md": "722397c04272dfaa", "gsd-core/workflows/check-todos.md": "6c2a43d1d3e86589", @@ -307,7 +307,7 @@ "gsd-core/workflows/ultraplan-phase.md": "328664400a001fd5", "gsd-core/workflows/undo.md": "791e0bf96d9a057f", "gsd-core/workflows/update.md": "f9e7d8a760d0d3c8", - "gsd-core/workflows/validate-phase.md": "2ac231dc541441c2", + "gsd-core/workflows/validate-phase.md": "7a3db6ab8ce9f380", "gsd-core/workflows/verify-phase.md": "e0957e153788a222", "gsd-core/workflows/verify-work.md": "c8ffee621e7319de", "hooks/gsd-check-update-worker.js": "a530efdb5fdc0da3", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index 7d744ed74..88c80049f 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -158,7 +158,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e", + "gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1", "gsd-core/templates/claude-md.md": "c9fea2d8afa17d80", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -206,7 +206,7 @@ "gsd-core/workflows/ai-integration-phase.md": "5159c6bdf102f74b", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", "gsd-core/workflows/audit-fix.md": "9bb427cd3b4075d5", - "gsd-core/workflows/audit-milestone.md": "2266710d0ae48932", + "gsd-core/workflows/audit-milestone.md": "202b726748604c93", "gsd-core/workflows/audit-uat.md": "1fb7b2ab9d587c8f", "gsd-core/workflows/autonomous.md": "cc5217b1b2238a4c", "gsd-core/workflows/check-todos.md": "32fdf33f5dc8bdde", @@ -311,7 +311,7 @@ "gsd-core/workflows/ultraplan-phase.md": "ceff456b1e9d94d8", "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "165beec33490bd28", - "gsd-core/workflows/validate-phase.md": "5b4ae14c87859bd2", + "gsd-core/workflows/validate-phase.md": "706627c190ae11aa", "gsd-core/workflows/verify-phase.md": "a4f918c92c927268", "gsd-core/workflows/verify-work.md": "3fb282f2bce34a79", "scripts/changeset/README.md": "86ff89331dfd94b2", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index 8df634f4c..d76decfea 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -226,7 +226,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e", + "gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1", "gsd-core/templates/claude-md.md": "d1d333e4b963c0d2", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -274,7 +274,7 @@ "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", "gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575", - "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", + "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", @@ -379,7 +379,7 @@ "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "5ff1f77222977648", - "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", + "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", "gsd-core/workflows/verify-phase.md": "22f18492581f1da5", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "hooks/gsd-check-update-worker.js": "bdc9324a2f080ddd", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index fc35ccd2f..de5c1cfb8 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -261,7 +261,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "59a3d4f6c4afbfc9", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "e3ca8ebb8d7e2cd0", + "gsd-core/templates/VALIDATION.md": "dae6246879d09d13", "gsd-core/templates/claude-md.md": "dd1a9011684f9753", "gsd-core/templates/codebase/architecture.md": "282db635ba093b1a", "gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5", @@ -309,7 +309,7 @@ "gsd-core/workflows/ai-integration-phase.md": "1dfa15d8f28c022d", "gsd-core/workflows/analyze-dependencies.md": "f799abc00907377f", "gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575", - "gsd-core/workflows/audit-milestone.md": "46edd152d8b63bfc", + "gsd-core/workflows/audit-milestone.md": "5f362cead97ceaca", "gsd-core/workflows/audit-uat.md": "2564078edb15b5e9", "gsd-core/workflows/autonomous.md": "92f08626d4aea668", "gsd-core/workflows/check-todos.md": "b2b103e8638e760a", @@ -414,7 +414,7 @@ "gsd-core/workflows/ultraplan-phase.md": "0bafc2af27be4591", "gsd-core/workflows/undo.md": "5ff7d63b0a2f46d5", "gsd-core/workflows/update.md": "5c35c0ec0f462ea6", - "gsd-core/workflows/validate-phase.md": "020201a41049679f", + "gsd-core/workflows/validate-phase.md": "6d6d10fe53f6b1d0", "gsd-core/workflows/verify-phase.md": "2e12c3cb97a9122a", "gsd-core/workflows/verify-work.md": "5b348e73fc0d0829", "hooks/gsd-check-update.js": "ef48957eb6ac6a10", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index 0076bec72..4bc90d322 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -156,7 +156,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "f436ae75a9c8518a", "gsd-core/templates/codebase/architecture.md": "282db635ba093b1a", "gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5", @@ -204,7 +204,7 @@ "gsd-core/workflows/ai-integration-phase.md": "ef0c2474cee76b00", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "9fdfe8a7fbcd1417", - "gsd-core/workflows/audit-milestone.md": "19e03e6d34d96f38", + "gsd-core/workflows/audit-milestone.md": "258e4dfd259ab13f", "gsd-core/workflows/audit-uat.md": "5ea0e30548ed0933", "gsd-core/workflows/autonomous.md": "dd972ddde9663295", "gsd-core/workflows/check-todos.md": "be9b50b5f28d7504", @@ -309,7 +309,7 @@ "gsd-core/workflows/ultraplan-phase.md": "7217c34dc9eaf7bb", "gsd-core/workflows/undo.md": "ba1ef7aa80bef6bd", "gsd-core/workflows/update.md": "f444a7cfcd246cfb", - "gsd-core/workflows/validate-phase.md": "2f705775a4b76d42", + "gsd-core/workflows/validate-phase.md": "e7aa423ebdd6a230", "gsd-core/workflows/verify-phase.md": "5c72780e34214e27", "gsd-core/workflows/verify-work.md": "c966971a3cbd1d71", "hooks/gsd-session.json": "3382597f61e3a559", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index 5b43b78b1..8baba5047 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -226,7 +226,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "d6d7da8b7817a04c", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -274,7 +274,7 @@ "gsd-core/workflows/ai-integration-phase.md": "b79f320d59a68773", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575", - "gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8", + "gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710", "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", "gsd-core/workflows/autonomous.md": "4b20eda9a0b587ce", "gsd-core/workflows/check-todos.md": "1a67337d1630848f", @@ -379,7 +379,7 @@ "gsd-core/workflows/ultraplan-phase.md": "466e01d65c350ef6", "gsd-core/workflows/undo.md": "18dec684fb1076f9", "gsd-core/workflows/update.md": "23e294ba707c3580", - "gsd-core/workflows/validate-phase.md": "2df0c6e298a5f249", + "gsd-core/workflows/validate-phase.md": "d03a94b7b807be12", "gsd-core/workflows/verify-phase.md": "e0957e153788a222", "gsd-core/workflows/verify-work.md": "e7e7e900c4874490", "hooks/gsd-cursor-post-tool.js": "019d503aee8b4a3f", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 4dd6d3631..24922ae2e 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -155,7 +155,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "7c778398f79e25a3", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -203,7 +203,7 @@ "gsd-core/workflows/ai-integration-phase.md": "ddab2912d025db65", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "2eee4a0be82ef951", - "gsd-core/workflows/audit-milestone.md": "806d346ee5bfe9f8", + "gsd-core/workflows/audit-milestone.md": "690289689e9eda7a", "gsd-core/workflows/audit-uat.md": "86d9131fccabf2ad", "gsd-core/workflows/autonomous.md": "dd572ca89862e5ec", "gsd-core/workflows/check-todos.md": "ea9a303c48a5d752", @@ -308,7 +308,7 @@ "gsd-core/workflows/ultraplan-phase.md": "0d103bf2622436f7", "gsd-core/workflows/undo.md": "791e0bf96d9a057f", "gsd-core/workflows/update.md": "7499bb4cb2a3ce6f", - "gsd-core/workflows/validate-phase.md": "75e8971d3981d06b", + "gsd-core/workflows/validate-phase.md": "88edc724568337d3", "gsd-core/workflows/verify-phase.md": "5c8d1305b47fbef4", "gsd-core/workflows/verify-work.md": "7a9c9541d2d73fdc", "hooks/gsd-check-update-worker.js": "7989cc2bedd1138d", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index c1021bce7..fea494096 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -226,7 +226,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "f35856254768bf7d", "gsd-core/templates/codebase/architecture.md": "282db635ba093b1a", "gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5", @@ -274,7 +274,7 @@ "gsd-core/workflows/ai-integration-phase.md": "c85c6afdc64f0da6", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575", - "gsd-core/workflows/audit-milestone.md": "23c1e35f449933b8", + "gsd-core/workflows/audit-milestone.md": "9f8ec364e58d5710", "gsd-core/workflows/audit-uat.md": "e11db0d74c2a7405", "gsd-core/workflows/autonomous.md": "73f429f7472c9949", "gsd-core/workflows/check-todos.md": "ed4b4eb12be222d7", @@ -379,7 +379,7 @@ "gsd-core/workflows/ultraplan-phase.md": "29245758b8497fa0", "gsd-core/workflows/undo.md": "7cd2153f8b15e30d", "gsd-core/workflows/update.md": "07dc2fba78ad1865", - "gsd-core/workflows/validate-phase.md": "557e3251e3b9349a", + "gsd-core/workflows/validate-phase.md": "52b9fa8a9533b444", "gsd-core/workflows/verify-phase.md": "e0957e153788a222", "gsd-core/workflows/verify-work.md": "9fc717845828c6e3", "kilo.json": "13151e97ff23c1aa", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index f96eaed8e..b0eeb106a 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -219,7 +219,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e", + "gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1", "gsd-core/templates/claude-md.md": "d1d333e4b963c0d2", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -267,7 +267,7 @@ "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", "gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575", - "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", + "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", @@ -372,7 +372,7 @@ "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "6718e0632bba26ca", - "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", + "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", "gsd-core/workflows/verify-phase.md": "22f18492581f1da5", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "scripts/changeset/README.md": "86ff89331dfd94b2", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index 0ff4b6515..ead5eb11b 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -226,7 +226,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "a4f5e38984001194", "gsd-core/templates/codebase/architecture.md": "282db635ba093b1a", "gsd-core/templates/codebase/concerns.md": "e66c584daa636fc5", @@ -274,7 +274,7 @@ "gsd-core/workflows/ai-integration-phase.md": "90e5f97018715b18", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "2871c5d0a4b671fa", - "gsd-core/workflows/audit-milestone.md": "7aa0db364a4b67e2", + "gsd-core/workflows/audit-milestone.md": "8bd0b730de08d1a8", "gsd-core/workflows/audit-uat.md": "c800099fab1e1c1b", "gsd-core/workflows/autonomous.md": "6cb0c014f5f56965", "gsd-core/workflows/check-todos.md": "6526b64ee88c7d2e", @@ -379,7 +379,7 @@ "gsd-core/workflows/ultraplan-phase.md": "f4bad8de3fdb49fa", "gsd-core/workflows/undo.md": "0bba5e7f6196c894", "gsd-core/workflows/update.md": "71b6cd852f38b4bc", - "gsd-core/workflows/validate-phase.md": "abcdbc1b56780565", + "gsd-core/workflows/validate-phase.md": "434d9927c65f2bba", "gsd-core/workflows/verify-phase.md": "126be1d026900102", "gsd-core/workflows/verify-work.md": "ae07b3fa8b6f864e", "hooks/gsd-check-update-worker.js": "385fb7c67810baf6", diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json index ca40d6239..9eddb6574 100644 --- a/tests/fixtures/golden-install-parity/pi.json +++ b/tests/fixtures/golden-install-parity/pi.json @@ -122,7 +122,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e", + "gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1", "gsd-core/templates/claude-md.md": "d1d333e4b963c0d2", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -170,7 +170,7 @@ "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", "gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575", - "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", + "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", @@ -275,7 +275,7 @@ "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "7e69d278375a2493", - "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", + "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", "gsd-core/workflows/verify-phase.md": "22f18492581f1da5", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "hooks/gsd-check-update-worker.js": "55376b5b9335a580", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index e3db0de4e..33f2ca449 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -155,7 +155,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "ec5972ab31c0f5d0", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -203,7 +203,7 @@ "gsd-core/workflows/ai-integration-phase.md": "afdc7c15f03a95fc", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "aaa1b74e001322b6", - "gsd-core/workflows/audit-milestone.md": "b7617cf590d92a56", + "gsd-core/workflows/audit-milestone.md": "78dbc1e8c4499d7d", "gsd-core/workflows/audit-uat.md": "97d441d07e7972b3", "gsd-core/workflows/autonomous.md": "3014ff90115f0daf", "gsd-core/workflows/check-todos.md": "ec8c22920f6b2df1", @@ -308,7 +308,7 @@ "gsd-core/workflows/ultraplan-phase.md": "49921383982474e0", "gsd-core/workflows/undo.md": "791e0bf96d9a057f", "gsd-core/workflows/update.md": "b34cb866152d4de3", - "gsd-core/workflows/validate-phase.md": "e989cbaa4228564c", + "gsd-core/workflows/validate-phase.md": "dfb9bd178ee1b67b", "gsd-core/workflows/verify-phase.md": "0dc52b9e629a5f5a", "gsd-core/workflows/verify-work.md": "3355ddc14f052fff", "hooks/gsd-check-update-worker.js": "4bb354044e0dff91", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 4d1e45b35..8e1d0f720 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -155,7 +155,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "17217a07ab8a6485", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -203,7 +203,7 @@ "gsd-core/workflows/ai-integration-phase.md": "d469eb120e52de0f", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "76607add3257cb37", - "gsd-core/workflows/audit-milestone.md": "a379eda51d821bce", + "gsd-core/workflows/audit-milestone.md": "ebec95af8f68f2ed", "gsd-core/workflows/audit-uat.md": "6e768b1c208a787a", "gsd-core/workflows/autonomous.md": "c482645c5d1ead46", "gsd-core/workflows/check-todos.md": "0dda8236355e8c9c", @@ -308,7 +308,7 @@ "gsd-core/workflows/ultraplan-phase.md": "77b58ef8af5209bd", "gsd-core/workflows/undo.md": "59b8baa54efc4110", "gsd-core/workflows/update.md": "1f935251fca1f276", - "gsd-core/workflows/validate-phase.md": "1c0ebe56d96a14d1", + "gsd-core/workflows/validate-phase.md": "58fd1a0a679d7115", "gsd-core/workflows/verify-phase.md": "a151ed36eb51813b", "gsd-core/workflows/verify-work.md": "dde2a42a56c27c4e", "scripts/changeset/README.md": "86ff89331dfd94b2", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index 8311cb82e..ec771fa9d 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -155,7 +155,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "68d32d1fea14e184", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "6144951011cdca57", + "gsd-core/templates/VALIDATION.md": "e4d0f1c48727fce3", "gsd-core/templates/claude-md.md": "20be2a0201ab92cd", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -203,7 +203,7 @@ "gsd-core/workflows/ai-integration-phase.md": "8948988717506320", "gsd-core/workflows/analyze-dependencies.md": "77aff48f97fa6f1c", "gsd-core/workflows/audit-fix.md": "aa052e15623d759d", - "gsd-core/workflows/audit-milestone.md": "ac2238ea6c11ae9e", + "gsd-core/workflows/audit-milestone.md": "868db5a8f5d55040", "gsd-core/workflows/audit-uat.md": "d496e39402e160de", "gsd-core/workflows/autonomous.md": "fe7bb7c978f305a2", "gsd-core/workflows/check-todos.md": "afc840fceb07bf99", @@ -308,7 +308,7 @@ "gsd-core/workflows/ultraplan-phase.md": "53b77a8edf60acd0", "gsd-core/workflows/undo.md": "18dec684fb1076f9", "gsd-core/workflows/update.md": "79aaf4b8f1f83045", - "gsd-core/workflows/validate-phase.md": "2db47bf5547d7b9d", + "gsd-core/workflows/validate-phase.md": "bf16fd7ff71286b2", "gsd-core/workflows/verify-phase.md": "f961cdb3ef03ff05", "gsd-core/workflows/verify-work.md": "cce8ae44b30957f1", "hooks/gsd-windsurf-pre-command.js": "7467a8a63e354aad", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 04fb029d6..5cf749414 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -226,7 +226,7 @@ "gsd-core/templates/SECURITY.md": "b628f7f1c6d2328f", "gsd-core/templates/UAT.md": "9e296471b97ebcec", "gsd-core/templates/UI-SPEC.md": "7dd5c7cdc7ece0ec", - "gsd-core/templates/VALIDATION.md": "f53e0ca061d3528e", + "gsd-core/templates/VALIDATION.md": "6f0fe4214dff6dd1", "gsd-core/templates/claude-md.md": "d1d333e4b963c0d2", "gsd-core/templates/codebase/architecture.md": "6be88214162fdd89", "gsd-core/templates/codebase/concerns.md": "efa26d1fb5132f25", @@ -274,7 +274,7 @@ "gsd-core/workflows/ai-integration-phase.md": "40c217869a06981f", "gsd-core/workflows/analyze-dependencies.md": "52942af10f140717", "gsd-core/workflows/audit-fix.md": "eedb2da4bffb7575", - "gsd-core/workflows/audit-milestone.md": "6866ce260980c21e", + "gsd-core/workflows/audit-milestone.md": "3835762c3147a927", "gsd-core/workflows/audit-uat.md": "fcfbec501620b564", "gsd-core/workflows/autonomous.md": "7e5683728ef33707", "gsd-core/workflows/check-todos.md": "bdeaf43f9c61e0cc", @@ -379,7 +379,7 @@ "gsd-core/workflows/ultraplan-phase.md": "0fb8291153e3937d", "gsd-core/workflows/undo.md": "96d2775f008b3a85", "gsd-core/workflows/update.md": "dc580dee13f881a6", - "gsd-core/workflows/validate-phase.md": "2c6d7671fcaabcaa", + "gsd-core/workflows/validate-phase.md": "ce9890f21c6e5607", "gsd-core/workflows/verify-phase.md": "22f18492581f1da5", "gsd-core/workflows/verify-work.md": "63b3f680d8f0a6f3", "scripts/changeset/README.md": "86ff89331dfd94b2", diff --git a/tests/policy-138-nyquist-config-default.test.cjs b/tests/policy-138-nyquist-config-default.test.cjs index 0665e1d04..72f5a11dc 100644 --- a/tests/policy-138-nyquist-config-default.test.cjs +++ b/tests/policy-138-nyquist-config-default.test.cjs @@ -1,3 +1,4 @@ +// allow-test-rule: runtime-contract-is-the-product — asserts GSD workflow/template markdown prose, the executable contract (#138, #2117) 'use strict'; // Policy regression test for issue #138: @@ -67,3 +68,59 @@ test('legacy Nyquist config helper still detects unsafe direct reads', () => { } } }); + +// ───────────────────────────────────────────────────────────────────────────── +// Issue #2117: audit-milestone could not distinguish a not-yet-validated phase +// from a validated-but-failing one — both read Nyquist PARTIAL. The fix makes the +// dead `status` field live (validate-phase §6 promotes draft → validated) and has +// audit-milestone §5.5 bucket `status: draft` as a distinct NOT-VALIDATED state. +// These assertions fail-first if either half of that two-workflow contract is +// reverted, silently re-collapsing "not validated" and "validation failed". +// ───────────────────────────────────────────────────────────────────────────── + +test('#2117 validate-phase.md promotes status: draft → validated when it reconciles VALIDATION.md', () => { + const content = readWorkflow('validate-phase.md'); + // Both the create (State B) and update (State A) paths in §6 must set the + // terminal marker, otherwise `status` stays `draft` for the life of the file + // and audit-milestone cannot tell an unvalidated phase from a failing one. + const occurrences = content.match(/status: validated/g) || []; + assert.ok( + occurrences.length >= 2, + 'validate-phase.md must set `status: validated` in both the create (State B) and update (State A) VALIDATION.md paths', + ); +}); + +test('#2117 audit-milestone.md buckets status: draft as NOT-VALIDATED, never PARTIAL', () => { + const content = readWorkflow('audit-milestone.md'); + assert.ok( + content.includes('`status`'), + 'audit-milestone.md must parse the `status` frontmatter field to detect not-yet-validated phases', + ); + assert.ok( + content.includes('| NOT-VALIDATED | `status: draft`'), + 'audit-milestone.md must define a NOT-VALIDATED bucket keyed on `status: draft`', + ); + assert.ok( + content.includes('| COMPLIANT | `status: validated`'), + 'COMPLIANT must require `status: validated` so a draft file can never be scored compliant', + ); + assert.ok( + content.includes('| PARTIAL | `status: validated`'), + 'PARTIAL must require `status: validated`; a `status: draft` file is NOT-VALIDATED, not PARTIAL', + ); + assert.ok( + content.includes('not_validated_phases'), + 'audit-milestone.md must report not_validated_phases in the nyquist audit YAML aggregate', + ); +}); + +test('#2117 VALIDATION.md template seeds status: draft (the pre-validation state)', () => { + const template = fs.readFileSync( + path.join(__dirname, '..', 'gsd-core', 'templates', 'VALIDATION.md'), + 'utf8', + ); + assert.ok( + /^status: draft$/m.test(template), + 'VALIDATION.md template must seed `status: draft`; validate-phase promotes it to validated', + ); +}); diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index e90823c69..b478680b8 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -6,7 +6,7 @@ "ai-integration-phase.md": 14805, "analyze-dependencies.md": 3887, "audit-fix.md": 11717, - "audit-milestone.md": 17681, + "audit-milestone.md": 18448, "audit-uat.md": 7469, "autonomous.md": 42474, "check-todos.md": 9475, @@ -87,7 +87,7 @@ "ultraplan-phase.md": 10512, "undo.md": 10431, "update.md": 20914, - "validate-phase.md": 10789, + "validate-phase.md": 10849, "verify-phase.md": 40923, "verify-work.md": 40247 }