From d223409c889b5ad8a96d3c3758862cfebb441bef Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 15 Jul 2026 04:16:53 -0700 Subject: [PATCH] fix(ci): run all compact test bins serially (#108266) --- scripts/lib/ci-node-test-plan.mjs | 12 ++++++------ test/scripts/ci-node-test-plan.test.ts | 13 ++++--------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/scripts/lib/ci-node-test-plan.mjs b/scripts/lib/ci-node-test-plan.mjs index be726474a939..f4a2ecc3e642 100644 --- a/scripts/lib/ci-node-test-plan.mjs +++ b/scripts/lib/ci-node-test-plan.mjs @@ -1381,12 +1381,12 @@ function createCompactNodeTestShardBundles(options = {}) { ...(bin.hasWholeConfigGroup ? { timeoutMinutes: COMPACT_WHOLE_NODE_TEST_TIMEOUT_MINUTES } : {}), - // 4 vCPU bins run their plans serially: overlapping two Vitest runs - // there starves process-spawning tests (worker-startup timeouts in - // core-runtime-infra-process, tooling process-group waits), and the - // packed weights are contention-inflated so serializing is roughly - // wall-neutral. Exclusive spawn/signal bins stay serial everywhere. - ...(bin.exclusive || runnerClass === "small" ? { planConcurrency: 1 } : {}), + // Every compact bin runs its plans serially. Overlapping two Vitest + // runs on one runner starves timing-sensitive tests on both runner + // classes (worker-startup timeouts on 4 vCPU, UI-animation and + // lock-timing flakes on 8 vCPU), and the packed weights are + // contention-inflated so serializing is roughly wall-neutral. + planConcurrency: 1, }); } } diff --git a/test/scripts/ci-node-test-plan.test.ts b/test/scripts/ci-node-test-plan.test.ts index 0e17cc7fe91c..6e61af38cba7 100644 --- a/test/scripts/ci-node-test-plan.test.ts +++ b/test/scripts/ci-node-test-plan.test.ts @@ -203,10 +203,9 @@ describe("scripts/lib/ci-node-test-plan.mjs", () => { expect(jobOf("agentic-agents-core-runner-embedded")).toBeGreaterThanOrEqual(0); expect(jobOf("core-unit-fast")).toBeGreaterThanOrEqual(0); expect(jobOf("agentic-agents-core-runner-embedded")).not.toBe(jobOf("core-unit-fast")); - // Spawn/signal-timing suites flake next to a concurrent sibling Vitest - // run; their bins never mix with regular groups, and every 4 vCPU bin - // runs serially because overlapping Vitest runs starve process-spawning - // tests on that runner class. + // Spawn/signal-timing suites never mix with regular groups, and every + // compact bin runs serially: overlapping Vitest runs flake timing- + // sensitive tests on both runner classes. const exclusiveGroupRe = /^core-tooling(?:-\d+|-isolated|-docker)?$|^core-runtime-tui-pty$/u; for (const shard of compact) { const exclusiveCount = shard.groups.filter((group) => @@ -215,11 +214,7 @@ describe("scripts/lib/ci-node-test-plan.mjs", () => { if (exclusiveCount > 0) { expect(exclusiveCount).toBe(shard.groups.length); } - if (exclusiveCount > 0 || !shard.runner.includes("-8vcpu-")) { - expect(shard.planConcurrency).toBe(1); - } else { - expect(shard.planConcurrency).toBeUndefined(); - } + expect(shard.planConcurrency).toBe(1); } expect( compact.filter((shard) =>