# Corrected proof matrix — exactly 8 recording pairs + 1 static pair

Read-only diff audit for [#22999](https://github.com/pingdotgg/t3code/pull/22999): before [680152e27b](https://github.com/pingdotgg/t3code/commit/680152e27b), after [db94329f89](https://github.com/pingdotgg/t3code/commit/db94329f89), checkout `/home/ubuntu/wt/pr-22999-after`. Supersedes the over-budget [prior matrix](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2308f0e148b85c4b/pr-22999-proof-matrix-pass1.md). This is an acquisition plan, not completed evidence or a passing behavior verdict.

## Budget contract

Exactly **8 recording pairs (16 clips total) plus 1 static pair (2 screenshots total)**. Each recording row is one fixed viewport/theme/handle/termination-timing sample, with one before clip and one after clip. No grouped sweeps, alternate terminations, extra handles, extra themes, or extra viewport clips hide inside a row. Every row is PENDING. Static evidence is one matched resting screenshot per revision, at 1440×900/light.

Use the same deterministic local Browser preview page, non-square source, floating width/position, composer layout, and interaction coordinates in both revisions. Use isolated development state. Widths below mean outer client CSS viewport; heights are fixed at 900 for 1440 and 844 for 390. Narrow samples are responsive web with mouse pointer input, not touch or native-mobile evidence. Capture the full player and composer, cursor, first displacement and final rest. A single continuous clip contains the one gesture, its termination, then passive pointer movement with no button down to reveal sticking. Passive motion is not another gesture. Do not add recovery drags or action/tap sequences.

## Fixed acquisition matrix

| Pair | Viewport | Theme | Handle | One sample / input method | Observable comparison |
| --- | --- | --- | --- | --- | --- |
| R1 | 1440×900 | light | NW | Normal diagonal resize and normal release using native `preview_drag`. | First movement starts from the rendered frame without a jump; opposite corner remains coherent; ratio remains stable; passive motion does not resize. |
| R2 | 1440×900 | dark | E | Normal horizontal resize and normal release using native `preview_drag`. | Starting geometry is continuous, opposite edge remains coherent, ratio stays stable, and release stops resizing. |
| R3 | 1440×900 | dark | NW | **Injected blur / missing-release sample:** acquire a real active mouse pointer on the mounted NW handle, inject matching `PointerEvent` motion, omit pointerup, dispatch window blur once, then inject passive motion. | Blur finalizes the gesture, releases capture when held, leaves a reachable frame, and later motion is inert. This row tests blur, not an additional buttons=0 termination. |
| R4 | 390×844 | light | E | **Injected missing-release sample:** acquire a real active mouse pointer on the mounted E handle, inject matching motion, omit pointerup and blur, then inject one matching `pointermove` with `buttons:0`; follow with passive motion. | The missing-button move terminates rather than applying another resize; final position fits the canvas and subsequent motion is inert. |
| R5 | 1440×900 | light | NW | **Injected transition-timing sample:** trigger one actual supported preview source-viewport sizing change; begin NW resize while the mounted layout is settling, inject deterministic motion, then normal pointerup. Outer viewport remains fixed. | First displacement uses rendered local geometry; the captured rendered aspect ratio remains stable despite the source change; termination leaves a reachable frame. |
| R6 | 390×844 | dark | E | **Injected transition-timing sample:** the same kind of supported source-viewport sizing change at this fixed outer viewport; begin E resize while layout is settling, inject deterministic motion, then normal pointerup. | Continuous starting geometry and frozen gesture ratio under source sizing; fitting does not leave an active gesture or unexpectedly replace the chosen width. |
| R7 | 390×844 | dark | NW | Normal diagonal resize and normal release using native `preview_drag`. | Narrow-layout first movement and anchoring remain coherent; frame fits, ratio stays stable, and passive motion is inert. |
| R8 | 390×844 | light | E | Normal horizontal resize and normal release using native `preview_drag`. | Narrow-layout continuity, opposite-edge anchoring, fitting and release behavior remain coherent. |
| S1 — static only | 1440×900 | light | none | Exactly one resting before screenshot and one resting after screenshot of the same seeded player. | Loaded content, border/radius, visible handles, player/composer placement and resting appearance. No motion claim. |

## Injection and transition validity

R3–R6 explicitly permit deterministic DOM `PointerEvent` injection into the **actual mounted handles**, so React event routing, computed CSS reads, store updates and visible rendering remain exercised. Native `setPointerCapture`, `hasPointerCapture` and `releasePointerCapture` must remain intact: no stubs, monkeypatches, fake geometry, direct controller calls or direct store mutations. Synthetic pointerdown alone cannot establish a browser-active pointer for native capture; use a real browser mouse-down on the target and its actual pointer ID before injecting matching events. Report the observed capture state and event sequence in each existing clip's caption. Clean up the real pointer after the observation; do not treat that cleanup release as the tested termination. Failure to acquire capture makes the sample unproved, not permission to stub it.

For R5/R6, identify the concrete existing source-viewport sizing control and old/new source dimensions before execution; trigger that supported change in the same clip. “Scale transition” means this real source/viewport sizing transition, not a fabricated CSS transform, browser zoom invented as a substitute, or a mocked computed style. Log geometry/timing without changing application behavior. If the available runtime has no supported source sizing transition, or no observable settling interval, mark that row UNPROVED with the reason; do not add a replacement scenario or clip. Each transition row has one transition and one resize, with normal release only. The plan does not claim an outer-viewport shrink/restore persistence experiment.

## Diff scope and sampling rationale

The four-file diff extracts pointer lifecycle/geometry into [previewMiniPlayerGesture.ts](https://github.com/pingdotgg/t3code/blob/db94329f89/apps/web/src/components/preview/previewMiniPlayerGesture.ts), wires it into [ThreadPreviewMiniPlayer.tsx](https://github.com/pingdotgg/t3code/blob/db94329f89/apps/web/src/components/preview/ThreadPreviewMiniPlayer.tsx), adds [focused controller tests](https://github.com/pingdotgg/t3code/blob/db94329f89/apps/web/src/components/preview/previewMiniPlayerGesture.test.ts), and makes the empty-obstacles constant private in [previewMiniPlayerLayout.ts](https://github.com/pingdotgg/t3code/blob/db94329f89/apps/web/src/components/preview/previewMiniPlayerLayout.ts). The layout algorithm is unchanged. The controller reads fractional computed local geometry at capture, freezes the rendered starting aspect ratio, handles missing primary-button state, and finishes/clamps on end or blur without persisting the fitted width as the chosen width. Shell wiring adds lost-capture termination to drag and resize handles.

NW samples simultaneous x/y movement and corner anchoring; E samples a one-axis edge resize. They share the controller used by the other resize directions and drag handle. Four normal pairs cross both chosen handles with both widths; light/dark appear at both widths. Two interruption pairs split blur and missing-release across those handles and widths; two transition pairs sample each handle at a different width/theme. This deliberately samples shared behavior within eight pairs; it does not prove unsampled directions, termination paths or render surfaces. Theme is a visual contrast sample, not a separate gesture implementation. Mocked controller tests supplement these clips but do not prove DOM capture or event delivery. No tests were run during this audit.

## Explicit exclusions

All combinations outside R1–R8 and S1 are out of scope: drag/pill interactions; N/S/W/NE/SW/SE handles; other size/theme/handle/termination combinations; touch taps and cancellation; separate pointercancel/lostpointercapture cases; secondary pointers; action buttons and reopen flows; new recovery gestures; extra static themes or narrow screenshots; and outer-viewport shrink/restore sweeps. Unit-level invalid geometry and capture exceptions are not added visual samples.

**Separate environment limitations:** physical OS outside-window release/return and physical touch input are not proved by injected blur/missing-release evidence. No extra recordings are allocated to them. Likewise this Browser preview fixture does not establish native Electron BrowserSurfaceSlot alignment, device-stream/PDF integrations, native mobile, or OS-specific capture delivery. The changed shared shell reaches browser/device preview rendering, but those backing integrations are not changed here. Provider adapters, contracts, backend persistence, transport/relay/tunnel modes and multi-environment paths are outside this local UI diff. No performance benchmark or exhaustive surface claim is made.

## FRICTION

- The prior matrix exceeded the cap by hiding multiple samples per row. This replacement has exactly eight recording pairs and one static pair, with no grouped sweeps.
- This pass was source-only: no browser, server, screenshot, recording or behavioral test was started. All evidence remains PENDING; supported transition availability and timing remain to be established by the executor.
- Native capture requires a real active pointer even when subsequent PointerEvents are injected. Untrusted event evidence covers the mounted app's deterministic lifecycle, not physical OS event delivery.
- No checkout edits or forge writes were performed. The only artifact write is this temporary Markdown file and its authorized public upload through `ghdrop upload -m`.
