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
On Windows x64, copilot.execonsistently crashes at process exit with a fatal
fail-fast (0xc0000409, subcode 0x7 FAST_FAIL_FATAL_APP_EXIT). The session's work
completes normally; the crash happens only during teardown.
Live-debugger analysis (WinDbg attached to the crashing process) shows this is the
well-known Windows-only Node.js/libuv shutdown race — uv_async_send() is called
on a uv_async_t whose UV_HANDLE_CLOSING flag is already set, tripping the libuv
assertion:
which calls abort() → __fastfail(FAST_FAIL_FATAL_APP_EXIT). The bundled Node
(v24.16.0) ships libuv with this assertion enabled, so the otherwise-benign
teardown race becomes a hard crash.
GitHub Copilot CLI: 1.0.74-0 (crash first captured on 1.0.73.0; reproduces on 1.0.74-0) - Bundled Node.js: v24.16.0 (win-x64, single-executable build), ICU 78 - OS: Windows x64 (build 10.0.29635) - Onset: started ~1 month ago (consistent with a CLI update that bumped the bundled Node)
Steps to reproduce the behavior
Launch copilot on Windows x64.
Use it normally (any session involving network/async activity).
Exit the CLI.
The process aborts on exit with a fail-fast crash / WER entry (exit is not clean).
Reproduces every time on the affected machine.
Expected behavior
The CLI should exit cleanly (exit code 0, no fail-fast/WER crash) after the session ends.
Additional context
Two threads show both sides of the shutdown race:
Crashing thread — "V8Worker" (a V8 background platform worker):
Disassembly of uv_async_send confirms the fatal branch is the top-of-function
guard (test byte ptr [handle+0x58],1 / UV_HANDLE_CLOSING), not a failed PostQueuedCompletionStatus.
Main thread — in Node's process-exit teardown, joining workers:
node::DefaultProcessExitHandler
→ (V8 platform shutdown)
→ uv_thread_join
→ WaitForSingleObjectEx ; waiting for the V8 worker to exit
So during DefaultProcessExitHandler, the main thread closes the per-isolate
"flush-tasks" uv_async_t (sets UV_HANDLE_CLOSING) and joins the V8 workers; a
V8 worker drains one last task and calls uv_async_send() on that now-closing
handle → assertion → abort.
Faulting thread is the V8 worker; instruction is int 29h (__fastfail).
Suggested fixes (for maintainers)
Avoid process.exit() during teardown when V8/libuv async handles are still
live; prefer setting process.exitCode and letting the loop drain, or add a
small deferral before forced exit (common community workaround for #56645).
Impact is at-exit only (no data loss), but it produces a non-zero exit and a WER
crash entry on every exit, which is noisy and can break scripts that check the
CLI's exit code.
Describe the bug
On Windows x64,
copilot.execonsistently crashes at process exit with a fatalfail-fast (
0xc0000409, subcode0x7 FAST_FAIL_FATAL_APP_EXIT). The session's workcompletes normally; the crash happens only during teardown.
Live-debugger analysis (WinDbg attached to the crashing process) shows this is the
well-known Windows-only Node.js/libuv shutdown race —
uv_async_send()is calledon a
uv_async_twhoseUV_HANDLE_CLOSINGflag is already set, tripping the libuvassertion:
which calls
abort()→__fastfail(FAST_FAIL_FATAL_APP_EXIT). The bundled Node(v24.16.0) ships libuv with this assertion enabled, so the otherwise-benign
teardown race becomes a hard crash.
Upstream tracking issue: nodejs/node#56645
(Node 23/24/25 lines on Windows; Linux/macOS unaffected.)
Affected version
Steps to reproduce the behavior
copiloton Windows x64.Reproduces every time on the affected machine.
Expected behavior
The CLI should exit cleanly (exit code 0, no fail-fast/WER crash) after the session ends.
Additional context
Two threads show both sides of the shutdown race:
Crashing thread — "V8Worker" (a V8 background platform worker):
Disassembly of
uv_async_sendconfirms the fatal branch is the top-of-functionguard (
test byte ptr [handle+0x58],1/UV_HANDLE_CLOSING), not a failedPostQueuedCompletionStatus.Main thread — in Node's process-exit teardown, joining workers:
So during
DefaultProcessExitHandler, the main thread closes the per-isolate"flush-tasks"
uv_async_t(setsUV_HANDLE_CLOSING) and joins the V8 workers; aV8 worker drains one last task and calls
uv_async_send()on that now-closinghandle → assertion → abort.
!analyze -vsummary:ExceptionCode: c0000409(STATUS_STACK_BUFFER_OVERRUN),Subcode: 0x7 FAST_FAIL_FATAL_APP_EXITFAILURE_BUCKET_ID: FAIL_FAST_FATAL_APP_EXIT_c0000409_copilot.exe!Unknownint 29h(__fastfail).Suggested fixes (for maintainers)
process.exit()during teardown when V8/libuv async handles are stilllive; prefer setting
process.exitCodeand letting the loop drain, or add asmall deferral before forced exit (common community workaround for #56645).
Node line where the shutdown ordering doesn't hit this path on Windows.
crash entry on every exit, which is noisy and can break scripts that check the
CLI's exit code.