# Proof re-audit (pass 2) — [#22803](https://git.cafe/pingdotgg/t3code/pulls/22803)

Auditor: Claude Opus 5.5 (Claude Code). Date 2026-10-21 UTC. Judged only against the unchanged [original matrix](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/63924d1b41f8fd38/pr-22803-matrix.md), using the [revised captures index](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c8dc90715a627acc/captures-index.md). Prior verdict: [INSUFFICIENT R3 R4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c8e461dbd2127476/pr-22803-proof-audit-2.md).

Read-only audit. No code, forge, PR, settings, server, or tab changes. No pairing token was minted or consumed. No browser was opened.

## Integrity checks

- **SHAs.** `/home/ubuntu/wt/pr-22803-before` is at `e27a03e94d43…` ([e27a03e94d](https://git.cafe/pingdotgg/t3code/commit/e27a03e94d43b504cfc3933282af913763312afd)) and `-after` is at `b0e0163e805d…` ([b0e0163e80](https://git.cafe/pingdotgg/t3code/commit/b0e0163e805da78f5156ca283cc35f3367a6df9f)). Both trees are clean. `git diff --stat` shows only `ClaudeAdapterV2.ts` (+35/−13) and `ClaudeAdapterV2.test.ts` (+89).
- **Index copy.** The uploaded index is byte-identical to the local `/tmp/pr-22803-evidence/captures-index.md`.
- **Uploads.** All 21 linked uploads were re-downloaded: 16 MP4s, 4 S9 PNGs and `runtime-evidence.tar.gz`.
  - All 21 SHA-256 hashes match the local files.
  - The 16 MP4s also match `media-manifest.json`.
  - `R7-before.mp4` is the 20:32 rebuild; its hash `3b481e99…` matches `R7rebuild-before.mp4`.
- **Viewports and themes.** Every row matches the matrix:
  - Desktop rows are 1440×900 CSS, encoded 2880×1800.
  - Narrow rows are 390×844 CSS, encoded 780×1688.
  - Themes match per row and are visually confirmed in the decoded frames.
  - S9's output is 1280×800 because the snapshot tool downsamples it. The index says so.
- **Archive (116 files).**
  - It contains 28 protocol logs: one each for the R5/R6 revisions, and initial + recovery for the six terminal rows on both revisions.
  - It holds no R7rebuild or probe artifacts and no `stub-285992`.
  - A grep for pairing tokens or secrets found only the stub's dummy `tokenSource:"evidence-stub"` and prose mentions.

## Protocol correlation (independently re-derived)

I checked all 32 entries in `protocol-correlations.json` (16 recordings × Q1/Q2) against the archived data. In each one:

- the row's metadata `threadId` is embedded in `runtimeRequestId`;
- the `nativeToolId` and `stubRequestId` occur in the named log;
- the stated `stubEmissionAt` appears in that log.

Deltas run from 0 to 15 ms.

The projection snapshots match each row's narrative:

- **Terminal rows R1–R4, R7, R8 (both revisions).** Q1 goes `pending` → `cancelled` at the stop or failure, then the recovery Q2 is `resolved`/`completed`.
- **R5/R6 before.**
  - Q1 is still `pending` at the cancellation-interval snapshot.
  - Both Q1 and Q2 are `pending` after the replacement.
  - The Blue click resolves **Q1**, and Q2 stays `pending`.
- **R5/R6 after.**
  - Q1 is `cancelled` (R5 20:21:08.844, R6 20:21:47.228) before Q2 exists.
  - Q2 is then `resolved` (R5 20:21:16.095, R6 20:21:54.140).
  - This is the regression discriminator.
- **R7-before rebuild.**
  - `stub-286415` logs the Q1 `can_use_tool` at 20:32:29.024 and the failure gate at 20:32:33.430. The metadata trigger is at 33.397, and the projection cancels at 33.473.
  - `stub-287289` answers the recovery Q2 with Blue and returns a success result.
  - `stub-285992` (20:32:26) contains only an initialize/control response and no user prompt. It is a probe, correctly excluded.
  - The R7 pair is coherent.

## Decoded checkpoints (all 64 viewed by me)

I extracted every narrated playback timestamp with ffmpeg from the downloaded uploads (not the local copies) and viewed them as per-row before/after sheets.

| Row | Matrix requirement | Decoded result | Sufficient? |
|---|---|---|---|
| R1 Stop 1440 light | Click Stop → Q1 not actionable → fresh Q2 → Blue | All 8 checkpoints match. "Run interrupted · by user", no card, fresh Q2, "Answer received: Blue". In the frames after cp2, the click ripple lands on option 2 and the check appears | Yes |
| R2 Stop 1440 dark | Same, with composer and timeline | All 8 match | Yes |
| R3 Stop 390 light | **Show reachable Stop control at narrow width → Stop** | All 8 narration checkpoints match. cp0 shows the pending composer with only Submit and no Stop control. Interruption is by RPC | **No: required interaction absent** |
| R4 Stop 390 dark | Same narrow Stop sequence | All 8 match, with the same absent control and RPC substitute | **No** |
| R5 steer 1440 light | Steer → Q1 cancelled, turn alive → empty interval → Q2 → Blue resolves only Q2 | Before: Q1 card persists, two "Input requested" entries, Q2 "Replacement" still pending at the end. After: no card at 4.1 s, Q2 at 8.2 s, "Answer received: Blue" | Yes |
| R6 steer 390 dark | Same, narrow | Same pattern, all 8 match | Yes |
| R7 failure 1440 dark | Pending → transport failure → controls gone, failure visible → recovery | All 8 match. "Provider turn failed." toast plus "Provider error" and recovery. Rebuilt R7-before shows 8:32 PM timestamps, consistent with its metadata | Yes |
| R8 failure 390 light | Same, narrow | All 8 match | Yes |
| S9 static 1440 light | Untouched pending Q1: header, question, Red/Blue, answer action, Stop | Color header, question, Red/Blue, Submit and red Stop are all present | Yes |

## Static delta

I rebuilt the S9 diff from the downloaded PNGs with Pillow `ImageChops.difference` on RGB:

- 385 of 1,024,000 pixels changed (0.0376 %).
- Mean channel delta 0.004930/255; maximum channel delta 34.
- Bounding box (372,194)–(448,206).
- The result is pixel-identical to the uploaded `S9-diff.png`.

The box contains only the "Input requested" label. `S9-after` shows the shimmer emphasis on "ques", consistent with an animation phase. "Working for 1s" sits outside the bbox and is unchanged.

The index's description is now accurate. This is a file-level rebuild of the supplied pair. I did not attempt a live recapture, so no live-recapture metric is claimed.

## R3/R4: re-checked, still unsatisfiable as written

I traced the Stop path in source at the after SHA:

- [ChatComposer.tsx:6211](https://git.cafe/pingdotgg/t3code/blob/b0e0163e805da78f5156ca283cc35f3367a6df9f/apps/web/src/components/chat/ChatComposer.tsx#L6211): the mobile pending-answer action group hard-codes `canInterrupt={false}`.
- [ComposerPrimaryActions.tsx:161](https://git.cafe/pingdotgg/t3code/blob/b0e0163e805da78f5156ca283cc35f3367a6df9f/apps/web/src/components/chat/ComposerPrimaryActions.tsx#L161) is the only place that renders "Stop generation".

One path neither the primary nor the prior auditor mentioned: [ChatView.tsx:4315](https://git.cafe/pingdotgg/t3code/blob/b0e0163e805da78f5156ca283cc35f3367a6df9f/apps/web/src/components/ChatView.tsx#L4315) handles a `thread.stop` keybinding command, gated on `canInterruptRunningThread` rather than on the composer.

- `thread.stop` has **no default binding**. A grep of `packages/shared/src/keybindings.ts` and `apps/server/src/keybindings.ts` finds no `stop` entry.
- Using it would require a settings change, which this audit's brief forbids.
- It is not a visible "reachable Stop control" either.

So it doesn't rescue R3/R4, but the claim that "no other path exists" is slightly overstated.

The RPC recordings are honest, clearly labelled, and correctly traced. Supplemental evidence still cannot satisfy a matrix row whose required visible step is "show reachable Stop control at narrow width → Stop". This is the same verdict as pass 1, now for the stronger reason that the requirement is unsatisfiable on this product, not just unattempted.

## Response to each prior non-blocking finding

| Prior finding | Status |
|---|---|
| Log times lead video PTS by 0.5–1.1 s | **Fixed.** Logs are labelled as command/wait times, and separate decoded checkpoints are provided. All 64 checkpoints show the narrated state |
| Initial/recovery logs missing for some rows | **Fixed.** All 28 logs are archived, and metadata `protocolLogs` and `requestLogCorrelation` are present for all 16 recordings |
| S9 described as clock/time | **Fixed.** It is now described precisely as the shimmer bbox |
| PATH used instead of Binary path | **Disclosed** explicitly. The executable mechanism is equivalent for the production SDK. Acceptable |
| Extra 20:32 stub processes | **Explained and verified.** 286415 and 287289 are the R7-before rebuild; 285992 is an unused probe |
| Live S9 recapture blocked by pairing | **Unchanged and acknowledged.** The file-level rebuild is sufficient for the supplied-pair check |

## New minor observations (non-blocking)

- **Question text differs from the matrix wording.** The matrix seed text said "Red or Blue?"; the fixture asks "Which color should we use?" with the header Color. R5/R6 Q2 uses the header "Replacement". The structure is equivalent.
- **Native IDs are reused.** The matrix asked for "fresh IDs per question and row". Terminal-row Q2s reuse `evidence-tool-1`/`evidence-permission-1` in a new process. Runtime request IDs remain unique, because they embed the thread, ordinal and a UUID. R5/R6 use distinct `-2` IDs within the same process, which is where uniqueness matters.
- **I didn't re-run the focused test.** The index reports that running it restarted the after server's dev runner, and the brief forbids affecting servers. I relied on the archived `focused-test.txt` (1 passed, 203 filtered).

## FRICTION

- Desktop checkpoint sheets at 4 × 1440 px are too small to read fine timeline text at viewer resolution. I verified R1/R2/R7 text by layout and colour, and by a cropped close-up of the Blue click. Per-checkpoint crops in the index's sheets would speed up future audits.
- At desktop cp2, the cursor rests on Submit, left there from the recovery prompt. At first glance this reads as "clicked Submit, not Blue". It took a script read (`role=button[name="Blue Use blue. 2"]`) and extra frames to clear it. A cp2.5 just after the Blue click would remove that ambiguity.
- `protocol-correlations.json` does not state the projection status for each request. I had to walk the snapshot JSON to confirm cancelled/resolved ordering.
- The `thread.stop` keybinding path was not addressed in the index's R3/R4 rationale.
- No live S9 recapture: the auditor profile is unpaired for these origins, and minting a pairing token was forbidden.

VERDICT: INSUFFICIENT R3 R4
