From 3b15a1e3ccee23b47a9e67ed86e64473fc331af0 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Fri, 24 Jul 2026 12:10:32 -0400 Subject: [PATCH] fix(#2576): normalize padded vs unpadded resolves_phase in close_phase_todos (#2597) * test(#2576): add failing regression for padded resolves_phase compare * fix(#2576): normalize padded vs unpadded resolves_phase in close_phase_todos * chore(#2576): backfill changeset pr to 2597 * test(#2576): drop fast-check property test (cross-platform-fragile on Windows CI) --- .changeset/sharp-otters-zip.md | 5 + gsd-core/workflows/execute-phase.md | 15 +- ...close-phase-todos-padded-resolves.test.cjs | 179 ++++++++++++++++++ .../golden-install-parity/antigravity.json | 2 +- .../golden-install-parity/augment.json | 2 +- .../golden-install-parity/claude-local.json | 2 +- .../golden-install-parity/claude.json | 2 +- .../fixtures/golden-install-parity/cline.json | 2 +- .../golden-install-parity/codebuddy.json | 2 +- .../fixtures/golden-install-parity/codex.json | 2 +- .../golden-install-parity/copilot.json | 2 +- .../golden-install-parity/cursor.json | 2 +- .../golden-install-parity/hermes.json | 2 +- .../fixtures/golden-install-parity/kilo.json | 2 +- .../golden-install-parity/kimi-code.json | 2 +- .../fixtures/golden-install-parity/kimi.json | 2 +- .../golden-install-parity/opencode.json | 2 +- tests/fixtures/golden-install-parity/pi.json | 2 +- .../fixtures/golden-install-parity/qwen.json | 2 +- .../fixtures/golden-install-parity/trae.json | 2 +- .../golden-install-parity/windsurf.json | 2 +- .../fixtures/golden-install-parity/zcode.json | 2 +- tests/workflow-size-baseline.json | 2 +- 23 files changed, 215 insertions(+), 24 deletions(-) create mode 100644 .changeset/sharp-otters-zip.md create mode 100644 tests/close-phase-todos-padded-resolves.test.cjs diff --git a/.changeset/sharp-otters-zip.md b/.changeset/sharp-otters-zip.md new file mode 100644 index 000000000..17d6b52e9 --- /dev/null +++ b/.changeset/sharp-otters-zip.md @@ -0,0 +1,5 @@ +--- +type: Fixed +pr: 2597 +--- +**`/gsd-execute-phase` now auto-closes pending todos for single-digit phases** — the close_phase_todos step normalizes both the phase number and each todo's `resolves_phase` value before comparing, so a todo tagged `resolves_phase: 5` is recognized when phase `05` completes. Previously the step compared the zero-padded `PHASE_NUMBER` (e.g. "05") against the unpadded value new-milestone wrote (e.g. "5") as literal strings, so every single-digit phase (1-9) silently failed to auto-close its todos — they stayed stuck in `pending/` forever despite their resolving phase completing. Decimal sub-phases (4.1 vs 04.1), letter suffixes, and quoted YAML values are now handled too. (#2576) diff --git a/gsd-core/workflows/execute-phase.md b/gsd-core/workflows/execute-phase.md index 2831308f5..cc4ec60ab 100644 --- a/gsd-core/workflows/execute-phase.md +++ b/gsd-core/workflows/execute-phase.md @@ -1515,7 +1515,7 @@ Copy failure must NOT block phase completion. **Auto-close pending todos tagged for this phase (#2433).** -This step runs AFTER `update_roadmap` marks the phase complete. It moves any pending todos that carry `resolves_phase: ` to the completed directory. +After `update_roadmap`, moves todos whose `resolves_phase` matches to `completed/`. ```bash PHASE_NUM="${PHASE_NUMBER}" @@ -1523,12 +1523,19 @@ PENDING_DIR=".planning/todos/pending" COMPLETED_DIR=".planning/todos/completed" mkdir -p "$COMPLETED_DIR" +# "05"=="5" (#2576). +normalize_phase_num() { + local p="${1//\"/}"; printf '%s' "$p" | sed 's/^0*\([0-9]\)/\1/' +} +PHASE_NUM_NORM=$(normalize_phase_num "$PHASE_NUM") + CLOSED=() for TODO_FILE in "$PENDING_DIR"/*.md; do [ -f "$TODO_FILE" ] || continue - # Extract resolves_phase from YAML frontmatter (first --- block only) + # resolves_phase from first frontmatter block RP=$(awk '/^---/{c++;next} c==1 && /^resolves_phase:/{print $2;exit} c==2{exit}' "$TODO_FILE" 2>/dev/null || true) - if [ "$RP" = "$PHASE_NUM" ] || [ "$RP" = "\"$PHASE_NUM\"" ]; then + RP_NORM=$(normalize_phase_num "$RP") + if [ -n "$RP_NORM" ] && [ "$RP_NORM" = "$PHASE_NUM_NORM" ]; then mv "$TODO_FILE" "$COMPLETED_DIR/" CLOSED+=("$(basename "$TODO_FILE")") fi @@ -1541,7 +1548,7 @@ if [ ${#CLOSED[@]} -gt 0 ]; then fi ``` -**If no todos have `resolves_phase: `:** Skip silently — this step is always additive and never blocks phase completion. +**No matches:** skip silently (always additive, non-blocking). diff --git a/tests/close-phase-todos-padded-resolves.test.cjs b/tests/close-phase-todos-padded-resolves.test.cjs new file mode 100644 index 000000000..831c258ca --- /dev/null +++ b/tests/close-phase-todos-padded-resolves.test.cjs @@ -0,0 +1,179 @@ +// allow-test-rule: source-text-is-the-product see #2576 +// Workflow .md files — their text IS what the runtime loads. Testing text content +// tests the deployed contract. Per CONTRIBUTING.md exception matrix. The behavioral +// cases below also extract the actual bash helper from the workflow text and +// exercise it, so the test is pinned to the deployed logic, not a paraphrase. +'use strict'; + +const { describe, test } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); +const { execFileSync } = require('node:child_process'); +const { cleanup } = require('./helpers.cjs'); + +const EXECUTE_PHASE = path.join(__dirname, '..', 'gsd-core', 'workflows', 'execute-phase.md'); + +// Extract the close_phase_todos step body so assertions never match unrelated +// steps elsewhere in the workflow (same isolation pattern as the #2415 test). +function readClosePhaseTodosStep() { + const content = fs.readFileSync(EXECUTE_PHASE, 'utf8'); + const stepStart = content.indexOf(''); + assert.ok(stepStart > -1, 'close_phase_todos step must exist in execute-phase.md'); + const stepEnd = content.indexOf('', stepStart); + assert.ok(stepEnd > stepStart, 'close_phase_todos step must be properly closed'); + return content.slice(stepStart, stepEnd); +} + +// Strip bash `#` comment lines so doc prose mentioning a name doesn't satisfy a +// structural assertion about the actual command. Same approach as the #2415 test. +function stripBashComments(text) { + return text.replace(/^\s*#.*$/gm, ''); +} + +describe('#2576: close_phase_todos normalizes padded vs unpadded resolves_phase before comparing', () => { + // ── Structural: the step must normalize BOTH sides of the comparison ── + // The bug was a raw string compare: `[ "$RP" = "$PHASE_NUM" ]`. PHASE_NUM is + // zero-padded ("05") but new-milestone.md writes resolves_phase unpadded ("5"), + // so every single-digit phase silently failed to auto-close its todos. + + test('close_phase_todos defines a normalize_phase_num bash helper', () => { + const step = stripBashComments(readClosePhaseTodosStep()); + // The helper name documents intent at the call site; pin the name so a future + // contributor cannot quietly revert to a raw compare without renaming it. + assert.match( + step, + /normalize_phase_num\s*\(\)\s*\{/, + 'close_phase_todos must define a normalize_phase_num() bash helper' + ); + }); + + test('close_phase_todos normalizes PHASE_NUM into PHASE_NUM_NORM before the loop', () => { + const step = stripBashComments(readClosePhaseTodosStep()); + assert.match( + step, + /PHASE_NUM_NORM\s*=\s*\$\(\s*normalize_phase_num\s+"\$PHASE_NUM"\s*\)/, + 'PHASE_NUM (zero-padded) must be normalized into PHASE_NUM_NORM once before the loop' + ); + }); + + test('close_phase_todos normalizes the extracted RP into RP_NORM inside the loop', () => { + const step = stripBashComments(readClosePhaseTodosStep()); + assert.match( + step, + /RP_NORM\s*=\s*\$\(\s*normalize_phase_num\s+"\$RP"\s*\)/, + 'the extracted resolves_phase value (RP) must be normalized into RP_NORM before comparing' + ); + }); + + test('close_phase_todos compares NORMALIZED values (RP_NORM = PHASE_NUM_NORM), not raw strings', () => { + const step = stripBashComments(readClosePhaseTodosStep()); + assert.match( + step, + /\[\s*"\$RP_NORM"\s*=\s*"\$PHASE_NUM_NORM"\s*\]/, + 'the comparison must be between normalized values: [ "$RP_NORM" = "$PHASE_NUM_NORM" ]' + ); + // The #2576 bug itself: the old raw-string compare must NOT remain. + assert.doesNotMatch( + step, + /\[\s*"\$RP"\s*=\s*"\$PHASE_NUM"\s*\]/, + 'the raw [ "$RP" = "$PHASE_NUM" ] compare must be gone — it is the #2576 defect' + ); + }); + + test('close_phase_todos guards against empty RP_NORM (missing/blank resolves_phase never matches)', () => { + const step = stripBashComments(readClosePhaseTodosStep()); + // A todo with no resolves_phase (or an unparseable one) must NOT match phase 0 + // via empty-string equality. The `-n` guard is the defensive seam. + assert.match( + step, + /\[\s*-n\s+"\$RP_NORM"\s*\]/, + 'comparison must be guarded by [ -n "$RP_NORM" ] so empty resolves_phase never matches' + ); + }); + + // ── Behavioral: extract the actual helper from the deployed workflow text and + // exercise it against the #2576 acceptance criteria. This pins the test to the + // real logic rather than a paraphrase, and proves the normalization is correct + // for every padded/unpadded pair the bug affected. + + function extractNormalizeHelper() { + const step = readClosePhaseTodosStep(); + // Match `normalize_phase_num() { ... \n}` up to the first newline-anchored `}`. + // Exact today because no interior line of the helper ends in a bare `}` (they + // end in quotes / then / else / fi). If the helper is ever refactored so an + // interior line ends in `}`, tighten this to a brace-counting parser. + const m = step.match(/normalize_phase_num\s*\(\)\s*\{[\s\S]*?\n\}/); + assert.ok(m, 'normalize_phase_num helper must exist in the step for behavioral extraction'); + return m[0]; + } + + function runHelper(t, input) { + const helper = extractNormalizeHelper(); + const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-2576-')); + t.after(() => cleanup(tmp)); + const script = path.join(tmp, 'normalize.sh'); + // argv array (no shell string) so a quoted input like '"05"' is passed verbatim. + fs.writeFileSync(script, `${helper}\nnormalize_phase_num "$1"\n`); + return execFileSync('bash', [script, input], { encoding: 'utf8' }); + } + + // The headline #2576 case: single-digit phase, padded vs unpadded. + test('acceptance: "05" and "5" both normalize to "5" (the reported bug)', (t) => { + assert.equal(runHelper(t, '05'), '5'); + assert.equal(runHelper(t, '5'), '5'); + assert.equal(runHelper(t, '05'), runHelper(t, '5')); + }); + + // Acceptance: decimal sub-phases — strip leading zeros from the leading integer + // run only, leave the dotted tail untouched. + test('acceptance: decimal sub-phase "04.1" normalizes to "4.1" (decimal preserved)', (t) => { + assert.equal(runHelper(t, '04.1'), '4.1'); + assert.equal(runHelper(t, '4.1'), '4.1'); + assert.equal(runHelper(t, '4.1'), runHelper(t, '04.1')); + }); + + // Acceptance: letter suffixes must compare correctly. + test('acceptance: letter suffix "03A" normalizes to "3A", "12A" stays "12A"', (t) => { + assert.equal(runHelper(t, '03A'), '3A'); + assert.equal(runHelper(t, '12A'), '12A'); + assert.equal(runHelper(t, '3A'), runHelper(t, '03A')); + }); + + // Acceptance: the "00"/"0" edge case must compare equal (not collapse to empty). + test('acceptance: "00" and "0" both normalize to "0" (all-zeros collapse to one zero)', (t) => { + assert.equal(runHelper(t, '0'), '0'); + assert.equal(runHelper(t, '00'), '0'); + assert.equal(runHelper(t, '0'), runHelper(t, '00')); + }); + + // Acceptance: quoted YAML values ("5") must compare correctly. The helper strips + // surrounding double quotes before normalizing. + test('acceptance: quoted YAML value "5" normalizes to "5" (quotes stripped)', (t) => { + assert.equal(runHelper(t, '"5"'), '5'); + assert.equal(runHelper(t, '"05"'), '5'); + assert.equal(runHelper(t, '"5"'), runHelper(t, '5')); + }); + + // Defensive: double-digit phases already matched before the fix; they must still. + test('regression: double-digit "12" stays "12" (no leading zero, no change)', (t) => { + assert.equal(runHelper(t, '12'), '12'); + }); + + // Defensive: arbitrary over-padding (e.g. a hand-edited "012") is tolerated too. + test('defensive: "012" normalizes to "12" (over-padding tolerated beyond the 2-digit convention)', (t) => { + assert.equal(runHelper(t, '012'), '12'); + assert.equal(runHelper(t, '12'), runHelper(t, '012')); + }); + + // Defensive: a blank or non-numeric resolves_phase must not crash and must not + // spuriously match any phase (the `[ -n "$RP_NORM" ]` guard relies on empty out). + test('defensive: empty input returns empty (no crash, no spurious match)', (t) => { + assert.equal(runHelper(t, ''), ''); + }); + + test('defensive: non-numeric "abc" passes through unchanged (will not equal any phase number)', (t) => { + assert.equal(runHelper(t, 'abc'), 'abc'); + }); +}); diff --git a/tests/fixtures/golden-install-parity/antigravity.json b/tests/fixtures/golden-install-parity/antigravity.json index 356c158d5..cc79ca3a1 100644 --- a/tests/fixtures/golden-install-parity/antigravity.json +++ b/tests/fixtures/golden-install-parity/antigravity.json @@ -247,7 +247,7 @@ "gsd-core/workflows/docs-update.md": "0b3023a3caa2123f", "gsd-core/workflows/edit-phase.md": "fc932e82ba1f585a", "gsd-core/workflows/eval-review.md": "9e8b169c05098b57", - "gsd-core/workflows/execute-phase.md": "62f2ffd1a3fab9a5", + "gsd-core/workflows/execute-phase.md": "df25a040ef14d483", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1832b97d0923fa67", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "13aa54f8279960ae", diff --git a/tests/fixtures/golden-install-parity/augment.json b/tests/fixtures/golden-install-parity/augment.json index b6ac18623..12558d2ba 100644 --- a/tests/fixtures/golden-install-parity/augment.json +++ b/tests/fixtures/golden-install-parity/augment.json @@ -318,7 +318,7 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "9576dee82fc42496", + "gsd-core/workflows/execute-phase.md": "014d1ce28cc64f48", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/fixtures/golden-install-parity/claude-local.json b/tests/fixtures/golden-install-parity/claude-local.json index 66d905b29..b8f84a72a 100644 --- a/tests/fixtures/golden-install-parity/claude-local.json +++ b/tests/fixtures/golden-install-parity/claude-local.json @@ -317,7 +317,7 @@ "gsd-core/workflows/docs-update.md": "7aef1019ce141558", "gsd-core/workflows/edit-phase.md": "dbbb6191f5a8b65e", "gsd-core/workflows/eval-review.md": "11620e0dc4a003dd", - "gsd-core/workflows/execute-phase.md": "5aad166b1505215d", + "gsd-core/workflows/execute-phase.md": "cbdeabca6be48255", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9a1f3deffb4dab14", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "a7f9b9a45303382f", diff --git a/tests/fixtures/golden-install-parity/claude.json b/tests/fixtures/golden-install-parity/claude.json index e3d166d99..e32ceb066 100644 --- a/tests/fixtures/golden-install-parity/claude.json +++ b/tests/fixtures/golden-install-parity/claude.json @@ -246,7 +246,7 @@ "gsd-core/workflows/docs-update.md": "ea47bd2d5a0d1d85", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "7c2f5ff8cc4d06e5", - "gsd-core/workflows/execute-phase.md": "cd61c80541fa54be", + "gsd-core/workflows/execute-phase.md": "7278bc14f1360c3e", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "d2020c5e01c7bd7f", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/fixtures/golden-install-parity/cline.json b/tests/fixtures/golden-install-parity/cline.json index bebd5c563..197e69e19 100644 --- a/tests/fixtures/golden-install-parity/cline.json +++ b/tests/fixtures/golden-install-parity/cline.json @@ -250,7 +250,7 @@ "gsd-core/workflows/docs-update.md": "7eb7095ca86d506f", "gsd-core/workflows/edit-phase.md": "9c9fadc047c61d74", "gsd-core/workflows/eval-review.md": "17fc9b4c4f7e1c74", - "gsd-core/workflows/execute-phase.md": "b169a6a7ad091517", + "gsd-core/workflows/execute-phase.md": "233b289d04dba64f", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "1b3558cb8f41b65a", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "35612890c1173577", diff --git a/tests/fixtures/golden-install-parity/codebuddy.json b/tests/fixtures/golden-install-parity/codebuddy.json index 1b874a48f..9741bc146 100644 --- a/tests/fixtures/golden-install-parity/codebuddy.json +++ b/tests/fixtures/golden-install-parity/codebuddy.json @@ -318,7 +318,7 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "8108d708e41340c2", + "gsd-core/workflows/execute-phase.md": "6339681fe63b9151", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/fixtures/golden-install-parity/codex.json b/tests/fixtures/golden-install-parity/codex.json index 9774acdc7..820551db9 100644 --- a/tests/fixtures/golden-install-parity/codex.json +++ b/tests/fixtures/golden-install-parity/codex.json @@ -353,7 +353,7 @@ "gsd-core/workflows/docs-update.md": "bf32efe90219d3dd", "gsd-core/workflows/edit-phase.md": "e592a4d85ce5380f", "gsd-core/workflows/eval-review.md": "c89a63285ead961e", - "gsd-core/workflows/execute-phase.md": "f6bf3f953a56e821", + "gsd-core/workflows/execute-phase.md": "968a8a22878c8f88", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "cd8678d082d6e191", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/fixtures/golden-install-parity/copilot.json b/tests/fixtures/golden-install-parity/copilot.json index ab4e97ee5..c2fbfbac6 100644 --- a/tests/fixtures/golden-install-parity/copilot.json +++ b/tests/fixtures/golden-install-parity/copilot.json @@ -248,7 +248,7 @@ "gsd-core/workflows/docs-update.md": "f64b067d0d729f04", "gsd-core/workflows/edit-phase.md": "8667c28b22b1599f", "gsd-core/workflows/eval-review.md": "1ae2d3d3fbf72893", - "gsd-core/workflows/execute-phase.md": "7f16a37d0729d517", + "gsd-core/workflows/execute-phase.md": "ffd43d2e08880866", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "ca37f91f7bd6f05c", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "25bebed74e645109", diff --git a/tests/fixtures/golden-install-parity/cursor.json b/tests/fixtures/golden-install-parity/cursor.json index 2e459da8f..c44054a7f 100644 --- a/tests/fixtures/golden-install-parity/cursor.json +++ b/tests/fixtures/golden-install-parity/cursor.json @@ -318,7 +318,7 @@ "gsd-core/workflows/docs-update.md": "215b0122c4d2b1e5", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "9389c58f7384972d", - "gsd-core/workflows/execute-phase.md": "784f3579b077e42e", + "gsd-core/workflows/execute-phase.md": "569fcc8eff1c9321", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "d2020c5e01c7bd7f", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/fixtures/golden-install-parity/hermes.json b/tests/fixtures/golden-install-parity/hermes.json index e71b913c1..42451b23f 100644 --- a/tests/fixtures/golden-install-parity/hermes.json +++ b/tests/fixtures/golden-install-parity/hermes.json @@ -247,7 +247,7 @@ "gsd-core/workflows/docs-update.md": "02811dd7aa32d5ba", "gsd-core/workflows/edit-phase.md": "7f27003f20e88fb8", "gsd-core/workflows/eval-review.md": "e7cd5dfcf18e2458", - "gsd-core/workflows/execute-phase.md": "e9ced8c3351c0df4", + "gsd-core/workflows/execute-phase.md": "5d6eac4e2b01028c", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "9b2193de25506b3b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "26ee34c543926402", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "362123fdf99e9980", diff --git a/tests/fixtures/golden-install-parity/kilo.json b/tests/fixtures/golden-install-parity/kilo.json index 82525ab11..4c6d21cb5 100644 --- a/tests/fixtures/golden-install-parity/kilo.json +++ b/tests/fixtures/golden-install-parity/kilo.json @@ -318,7 +318,7 @@ "gsd-core/workflows/docs-update.md": "3c0d5ef72202d246", "gsd-core/workflows/edit-phase.md": "8323bfe10faa0c0a", "gsd-core/workflows/eval-review.md": "35be91cd22a9bc11", - "gsd-core/workflows/execute-phase.md": "8f3e14c95888af4d", + "gsd-core/workflows/execute-phase.md": "fcd4c5d6d2630bed", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "b1e6588cd32a6f08", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/fixtures/golden-install-parity/kimi-code.json b/tests/fixtures/golden-install-parity/kimi-code.json index a5bc85e87..57e89a25d 100644 --- a/tests/fixtures/golden-install-parity/kimi-code.json +++ b/tests/fixtures/golden-install-parity/kimi-code.json @@ -275,7 +275,7 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "d8415f714b900335", + "gsd-core/workflows/execute-phase.md": "385158f8200e0b4b", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/fixtures/golden-install-parity/kimi.json b/tests/fixtures/golden-install-parity/kimi.json index e3b1d45e3..1f304bc93 100644 --- a/tests/fixtures/golden-install-parity/kimi.json +++ b/tests/fixtures/golden-install-parity/kimi.json @@ -311,7 +311,7 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "4fce4cae4a748e1e", + "gsd-core/workflows/execute-phase.md": "a4a4860eaebd1493", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/fixtures/golden-install-parity/opencode.json b/tests/fixtures/golden-install-parity/opencode.json index a2e8f594f..ef6597e46 100644 --- a/tests/fixtures/golden-install-parity/opencode.json +++ b/tests/fixtures/golden-install-parity/opencode.json @@ -318,7 +318,7 @@ "gsd-core/workflows/docs-update.md": "f6210dc8ff7776d5", "gsd-core/workflows/edit-phase.md": "1876c855fb0a0a39", "gsd-core/workflows/eval-review.md": "1973f08d0eb34159", - "gsd-core/workflows/execute-phase.md": "732995bcbb285233", + "gsd-core/workflows/execute-phase.md": "8f636a478e627dec", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "a15993affd62f4bf", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "c4cba01539f0368a", diff --git a/tests/fixtures/golden-install-parity/pi.json b/tests/fixtures/golden-install-parity/pi.json index 58ac5f65a..b7e1377bd 100644 --- a/tests/fixtures/golden-install-parity/pi.json +++ b/tests/fixtures/golden-install-parity/pi.json @@ -214,7 +214,7 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "6f720660e0cee48a", + "gsd-core/workflows/execute-phase.md": "3ce575de94c6d4e2", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/fixtures/golden-install-parity/qwen.json b/tests/fixtures/golden-install-parity/qwen.json index 3ba92371b..b0546f9b6 100644 --- a/tests/fixtures/golden-install-parity/qwen.json +++ b/tests/fixtures/golden-install-parity/qwen.json @@ -247,7 +247,7 @@ "gsd-core/workflows/docs-update.md": "226550a6d556b09f", "gsd-core/workflows/edit-phase.md": "0fb5e0123cfc6f36", "gsd-core/workflows/eval-review.md": "88431952699d9fa6", - "gsd-core/workflows/execute-phase.md": "b2744ece3ffc1ec6", + "gsd-core/workflows/execute-phase.md": "a2ffd60956eba939", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "0e0949db56deebeb", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "0b04cc2dcab61107", diff --git a/tests/fixtures/golden-install-parity/trae.json b/tests/fixtures/golden-install-parity/trae.json index 8e844caed..07a757748 100644 --- a/tests/fixtures/golden-install-parity/trae.json +++ b/tests/fixtures/golden-install-parity/trae.json @@ -247,7 +247,7 @@ "gsd-core/workflows/docs-update.md": "89e760e665ff99f8", "gsd-core/workflows/edit-phase.md": "7facd0faa33c8cad", "gsd-core/workflows/eval-review.md": "90a29a4fa0cdd947", - "gsd-core/workflows/execute-phase.md": "cea9135e975318d8", + "gsd-core/workflows/execute-phase.md": "10c31efb8ef7b218", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "296b812e8d0e9ce8", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7d30384e9bf82664", diff --git a/tests/fixtures/golden-install-parity/windsurf.json b/tests/fixtures/golden-install-parity/windsurf.json index f7788f265..5b487d32e 100644 --- a/tests/fixtures/golden-install-parity/windsurf.json +++ b/tests/fixtures/golden-install-parity/windsurf.json @@ -247,7 +247,7 @@ "gsd-core/workflows/docs-update.md": "6bd25d0123ee6c73", "gsd-core/workflows/edit-phase.md": "c0ae7d0063f3e789", "gsd-core/workflows/eval-review.md": "713de00ea5326988", - "gsd-core/workflows/execute-phase.md": "93432c3e63da4914", + "gsd-core/workflows/execute-phase.md": "e4138bc697e320b1", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "3194ecd382690755", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "fb4497767cdf73a3", diff --git a/tests/fixtures/golden-install-parity/zcode.json b/tests/fixtures/golden-install-parity/zcode.json index 3774249bd..b1433f2db 100644 --- a/tests/fixtures/golden-install-parity/zcode.json +++ b/tests/fixtures/golden-install-parity/zcode.json @@ -318,7 +318,7 @@ "gsd-core/workflows/docs-update.md": "a320371be70f43d8", "gsd-core/workflows/edit-phase.md": "966a3eadd1bebc04", "gsd-core/workflows/eval-review.md": "32d3d7e80ab2bfc7", - "gsd-core/workflows/execute-phase.md": "70da309ca11a8494", + "gsd-core/workflows/execute-phase.md": "9c4b1a77eb4fbd17", "gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md": "f7782680c2b8ad6b", "gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md": "7ebb7d1af6082028", "gsd-core/workflows/execute-phase/steps/post-merge-gate.md": "7b2d9a4a4013fd6a", diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index db888ce85..f72cfe917 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -24,7 +24,7 @@ "docs-update.md": 56494, "edit-phase.md": 12927, "eval-review.md": 10332, - "execute-phase.md": 93368, + "execute-phase.md": 93389, "execute-plan.md": 35143, "explore.md": 11127, "extract-learnings.md": 12893,