Skip to content

Require the Node that does not crash mid-suite on Windows - #247

Merged
michaelvanhoutte merged 1 commit into
mainfrom
claude/issue-207-status-40e8b2
Sep 7, 2026
Merged

michaelvanhoutte merged 1 commit into
mainfrom
claude/issue-207-status-40e8b2

Conversation

@michaelvanhoutte

Copy link
Copy Markdown
Owner

The browser suite's dev server died in about 30% of pinned runs on Windows, taking the rest of the stack with it. "Node crashes in its own socket code" (issue 207) established it was a 0xC0000409 stack-cookie failure inside node.exe, on a socket path, and left one lead untested. This runs it.

What the measurement says

Node Pinned runs Stack deaths
v24.15.0 20 6
v24.14.1 10 0
v24.20.0 10 0, 105 tests passing each run

nodejs/node#62991 is this bug, which issue 207 ruled out on the evidence it had. It was filed on exit code 0xDEAD, but a second reporter there records "0xDEAD / 0xC0000409" on v24.15.0+, and it closes on "a non-deterministic Windows-only stack buffer overrun in the TCP machinery that was fixed in [v24.16.0]" — which is what a /GS fail-fast with ws2_32 on every crashing stack is.

The change

engines asks for ^24.16, and .npmrc sets engine-strict=true.

Both halves are needed: engines on its own is advisory, and pnpm installs anyway after printing WARN Unsupported engine (measured, exit 0). With engine-strict, v24.15.0 gets ERR_PNPM_UNSUPPORTED_ENGINE and exit 1. The cost, said in the .npmrc comment: it gates every dependency's engines too, so a dependency whose range excludes our Node now fails the install rather than warning.

Bounded to the 24 line, not left open at >=24.16, because Node stopped distributing corepack in v25 (nodejs/node#57617, SEMVER-MAJOR) — and corepack enable pnpm is the first setup step in the readme, and how packageManager supplies the pnpm version. An open range would have declared support for a Node where the documented setup cannot run.

No .nvmrc: .github/actions/setup/action.yml already reads node-version-file: package.json, so engines is the single source. The test explorer's own engines is deleted for the same reason — it is private, only ever run from the workspace root, and said >=22, which includes the crashing version.

How to check it

There is no product surface to drive, so the walk is the install gate itself, on this branch:

pnpm install --frozen-lockfile

On Node 24.16+ it installs (exit 0). On v24.15.0 it refuses, naming Expected version: ^24.16 and Got: v24.15.0 (exit 1) — that refusal is the whole change working. CI resolves node-version-file: package.json to v24.20.0, the version the ten runs above were measured on.

Also run: pnpm typecheck, pnpm test (1752 tests), pnpm test:scripts (236), and the F3 suite eleven times on v24.20.0.

One thing that misreads badly in a run log, worth knowing before diagnosing the next flake: Playwright kills its webServer at the end of a green run, so supervise prints a server exited (1); stopping the rest and pnpm relabels the child Command "vite" not found — the crash's two lines exactly. Position separates them: on a green run they sit within three lines of 105 passed.

Left as chips

  • apps/web/tests/unit/pages/CapturePage.test.tsx failed once under full-suite load and passed alone and on a re-run — a timing flake, unrelated to this change.
  • Nothing checks that the four written copies of the floor (engines, readme twice, CLAUDE.md) stay in step. This change found the previous value's five copies by grep; a check in scripts/lib/ would be its own piece of work.

Closes #207

🤖 Generated with Claude Code

The browser suite's dev server died in about 30% of runs under load on
Windows, and the cause was a stack buffer overrun inside node.exe's TCP
code, not anything here: a v24.15.0 regression that upstream fixed in
v24.16.0 (nodejs/node#62991). Measured on this machine, pinned to two
cores: 6 deaths in 20 runs on v24.15.0, 0 in 10 on v24.20.0 with all 105
tests passing each time.

So `engines` asks for `^24.16` rather than `>=22.12`. Bounded to the 24
line because Node stopped distributing corepack in v25, which every
setup instruction here depends on for the pnpm version.

`engines` alone only warns — pnpm prints "WARN Unsupported engine" and
installs anyway — so `.npmrc` sets `engine-strict=true`, which is what
makes the floor hold. The test explorer's own `engines` goes: it is
private and only ever run from the workspace root, so the root's
governs and the claim exists in one place.

Closes #207

Co-Authored-By: Claude Opus 5 <[email protected]>
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

Security review

Verdict: NONE. The reviewer reported nothing. If it could not read the whole diff, it says so in a comment of its own — this note cannot tell you how much was covered.

Worth a look
  • The session ran only 4 turns. Its verdict was NONE.

Any findings are inline comments on the diff. This note is written by the gate, not by the reviewer, so it appears whether or not the reviewer said anything.

@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

@michaelvanhoutte
michaelvanhoutte merged commit 7cb2f16 into main Sep 7, 2026
21 checks passed
@michaelvanhoutte
michaelvanhoutte deleted the claude/issue-207-status-40e8b2 branch September 7, 2026 19:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Node crashes in its own socket code, taking the F3 stack down mid-run on Windows

1 participant