# Missing CLI evidence for [#32913](https://git.cafe/pingdotgg/t3code/pull/32913)

**4/4 requested rows captured; 14 before/after pairs, 28 final executions. No requested row is unverified.**

Before: [fa2f4ff2a2](https://git.cafe/pingdotgg/t3code/commit/fa2f4ff2a2bac5ac92e07749f6b83b0003d642a0). After: [1af59792b3](https://git.cafe/pingdotgg/t3code/commit/1af59792b3ca105da634cdf90c392bae9ad1ff91). No worktree edits or commits. Synthetic HTTP data only; no T3 database.

**Environment:** Ubuntu 24.04.4 LTS Linux x86_64; dash 0.5.12-6ubuntu5; bash 5.2.21 --posix; curl 8.5.0; PowerShell 7.4.6 Core Linux; Node v20.11.1 (launcher execution), v26.12.1 (real repo build); Python 3.12.3; pipe or controlling PTY as recorded per case. Kernel 6.8.0-117-generic. Exact version output is in `environment.txt`. Node and PowerShell are the official linux-x64 tarballs downloaded into scratch; download URLs and local hashes are in `tools.json`.

**Artifacts:** 

[requested-evidence.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/15fddc012208f5e4/requested-evidence.tar.gz)
[preliminary-captures.tar.gz](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8bba2db7bf7f8e07/preliminary-captures.tar.gz)
[build_capture.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d9a7cd2e1fcfc7c7/build_capture.py)
[capture_missing.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/58910c30ddc26c80/capture_missing.py)
[report_missing.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/891926ff759957d3/report_missing.py)
[finalize_missing.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/70d48f4c8e7ad0e1/finalize_missing.py)
[fixture_server.py](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/44063fa8bd51e2e1/fixture_server.py)

Archive paths below are relative to the final bundle root. Each pair contains `before/transcript.txt` and `after/transcript.txt` (each records its SHA), independent `server-request.log` files with UTC/relative timestamps, `directory-listing.txt`, `events.json`, `result.json`, executed source/wrappers, and `Diff0.diff`, `DiffT.diff`, `DiffB.diff`. `row-diffs/<row>/` aggregates the pair diffs.

| Row | Before | After |
|---|---|---|
| S31 | Both shells exit 1 at first 504; no backoff exists. | Latest and SHA256SUMS backoff Ctrl-C exit 130 in dash and bash --posix. Zero subsequent requests, zero remaining tracked processes. SHA256SUMS staging is present before the signal and removed afterward. Discovery has not created staging. |
| E02 | Shell piped archive fetch exits 1; interactive archive download exits 22. PS7 R/W/H exit 1 at first 502. | All retry the same endpoint once, receive 200 and exit 0. Shell installs validate the executable and completion marker; PS7 uses real HTTP in verbatim helpers/discovery caller. |
| E03 | Real built npm launcher on Node 20.11.1 exits 1 at first 504, separately on checksums and archive. | Same endpoint retries after about 0.5s; both installs exit 0, print 1.2.3 and create the completion marker. |
| E04 | Ctrl-C during the active archive stream exits 130 and leaves one staging directory and partial tarball. | Same outcome and same partial byte count; the PR does not fix active-download SIGINT cleanup. |

## Pair results and one-line diffs

D0 = raw transcript diff; DT = full transcript diff with timestamps and incidental paths/PIDs masked; DB = grouped behavioural diff. Counts below are bytes. SHA metadata remains in D0/DT.

| Pair / archive directory | Before [fa2f4ff2a2](https://git.cafe/pingdotgg/t3code/commit/fa2f4ff2a2bac5ac92e07749f6b83b0003d642a0) | After [1af59792b3](https://git.cafe/pingdotgg/t3code/commit/1af59792b3ca105da634cdf90c392bae9ad1ff91) | Diff summary |
|---|---|---|---|
| `E02-pwsh7-H` | exit 1; archive:502 | exit 0; archive:502 → archive:200 | D0 15213 / DT 9195 / DB 2003; same-endpoint request gap [1.034] s |
| `E02-pwsh7-R` | exit 1; latest:502 | exit 0; latest:502 → latest:200 | D0 13424 / DT 8124 / DB 1307; same-endpoint request gap [1.084] s |
| `E02-pwsh7-W` | exit 1; archive:502 | exit 0; archive:502 → archive:200 | D0 14162 / DT 8600 / DB 1545; same-endpoint request gap [1.109] s |
| `E02-shell-bash-posix-interactive-download` | exit 22; sums:200 → archive:502 | exit 0; sums:200 → archive:502 → archive:200 | D0 29149 / DT 17828 / DB 6809; same-endpoint request gap [1.144] s |
| `E02-shell-bash-posix-piped-fetch` | exit 1; sums:200 → archive:502 | exit 0; sums:200 → archive:502 → archive:200 | D0 18313 / DT 9269 / DB 2920; same-endpoint request gap [1.051] s |
| `E02-shell-dash-interactive-download` | exit 22; sums:200 → archive:502 | exit 0; sums:200 → archive:502 → archive:200 | D0 28437 / DT 17465 / DB 6680; same-endpoint request gap [1.155] s |
| `E02-shell-dash-piped-fetch` | exit 1; sums:200 → archive:502 | exit 0; sums:200 → archive:502 → archive:200 | D0 17754 / DT 9908 / DB 2803; same-endpoint request gap [1.05] s |
| `E03-node20-archive-504` | exit 1; sums:200 → archive:504 | exit 0; sums:200 → archive:504 → archive:200 | D0 14887 / DT 8527 / DB 1502; same-endpoint request gap [0.504] s |
| `E03-node20-sums-504` | exit 1; sums:504 | exit 0; sums:504 → sums:200 → archive:200 | D0 14063 / DT 8323 / DB 1489; same-endpoint request gap [0.513] s |
| `E04-node20-ctrlc-active-archive` | exit 130; sums:200 → archive:200 | exit 130; sums:200 → archive:200; staging survives | D0 17592 / DT 7296 / DB 0; no retry after exit/signal |
| `S31-latest-bash-posix` | exit 1; latest:504 | exit 130; latest:504 | D0 14886 / DT 8629 / DB 2142; no retry after exit/signal |
| `S31-latest-dash` | exit 1; latest:504 | exit 130; latest:504 | D0 14574 / DT 8827 / DB 2142; no retry after exit/signal |
| `S31-sums-bash-posix` | exit 1; sums:504 | exit 130; sums:504 | D0 14869 / DT 8247 / DB 2239; no retry after exit/signal |
| `S31-sums-dash` | exit 1; sums:504 | exit 130; sums:504 | D0 14559 / DT 8797 / DB 2239; no retry after exit/signal |

## Exact E04 leftovers

**Before — [fa2f4ff2a2](https://git.cafe/pingdotgg/t3code/commit/fa2f4ff2a2bac5ac92e07749f6b83b0003d642a0)**

```text
DIR /tmp/lead-32913-r2/evidence-capture-1/runs-20261110T124424.723947Z/E04-node20-ctrlc-active-archive/before/home/t3/runtime/versions
DIR /tmp/lead-32913-r2/evidence-capture-1/runs-20261110T124424.723947Z/E04-node20-ctrlc-active-archive/before/home/t3/runtime/versions/1.2.3.staging-zn76Th mode=700
FILE /tmp/lead-32913-r2/evidence-capture-1/runs-20261110T124424.723947Z/E04-node20-ctrlc-active-archive/before/home/t3/runtime/versions/1.2.3.staging-zn76Th/t3-1.2.3-linux-x64.tar.gz bytes=32830 mode=664
DIR /tmp/lead-32913-r2/evidence-capture-1/runs-20261110T124424.723947Z/E04-node20-ctrlc-active-archive/before/tmp
```

**After — [1af59792b3](https://git.cafe/pingdotgg/t3code/commit/1af59792b3ca105da634cdf90c392bae9ad1ff91)**

```text
DIR /tmp/lead-32913-r2/evidence-capture-1/runs-20261110T124424.723947Z/E04-node20-ctrlc-active-archive/after/home/t3/runtime/versions
DIR /tmp/lead-32913-r2/evidence-capture-1/runs-20261110T124424.723947Z/E04-node20-ctrlc-active-archive/after/home/t3/runtime/versions/1.2.3.staging-CR6UhO mode=700
FILE /tmp/lead-32913-r2/evidence-capture-1/runs-20261110T124424.723947Z/E04-node20-ctrlc-active-archive/after/home/t3/runtime/versions/1.2.3.staging-CR6UhO/t3-1.2.3-linux-x64.tar.gz bytes=32830 mode=664
DIR /tmp/lead-32913-r2/evidence-capture-1/runs-20261110T124424.723947Z/E04-node20-ctrlc-active-archive/after/tmp
```

## What else changed

- Intended: head makes one additional request to each failed 502/504 endpoint, introduces one backoff, reaches subsequent download/validation steps, and replaces the prior error output with success. Request headers and endpoint order up to the failure are unchanged. Shell noninteractive failure exits 1; its interactive curl failure exits 22; both become 0 on recovery. PS7 exceptions become successful resolved-version or downloaded-byte/hash output.
- Intended S31 comparison: main exits 1 before a backoff exists, so a backoff Ctrl-C cannot be delivered there. Head reaches an actual `sleep 1`; terminal Ctrl-C exits 130. Latest discovery ends by native SIGINT (wait status 2); checksum download reaches the existing INT trap (wait status 33280). Both report exit code 130.
- Unchanged limit: latest lookup leaves a 19-byte temporary index in TMPDIR on both pins. Staging is not yet created there. The SHA256SUMS staging directory is cleaned on both the before failure and after interruption.
- Unchanged limit: launcher mid-body SIGINT leaves an incomplete `1.2.3.staging-*` directory containing only the partial archive on both pins. No completion marker, extraction, published version, or further request is observed. Exact names, modes and bytes are listed above; partial archive bytes are retained in the bundle.
- Downloader implementation detail visible in the shell traces: head adds `-w %{http_code}` to interactive curl, writes a `.status` sidecar while active, and removes the sidecars after successful completion. Foreground curl command arguments are unchanged.
- Fixture/metadata differences: UTC and elapsed clocks, loopback ports, PIDs/PGIDs, random temporary/staging names, before/after paths, source hashes and error source locations differ. Terminal read chunks and progress-update flushes can differ; raw transcripts retain them. Final paired payload bytes are identical, as recorded in `artifact-fingerprints.json` and every manifest.

## Normalisation and scope

`Diff0` uses the original terminal transcript bytes. `DiffT` masks UTC/relative clocks (including request_t and transport mono), observation duration, independent run/build paths, loopback ports, tracked PIDs and random mktemp/staging names. It preserves source hashes, SHA/side, all statuses, exceptions, command arguments, signals, exit/wait statuses, byte counts, directory/file presence and event order. Its full timestamp-masked inputs are retained.

`DiffB` additionally groups requests, transport calls, actions, state and concatenated terminal output into stable channels; only terminal read chunk boundaries and cross-channel flush order are removed. Same-endpoint request gaps are retained to 0.1s. All emitted terminal bytes, including ANSI and PowerShell error source frames, remain. SHA/provenance metadata is outside this behavioural view and remains raw/DT. No failed attempt, outcome or leftover is suppressed.

S31 uses a controlling PTY, pipes the full script into shell `-s`, redirects stderr to a pipe to force noninteractive fetch, confirms the foreground process group and sleeping `/usr/bin/sleep 1`, then writes the terminal Ctrl-C byte. The server stays open for 1.5s after exit; the request log confirms zero additional requests. E02 shell pipe cases have no TTY; interactive cases have PTY stderr. PowerShell R/W have redirected stderr; H reports terminal=True and interactive=True. PowerShell executes real PS7/.NET helpers on Linux, without claiming an end-to-end Windows install. Launchers are unpacked outputs of the real `buildNpmLauncher` CLI used by `scripts/build-npm-launcher.test.ts`, with exact source-byte equality checked, and run without fetch hooks on Node 20.11.1.

Earlier same-row captures are preserved in the preliminary bundle. They are superseded by the 28 final executions: S31 gained explicit pre-signal directory snapshots and confirmed sleeping state, and the final complete run shares one fixture payload across all pairs to prevent archive timestamp variation. No preliminary evidence was deleted.

Unverified requested rows: **none**. No UI surface applies. All started servers/processes are stopped, the second checkout is removed, and available disk remains above 5GB; see `cleanup-verification.txt`.

FRICTION: tool | The before checkout could not resolve build dependencies from the root node_modules link alone; scripts/node_modules is a separate workspace dependency directory. Linking both existing dependency directories into the temporary before checkout allowed the real build. | A fixture setup note naming both links would avoid the first failed build attempt.
FRICTION: model | A report regeneration initially treated its generated row-diffs directory as another capture pair. Filtering for before/result.json fixed reruns; no raw evidence changed. | Make report discovery idempotent from the first run.
