You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Windows: bundled Node v24.16.0 can abort at exit (nodejs/node#56645); please bundle Node >= 24.20.0 #2617
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.
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.
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.
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.
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.
Activity
Ancienttwo commentedon Oct 16, 2026
Measured on hosted
windows-latestwith 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.exefrom@colbymchenry/codegraph-win32-x64@1.6.2(v24.16.0): 284 / 300 aborted with0xC0000409andAssertion failed: !(handle->flags & UV_HANDLE_CLOSING), file src\win\async.c, line 94.node.exewith 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-onlyalready set, so another path still reaches the race.v24.21.0: 0 / 300.Run: https://github.com/Ancienttwo/arch-context/actions/runs/38864942793 (script:
probe/node-exit-abort-repro.mjson branchclaude/issue-358-exit-abort-probe).release.ymlcallsscripts/build-bundle.sh "$t"without a version, so the defaultNODE_VERSION="${2:-v24.16.0}"is the whole pin. Moving it tov24.21.0takes the exit fix (24.20.0) and the Windows 8.3-short-path watcher fix (nodejs/node#65118, 24.21.0).--liftoff-onlyand the Node 25 block stay as they are. I'll open a small PR with that change.colbymchenry commentedon Oct 22, 2026
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.
fix(bundle): bundle Node 24.21.0 so Windows commands no longer abort …
fix(bundle): bundle Node 24.22.1, the October security release, and v…
fix(bundle): bundle Node 24.22.1, the October security release, and v…
fix(bundle): bundle Node 24.22.1, the October security release, and v…