# Bot finding 6: ClaudeStdin fixture loses child signal exit status

PR [#23550](https://github.com/pingdotgg/t3code/pull/23550), branch `fix/issue-23507`, base head `0e987b4` → fix commit `258518e`.

## Verdict: CONFIRMED

`child.on('exit', code => process.exit(code ?? 1))`: when the child dies from a forwarded SIGTERM/SIGINT, `code` is null, so the wrapper exited 1 instead of dying by the signal.

## Before (head 0e987b4)
```
SIGTERM  wrapper_rc=1 (python: negative = killed by signal) child_pid=737854 child_alive_after=False
SIGINT   wrapper_rc=1 (python: negative = killed by signal) child_pid=737868 child_alive_after=False
exit 0   wrapper_rc=0 (python: negative = killed by signal) child_pid=737881 child_alive_after=False
exit 3   wrapper_rc=3 (python: negative = killed by signal) child_pid=737895 child_alive_after=False
```
## After
```
SIGTERM  wrapper_rc=-15 (python: negative = killed by signal) child_pid=738318 child_alive_after=False
SIGINT   wrapper_rc=-2 (python: negative = killed by signal) child_pid=738331 child_alive_after=False
exit 0   wrapper_rc=0 (python: negative = killed by signal) child_pid=738344 child_alive_after=False
exit 3   wrapper_rc=3 (python: negative = killed by signal) child_pid=738358 child_alive_after=False
child SIGKILL  wrapper_rc=-9
child SIGPIPE  wrapper_rc=1
```
Python reports a signal death as a negative return code. Child PIDs were captured from the child's stderr at spawn and checked in /proc afterwards; none survived. `edge.txt` kills the child directly: SIGKILL propagates as -9; SIGPIPE, which Node ignores, falls back to exit 1 instead of hanging.

## Fix
Named forwarders are removed with `process.off` before `process.kill(process.pid, signal)`, so the self-signal is not forwarded back to the dead child; ordinary exit codes pass through unchanged; `process.exit(1)` covers signals Node ignores. The stdin pipe, the `drain` backpressure path, and UTF-8 decoding are untouched. The UTF-8 log line `héllo ✓` was recorded intact, log mode is 600, and fixture mode stays 775.

## Checks
- `vp i` (deps were absent)
- `vp lint` + `vp fmt --check` on the fixture: clean
- `vp run knip:check`: 2/2 successful
- Production tests were not rerun (fixture-only change, per brief)
