# H04: Harness: invalid PID/non-running filtering

Before [e9236274a3](https://git.cafe/pingdotgg/t3code/commit/e9236274a3a6e0c731a7df4092db1e686f039068); after [63e44670dd](https://git.cafe/pingdotgg/t3code/commit/63e44670dd1d222cf63619d5e02415f2a9fd3bc2).

Before run: `/tmp/lead-24640-r1/capture/2026-10-27T14-33-29.299Z-before-H04`. After run: `/tmp/lead-24640-r1/capture/2026-10-27T14-33-32.252Z-after-H04`.

Environment: fs-31 Linux x86_64, Node v26.12.1; real TerminalManager harness, controlled runner/fake PTY/TestClock; no server, RPC, or database. Viewport/theme/DPR/font scaling=N/A.

Labelled fake PTY harness. NaN PID is deliberately injected (JSON represents it as null; integer=false is explicitly recorded). Invalid-only and exited-only candidates issue no query; mixed valid/invalid performs one snapshot and updates only the eligible terminal.

Wrapper timings exclude Python startup and stream drain. Acquisition timings use the real terminal.posixProcessTableSnapshot trace span. An idle gap is END→next START, never start-to-start. Before delay=min(1000×2^failureCount,60000)ms; after delay=min(max(1000×2^failureCount,4×measured fallback acquisition),60000)ms. Native-failed production ticks increment failureCount even when fallback succeeds; successful absent-supplier harness ticks reset it. Native requests and terminal processing can add overhead.

| Event | Before ([e9236274a3](https://git.cafe/pingdotgg/t3code/commit/e9236274a3a6e0c731a7df4092db1e686f039068)) | After ([63e44670dd](https://git.cafe/pingdotgg/t3code/commit/63e44670dd1d222cf63619d5e02415f2a9fd3bc2)) | Δ |
|---|---|---|---|
| Harness event 1 | `{"kind":"pty-spawn","pid":null,"integer":false}` | `{"kind":"pty-spawn","pid":null,"integer":false}` | Same candidate filtering |
| Harness event 2 | `{"kind":"event","phase":"invalid-only-no-query","test_ms":0,"event":{"type":"started","threadId":"harness-thread","terminalId":"invalid","sequence":1,"snapshot":{"threadId":"harness-thread","terminalId":"invalid","cwd":"/tmp/lead-24640-r1/capture/2026-10-27T14-33-29.299Z-before-H04","worktreePath":null,"status":"running","pid":null,"history":"","exitCode":null,"exitSignal":null,"label":"invalid","updatedAt":"2026-10-27T14:33:29.366Z","sequence":1}}}` | `{"kind":"event","phase":"invalid-only-no-query","test_ms":0,"event":{"type":"started","threadId":"harness-thread","terminalId":"invalid","sequence":1,"snapshot":{"threadId":"harness-thread","terminalId":"invalid","cwd":"/tmp/lead-24640-r1/capture/2026-10-27T14-33-32.252Z-after-H04","worktreePath":null,"status":"running","pid":null,"history":"","exitCode":null,"exitSignal":null,"label":"invalid","updatedAt":"2026-10-27T14:33:32.287Z","sequence":1}}}` | See event values |
| Harness event 3 | `{"kind":"invalid-only","phase":"invalid-only-no-query","test_ms":3000}` | `{"kind":"invalid-only","phase":"invalid-only-no-query","test_ms":3000}` | See event values |
| Harness event 4 | `{"kind":"counts","phase":"invalid-only-no-query","query":0,"nativeCalls":0,"customCalls":0,"activities":[]}` | `{"kind":"counts","phase":"invalid-only-no-query","query":0,"nativeCalls":0,"customCalls":0,"activities":[]}` | See event values |
| Harness event 5 | `{"kind":"pty-spawn","pid":9000,"integer":true}` | `{"kind":"pty-spawn","pid":9000,"integer":true}` | See event values |
| Harness event 6 | `{"kind":"event","phase":"mixed-valid-invalid","test_ms":3000,"event":{"type":"started","threadId":"harness-thread","terminalId":"valid","sequence":1,"snapshot":{"threadId":"harness-thread","terminalId":"valid","cwd":"/tmp/lead-24640-r1/capture/2026-10-27T14-33-29.299Z-before-H04","worktreePath":null,"status":"running","pid":9000,"history":"","exitCode":null,"exitSignal":null,"label":"valid","updatedAt":"2026-10-27T14:33:29.372Z","sequence":1}}}` | `{"kind":"event","phase":"mixed-valid-invalid","test_ms":3000,"event":{"type":"started","threadId":"harness-thread","terminalId":"valid","sequence":1,"snapshot":{"threadId":"harness-thread","terminalId":"valid","cwd":"/tmp/lead-24640-r1/capture/2026-10-27T14-33-32.252Z-after-H04","worktreePath":null,"status":"running","pid":9000,"history":"","exitCode":null,"exitSignal":null,"label":"valid","updatedAt":"2026-10-27T14:33:32.293Z","sequence":1}}}` | See event values |
| Harness event 7 | `{"kind":"query-start","phase":"mixed-valid-invalid","q":1,"test_ms":4000,"mode":"valid","delay":0,"budget":"1 second"}` | `{"kind":"query-start","phase":"mixed-valid-invalid","q":1,"test_ms":4000,"mode":"valid","delay":0,"budget":"15 seconds"}` | See event values |
| Harness event 8 | `{"kind":"query-end","phase":"mixed-valid-invalid","q":1,"test_ms":4000,"elapsed":0,"outcome":"success"}` | `{"kind":"query-end","phase":"mixed-valid-invalid","q":1,"test_ms":4000,"elapsed":0,"outcome":"success"}` | See event values |
| Harness event 9 | `{"kind":"event","phase":"mixed-valid-invalid","test_ms":4000,"event":{"type":"activity","threadId":"harness-thread","terminalId":"valid","sequence":2,"hasRunningSubprocess":true,"label":"fixture-child"}}` | `{"kind":"event","phase":"mixed-valid-invalid","test_ms":4000,"event":{"type":"activity","threadId":"harness-thread","terminalId":"valid","sequence":2,"hasRunningSubprocess":true,"label":"fixture-child"}}` | See event values |
| Harness event 10 | `{"kind":"mixed","phase":"mixed-valid-invalid","test_ms":4000}` | `{"kind":"mixed","phase":"mixed-valid-invalid","test_ms":4000}` | See event values |
| Harness event 11 | `{"kind":"counts","phase":"mixed-valid-invalid","query":1,"nativeCalls":0,"customCalls":0,"activities":[{"type":"activity","threadId":"harness-thread","terminalId":"valid","sequence":2,"hasRunningSubprocess":true,"label":"fixture-child"}]}` | `{"kind":"counts","phase":"mixed-valid-invalid","query":1,"nativeCalls":0,"customCalls":0,"activities":[{"type":"activity","threadId":"harness-thread","terminalId":"valid","sequence":2,"hasRunningSubprocess":true,"label":"fixture-child"}]}` | See event values |
| Harness event 12 | `{"kind":"event","phase":"exited-and-invalid","test_ms":4000,"event":{"type":"exited","threadId":"harness-thread","terminalId":"valid","sequence":3,"exitCode":0,"exitSignal":null}}` | `{"kind":"event","phase":"exited-and-invalid","test_ms":4000,"event":{"type":"exited","threadId":"harness-thread","terminalId":"valid","sequence":3,"exitCode":0,"exitSignal":null}}` | See event values |
| Harness event 13 | `{"kind":"exited-and-invalid","phase":"exited-and-invalid","test_ms":5000}` | `{"kind":"exited-and-invalid","phase":"exited-and-invalid","test_ms":5000}` | See event values |
| Harness event 14 | `{"kind":"counts","phase":"exited-and-invalid","query":1,"nativeCalls":0,"customCalls":0,"activities":[{"type":"activity","threadId":"harness-thread","terminalId":"valid","sequence":2,"hasRunningSubprocess":true,"label":"fixture-child"}]}` | `{"kind":"counts","phase":"exited-and-invalid","query":1,"nativeCalls":0,"customCalls":0,"activities":[{"type":"activity","threadId":"harness-thread","terminalId":"valid","sequence":2,"hasRunningSubprocess":true,"label":"fixture-child"}]}` | See event values |
| Harness event 15 | `{"kind":"pty-kill","pid":null,"signal":"SIGTERM"}` | `{"kind":"pty-kill","pid":null,"signal":"SIGTERM"}` | See event values |
| Harness event 16 | `{"kind":"pty-kill","pid":null,"signal":"SIGKILL"}` | `{"kind":"pty-kill","pid":null,"signal":"SIGKILL"}` | See event values |
| Harness event 17 | `{"kind":"event","phase":"exited-and-invalid","test_ms":5000,"event":{"type":"closed","threadId":"harness-thread","terminalId":"invalid","sequence":2}}` | `{"kind":"event","phase":"exited-and-invalid","test_ms":5000,"event":{"type":"closed","threadId":"harness-thread","terminalId":"invalid","sequence":2}}` | See event values |
| Harness event 18 | `{"kind":"event","phase":"exited-and-invalid","test_ms":5000,"event":{"type":"closed","threadId":"harness-thread","terminalId":"valid","sequence":4}}` | `{"kind":"event","phase":"exited-and-invalid","test_ms":5000,"event":{"type":"closed","threadId":"harness-thread","terminalId":"valid","sequence":4}}` | See event values |
| Harness event 19 | `{"kind":"cleanup","phase":"exited-and-invalid","test_ms":5000}` | `{"kind":"cleanup","phase":"exited-and-invalid","test_ms":5000}` | See event values |
| Harness event 20 | `{"kind":"counts","phase":"exited-and-invalid","query":1,"nativeCalls":0,"customCalls":0,"activities":[{"type":"activity","threadId":"harness-thread","terminalId":"valid","sequence":2,"hasRunningSubprocess":true,"label":"fixture-child"}]}` | `{"kind":"counts","phase":"exited-and-invalid","query":1,"nativeCalls":0,"customCalls":0,"activities":[{"type":"activity","threadId":"harness-thread","terminalId":"valid","sequence":2,"hasRunningSubprocess":true,"label":"fixture-child"}]}` | See event values |
| Harness event 21 | `{"kind":"complete"}` | `{"kind":"complete"}` | See event values |

## Behaviour difference
Same candidate filtering
Raw UTC/monotonic RPC, query, signal, metadata, warnings, and cleanup records are in the paired transcripts. PID, randomly generated script terminal suffix, database path, UTC, sequence batching, and scheduler jitter naturally vary between fresh runs. No visual comparison is applicable.