The bug #1998 subtest "checkbox updated when archived milestones exist in <details>" flaked under the high-concurrency docker run (~672 test files in parallel): the current-milestone checkbox was left unchecked. Root cause: `gsd-tools phase complete` writes ROADMAP.md as its LAST step, after a read-heavy parse/lock sequence. Under heavy parallel CPU/IO contention the test's tight `timeout: 10000` fired mid-parse and SIGTERM'd the subprocess before that write landed, leaving ROADMAP.md pristine (both phases `- [ ]`). The bare `catch {}` silently swallowed the kill, so a timeout masqueraded as a "checkbox not checked" assertion failure. All I/O is scoped to each test's tmpDir, so there is no cross-process race — the timeout was the sole cause. Consolidate all 7 duplicated `phase complete` call sites (suites #1998, #2005, #2526) into a shared runPhaseComplete() helper that: 1. raises the timeout to 60s so the test's own timer never kills the subprocess under load; 2. never silently swallows a signal/timeout kill (rethrows loudly with captured output) while still tolerating a clean non-zero exit for the ROADMAP-asserting tests via { tolerateExit: true }. No retry loop. Verified with 3x `gsd-test --reset` full docker runs (13207 tests / 2311 suites each, 0 failures, flaky subtest green every round). Closes #916 Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
190 KiB
190 KiB