What blocks with the event loop.
The handler cannot run while the synchronous child owns the thread.
A wrapper cannot settle a body whose same-process call is blocked.
Session write completions and microtask continuations stop progressing.
Health checks, Web RPC, and unrelated Sessions become unresponsive.
Choose the asynchronous owner.
No shell by default; forward the signal and set a deliberate maxBuffer.
Consume every pipe and wait for close before returning.
Use tree-scoped termination, bounded collection, spill, and quiescent wait.
It removes event-loop blocking but keeps shell injection. Separate the executable from its argument array and never interpolate untrusted input.
Primary evidence.
Migrate the lifetime, then prove it.
The complete guide includes an execFile migration, process-tree guidance, signal and timeout ownership, shell safety, reproduction evidence, and twelve acceptance gates.
Read the complete guide