# PR #23373 proof audit, pass 2

Auditor: read-only. No repo edits, no servers, no browser. Work files are in this directory.

## 1. Source binding (earlier gap: full-tree binding). CLOSED

Re-run on 2026-10-22:

| Checkout | HEAD | HEAD^{tree} | ThreadTerminalDrawer.tsx blob | status |
|---|---|---|---|---|
| ~/wt/pr-23373-before | 8d3b061121fe… | 5e712c15e076… | 0a12a6535c2d… | `?? apps/web/test/fixtures/terminal-layout/` only |
| ~/wt/pr-23373 | 7164868151be… | 7ca45dfa53df… | 9626c2640b7d… | clean |

These match provenance.txt and the expected SHAs and blobs. The BEFORE tree is not modified: its only change is untracked fixture files, so no app source is altered. One caveat: BEFORE is main `8d3b061121`, not the PR's merge-base. evidence.md discloses this, and no unrelated visible change shows up on the terminal surfaces.

## 2. Row-by-row

All captured pairs have the same dimensions on both sides: W is 1280×800 (0.889× downscale), N is 780×1800, and the crops match too. Every row has before, after, crop-before, crop-after, diff0-x8, and diffT-fuzz3.

| Row | Present | Shows pass criterion | Same input/dims | Notes |
|---|---|---|---|---|
| S-P1-W-L / W-D | yes | yes (evidence notes canvas 52→74) | yes | |
| S-P1-N-L | yes | **viewed**: before, the pill hides `RIGHT'`. After, there's a bordered row and the full line is visible. | yes | |
| S-P1-N-D | yes | yes | yes | |
| S-D1-W-L | yes | **viewed** (row-1 crop): tail covered before, `…xRIGHT'` visible after | yes | |
| S-D1-W-D | yes | **viewed** (surface crop): pill over row 1 before. After, buttons sit in their own row above the canvas. | yes | |
| S-D1-N-L | yes | yes | yes | |
| S-D1-N-D | yes | **viewed** (crop): tail covered before, visible after | yes | |
| S-WRAP-P-W-D | yes | yes, with an extra rows-1–2 crop | yes | |
| S-WRAP-D-N-L | yes | yes | yes | Theme is L, not the matrix's D |
| S-SB-D-W-D (+split) | yes | sidebar header unchanged; only the git badge differs | yes | |
| R-HIT-D-W-D (+SB probe) | yes, mp4 ×2 + narration | **frame checked**: after the top+2 click on Split H, the after build shows 2 panes and the sidebar | same steps | Narration logs `elementFromPoint` hits for all 4 buttons. Sidebar top+2 → strip, identical before and after (pre-existing). |
| R-RETURN+TYPE-D-N-L | yes | **frame checked** at the narrated step 5: back to single, before has the pill over `RIGHT'`, after has the row and the full line | same steps | Matched first-line typing plus New/close/return flow (gap closed for the drawer) |
| R-TYPE+MAX+RETURN-P-W-D | yes | per narration and stills (R-MAX-maximized, R-RETURN-P-W-D-end) | same steps | Closes the gap for the panel: typing, maximize/restore, and split→close→return |
| R-RESIZE-D-W-L | yes | **frame checked** at h=430: before has the pill over row 1 (btn 480 > canvas 471). After, canvas is at 499 and buttons at 477, below the strip. Captions match the narration. | same steps | 280→430→280, persisted across the toggle. Max clamp not exercised. Drag-back was to the exact start height, not the "restore stored preference" no-op path specifically. |
| R-GROUPS-D-W-D | yes | frame checked: single again, after shows the row and the full line | same steps | |
| R-SPLIT-D-W-L | yes | narration: 4-pane limit holds on both | same steps | |
| R-TABS-P-W-L | yes | narration and stills | same steps | |

Narration timestamps are relative to the caption, not the video. In R-HIT after, caption 33.2s is at video ~54s. Each narration file states this, and the frames line up once the offset is applied.

## 3. Diff rebuild

| Row | AE0 rebuilt | AE0 recorded | rebuilt diff0-x8 vs local, differing px | AE fuzz 3% rebuilt |
|---|---|---|---|---|
| S-P1-N-L | 13541 | 13541 | 0 | 12426 |
| S-D1-W-L | 12990 | 12990 | 0 | 11473 |

The rebuilt and stored diffs are bit-identical. Minor: every `diffT-ae.txt` is empty, so no fuzz-3% count was recorded. The images themselves exist.

## 4. Links and upload integrity

- All 168 gh-file-drop URLs in evidence.md return 200 to `curl -sI`.
- The uploaded evidence.md matches local exactly (sha256 `ee10c8d2…`).
- For the rebuilt rows S-P1-N-L and S-D1-W-L, all 10 uploaded PNGs (before, after, both crops, diff0) match the local files' sha256. R-HIT-D-W-D_after.mp4 and R-RESIZE-D-W-L_after.mp4 also match.
- Local recording names use `+`, and the uploaded names use `-`. Content is the same (hash checked for the samples).

## Earlier gaps

- Full-tree source binding: **closed**.
- Matched first-line typing: **closed** (panel W/D, drawer N/L, plus the wrap stills).
- New/close/return flows: **closed** (drawer N/L, panel W/D, groups W/D, tabs W/L).
- Drawer button-top activation: **closed**. All 4 buttons are hit at top+2, and a real click splits.
- Resize-strip drag and restore: **closed** for drag, return, and persistence.

## Unverified (secondary, not blocking)

These rows were not captured:

- S-WRAP-P-N-L, S-WRAP-D-N-D, S-WRAP-D-W-L
- S-SB-D-W-L
- R-HIT-D-N-L
- R-HIT-SB-D-W-L as a separate light capture (the dark probe exists)
- R-RESIZE-D-N-D (no max clamp at N)
- R-SPLIT-P-N-D

Also unverified:

- The resize clamp path.
- The "drag ends at start height restores preference" branch.
- Electron and permission-unavailable rows.

The core claim (panel and drawer × W/N × L/D) is covered by S-P1 and S-D1.
