# Proof audit pass 1 — revised brief 4ed4f1d

Read-only audit of [#19536](https://git.cafe/pingdotgg/t3code/issues/19536), `/home/ubuntu/wt/issue-19536`, 2026-10-22 UTC. Reviewed local `origin/main..HEAD`: base [e07595714a](https://git.cafe/pingdotgg/t3code/commit/e07595714a467e18c750107137d2c2e50f0c3530), head [33a8e6513d](https://git.cafe/pingdotgg/t3code/commit/33a8e6513d1a76464422bc8e9f2883215004a454). No fetch, forge operation, browser/server launch, product/fixture edit, test run, or new capture. Checkout was clean at inspection. This report supersedes the scope of `/tmp/issue-19536-matrix.md`.

## Decision and exact boundary

Keep the fix small. Exactly two directly affected render states exist: **one terminal in the content panel** and **one terminal in the bottom drawer**. The former floating actions become a normal-flow row above the terminal content. Panel row: 22 CSS px. Drawer row: 28 CSS px, including 6px top clearance for the existing resize strip. The earlier report's uniform 22px claim is obsolete.

The extracted `terminalActions` JSX matches the former split-sidebar controls, including classes, labels, permission conditions and callbacks. The split sidebar's wrapper and pane markup are unchanged. Multiple terminals, split directions, limits and groups are not additional changed visual fixtures. Use a split-to-single transition inside a movie to check that the new row disappears/reappears correctly; do not create a second grid of sidebar screenshots.

Web and Electron share this web component; this evidence is Linux Chromium web evidence, not a native Electron runtime pass. Native mobile renders a separate component. No provider, server, contract, remote-transport, command-palette or settings logic changes. Those surfaces do not multiply this matrix.

## Minimum honest matrix

W = 1440×900 CSS px; N = 390×900 CSS px. L/D = explicit light/dark. Whole viewport means the real application's entire viewport, including surrounding chat/composer or sheet/backdrop. A 390px panel is the actual sheet inside that viewport, not a fabricated 390px-wide terminal. One live terminal, stable font 12, scale 1, same shell/input bytes within each pair; drawer height 280px. Put pending input/output and a steady cursor on the first physical terminal line extending through the old toolbar footprint. Do not use only a prompt several lines below the overlap.

| Required row | Mode and state | Before/after evidence | Existing best candidate |
| --- | --- | --- | --- |
| P1-W-L | Single content panel, wide, light | Whole-viewport still pair | `P1-current-W-L-{before,after}.png` |
| P1-W-D | Single content panel, wide, dark | Whole-viewport still pair | `P1-current-W-D-{before,after}.png` |
| P1-N-L | Single content panel sheet, narrow, light | Whole-viewport still pair | `P1-current-N-L-{before,after}.png` |
| P1-N-D | Single content panel sheet, narrow, dark | Whole-viewport still pair | `P1-current-N-D-{before,after}.png` |
| D1-W-L | Single drawer, wide, light | Whole-viewport still pair | `D1-current-W-L-{before,after}.png` |
| D1-W-D | Single drawer, wide, dark | Whole-viewport still pair | `D1-current-W-D-{before,after}.png` |
| D1-N-L | Single drawer, narrow, light | Whole-viewport still pair | `D1-current-N-L-{before,after}.png` |
| D1-N-D | Single drawer, narrow, dark | Whole-viewport still pair | `D1-current-N-D-{before,after}.png` |
| RP-N-L | Moved panel controls and return to single | One short whole-viewport recording per revision, identical flow | Existing `RP-N-L` core/return/lifecycle chapters; provenance qualification below |
| RD-N-L | Moved drawer controls plus resize-strip boundary | One short whole-viewport recording per revision, identical flow | Existing `RD-N-L-before-recovery` and `RD-N-L-after` core; resize coverage qualification below |

**Total: eight static pairs (16 stills), two interaction pairs (four recordings, or clearly identified existing chapters).** Movies need not repeat both themes and widths: those appearance combinations are already covered by the eight static pairs. Narrow light is the constrained interaction representative for both modes. Wide dark movies already on disk may supplement or substitute individual unchanged-control observations; they are not new mandatory rows.

Minimum recorded flow per mode: begin at the single-terminal overlap example; type on that first line; show hover/access to all four moved actions; invoke horizontal split and close its extra pane to return to single; invoke vertical split and return to single; invoke New and close the created terminal to return to the original single surface. Panel New creates a tab; drawer New creates a group—follow the real behavior. Reuse those transitions to show the unchanged sidebar control header and the single row returning. No limit test, long-label script, session persistence, shortcut, typography, scrollback or maximize demonstration is required. Do not claim those behaviors from these movies.

Drawer only: while still single, show a pointer hit near the top of an actual button and one small drag on the separate 6px resize strip, then restore. This is justified by the drawer-specific clearance in the fix. No sweep through min/max heights or enlarged composer is needed. A still or logged `elementFromPoint` result alone does not establish successful pointer interaction. An observed baseline hit defect may remain visible in before footage; identical user intent matters more than pretending both revisions pass.

## Provenance and reuse

All filenames in this section are below `/tmp/issue-19536-assets` unless stated otherwise.

### Preferred static evidence: retain the current pairs

`current-pairs.json` has exactly the eight required pairs. Metadata records W/N at height 900, DPR 2, visual scale 1, light/dark root classes, terminal font 12, identical per-pair input and column counts. Geometry is internally consistent: panel canvas y=52→74 (22px), drawer canvas y=621→649 (28px), same outer dimensions. The sampled narrow drawer pair visibly shows the old toolbar covering the input and the new input fully below the row; sampled wide panel after is also the real app. This was a provenance audit with representative pixel inspection, not a fresh exhaustive visual certification of every asset.

Before metadata: terminal blob `0a12a6535c2d56325ef3193068b44c5ef08eb4b2`, matching present origin/main. Before source is recorded as [b5a226e49c](https://git.cafe/pingdotgg/t3code/commit/b5a226e49c52ecab4ddc2d678a7012d97e651a6a); checkout heads vary, and status explicitly records only `ThreadTerminalDrawer.tsx` modified. Inspection of the recorded heads shows the production-source difference from that baseline is this component; the remaining differences are fixtures. This supports a controlled baseline-component restoration. **Do not reject the before images just because the capture checkout was dirty, and do not relabel that checkout HEAD as a clean baseline build.** The recorded sourceTreeSha is a supplied attribution, not an independently measured whole-tree hash.

After metadata: clean [67d7573465](https://git.cafe/pingdotgg/t3code/commit/67d757346587b3902dd91f39942a4d3fe8254783), terminal blob `9626c2640b7d20fc38c972ed6fd3af250a434c16`, exactly matching reviewed HEAD. The component also matches historical [ec679087f9](https://git.cafe/pingdotgg/t3code/commit/ec679087f9029cc9be36fc76e1f95e2ffb692dce). These are reusable historical component-fix comparisons. They are **not runtime captures of the newer merged HEAD**: other web files, including composer/header and markdown CSS, changed afterward. Do not invent a recapture requirement solely from the merge; disclose the revision and limit the claim.

Wide PNGs are 1280×800 despite recorded CSS viewport 1440×900/DPR 2; narrow PNGs are 780×1800. Wide images preserve the viewport aspect ratio and appear to contain the full app, so retain them as scaled whole-viewport illustrations. Their export scaling is not documented by the fixture driver; they cannot serve as native-resolution or pixel-perfect 1440/DPR-2 proof. The user's whole-viewport requirement alone does not require discarding these scaled images.

`recovery-final.json` contains the same 16 current captures, not another independent pass. Original `D1-*`/`P1-*` stills and older prompt-only movies are supplementary: the `*-current-*` pending-input pairs make the overlap clearer and carry stronger source metadata.

### Recordings: useful existing material, qualified claims

`videos.json` lists 16 earlier recordings; `recovery-final.json` adds 8 recovery/current recordings. All 24 referenced attachment files exist and ffprobe reads a video stream. Original W movies are 2880×1800; original N movies are 780×1800. Existence/decodability is not a complete playback review or proof of source revision.

- `RP-N-L-before` records single/hover/horizontal split, then disconnects during Confirm. Its `before-return` chapter supplies return-to-single, vertical split and New; `before-lifecycle` supplies later lifecycle actions. After has corresponding core/return/lifecycle chapters. Retain completed segments with their boundaries; do not describe the failed core as one successful complete run.
- `RD-N-L-before-recovery` records single/hover/horizontal split/return/vertical split/New. `RD-N-L-after` records the corresponding checkpoints. These are the smallest existing drawer-control candidates; extra limit/group coverage need not be repeated or made a condition of acceptance.
- Original `captures.json` and `events.json` do not bind these original after movies to a captured source hash. Recovery before metadata supplies a claimed source revision, but omits measured component blob and working-tree status. Manifest historical after attribution and matching current component make reuse plausible, not independently proven. Link the movie/chapter to source records before calling it final revision proof; a manifest assertion alone is insufficient.
- Existing after hit-test events report the drawer's button top+2px resolving to the split button, and successful subsequent split checkpoints. The lifecycle movies include a resize drag, but there is no matched before resize-boundary segment established by the recovery event set. That specific before/after interaction remains incomplete; do not demand the unrelated lifecycle suite to repair it.
- `RD-N-L-after-persistence` times out and has no successful after-thread-switch checkpoint. It cannot prove persistence; **persistence is outside this minimum matrix**, so this is not a blocker for the visual fix. Wide drawer recovery similarly fails partway and resumes in a separate chapter; do not call its partial movie complete.
- The five `*-current-*` recovery movies accompany typing/appearance capture and stronger still metadata. They are candidates for the first-line typing proof, not substitutes for missing toolbar/resize actions: their logged operations do not exercise those controls. Several runs change viewport during one recording while the encoded stream has one fixed size (for example `D1-current-before` remains 2880×1800; `P1-current-before/after` remain 780×1800). Inspect framing at the relevant timestamps before claiming whole-viewport footage for every requested size. A still captured after resize does not establish the movie's framing.

The smallest remaining interaction work is therefore **source/framing reconciliation of the two narrow control pairs, plus the drawer resize-boundary pair if the existing chapters cannot show it**. Do not restart the old exhaustive capture script. If reconciliation cannot establish a required segment, replace only that short paired segment in a later authorized capture pass.

### Delivery records are not validation

`urls.json` maps 257 paths. It includes all eight current before stills and none of the eight current after stills. `uploads.md` predates the current series and contains no current pair. The five current recovery movie paths also lack an asset-directory copy under their run name; their originals still exist at the attachment paths in `recovery-final.json`. Thus the existing upload list cannot be presented as the final comparison bundle. This is a delivery/index gap, not lost local evidence. No upload or remote URL availability check was performed here.

## Fixture assessment and scope cuts

The seven fixture files are committed and inspectable in `apps/web/test/fixtures/terminal-layout`. `shell.sh` and `setup.mjs:typeFirstLine` provide the useful deterministic real-shell seed; `capture.mjs` records app geometry; `driver.mjs` records source metadata/events and uses preview snapshots. Retain those as available tooling. No fixture execution occurred in this audit.

`replay.mjs` and `manifest.json` encode the older broad plan: four recording runs, four-pane limit, long-label scripts, shortcuts, maximize, persistence-like lifecycle, large font/composer, scrollback and unavailable permission fixtures. They are not acceptance requirements for this fix. Run only the minimal flow above in any later pass; no product abstraction or new fixture framework is justified. No dedicated static sidebar, empty, permission-disabled, error/loading, group, limit, native mobile, provider, network-mode or alternate-entry-point rows. Permissions and all split-sidebar conditions are unchanged code paths; disabled visual coverage would be extra confidence, not a missing requirement.

## FRICTION

- **Revision attribution:** the best static evidence is from the earlier clean after revision, with the exact present component blob; this is not a whole-app runtime pass on reviewed HEAD. Old interaction movies lack equally strong per-run source binding. Resolve attribution before claiming a final proof pass.
- **Export/framing:** wide PNGs are scaled; current recovery movies retain fixed encoded dimensions across viewport changes. Preserve CSS viewport metadata and disclose scaling; inspect the relevant existing movie frames before reuse. Do not confuse raster dimensions with CSS viewport dimensions.
- **Actual missing interaction proof:** matched drawer resize-strip/button-boundary footage is not established. Narrow control movies are usable candidates, subject to source reconciliation and segment inspection. Failed persistence and omitted permission/limit suites do not expand the required work.
- **Delivery:** the latest eight after stills are absent from the supplied upload index. Local files remain present. No publication is authorized or performed by this audit.
- **Audit boundary:** no browser/server/capture was permitted or used. No claim of live UI validation, successful complete movie playback review, or merge readiness is made. No PR was created, edited or otherwise worked on; no PR-body question is needed.

Smallest-fix recommendation: keep the existing two-layout change and shared controls; finish only the qualified evidence gaps above. No product bug was established by this evidence audit. Main doubt is the strength and labeling of interaction provenance, not a need for more product scope or a larger fixture matrix.
