# CLI launcher shutdown evidence

Linux x64, Node 26, bindfs FUSE passthrough, fresh synthetic Git repositories and fresh T3 homes. The terminal recordings are real X11 captures (1600x1000, identical font and colors). No production data or paid model is used.

Base: [f5ae8088c3](https://github.com/pingdotgg/t3code/commit/f5ae8088c354ec6e75fee258d716afa52a4cbac1).
Head: [e187c483fa](https://github.com/pingdotgg/t3code/commit/e187c483faee7118fe985adda5d7a2f963d1a310).

Prerequisites: vp, npm, Python with Pillow, bindfs, fusermount, Xvfb, xterm, ffmpeg, a usable FUSE device. Put driver.py and record.py beside each other in an evidence directory.

For each side, use its own checkout and first run:

```
vp i
vp run --filter t3 build:exe
node scripts/build-npm-launcher.ts --version 0.1.9 --output-dir "$EVIDENCE/$SIDE-package"
npm install --prefix "$EVIDENCE/$SIDE-install" "$EVIDENCE/$SIDE-package/t3.tgz"
T3_EVIDENCE_CHECKOUT="$CHECKOUT" python3 "$EVIDENCE/record.py" "$SIDE"
```

SIDE is base or head. EVIDENCE is the directory containing the scripts. CHECKOUT names that side's checkout. Run the sides sequentially; the driver uses loopback port 14787 and the recorder uses X display 187.

The driver seeds the launcher's runtime cache with that checkout's real built executable and links its runtime dependencies beside it. It starts the npm-installed launcher with `serve`, adds a synthetic Git repository through the real project CLI, starts a real ACP replay provider session through the thread CLI, pauses the recorded bindfs daemon, and starts six concurrent new-worktree launch requests. Requests can remain in filesystem-dependent preflight rather than creating durable threads. It then sends SIGTERM only to the recorded npm launcher PID.

At +1, +5, +6, +10 and +20 seconds, the driver reads the recorded PIDs' process states. At +20 seconds it SIGKILLs only the launcher if still alive. One second later it opens the filesystem gate, then checks again at +1, +3 and +6 seconds. It finally cleans up its recorded processes and mount.

The stills are real terminal screenshots after the +6s inspection, with two pixel-identical screen grabs 500ms apart. The text transcripts record the observations shown in the videos. A transient descendant already gone before SIGTERM is included because PID tracking is conservative.

Observed: base launcher, runtime and replay provider remained alive at +6s and +20s; killing only the launcher orphaned the runtime. Head's entire recorded tree was absent at +6s, before gate release. Base's replay provider stopped within one second after opening the gate, and its runtime exited within three seconds: persistent post-release orphans were not reproduced. No claim is made that the observed sleeping processes were in uninterruptible kernel state.

No scenario was used: the behavior requires the real npm launcher, OS signals, a process tree, and an externally controlled filesystem stall.
