fix(#1525): skip deferred phases on autonomous reruns (#1846)

* fix(#1525): skip deferred phases on autonomous reruns

* chore(#1525): add changeset fragment

* chore(#1525): fix changeset body

* test(#1525): refresh install parity fixtures

* test(#1525): shrink autonomous workflow

* test(#1525): refresh autonomous baselines

* test(#1525): tolerate Windows temp cleanup flake
This commit is contained in:
Tom Boucher
2026-06-30 21:29:38 -04:00
committed by GitHub
parent be54c0dbf5
commit 93e5d2dd84
22 changed files with 76 additions and 42 deletions

View File

@@ -139,6 +139,16 @@ describe('autonomous verification deferral contract', () => {
/Gaps deferred` and proceed to iterate step/,
'gap deferral must not silently proceed to the next phase',
);
assert.match(
workflow,
/Skip deferred phases on autonomous re-entry/,
'reruns must explicitly skip deferred verification phases',
);
assert.match(
workflow,
/Deferred Verification \(Skipped on Re-entry\)/,
'workflow should surface skipped deferred phases and their resume commands',
);
});
test('workflow runs normal transition post-processing after passed verification (#1526)', () => {
@@ -197,6 +207,8 @@ describe('autonomous verification deferral contract', () => {
);
assert.match(discoverStep, /phase_complete !== true/);
assert.match(discoverStep, /verification_status !== "passed"/);
assert.match(discoverStep, /STATE_CONTENT=\$\(cat \.planning\/STATE\.md 2>\/dev\/null \|\| true\)/);
assert.match(discoverStep, /drop any phase whose number appears in the deferred-phase map/);
assert.doesNotMatch(discoverStep, /ROADMAP=\$\(gsd_run query roadmap\.analyze\)/);
assert.doesNotMatch(discoverStep, /disk_status !== "complete"/);
@@ -207,5 +219,7 @@ describe('autonomous verification deferral contract', () => {
);
assert.match(iterateStep, /phase_complete !== true/);
assert.match(iterateStep, /verification_status !== "passed"/);
assert.match(iterateStep, /STATE_CONTENT=\$\(cat \.planning\/STATE\.md 2>\/dev\/null \|\| true\)/);
assert.match(iterateStep, /drop deferred phases from the autonomous queue/);
});
});

View File

@@ -199,7 +199,7 @@
"gsd-core/workflows/audit-fix.md": "9787a0ef00be649c",
"gsd-core/workflows/audit-milestone.md": "5e73ad8112a9b9b4",
"gsd-core/workflows/audit-uat.md": "777262a63dcaacdc",
"gsd-core/workflows/autonomous.md": "f145bbc649fd8aa6",
"gsd-core/workflows/autonomous.md": "443c5f64043df8ae",
"gsd-core/workflows/check-todos.md": "f6a93906922dd939",
"gsd-core/workflows/cleanup.md": "53aa20672fe253bd",
"gsd-core/workflows/code-review-fix.md": "715d98a6ff5931e2",

View File

@@ -268,7 +268,7 @@
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9",
"gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793",
"gsd-core/workflows/autonomous.md": "ba6828223ba13c1f",
"gsd-core/workflows/autonomous.md": "6a69708c184ac6a7",
"gsd-core/workflows/check-todos.md": "1e3026abe782bd36",
"gsd-core/workflows/cleanup.md": "5cf0772521c192a4",
"gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93",

View File

@@ -198,7 +198,7 @@
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04",
"gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12",
"gsd-core/workflows/autonomous.md": "c72e08a2afc08828",
"gsd-core/workflows/autonomous.md": "62d751d0fe6f14bc",
"gsd-core/workflows/check-todos.md": "fa637b6cc9be647c",
"gsd-core/workflows/cleanup.md": "5cf0772521c192a4",
"gsd-core/workflows/code-review-fix.md": "a416c764425cbb61",

View File

@@ -202,7 +202,7 @@
"gsd-core/workflows/audit-fix.md": "85a83f15012e220d",
"gsd-core/workflows/audit-milestone.md": "7e68a0d33382fbca",
"gsd-core/workflows/audit-uat.md": "2ab2975014fbb210",
"gsd-core/workflows/autonomous.md": "40a72366442139c2",
"gsd-core/workflows/autonomous.md": "c4d9da6056aeb782",
"gsd-core/workflows/check-todos.md": "ab6239efbf42077b",
"gsd-core/workflows/cleanup.md": "869f953fb25e57a7",
"gsd-core/workflows/code-review-fix.md": "40d723ec1c6b45d1",

View File

@@ -268,7 +268,7 @@
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9",
"gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793",
"gsd-core/workflows/autonomous.md": "ba6828223ba13c1f",
"gsd-core/workflows/autonomous.md": "6a69708c184ac6a7",
"gsd-core/workflows/check-todos.md": "1e3026abe782bd36",
"gsd-core/workflows/cleanup.md": "5cf0772521c192a4",
"gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93",

View File

@@ -234,7 +234,7 @@
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "28afeeab183e254f",
"gsd-core/workflows/audit-uat.md": "b3b503e9f80dc9f5",
"gsd-core/workflows/autonomous.md": "d8ed420051f4d670",
"gsd-core/workflows/autonomous.md": "b371d3c2ccaa0f42",
"gsd-core/workflows/check-todos.md": "d847aa758e18d698",
"gsd-core/workflows/cleanup.md": "b990139192ab7c08",
"gsd-core/workflows/code-review-fix.md": "3311f5fa61f8a90b",

View File

@@ -200,7 +200,7 @@
"gsd-core/workflows/audit-fix.md": "bd88277e075ec47f",
"gsd-core/workflows/audit-milestone.md": "3c1624402b54073d",
"gsd-core/workflows/audit-uat.md": "eccd8feb247425b0",
"gsd-core/workflows/autonomous.md": "00fa6860aa7653a8",
"gsd-core/workflows/autonomous.md": "44ba4186752758c0",
"gsd-core/workflows/check-todos.md": "4cdc0f448c772fbf",
"gsd-core/workflows/cleanup.md": "a67cfbd98eca5b86",
"gsd-core/workflows/code-review-fix.md": "84d5f91b2856a1f2",

View File

@@ -268,7 +268,7 @@
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04",
"gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12",
"gsd-core/workflows/autonomous.md": "70065ffffd8886cf",
"gsd-core/workflows/autonomous.md": "c51a8b19aa869149",
"gsd-core/workflows/check-todos.md": "a993c1e7b0eff1f6",
"gsd-core/workflows/cleanup.md": "2bd6ad5f107fe439",
"gsd-core/workflows/code-review-fix.md": "c62547be55f13dcd",

View File

@@ -268,7 +268,7 @@
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9",
"gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793",
"gsd-core/workflows/autonomous.md": "7cc800bc9a5bfc8a",
"gsd-core/workflows/autonomous.md": "c1bbd56f92dda773",
"gsd-core/workflows/check-todos.md": "34b3034a31e7dbe5",
"gsd-core/workflows/cleanup.md": "e73b3969f5c10dcf",
"gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93",

View File

@@ -199,7 +199,7 @@
"gsd-core/workflows/audit-fix.md": "5aded4cc2682502b",
"gsd-core/workflows/audit-milestone.md": "c36d1c46d4aecca7",
"gsd-core/workflows/audit-uat.md": "5e93ef61f91ad0c0",
"gsd-core/workflows/autonomous.md": "7a482d2afb346e57",
"gsd-core/workflows/autonomous.md": "6f4df1e9a17a71c4",
"gsd-core/workflows/check-todos.md": "8807759cc4df46c0",
"gsd-core/workflows/cleanup.md": "6380894e67d2435d",
"gsd-core/workflows/code-review-fix.md": "5090840d834ec31a",

View File

@@ -268,7 +268,7 @@
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "5e9a35af57344e04",
"gsd-core/workflows/audit-uat.md": "69dbdec25cae2f12",
"gsd-core/workflows/autonomous.md": "ac4f18090bd4b178",
"gsd-core/workflows/autonomous.md": "6ebf93b8ed1155f3",
"gsd-core/workflows/check-todos.md": "cde0a3025828bad8",
"gsd-core/workflows/cleanup.md": "d124682912dab9f6",
"gsd-core/workflows/code-review-fix.md": "a416c764425cbb61",

View File

@@ -235,7 +235,7 @@
"gsd-core/workflows/audit-fix.md": "eaead7ea85761e5b",
"gsd-core/workflows/audit-milestone.md": "fe7185bb70eafdb9",
"gsd-core/workflows/audit-uat.md": "ca6f1f0ef174f793",
"gsd-core/workflows/autonomous.md": "ba6828223ba13c1f",
"gsd-core/workflows/autonomous.md": "6a69708c184ac6a7",
"gsd-core/workflows/check-todos.md": "1e3026abe782bd36",
"gsd-core/workflows/cleanup.md": "5cf0772521c192a4",
"gsd-core/workflows/code-review-fix.md": "b442c670f8c1fe93",

View File

@@ -268,7 +268,7 @@
"gsd-core/workflows/audit-fix.md": "c7878f1dff04adf1",
"gsd-core/workflows/audit-milestone.md": "99f0b884c9208dde",
"gsd-core/workflows/audit-uat.md": "e530acf37fd9c699",
"gsd-core/workflows/autonomous.md": "9a19deccc06a702e",
"gsd-core/workflows/autonomous.md": "dacf6c73407fe29c",
"gsd-core/workflows/check-todos.md": "42806d03eacf9ff6",
"gsd-core/workflows/cleanup.md": "daca0c4f1d531a02",
"gsd-core/workflows/code-review-fix.md": "618c850533bd5c9e",

View File

@@ -199,7 +199,7 @@
"gsd-core/workflows/audit-fix.md": "75f9d02e6924913c",
"gsd-core/workflows/audit-milestone.md": "49d1978340cf89ef",
"gsd-core/workflows/audit-uat.md": "b38b4e18e2abd51b",
"gsd-core/workflows/autonomous.md": "aa104d2eec3f112f",
"gsd-core/workflows/autonomous.md": "df74d15ceddb0190",
"gsd-core/workflows/check-todos.md": "7fc4a39f3e83dde7",
"gsd-core/workflows/cleanup.md": "804c5d481279f008",
"gsd-core/workflows/code-review-fix.md": "7d6caed073170b2a",

View File

@@ -199,7 +199,7 @@
"gsd-core/workflows/audit-fix.md": "493e4abe4f701662",
"gsd-core/workflows/audit-milestone.md": "26b2428d9a8df7b2",
"gsd-core/workflows/audit-uat.md": "f02cd45df6304b06",
"gsd-core/workflows/autonomous.md": "09f390b492bc8801",
"gsd-core/workflows/autonomous.md": "e2b5525089396882",
"gsd-core/workflows/check-todos.md": "e4209530a4132312",
"gsd-core/workflows/cleanup.md": "78080ff25ba43f8c",
"gsd-core/workflows/code-review-fix.md": "4eebfb7f1612b441",

View File

@@ -199,7 +199,7 @@
"gsd-core/workflows/audit-fix.md": "e1ad3e58979d9eef",
"gsd-core/workflows/audit-milestone.md": "e578d1ce71b172e6",
"gsd-core/workflows/audit-uat.md": "0f779101b40c7229",
"gsd-core/workflows/autonomous.md": "fbd5185763707f74",
"gsd-core/workflows/autonomous.md": "605f4563acd39ae4",
"gsd-core/workflows/check-todos.md": "ad2ff17a672e7101",
"gsd-core/workflows/cleanup.md": "edc0bc375acdb563",
"gsd-core/workflows/code-review-fix.md": "aa750f6d1abd3b9f",

View File

@@ -4,6 +4,7 @@
const { execFileSync } = require('child_process');
const fs = require('fs');
const os = require('os');
const path = require('path');
const { createFixture } = require('./fixtures/index.cjs');
@@ -130,6 +131,7 @@ function cleanup(tmpDir) {
if (typeof tmpDir !== 'string' || tmpDir.length === 0) return;
const target = path.resolve(tmpDir);
const cwd = path.resolve(process.cwd());
const tmpRoot = path.resolve(os.tmpdir());
if (cwd === target || cwd.startsWith(`${target}${path.sep}`)) {
// Windows cannot remove a directory that is the current working directory.
process.chdir(path.dirname(target));
@@ -139,7 +141,17 @@ function cleanup(tmpDir) {
// teardown runs. On POSIX the retry loop is a no-op (rmSync succeeds first try).
// Budget: 20 × 250ms = 5s total — Windows Defender's deferred scan can hold
// newly-written files for several seconds on cold runners.
fs.rmSync(target, { recursive: true, force: true, maxRetries: 20, retryDelay: 250 });
try {
fs.rmSync(target, { recursive: true, force: true, maxRetries: 20, retryDelay: 250 });
} catch (error) {
// After retries, Windows can still briefly hold temp dirs open after a timed-out
// child exits. Ignore that teardown-only flake for temp roots, but rethrow everything else.
const isTmpPath = target === tmpRoot || target.startsWith(`${tmpRoot}${path.sep}`);
const isTransientWinErr = process.platform === 'win32'
&& isTmpPath
&& ['EBUSY', 'ENOTEMPTY', 'EPERM'].includes(error && error.code);
if (!isTransientWinErr) throw error;
}
}
/**

View File

@@ -8,7 +8,7 @@
"audit-fix.md": 10988,
"audit-milestone.md": 17637,
"audit-uat.md": 7425,
"autonomous.md": 42747,
"autonomous.md": 41790,
"check-todos.md": 9431,
"cleanup.md": 9897,
"code-review-fix.md": 23890,