Skip to content

Windows: bundled Node v24.16.0 can abort at exit (nodejs/node#56645); please bundle Node >= 24.20.0 #2617

Closed

Description

@Ancienttwo

Summary

The 1.6.2 bundles (and scripts/build-bundle.sh's default NODE_VERSION) ship Node v24.16.0. On Windows that release carries nodejs/node#56645: at process exit, a V8 platform worker can post a delayed task after the scheduler's uv_async handle has started closing, and libuv aborts with

Assertion failed: !(handle->flags & UV_HANDLE_CLOSING), file src\win\async.c, line 94

and status 0xC0000409, after the command's work has already completed. Node fixed it in 24.20.0 (nodejs/node#61999, listed in CHANGELOG_V24.md). Node 24.21.0 also contains the 8.3-short-path file-watcher fix (nodejs/node#65118), which matters if the watcher runs under a runner temp dir.

What we saw

In hosted Windows CI, codegraph sync <root> --quiet (1.6.1, launched through npm-shim.js, bundled node.exe) printed exactly that assertion and exited with status 9. That is 0xC0000409 cut to its low byte by the caller. The work had finished; the crash happened during teardown. Our tooling correctly treats a nonzero exit as failure, so this fails a run that would otherwise be correct.

Measured

  • win32-x64 1.6.2 bundled node.exe --version → v24.16.0 (hosted windows-latest); darwin-arm64 1.6.2 → v24.16.0.
  • A 20-minute, two-runner Windows stress of init / sync --quiet / status -j (bundled v24.16.0 vs the same entry and --liftoff-only flags on Node v24.21.0, 4 workers each) did not reproduce it: 0 nonzero exits in about 2,840 children per runtime. The abort is rare and load-dependent. Other projects report about 1 in 10 CI runs, and moving to Node ≥ 24.20 cleared it for them (for example ci(edge): run Windows checks and releases on Node 24.21.0, past the libuv exit abort pawaca/dsh-edge#277).

The 1.6.2 notes on helper-thread start-up and clean-up (the 3221225477 access violation) address a different crash. This one is inside Node's own platform shutdown, so it needs the runtime bump.

Request

Bundle Node ≥ 24.20.0 (24.21.0 preferred) in the next release, at least for the win32 bundles.

Activity

  1. Ancienttwo commented on Oct 16, 2026

    @Ancienttwo
    Author

    Measured on hosted windows-latest with Node's own regression reproducer for nodejs/node#56645 (test-process-exit-after-fetch-throw.js, added in nodejs/node#61999), 300 runs each:

    • node.exe from @colbymchenry/codegraph-win32-x64@1.6.2 (v24.16.0): 284 / 300 aborted with 0xC0000409 and Assertion failed: !(handle->flags & UV_HANDLE_CLOSING), file src\win\async.c, line 94.
    • The same node.exe with the shim's --liftoff-only: 0 / 300. That flag only removes this reproducer's WASM tier-up trigger. Our real crash (codegraph sync, same assertion and line) happened under the shim, with --liftoff-only already set, so another path still reaches the race.
    • Node v24.21.0: 0 / 300.

    Run: https://github.com/Ancienttwo/arch-context/actions/runs/38864942793 (script: probe/node-exit-abort-repro.mjs on branch claude/issue-358-exit-abort-probe).

    release.yml calls scripts/build-bundle.sh "$t" without a version, so the default NODE_VERSION="${2:-v24.16.0}" is the whole pin. Moving it to v24.21.0 takes the exit fix (24.20.0) and the Windows 8.3-short-path watcher fix (nodejs/node#65118, 24.21.0). --liftoff-only and the Node 25 block stay as they are. I'll open a small PR with that change.

  2. colbymchenry commented on Oct 22, 2026

    @colbymchenry
    Owner

    Thanks for the careful report and the measurements, @Ancienttwo.

    #2806 is merged to main. It moves the bundled Node to 24.21.0, which has Node's fix for this abort at exit (nodejs/node#61999, from 24.20.0) and the 8.3 short-path watcher fix.

    On a Windows 11 machine, Node's own reproducer aborted in 300 of 300 runs on 24.16.0 and passed all 300 on 24.21.0. A win32-x64 bundle built with it indexes and syncs cleanly.

    Your PR #2619 guided the change, and you're credited in the changelog. It ships with the next release's bundles.

  3. added a commit that references this issue on Oct 22, 2026
    c4dbc12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions