From f3a6bb5a384c65a9b039280a8dc17a4d965112d9 Mon Sep 17 00:00:00 2001 From: Paul Bakaus Date: Sat, 25 Jul 2026 20:26:43 -0700 Subject: [PATCH] Retry the doctor-test scratch cleanup to kill a Node 22 CI flake The suite runs real git subprocesses in its scratch dir, and on Node 22 the recursive afterEach delete raced git's object writes: rmdir of .git/objects threw ENOTEMPTY and failed an unrelated PR's CI run (seen on the #418 rebase run, checkDesignDrift suite). rmSync's maxRetries/retryDelay options exist for exactly these transient errors. Prepared with AI assistance (Claude Code), directed by @pbakaus. Co-Authored-By: Claude Code --- tests/doctor.test.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/doctor.test.mjs b/tests/doctor.test.mjs index f46c481db..2e120e4c2 100644 --- a/tests/doctor.test.mjs +++ b/tests/doctor.test.mjs @@ -39,7 +39,11 @@ beforeEach(() => { }); afterEach(() => { - fs.rmSync(scratch, { recursive: true, force: true }); + // These tests run real git subprocesses in the scratch dir; on Node 22 a + // recursive delete can race git's object writes and fail the whole test + // with ENOTEMPTY (seen in CI). maxRetries/retryDelay make rmSync retry + // exactly those transient errors. + fs.rmSync(scratch, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }); }); function write(rel, body) {