diff --git a/.changeset/2388-shared-requirement-gate.md b/.changeset/2388-shared-requirement-gate.md new file mode 100644 index 000000000..9e19c4058 --- /dev/null +++ b/.changeset/2388-shared-requirement-gate.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 2424 +--- +**Shared requirement IDs across multiple plans no longer read `Complete` before every declaring plan (and phase verification) has finished** — `execute-plan.md` now gates completion on sibling plans' `SUMMARY.md` files via a new read-only `requirements ready-ids` check, and a `gaps_found` phase verification reverts any requirement ID this phase owns back out of `Complete` before the gap report renders. Single-plan requirement IDs are unaffected — no added latency. (#2388) diff --git a/docs/INVENTORY-MANIFEST.json b/docs/INVENTORY-MANIFEST.json index 517f811fd..31a3c753b 100644 --- a/docs/INVENTORY-MANIFEST.json +++ b/docs/INVENTORY-MANIFEST.json @@ -229,6 +229,7 @@ "execute-mvp-tdd.md", "execute-phase-between-wave-reset.md", "execute-phase-context-guard.md", + "execute-phase-requirement-revert.md", "execute-phase-wave-guard.md", "executor-examples.md", "gate-prompts.md", diff --git a/docs/INVENTORY.md b/docs/INVENTORY.md index 5503fb4bd..8de2825bc 100644 --- a/docs/INVENTORY.md +++ b/docs/INVENTORY.md @@ -315,6 +315,7 @@ Full roster at `gsd-core/references/*.md`. References are shared knowledge docum | `agent-contracts.md` | Formal interface between orchestrators and agents. | | `context-budget.md` | Context window budget allocation rules. | | `execute-phase-context-guard.md` | Context exhaustion guard step for `execute-phase` wave loop — `workflow.context_guard_mode` dispatch table (warn/auto/off) and POOR-tier pause-work trigger (#1452). | +| `execute-phase-requirement-revert.md` | Gap-report step for `execute-phase` — reverts this phase's own shared requirement IDs out of `Complete` in REQUIREMENTS.md before rendering a `gaps_found` report, scoped to `PHASE_REQ_IDS` so other phases' rows are untouched (#2388). | | `continuation-format.md` | Session continuation/resume format. | | `domain-probes.md` | Domain-specific probing questions for discuss-phase. | | `edge-probe.md` | Spec-phase edge-completeness probe — 8-category edge taxonomy, shape classification, and the `requirements → checks → verifier` resolution model (Step 5.5). | diff --git a/gsd-core/bin/gsd-tools.cjs b/gsd-core/bin/gsd-tools.cjs index af51021bd..677be87c2 100755 --- a/gsd-core/bin/gsd-tools.cjs +++ b/gsd-core/bin/gsd-tools.cjs @@ -59,6 +59,10 @@ * Requirements Operations: * requirements mark-complete Mark requirement IDs as complete in REQUIREMENTS.md * Accepts: REQ-01,REQ-02 or REQ-01 REQ-02 or [REQ-01, REQ-02] + * requirements ready-ids Read-only: which of are safe to mark-complete now + * (no sibling *-PLAN.md in the same phase dir still missing its SUMMARY for that ID) + * requirements revert-phase Revert requirement IDs out of Complete (checkbox + traceability row); + * gaps_found-only, never call on the pass path * * Milestone Operations: * milestone complete Archive milestone, create MILESTONES.md @@ -1216,8 +1220,19 @@ function dispatchOverlayCapabilityCommand({ command, args, cwd, raw, error, load const subcommand = args[1]; if (subcommand === 'mark-complete') { milestone.cmdRequirementsMarkComplete(cwd, args.slice(2), raw); + } else if (subcommand === 'ready-ids') { + // #2388: read-only shared-ID gate — computes which of the given + // requirement IDs are safe to hand to mark-complete right now + // (no sibling *-PLAN.md in the same phase dir still missing its + // *-SUMMARY.md for that ID). + milestone.cmdRequirementsReadyIds(cwd, args.slice(2), raw); + } else if (subcommand === 'revert-phase') { + // #2388: gaps_found-only revert — flips this phase's own + // requirement IDs back out of Complete (checkbox + traceability + // row) before the gap report renders. + milestone.cmdRequirementsRevertPhase(cwd, args.slice(2), raw); } else { - error('Unknown requirements subcommand. Available: mark-complete', ERROR_REASON.SDK_UNKNOWN_COMMAND); + error('Unknown requirements subcommand. Available: mark-complete, ready-ids, revert-phase', ERROR_REASON.SDK_UNKNOWN_COMMAND); } } diff --git a/gsd-core/references/execute-phase-requirement-revert.md b/gsd-core/references/execute-phase-requirement-revert.md new file mode 100644 index 000000000..084f58952 --- /dev/null +++ b/gsd-core/references/execute-phase-requirement-revert.md @@ -0,0 +1,8 @@ +**Revert this phase's own requirement IDs out of `Complete` before rendering the gap report (#2388).** A shared requirement ID can already read `Complete` at this point (its first-declaring plan finished before this verification ran) — a `gaps_found` verdict must not leave that premature `Complete` sitting in REQUIREMENTS.md. Scoped strictly to `PHASE_REQ_IDS` (this phase's own citations from `init.execute-phase`), so another phase's `Complete` row is never touched: + +```bash +if [ -n "${PHASE_REQ_IDS}" ]; then + gsd_run query requirements.revert-phase ${PHASE_REQ_IDS} >/dev/null 2>&1 || true + gsd_run query commit "docs(phase-{X}): revert premature Complete requirements after gaps found" --files .planning/REQUIREMENTS.md >/dev/null 2>&1 || true +fi +``` diff --git a/gsd-core/workflows/execute-phase.md b/gsd-core/workflows/execute-phase.md index 232b84630..6cdd28175 100644 --- a/gsd-core/workflows/execute-phase.md +++ b/gsd-core/workflows/execute-phase.md @@ -1439,9 +1439,10 @@ Verify-work will walk you through each item and mark the phase complete when all **If user acknowledges without reporting issues (including "ok", "noted", "ack", "got it", "approved", "done", "yes", "pass", or similar):** Stop. The phase remains pending. No further orchestrator action — wait for the user to run `/gsd:verify-work`. -**If user reports issues now (before running verify-work):** Proceed to gap closure as currently implemented. +**If user reports issues now:** Proceed to gap closure. **If gaps_found:** +@~/.claude/gsd-core/references/execute-phase-requirement-revert.md ``` ## ⚠ Phase {X}: {Name} — Gaps Found diff --git a/gsd-core/workflows/execute-plan.md b/gsd-core/workflows/execute-plan.md index a35a8428d..e6e053085 100644 --- a/gsd-core/workflows/execute-plan.md +++ b/gsd-core/workflows/execute-plan.md @@ -470,13 +470,21 @@ Counts PLAN vs SUMMARY files on disk. Updates progress table row with correct co -Mark completed requirements from the PLAN.md frontmatter `requirements:` field: +Mark completed requirements from the PLAN.md frontmatter `requirements:` field. + +Extract requirement IDs from the plan's frontmatter (e.g., `requirements: [AUTH-01, AUTH-02]`) into `REQ_IDS`. If no requirements field, skip this step. + +**Shared-ID gate (#2388):** a requirement ID declared by more than one plan in this phase must not read `Complete` until every plan declaring it has finished (produced a `*-SUMMARY.md`) — otherwise the first plan to finish flips it `Complete` while its sibling plans are still running, before phase verification ever gets a chance to catch a real gap. Compute the ready subset first, then mark only those: ```bash -gsd_run query requirements.mark-complete ${REQ_IDS} +READY=$(gsd_run query requirements.ready-ids "${PLAN_PATH}" ${REQ_IDS} --raw) +READY_IDS=$(printf '%s' "$READY" | jq -r '.ready[]' 2>/dev/null | tr '\n' ' ') +if [ -n "$(printf '%s' "$READY_IDS" | tr -d '[:space:]')" ]; then + gsd_run query requirements.mark-complete ${READY_IDS} +fi ``` -Extract requirement IDs from the plan's frontmatter (e.g., `requirements: [AUTH-01, AUTH-02]`). If no requirements field, skip. +`requirements.ready-ids` is read-only: it scans sibling `*-PLAN.md` files in this plan's phase directory and blocks an ID only when a sibling ALSO declares it and that sibling has no `*-SUMMARY.md` yet. An ID no sibling declares is always ready (single-plan requirements mark immediately, no added latency). A blocked ID is re-evaluated the next time any plan in this phase finishes its own `update_requirements` step, and becomes ready once the LAST declaring plan's SUMMARY exists. diff --git a/src/command-aliases.cts b/src/command-aliases.cts index 19c2a36be..549e0f53c 100644 --- a/src/command-aliases.cts +++ b/src/command-aliases.cts @@ -746,6 +746,20 @@ export const NON_FAMILY_COMMAND_ALIASES: NonFamilyCommandAlias[] = [ ], "mutation": true }, + { + "canonical": "requirements.ready-ids", + "aliases": [ + "requirements ready-ids" + ], + "mutation": false + }, + { + "canonical": "requirements.revert-phase", + "aliases": [ + "requirements revert-phase" + ], + "mutation": true + }, { "canonical": "stats.json", "aliases": [ diff --git a/src/milestone.cts b/src/milestone.cts index 905b7728d..b81abf88a 100644 --- a/src/milestone.cts +++ b/src/milestone.cts @@ -268,6 +268,193 @@ function cmdRequirementsMarkComplete(cwd: string, reqIdsRaw: string[], raw: bool ); } +/** + * #2388: a requirement ID shared by more than one plan in a phase must not be + * handed to `cmdRequirementsMarkComplete` until every plan declaring it has + * finished (i.e. has a `*-SUMMARY.md`) — otherwise the ID reads `Complete` in + * REQUIREMENTS.md ~20 minutes before its sibling plans even run, and long + * before `verify_phase_goal` has a chance to catch a gap. + * + * Pure read-only gate: scans sibling `*-PLAN.md` files in the SAME phase + * directory as `planPath` (excluding `planPath` itself) and, for each + * candidate ID, blocks it only when a sibling plan ALSO declares that ID in + * its own `requirements:` frontmatter AND that sibling has no matching + * `*-SUMMARY.md` yet. An ID no sibling declares is never blocked — a + * single-plan (non-shared) ID is always `ready`, preserving immediate + * marking with no added latency (acceptance criterion 4). Does not read or + * write REQUIREMENTS.md itself; callers pass the `ready` subset on to + * `cmdRequirementsMarkComplete` (whose own flip semantics are untouched). + */ +function cmdRequirementsReadyIds(cwd: string, args: string[], raw: boolean): void { + const planPathArg = args[0]; + if (!planPathArg) { + error('plan path required. Usage: requirements ready-ids REQ-01,REQ-02'); + } + + const reqIds = args + .slice(1) + .join(' ') + .replace(/[\[\]]/g, '') + .split(/[,\s]+/) + .map((r) => r.trim()) + .filter(Boolean); + + if (reqIds.length === 0) { + output({ ready: [], blocked: [], total: 0 }, raw, 'no requirement IDs provided'); + return; + } + + const planAbsPath = path.resolve(cwd, planPathArg); + const phaseDir = path.dirname(planAbsPath); + const currentBasename = path.basename(planAbsPath); + + let siblingPlanFiles: string[] = []; + try { + siblingPlanFiles = fs + .readdirSync(phaseDir) + .filter((f) => f.endsWith('-PLAN.md') && f !== currentBasename); + } catch { + siblingPlanFiles = []; + } + + const parseFrontmatterReqIds = (content: string): string[] => { + const fm = extractFrontmatter(content); + const fmReq = fm.requirements; + if (Array.isArray(fmReq)) return fmReq.map((r) => String(r).trim()).filter(Boolean); + if (typeof fmReq === 'string') { + return fmReq + .replace(/[\[\]]/g, '') + .split(/[,\s]+/) + .map((r) => r.trim()) + .filter(Boolean); + } + return []; + }; + + const ready: string[] = []; + const blocked: string[] = []; + + for (const reqId of reqIds) { + let blockedBySibling = false; + + for (const siblingFile of siblingPlanFiles) { + const siblingPath = path.join(phaseDir, siblingFile); + let siblingContent: string; + try { + siblingContent = fs.readFileSync(siblingPath, 'utf-8'); + } catch { + continue; + } + + const siblingReqIds = parseFrontmatterReqIds(siblingContent); + const siblingDeclaresId = siblingReqIds.some((id) => id.toLowerCase() === reqId.toLowerCase()); + if (!siblingDeclaresId) continue; + + // Sibling declares the SAME ID — it must have finished (produced a + // SUMMARY) before this ID is ready to mark Complete. + const siblingSummaryPath = siblingPath.replace(/-PLAN\.md$/, '-SUMMARY.md'); + if (!fs.existsSync(siblingSummaryPath)) { + blockedBySibling = true; + break; + } + } + + if (blockedBySibling) blocked.push(reqId); + else ready.push(reqId); + } + + output( + { ready, blocked, total: reqIds.length }, + raw, + `${ready.length}/${reqIds.length} requirement(s) ready to mark complete`, + ); +} + +/** + * #2388: revert this phase's own requirement IDs out of `Complete` when + * `verify_phase_goal` returns `gaps_found` — a gap verdict must not leave a + * premature `Complete` (from a shared ID's first-declaring plan, or from any + * other early write) sitting in REQUIREMENTS.md indefinitely. + * + * Mirrors `cmdRequirementsMarkComplete`'s two write surfaces in reverse: + * checkbox `[x]` -> `[ ]`, and traceability Status `Complete` -> `Gaps + * Found`. Phase-scoping is the CALLER's responsibility — this function only + * ever touches the exact IDs it is given, so a caller passing just this + * phase's own `phase_req_ids` never touches another phase's `Complete` row. + * Never call this on the pass path; it is `gaps_found`-only. + */ +function cmdRequirementsRevertPhase(cwd: string, reqIdsRaw: string[], raw: boolean): void { + const reqIds = (reqIdsRaw || []) + .join(' ') + .replace(/[\[\]]/g, '') + .split(/[,\s]+/) + .map((r) => r.trim()) + .filter(Boolean); + + if (reqIds.length === 0) { + output({ reverted: [], unchanged: [], total: 0 }, raw, 'no requirement IDs provided'); + return; + } + + const reqPath = planningPaths(cwd).requirements; + if (!fs.existsSync(reqPath)) { + output( + { reverted: [], unchanged: reqIds, total: reqIds.length, reason: 'REQUIREMENTS.md not found' }, + raw, + 'no requirements file', + ); + return; + } + + let reqContent = fs.readFileSync(reqPath, 'utf-8'); + const reverted: string[] = []; + const unchanged: string[] = []; + + for (const reqId of reqIds) { + const reqEscaped = escapeRegex(reqId); + let idReverted = false; + + // Surface 1 — checkbox: - [x] **REQ-ID** -> - [ ] **REQ-ID** + const checkboxPattern = new RegExp(`(-\\s*\\[)x(\\]\\s*\\*\\*${reqEscaped}\\*\\*)`, 'gi'); + const afterCheckbox = reqContent.replace(checkboxPattern, '$1 $2'); + if (afterCheckbox !== reqContent) { + reqContent = afterCheckbox; + idReverted = true; + } + + // Surface 2 — traceability row: Status Complete -> Gaps Found. Only + // flips a row currently reading Complete (mirrors mark-complete's own + // "only flip Pending -> Complete" gate, in reverse). + const rowMatch = (row: Record): boolean => + (Object.values(row)[0] ?? '').trim().toLowerCase() === reqId.toLowerCase(); + let tableHit = false; + const tableUpdate = updateTraceabilityCell(reqContent, rowMatch, 'Status', (current) => { + if (/^complete$/i.test(current.trim())) { + tableHit = true; + return ' Gaps Found '; + } + return current; + }); + if (tableUpdate.ok) { + reqContent = tableUpdate.value; + if (tableHit) idReverted = true; + } + + if (idReverted) reverted.push(reqId); + else unchanged.push(reqId); + } + + if (reverted.length > 0) { + platformWriteSync(reqPath, reqContent); + } + + output( + { reverted, unchanged, total: reqIds.length }, + raw, + `${reverted.length}/${reqIds.length} requirement(s) reverted from Complete`, + ); +} + function cmdMilestoneComplete(cwd: string, version: string, options: MilestoneCompleteOptions, raw: boolean): void { if (!version) { error('version required for milestone complete (e.g., v1.0)'); @@ -766,6 +953,8 @@ function archivePhaseDirectories(cwd: string, phasesDir: string, dirs: ReadonlyA export = { cmdRequirementsMarkComplete, + cmdRequirementsReadyIds, + cmdRequirementsRevertPhase, cmdMilestoneComplete, cmdPhasesClear, }; diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 66ab42b72..baeb46666 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -39,7 +39,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74", - "gsd-core/bin/gsd-tools.cjs": "bcccc9e975b37e39", + "gsd-core/bin/gsd-tools.cjs": "0a2fc4e226f009c5", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "826cf9315e592a1d", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -241,13 +242,13 @@ "gsd-core/workflows/docs-update.md": "8e986e26d0e6e1a0", "gsd-core/workflows/edit-phase.md": "fc932e82ba1f585a", "gsd-core/workflows/eval-review.md": "eb4040eaa5b8497f", - "gsd-core/workflows/execute-phase.md": "a349bfdfcdf2c011", + "gsd-core/workflows/execute-phase.md": "e35fc8cb7e4b2097", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "55d0706e80a2554a", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "5e9635a80ca6c3a5", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "3c66870732e77709", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "dea5df2e142f66bd", + "gsd-core/workflows/execute-plan.md": "b5eec9e33626aefa", "gsd-core/workflows/explore.md": "934c00f9f216dbdb", "gsd-core/workflows/extract-learnings.md": "167ea7f0e23bf496", "gsd-core/workflows/fast.md": "568e6c3ec00b6e00", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index 97a754e3c..eaab16494 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -110,7 +110,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -312,13 +313,13 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "42bb004d479f7706", + "gsd-core/workflows/execute-phase.md": "c18baf04228abf68", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "7bc87fa99a1f9b0e", + "gsd-core/workflows/execute-plan.md": "83cb02952b514bd8", "gsd-core/workflows/explore.md": "6c04f2e658d93261", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json index 2ad1bf130..db988733b 100644 --- a/tests/fixtures/golden-install-parity/claude-local.json +++ b/tests/fixtures/golden-install-parity/claude-local.json @@ -109,7 +109,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -158,6 +158,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -311,13 +312,13 @@ "gsd-core/workflows/docs-update.md": "cd753783ab95da00", "gsd-core/workflows/edit-phase.md": "dbbb6191f5a8b65e", "gsd-core/workflows/eval-review.md": "086a1f2b3c11462c", - "gsd-core/workflows/execute-phase.md": "a0f26f223218812d", + "gsd-core/workflows/execute-phase.md": "e4babdc61b00b387", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "6d38bfd540030da4", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "e5d65c3a0ae0ed2a", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "ccd95645902f57af", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "e81d3476290ef292", + "gsd-core/workflows/execute-plan.md": "587757b937368212", "gsd-core/workflows/explore.md": "95e463d4bdd6dadd", "gsd-core/workflows/extract-learnings.md": "fd75072c339b58bd", "gsd-core/workflows/fast.md": "7f7687b920d79b29", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index e6599c290..af6265f3f 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -38,7 +38,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -87,6 +87,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -240,13 +241,13 @@ "gsd-core/workflows/docs-update.md": "63082608d3ae92be", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "f59e8329dae1e528", - "gsd-core/workflows/execute-phase.md": "a5ca7da9e551bf4c", + "gsd-core/workflows/execute-phase.md": "7f2b133debb7b88f", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "2cddec7d1b197e48", + "gsd-core/workflows/execute-plan.md": "bc1c2a159117642c", "gsd-core/workflows/explore.md": "b9eea1bac358c9ce", "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", "gsd-core/workflows/fast.md": "41a6568b873aef99", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index e0f642aff..351f1e12b 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -42,7 +42,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "476aa24e8c4f03cf", - "gsd-core/bin/gsd-tools.cjs": "01e301fba0dc2101", + "gsd-core/bin/gsd-tools.cjs": "0f718645418266a8", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -91,6 +91,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "e9582246dbc617e0", "gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "742bb890af014c87", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -244,13 +245,13 @@ "gsd-core/workflows/docs-update.md": "39f288623a8f6f32", "gsd-core/workflows/edit-phase.md": "9c9fadc047c61d74", "gsd-core/workflows/eval-review.md": "3e1d7829ed2ed494", - "gsd-core/workflows/execute-phase.md": "7cafa358f645936a", + "gsd-core/workflows/execute-phase.md": "2b087f64c9fa112c", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "67ebc93f51968cb6", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "27505ecd7d5b4e57", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "91eac50d2e1f5a2f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "7f186055a0246932", + "gsd-core/workflows/execute-plan.md": "0db7b9db6454f380", "gsd-core/workflows/explore.md": "e83af8ceae314cf9", "gsd-core/workflows/extract-learnings.md": "6f39375b7dc775f9", "gsd-core/workflows/fast.md": "e4f74a454b6ca5e8", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index 69bae7b9e..301779bca 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -110,7 +110,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -312,13 +313,13 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "4d6f9e033792619a", + "gsd-core/workflows/execute-phase.md": "64b6a432d49e3136", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "90cfc1e6e677d43f", + "gsd-core/workflows/execute-plan.md": "1c26c1cf464fa6b7", "gsd-core/workflows/explore.md": "6c04f2e658d93261", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 315e335bb..a590c9f8f 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -145,7 +145,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -194,6 +194,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "a483199612e216f1", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "95e55087876a0d96", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -347,13 +348,13 @@ "gsd-core/workflows/docs-update.md": "e255317df939e302", "gsd-core/workflows/edit-phase.md": "e592a4d85ce5380f", "gsd-core/workflows/eval-review.md": "63d0d0670b54c244", - "gsd-core/workflows/execute-phase.md": "8176e734cd927891", + "gsd-core/workflows/execute-phase.md": "916e24c2bd0da0f7", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f4cacd27d37bac65", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "89dda78cf3c1f1b7", + "gsd-core/workflows/execute-plan.md": "4492431f93e1df8c", "gsd-core/workflows/explore.md": "2ef10d17c8864a04", "gsd-core/workflows/extract-learnings.md": "f716aa03fcb5f8da", "gsd-core/workflows/fast.md": "e4ed60f96a7b3ac8", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index 3df3e778d..7f22b3a69 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -40,7 +40,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "ea841e2865248e74", - "gsd-core/bin/gsd-tools.cjs": "bcccc9e975b37e39", + "gsd-core/bin/gsd-tools.cjs": "0a2fc4e226f009c5", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -89,6 +89,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "1eb1e1e552ebd17b", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -242,13 +243,13 @@ "gsd-core/workflows/docs-update.md": "9292cfa3c52c434e", "gsd-core/workflows/edit-phase.md": "8667c28b22b1599f", "gsd-core/workflows/eval-review.md": "81c8e72ba3862856", - "gsd-core/workflows/execute-phase.md": "75bc8795af213c29", + "gsd-core/workflows/execute-phase.md": "95afff0cf3e75bf6", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "63b712920f21a40f", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "1963079fe27412c6", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "bce45e41bc6802e8", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "66879e62abcc33ae", + "gsd-core/workflows/execute-plan.md": "388f3cd58a3adac5", "gsd-core/workflows/explore.md": "5fd91a8510e1114b", "gsd-core/workflows/extract-learnings.md": "f34d0b1927545b18", "gsd-core/workflows/fast.md": "66821090b6b8ed3b", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index 71e87ade8..730759255 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -110,7 +110,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "2525f1ae8b086828", - "gsd-core/bin/gsd-tools.cjs": "1cb30e24bc75c677", + "gsd-core/bin/gsd-tools.cjs": "35ec4c40e46036eb", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "44e31bdae72ed5d5", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "b0e27ed2d8405974", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -312,13 +313,13 @@ "gsd-core/workflows/docs-update.md": "e86d7d7e2e3dac6d", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "a86279dd98dd5c03", - "gsd-core/workflows/execute-phase.md": "f67b5d55c3e7dc4b", + "gsd-core/workflows/execute-phase.md": "875819cbb102d6bc", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "a57ce521a92348ef", + "gsd-core/workflows/execute-plan.md": "13e9664263d3844d", "gsd-core/workflows/explore.md": "b9eea1bac358c9ce", "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", "gsd-core/workflows/fast.md": "77b49793e26b3323", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index 4b9ac6b1a..c9eb14893 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -39,7 +39,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "3a3409215044af9f", - "gsd-core/bin/gsd-tools.cjs": "ce9059c4e3fa8d33", + "gsd-core/bin/gsd-tools.cjs": "693bd27cb9b76b76", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "4d6ea8e85e88b1fe", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "b13d8860a76b7a41", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -241,13 +242,13 @@ "gsd-core/workflows/docs-update.md": "ba4cf926fc463cbe", "gsd-core/workflows/edit-phase.md": "7f27003f20e88fb8", "gsd-core/workflows/eval-review.md": "f510e5762212dc6f", - "gsd-core/workflows/execute-phase.md": "3205cca9fe364951", + "gsd-core/workflows/execute-phase.md": "e69d330bed0d9468", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "14a27cc0828f59d3", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "26ee34c543926402", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "5d3a54df40320dbf", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "1ec347a324814b1d", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "274b22f8e53c88d1", + "gsd-core/workflows/execute-plan.md": "ed1528fcbfb792a8", "gsd-core/workflows/explore.md": "d931b4d85a74c795", "gsd-core/workflows/extract-learnings.md": "e9e167c718949c0b", "gsd-core/workflows/fast.md": "c801145115755524", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index a9b3f9651..6c47ac40b 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -110,7 +110,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -312,13 +313,13 @@ "gsd-core/workflows/docs-update.md": "79afaaf19fd527cc", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "926eda8bbee28b23", - "gsd-core/workflows/execute-phase.md": "4babf365129ad14b", + "gsd-core/workflows/execute-phase.md": "a470b8e99e963c83", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "facb0e816d87a0c7", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "21c1dc158588803a", + "gsd-core/workflows/execute-plan.md": "0e40eda4ae70fcab", "gsd-core/workflows/explore.md": "14242d36d4822df6", "gsd-core/workflows/extract-learnings.md": "d8177b0c13b7e5ee", "gsd-core/workflows/fast.md": "41a6568b873aef99", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index 5d90eb2bf..3e490e8ca 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -103,7 +103,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -152,6 +152,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -305,13 +306,13 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "2629630eb4a94a6b", + "gsd-core/workflows/execute-phase.md": "d06e2f3aa15eba2b", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "3c4310c2dd9ef0ad", + "gsd-core/workflows/execute-plan.md": "045ad8cb48444e57", "gsd-core/workflows/explore.md": "6c04f2e658d93261", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index c86859932..d3e63a042 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -110,7 +110,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -312,13 +313,13 @@ "gsd-core/workflows/docs-update.md": "850366c2ef8fb780", "gsd-core/workflows/edit-phase.md": "1876c855fb0a0a39", "gsd-core/workflows/eval-review.md": "5394694d29ad7543", - "gsd-core/workflows/execute-phase.md": "895f8e910b32ebd4", + "gsd-core/workflows/execute-phase.md": "e5a4f684bd87245c", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1804215577f1ad35", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "01c2fe9e5bcb57be", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "86b8a7f50115162f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "cdd49ac15770c9d1", + "gsd-core/workflows/execute-plan.md": "ac4a07ff7e42190d", "gsd-core/workflows/explore.md": "7f5f9231cfd3089b", "gsd-core/workflows/extract-learnings.md": "92b3c0979604b7d0", "gsd-core/workflows/fast.md": "12187b242e6af970", diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json index abb109759..b87f500f2 100644 --- a/tests/fixtures/golden-install-parity/pi.json +++ b/tests/fixtures/golden-install-parity/pi.json @@ -6,7 +6,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -55,6 +55,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -208,13 +209,13 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "353711104c33d19f", + "gsd-core/workflows/execute-phase.md": "01ccacd935b7c620", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "d797619290e91120", + "gsd-core/workflows/execute-plan.md": "6412aa2edd5a4452", "gsd-core/workflows/explore.md": "6c04f2e658d93261", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 11e23717c..3217ff6d3 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -39,7 +39,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "6e98d76e955e35a2", - "gsd-core/bin/gsd-tools.cjs": "5690fc2c19953392", + "gsd-core/bin/gsd-tools.cjs": "3f367ea99374b291", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "8c2e5a596401dd33", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "41d8123374d3838b", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -241,13 +242,13 @@ "gsd-core/workflows/docs-update.md": "45d2f0d173c84e07", "gsd-core/workflows/edit-phase.md": "0fb5e0123cfc6f36", "gsd-core/workflows/eval-review.md": "6dee8a1e40ececd4", - "gsd-core/workflows/execute-phase.md": "840ce6d4ff582aed", + "gsd-core/workflows/execute-phase.md": "e51bcc011f22d197", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "36af8d91e4ae8b9c", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "94765e9fc206efbf", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "463e4e1b57b22b24", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "79410db4a6bb5a46", + "gsd-core/workflows/execute-plan.md": "25ef51fc9900f4b4", "gsd-core/workflows/explore.md": "e1a83a8982532e5b", "gsd-core/workflows/extract-learnings.md": "dd4fdb88605de49a", "gsd-core/workflows/fast.md": "93ed453edddd8c0c", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 79f1d2fd7..b32df012d 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -39,7 +39,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "de4627dff103d527", - "gsd-core/bin/gsd-tools.cjs": "38fe136ab7f63b5c", + "gsd-core/bin/gsd-tools.cjs": "84762454c60a6c9a", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "7a1aa0ad7963f809", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "973a3a6a5db7e449", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -241,13 +242,13 @@ "gsd-core/workflows/docs-update.md": "f13571f08e083356", "gsd-core/workflows/edit-phase.md": "7facd0faa33c8cad", "gsd-core/workflows/eval-review.md": "37d545d4f0db4927", - "gsd-core/workflows/execute-phase.md": "cadbd19b2a828111", + "gsd-core/workflows/execute-phase.md": "13789ed1d5ffc4e4", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "c985a30317a1aa6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "06f115a379580094", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "9d58274a5a1b14f5", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "feae1e61007feab2", + "gsd-core/workflows/execute-plan.md": "1a409bc80100b6ee", "gsd-core/workflows/explore.md": "8a5437aa0c239c38", "gsd-core/workflows/extract-learnings.md": "3fcc858b20d0d0e6", "gsd-core/workflows/fast.md": "0f05b1e008ac2fc2", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index a7ee67f00..63727749a 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -39,7 +39,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "5636ca0b726871b2", - "gsd-core/bin/gsd-tools.cjs": "8f1e439594006870", + "gsd-core/bin/gsd-tools.cjs": "3a0f24b2def05244", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "1587345770b19c7f", "gsd-core/references/execute-phase-context-guard.md": "a5a1058d35806a8e", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "96485eccd4606e54", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -241,13 +242,13 @@ "gsd-core/workflows/docs-update.md": "70f73cc8c27e0ca0", "gsd-core/workflows/edit-phase.md": "c0ae7d0063f3e789", "gsd-core/workflows/eval-review.md": "b28be79ef29f16fd", - "gsd-core/workflows/execute-phase.md": "46a363f3f33cc596", + "gsd-core/workflows/execute-phase.md": "0fc874e8103061d5", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "47ae5482f8e64100", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "003c6a0f21a4aa61", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "e469e777fb8e7fbb", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "403c53e3148033a3", + "gsd-core/workflows/execute-plan.md": "864931070aedf894", "gsd-core/workflows/explore.md": "04e461ff8159a24e", "gsd-core/workflows/extract-learnings.md": "af793bdf4ffd1c8a", "gsd-core/workflows/fast.md": "b03b9f595892479a", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index d0c7b4190..056cd7184 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -110,7 +110,7 @@ "gsd-core/VERSION": "ef0deccd81a6723c", "gsd-core/bin/check-latest-version.cjs": "e4a224058c8f4d74", "gsd-core/bin/ensure-runtime-build.cjs": "51bc64467ab30f62", - "gsd-core/bin/gsd-tools.cjs": "cae92a5bde4f3414", + "gsd-core/bin/gsd-tools.cjs": "bcecc5e92220b2b3", "gsd-core/bin/gsd_run": "62d9b647ede212e6", "gsd-core/bin/shared/config-defaults.manifest.json": "517e6a7c1e9f4f16", "gsd-core/bin/shared/config-schema.manifest.json": "0109a5a9866a24e0", @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md": "a98a270a7ab126bc", "gsd-core/references/execute-phase-between-wave-reset.md": "3ad96ca0f7fee37e", "gsd-core/references/execute-phase-context-guard.md": "982006c1f3364242", + "gsd-core/references/execute-phase-requirement-revert.md": "48ade76866c57ce2", "gsd-core/references/execute-phase-wave-guard.md": "de9ac22cead4cfd8", "gsd-core/references/executor-examples.md": "ba59243ed45c8ab1", "gsd-core/references/few-shot-examples/plan-checker.md": "2574808188ac9de4", @@ -312,13 +313,13 @@ "gsd-core/workflows/docs-update.md": "f35922d15b7061c9", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "f898936e2cfe4130", - "gsd-core/workflows/execute-phase.md": "4bd16cf990e3ee63", + "gsd-core/workflows/execute-phase.md": "2f43fae80c4c4fab", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "4e265392b3f2ba0e", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "09ea1680a375b979", "gsd-core/workflows/execute-phase/steps/regression-gate.md": "5f24c5ad58c2518f", "gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md": "be84efbd71e1513e", - "gsd-core/workflows/execute-plan.md": "4614bb2145a7f737", + "gsd-core/workflows/execute-plan.md": "ee300f9c6f7626c8", "gsd-core/workflows/explore.md": "6c04f2e658d93261", "gsd-core/workflows/extract-learnings.md": "b6f01ca3d8f58de4", "gsd-core/workflows/fast.md": "11f5cd10ae5cc7d3", diff --git a/tests/fixtures/install-tree/antigravity.json b/tests/fixtures/install-tree/antigravity.json index 5b1f1a8d3..310ffad32 100644 --- a/tests/fixtures/install-tree/antigravity.json +++ b/tests/fixtures/install-tree/antigravity.json @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/augment.json b/tests/fixtures/install-tree/augment.json index 704dd0e81..a4b2e7922 100644 --- a/tests/fixtures/install-tree/augment.json +++ b/tests/fixtures/install-tree/augment.json @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/claude-local.json b/tests/fixtures/install-tree/claude-local.json index 4fe08e262..2f060468e 100644 --- a/tests/fixtures/install-tree/claude-local.json +++ b/tests/fixtures/install-tree/claude-local.json @@ -158,6 +158,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/claude.json b/tests/fixtures/install-tree/claude.json index b0a5df5d8..f0920a02e 100644 --- a/tests/fixtures/install-tree/claude.json +++ b/tests/fixtures/install-tree/claude.json @@ -87,6 +87,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/cline.json b/tests/fixtures/install-tree/cline.json index 95ee215f2..be4c9c39e 100644 --- a/tests/fixtures/install-tree/cline.json +++ b/tests/fixtures/install-tree/cline.json @@ -91,6 +91,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/codebuddy.json b/tests/fixtures/install-tree/codebuddy.json index f9494e56b..fd8ed7e53 100644 --- a/tests/fixtures/install-tree/codebuddy.json +++ b/tests/fixtures/install-tree/codebuddy.json @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/codex.json b/tests/fixtures/install-tree/codex.json index 02218d87f..d6f76ea04 100644 --- a/tests/fixtures/install-tree/codex.json +++ b/tests/fixtures/install-tree/codex.json @@ -194,6 +194,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/copilot.json b/tests/fixtures/install-tree/copilot.json index f567d5057..d7f1e3824 100644 --- a/tests/fixtures/install-tree/copilot.json +++ b/tests/fixtures/install-tree/copilot.json @@ -89,6 +89,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/cursor.json b/tests/fixtures/install-tree/cursor.json index 5bfa08e68..2e3fa2eb1 100644 --- a/tests/fixtures/install-tree/cursor.json +++ b/tests/fixtures/install-tree/cursor.json @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/hermes.json b/tests/fixtures/install-tree/hermes.json index 709080eeb..58acc1d33 100644 --- a/tests/fixtures/install-tree/hermes.json +++ b/tests/fixtures/install-tree/hermes.json @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/kilo.json b/tests/fixtures/install-tree/kilo.json index 371012a9d..19c0fbe5d 100644 --- a/tests/fixtures/install-tree/kilo.json +++ b/tests/fixtures/install-tree/kilo.json @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/kimi.json b/tests/fixtures/install-tree/kimi.json index 0d7616990..100fc69eb 100644 --- a/tests/fixtures/install-tree/kimi.json +++ b/tests/fixtures/install-tree/kimi.json @@ -152,6 +152,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/opencode.json b/tests/fixtures/install-tree/opencode.json index 3cce8915f..ca22c4048 100644 --- a/tests/fixtures/install-tree/opencode.json +++ b/tests/fixtures/install-tree/opencode.json @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/pi.json b/tests/fixtures/install-tree/pi.json index f9a68bda4..677542e14 100644 --- a/tests/fixtures/install-tree/pi.json +++ b/tests/fixtures/install-tree/pi.json @@ -55,6 +55,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/qwen.json b/tests/fixtures/install-tree/qwen.json index d2bf91df8..4a6132ada 100644 --- a/tests/fixtures/install-tree/qwen.json +++ b/tests/fixtures/install-tree/qwen.json @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/trae.json b/tests/fixtures/install-tree/trae.json index 536ddf383..3bff0d1ff 100644 --- a/tests/fixtures/install-tree/trae.json +++ b/tests/fixtures/install-tree/trae.json @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/windsurf.json b/tests/fixtures/install-tree/windsurf.json index 5b4b52b07..e73fbe5cd 100644 --- a/tests/fixtures/install-tree/windsurf.json +++ b/tests/fixtures/install-tree/windsurf.json @@ -88,6 +88,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/fixtures/install-tree/zcode.json b/tests/fixtures/install-tree/zcode.json index cafc11fae..ad72e0ff6 100644 --- a/tests/fixtures/install-tree/zcode.json +++ b/tests/fixtures/install-tree/zcode.json @@ -159,6 +159,7 @@ "gsd-core/references/execute-mvp-tdd.md", "gsd-core/references/execute-phase-between-wave-reset.md", "gsd-core/references/execute-phase-context-guard.md", + "gsd-core/references/execute-phase-requirement-revert.md", "gsd-core/references/execute-phase-wave-guard.md", "gsd-core/references/executor-examples.md", "gsd-core/references/few-shot-examples/plan-checker.md", diff --git a/tests/milestone.test.cjs b/tests/milestone.test.cjs index 01f1f1b47..f2bff639f 100644 --- a/tests/milestone.test.cjs +++ b/tests/milestone.test.cjs @@ -1162,6 +1162,201 @@ describe('requirements mark-complete: traceability write (regression, ADR-2143 }); }); +// ───────────────────────────────────────────────────────────────────────────── +// requirements ready-ids command — shared-ID sibling-plan gate (#2388) +// ───────────────────────────────────────────────────────────────────────────── + +describe('requirements ready-ids command (#2388 shared-ID gate)', () => { + let tmpDir; + + beforeEach(() => { tmpDir = createTempProject(); }); + afterEach(() => { cleanup(tmpDir); }); + + function writeRequirements(tmpDir, content) { + fs.writeFileSync(path.join(tmpDir, '.planning', 'REQUIREMENTS.md'), content, 'utf-8'); + } + + function readRequirements(tmpDir) { + return fs.readFileSync(path.join(tmpDir, '.planning', 'REQUIREMENTS.md'), 'utf-8'); + } + + function makePhaseDir(tmpDir) { + const dir = path.join(tmpDir, '.planning', 'phases', '05-05-feature'); + fs.mkdirSync(dir, { recursive: true }); + return dir; + } + + const SHARED_REQUIREMENTS = `# Requirements + +## Feature + +- [ ] **SHARED-01**: shared across two plans +- [ ] **SOLO-01**: only plan-02 declares this + +## Traceability + +| Requirement | Phase | Status | +|-------------|-------|--------| +| SHARED-01 | Phase 5 | Pending | +| SOLO-01 | Phase 5 | Pending | +`; + + // #2388 acceptance criteria 2+3: a requirement ID shared by two plans in + // the same phase must not read Complete until BOTH plans have a SUMMARY — + // then, once the last declaring plan finishes, it marks Complete via the + // normal (unmodified) mark-complete path. + test('shared ID stays Pending until every declaring plan has a SUMMARY, then marks Complete', () => { + writeRequirements(tmpDir, SHARED_REQUIREMENTS); + const dir = makePhaseDir(tmpDir); + const plan1 = path.join(dir, '05-05-01-a-PLAN.md'); + const plan2 = path.join(dir, '05-05-02-b-PLAN.md'); + fs.writeFileSync(plan1, '---\nphase: 05-05\nplan: 01\nrequirements: [SHARED-01]\n---\nPlan A\n'); + fs.writeFileSync(plan2, '---\nphase: 05-05\nplan: 02\nrequirements: [SHARED-01, SOLO-01]\n---\nPlan B\n'); + + // Plan 01 finishes first (its own SUMMARY now exists) and gates its own + // requirement IDs before calling mark-complete — plan 02 has not + // finished yet, so SHARED-01 must be blocked. + fs.writeFileSync(path.join(dir, '05-05-01-a-SUMMARY.md'), 'done\n'); + const readyForPlan1 = JSON.parse( + runGsdTools(['query', 'requirements.ready-ids', plan1, 'SHARED-01'], tmpDir).output, + ); + assert.deepStrictEqual(readyForPlan1.ready, [], 'SHARED-01 must be blocked — plan 02 has not finished yet'); + assert.deepStrictEqual(readyForPlan1.blocked, ['SHARED-01']); + + // The workflow only hands the READY subset to mark-complete (empty here), + // so REQUIREMENTS.md must be untouched. + let content = readRequirements(tmpDir); + assert.ok(content.includes('- [ ] **SHARED-01**'), 'SHARED-01 checkbox must stay unchecked'); + assert.ok(content.includes('| SHARED-01 | Phase 5 | Pending |'), 'SHARED-01 traceability must stay Pending'); + + // Plan 02 finishes: its own SUMMARY now exists too, so when IT gates its + // own IDs, plan 01 (the sibling) already has a SUMMARY — SHARED-01 is + // ready. SOLO-01 has no sibling declaring it at all, so it was always ready. + fs.writeFileSync(path.join(dir, '05-05-02-b-SUMMARY.md'), 'done\n'); + const readyForPlan2 = JSON.parse( + runGsdTools(['query', 'requirements.ready-ids', plan2, 'SHARED-01,SOLO-01'], tmpDir).output, + ); + assert.deepStrictEqual(readyForPlan2.ready.sort(), ['SHARED-01', 'SOLO-01']); + assert.deepStrictEqual(readyForPlan2.blocked, []); + + // Hand the ready subset to the UNMODIFIED mark-complete path. + runGsdTools(['query', 'requirements.mark-complete', ...readyForPlan2.ready], tmpDir); + content = readRequirements(tmpDir); + assert.ok(content.includes('- [x] **SHARED-01**'), 'SHARED-01 checkbox should now be checked'); + assert.ok(content.includes('| SHARED-01 | Phase 5 | Complete |'), 'SHARED-01 traceability should now be Complete'); + }); + + // #2388 acceptance criteria 4: a single-plan (non-shared) ID must not incur + // any added latency — it is ready even before its OWN plan has a SUMMARY, + // as long as no sibling plan also declares it. + test('a single-plan (non-shared) requirement ID is always ready — no added latency', () => { + writeRequirements(tmpDir, SHARED_REQUIREMENTS); + const dir = makePhaseDir(tmpDir); + const plan1 = path.join(dir, '05-05-01-a-PLAN.md'); + fs.writeFileSync(plan1, '---\nphase: 05-05\nplan: 01\nrequirements: [SOLO-01]\n---\nSolo plan\n'); + + const result = JSON.parse( + runGsdTools(['query', 'requirements.ready-ids', plan1, 'SOLO-01'], tmpDir).output, + ); + assert.deepStrictEqual(result.ready, ['SOLO-01']); + assert.deepStrictEqual(result.blocked, []); + }); + + test('no sibling *-PLAN.md files at all → every ID is ready', () => { + writeRequirements(tmpDir, SHARED_REQUIREMENTS); + const dir = makePhaseDir(tmpDir); + const plan1 = path.join(dir, '05-05-01-a-PLAN.md'); + fs.writeFileSync(plan1, '---\nphase: 05-05\nplan: 01\nrequirements: [SHARED-01]\n---\nOnly plan\n'); + + const result = JSON.parse( + runGsdTools(['query', 'requirements.ready-ids', plan1, 'SHARED-01'], tmpDir).output, + ); + assert.deepStrictEqual(result.ready, ['SHARED-01']); + assert.deepStrictEqual(result.blocked, []); + }); +}); + +// ───────────────────────────────────────────────────────────────────────────── +// requirements revert-phase command — gaps_found revert (#2388) +// ───────────────────────────────────────────────────────────────────────────── + +describe('requirements revert-phase command (#2388 gaps_found revert)', () => { + let tmpDir; + + beforeEach(() => { tmpDir = createTempProject(); }); + afterEach(() => { cleanup(tmpDir); }); + + function writeRequirements(tmpDir, content) { + fs.writeFileSync(path.join(tmpDir, '.planning', 'REQUIREMENTS.md'), content, 'utf-8'); + } + + function readRequirements(tmpDir) { + return fs.readFileSync(path.join(tmpDir, '.planning', 'REQUIREMENTS.md'), 'utf-8'); + } + + // #2388 acceptance criterion 5 (phase-scoping): reverting one phase's IDs + // must never touch a DIFFERENT phase's Complete row. + test('reverts a phase\'s own Complete IDs (checkbox + traceability) without touching another phase\'s Complete', () => { + writeRequirements( + tmpDir, + `# Requirements + +## Feature + +- [x] **PHASE5-01**: phase 5 thing +- [x] **PHASE6-01**: phase 6 thing + +## Traceability + +| Requirement | Phase | Status | +|-------------|-------|--------| +| PHASE5-01 | Phase 5 | Complete | +| PHASE6-01 | Phase 6 | Complete | +`, + ); + + const result = runGsdTools('requirements revert-phase PHASE5-01', tmpDir); + assert.ok(result.success, `Command failed: ${result.error}`); + const out = JSON.parse(result.output); + assert.deepStrictEqual(out.reverted, ['PHASE5-01']); + assert.deepStrictEqual(out.unchanged, []); + + const content = readRequirements(tmpDir); + assert.ok(content.includes('- [ ] **PHASE5-01**'), 'PHASE5-01 checkbox must revert to unchecked'); + assert.ok(content.includes('| PHASE5-01 | Phase 5 | Gaps Found |'), 'PHASE5-01 traceability must revert to Gaps Found'); + assert.ok(content.includes('- [x] **PHASE6-01**'), 'a DIFFERENT phase\'s Complete checkbox must be untouched'); + assert.ok(content.includes('| PHASE6-01 | Phase 6 | Complete |'), 'a DIFFERENT phase\'s traceability row must be untouched'); + }); + + test('an ID that is not currently Complete is reported unchanged, not reverted', () => { + writeRequirements( + tmpDir, + `# Requirements + +## Feature + +- [ ] **PHASE5-01**: not complete yet + +## Traceability + +| Requirement | Phase | Status | +|-------------|-------|--------| +| PHASE5-01 | Phase 5 | Pending | +`, + ); + + const result = runGsdTools('requirements revert-phase PHASE5-01', tmpDir); + assert.ok(result.success, `Command failed: ${result.error}`); + const out = JSON.parse(result.output); + assert.deepStrictEqual(out.reverted, []); + assert.deepStrictEqual(out.unchanged, ['PHASE5-01']); + + const content = readRequirements(tmpDir); + assert.ok(content.includes('- [ ] **PHASE5-01**'), 'checkbox must stay unchecked (nothing to revert)'); + assert.ok(content.includes('| PHASE5-01 | Phase 5 | Pending |'), 'traceability status must stay Pending (nothing to revert)'); + }); +}); + // ───────────────────────────────────────────────────────────────────────────── // new-milestone workflow verification gate (#1269) // ───────────────────────────────────────────────────────────────────────────── diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index be1048569..b3f28db3e 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -24,8 +24,8 @@ "docs-update.md": 55706, "edit-phase.md": 12927, "eval-review.md": 9967, - "execute-phase.md": 93363, - "execute-plan.md": 33113, + "execute-phase.md": 93376, + "execute-plan.md": 34262, "explore.md": 10541, "extract-learnings.md": 12893, "fast.md": 7613,