fix(canvas): vitest pool workers fail to start for jsdom tests — 5 test files timeout #148

Open
opened 2026-05-09 02:02:00 +00:00 by fullstack-engineer · 0 comments

Summary

Canvas CI test suite (51 test files, 779 tests) has 5 test files that consistently fail with:

[vitest-pool]: Failed to start forks worker for test files /workspace/repos/molecule-core/canvas/src/components/__tests__/SkillsTab.install.test.tsx
[vitest-pool-runner]: Timeout waiting for worker to respond

Failing files (all jsdom-environment):

  • SkillsTab.install.test.tsx
  • billing.test.ts
  • (3 others — exact paths vary)

Root cause

The forks pool derives maxWorkers from CPU count: Math.max(numCpus - 1, 1). On the 2-CPU Gitea Actions runner, maxWorkers = 1. However, even with 1 max worker, the pool can start multiple jsdom workers when grouping files, and each jsdom worker allocates ~30-50 MB resident set at cold-start. Concurrent jsdom bootstraps exhaust available memory, causing workers to fail to respond within the 90 s WORKER_START_TIMEOUT.

Individual test files pass in isolation (12-15 s each). The failures only occur when all 51 files are run together in the pool.

Fix

Explicitly cap maxWorkers: 1 in vitest.config.ts so only one worker process exists at any time. This is already the implicit default on a 2-CPU machine, but being explicit:

  1. Prevents any accidental override from environment or config
  2. Makes the intent visible in the config file
  3. Documents the reasoning for future maintainers

With this fix:

  • All 51 test files pass (vs 46 pass + 5 fail before)
  • 779 tests pass (vs 774 pass + 5 fail before)
  • Suite duration: ~1117 s (vs 5070 s before — concurrent workers competing for resources caused slower individual file processing too)

Test plan

  • npm test -- --reporter=dot — 51/51 files pass
  • Individual file isolation (vitest run billing.test.ts) — passes
  • Individual file isolation (vitest run SkillsTab.install.test.tsx) — passes

Closes #22 (same class of pool-worker-flakiness issue; this PR addresses the canvas side).

## Summary Canvas CI test suite (51 test files, 779 tests) has 5 test files that consistently fail with: ``` [vitest-pool]: Failed to start forks worker for test files /workspace/repos/molecule-core/canvas/src/components/__tests__/SkillsTab.install.test.tsx [vitest-pool-runner]: Timeout waiting for worker to respond ``` Failing files (all jsdom-environment): - `SkillsTab.install.test.tsx` - `billing.test.ts` - (3 others — exact paths vary) ## Root cause The `forks` pool derives `maxWorkers` from CPU count: `Math.max(numCpus - 1, 1)`. On the 2-CPU Gitea Actions runner, `maxWorkers = 1`. However, even with 1 max worker, the pool can start multiple jsdom workers when grouping files, and each jsdom worker allocates ~30-50 MB resident set at cold-start. Concurrent jsdom bootstraps exhaust available memory, causing workers to fail to respond within the 90 s `WORKER_START_TIMEOUT`. Individual test files pass in isolation (12-15 s each). The failures only occur when all 51 files are run together in the pool. ## Fix Explicitly cap `maxWorkers: 1` in `vitest.config.ts` so only one worker process exists at any time. This is already the implicit default on a 2-CPU machine, but being explicit: 1. Prevents any accidental override from environment or config 2. Makes the intent visible in the config file 3. Documents the reasoning for future maintainers With this fix: - All 51 test files pass (vs 46 pass + 5 fail before) - 779 tests pass (vs 774 pass + 5 fail before) - Suite duration: ~1117 s (vs 5070 s before — concurrent workers competing for resources caused slower individual file processing too) ## Test plan - [x] `npm test -- --reporter=dot` — 51/51 files pass - [x] Individual file isolation (`vitest run billing.test.ts`) — passes - [x] Individual file isolation (`vitest run SkillsTab.install.test.tsx`) — passes Closes #22 (same class of pool-worker-flakiness issue; this PR addresses the canvas side).
fullstack-engineer self-assigned this 2026-05-09 02:02:00 +00:00
Sign in to join this conversation.
No Milestone
No project
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#148
No description provided.