From 2fdf97139daaae7a64e006327c5b43db77accd15 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 3 Sep 2026 06:15:49 +0000 Subject: [PATCH 1/2] test(cli): quarantine the never-read-reader hang case behind #14832 (maintainer ruling A) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `'never-read'` case in run-dev-unbuilt-workspace.e2e.test.ts hangs under CI load and was SIGKILLed at the 180 s cap on `Test Core (1/6)`, ejecting a whole merge-queue batch each time. The product hang lives in `packages/cli/bin/run-dev.js` and is fixed separately; until it lands the case is skipped and its `beforeAll` spawn — the only place the 180 s is paid, and consumed by that case alone — is commented out verbatim beside a restore note. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01ShyhexkB2d1AeRZ85tgAAe --- .../run-dev-unbuilt-workspace.e2e.test.ts | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts b/packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts index 131331ed37..ba9311bcae 100644 --- a/packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts +++ b/packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts @@ -300,10 +300,18 @@ beforeAll(async () => { built = await runCli(REAL_COMMAND, dir, undefined); genuinelyMissing = await runCli(['definitely-not-a-command'], dir, undefined); stalled = await runCliWhileParentStalls(REAL_COMMAND, dir, `--import ${UNBUILT_HOOK}`); - // ⛔ Nothing measured above is consulted here. Case 1's wall clock is read by - // the failure message below, as evidence; the ceiling is a constant, so a - // slow sample can no longer size the instrument that judges the next run. - unread = await runCliAgainstDeadReader(REAL_COMMAND, dir, `--import ${UNBUILT_HOOK}`, 'never-read', UNREAD_HARD_CAP_MS); + // ⛔ QUARANTINED — the `'never-read'` child is NOT spawned while the case it + // feeds is skipped. See the quarantine note on + // `it.skip('gives up and exits instead of waiting forever')` further down: + // this spawn is where the 180 s `UNREAD_HARD_CAP_MS` is paid under CI load, + // and that one case is its ONLY consumer — `unread` is read nowhere else in + // this file. The PR that fixes the hang in `bin/run-dev.js` un-skips that case + // and restores these four lines verbatim, in the same change: + // + // // ⛔ Nothing measured above is consulted here. Case 1's wall clock is read by + // // the failure message below, as evidence; the ceiling is a constant, so a + // // slow sample can no longer size the instrument that judges the next run. + // unread = await runCliAgainstDeadReader(REAL_COMMAND, dir, `--import ${UNBUILT_HOOK}`, 'never-read', UNREAD_HARD_CAP_MS); closedEnd = await runCliAgainstDeadReader(REAL_COMMAND, dir, `--import ${UNBUILT_HOOK}`, 'destroy-read-end', UNREAD_HARD_CAP_MS); }, RUN_TIMEOUT_MS * 6); @@ -392,7 +400,23 @@ describe('the mirror direction: a reader that is never coming back', () => { * this replaces armed no bound at all (`write()` returned true, so an early * return skipped it) and read as correct in every stalled-reader test. */ - it('gives up and exits instead of waiting forever', () => { + // ⛔ QUARANTINED under the maintainer's ruling A of 2026-09-03 on + // objectstack#14832 — do not un-skip it on its own. + // + // WHY. The `'never-read'` child this case reads HANGS under CI load. The + // defect is in the product — `bin/run-dev.js`, the other half of #14832 — + // and NOT a cap that is set too low, so raising `UNREAD_HARD_CAP_MS` would buy + // nothing and would only make each failure slower. On `Test Core (1/6)` the + // harness SIGKILLed the child at the 180 s cap and this assertion red, and + // every occurrence EJECTED A WHOLE MERGE-QUEUE BATCH: `main` could not advance + // for hours behind this one case, which is what the ruling weighed. + // + // RE-ENABLE CONDITION. The PR that fixes the hang in `bin/run-dev.js` un-skips + // this case in the SAME change, and restores the `'never-read'` spawn in + // `beforeAll` (kept there verbatim, commented). The body below and all of its + // comments are untouched, so lifting the quarantine is `it.skip` -> `it` plus + // that one spawn line — nothing here has to be reconstructed. + it.skip('gives up and exits instead of waiting forever', () => { // A child still alive at the cap was SIGKILLed: signal set, code null. // That is the hang, and it is the whole point of this case. // From edf0095162fa468c0a1c307d79f261994a06f853 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 3 Sep 2026 06:19:22 +0000 Subject: [PATCH 2/2] test(cli): keep the quarantined file strict-clean with a definite-assignment assertion With the `'never-read'` spawn commented out nothing assigns `unread`, and `strict` then reports TS2454 at each of the three reads inside the skipped case. The package's own `typecheck` is `include: ["src"]`, so it never compiles this file and reported exit 0 either way; measured against an equivalent strict program the pristine file is 0 errors, the quarantine without this assertion is 3, and with it 0 again. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01ShyhexkB2d1AeRZ85tgAAe --- packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts b/packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts index ba9311bcae..4d94015111 100644 --- a/packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts +++ b/packages/cli/test/run-dev-unbuilt-workspace.e2e.test.ts @@ -291,7 +291,13 @@ let unbuilt: Run; let built: Run; let genuinelyMissing: Run; let stalled: Run; -let unread: Lifetime; +// Definite-assignment assertion for the duration of the QUARANTINE below: the +// `'never-read'` spawn in `beforeAll` is commented out, so nothing assigns this +// and `strict` reports TS2454 at each of the three reads inside the skipped +// case. Restoring that spawn makes the `!` redundant again, so it goes when the +// quarantine is lifted. (Measured: the package's own `typecheck` is +// `include: ["src"]`, so it never compiles this file and would not have said.) +let unread!: Lifetime; let closedEnd: Lifetime; beforeAll(async () => {