# Missing-proof matrix r4 — fresh source check, pass 1

2026-10-22 UTC. Read-only, web-only audit of [#23462](https://git.cafe/pingdotgg/t3code/pulls/23462) for [#16447](https://git.cafe/pingdotgg/t3code/issues/16447). BEFORE [3b95e7831b](https://git.cafe/pingdotgg/t3code/commit/3b95e7831b11b17627dff16843bc087bfca397ec); AFTER [366ec74cf8](https://git.cafe/pingdotgg/t3code/commit/366ec74cf818a8b0ccd032d115e2f6d353f61245).

Read the supplied current PR envelope, proof2 and matrix-r3 first, in that order. Then inspected the complete four-file base-to-head diff and current source/callers in /home/ubuntu/wt/pr-23462. Clean status, detached exact HEAD and merge-base with origin/main are independently confirmed. No source edits, capture, browser interaction, seeding, server action, branches, comments, checks/watch or forge changes were performed. App-required registration of this existing PR was performed. Only this report was written outside the repository. This is a source-confirmed acquisition specification, not new visual proof or a merge verdict.

## Decision

Retain valid literal Wide primary light/dark evidence and its stated limits. Missing proof remains exactly D, N20, N8, actual-Full Z, C2 text drag, M-coarse and independent recapture. No new implementation defect is established by this source pass. r3's missing-worktree/source/fixture blocker is resolved. Its prior authentication failure is historical: the owner now reports an authenticated synthetic-only server at localhost:7456; this pass did not independently navigate it. Independent rebuild is practical from the committed seed; independent recapture is still outstanding.

Two source corrections matter: C2's 8px is the rail HEIGHT for two items, not hit-strip WIDTH. Comfortable can retain h40 width while its two-item rail is 8px high. Also this component performs hover/click navigation, not continuous drag-to-scroll: rail-origin mousemove changes preview, while click/keyboard/neighbor actions select a user item. Do not require invented drag-navigation semantics.

## Source-confirmed boundaries

- [TimelineMinimap.tsx](https://git.cafe/pingdotgg/t3code/src/commit/366ec74cf818a8b0ccd032d115e2f6d353f61245/apps/web/src/components/chat/TimelineMinimap.tsx): active width is always hitStripWidth; the overlapping preview is pointer-events-none. The removed preview exemption is consistent with that display-only preview. Leaving the rail clears activeIndex immediately; nonpersistent outer rail opacity has a 150ms transition. Preview removal and rail fading are separate assertions. Focus-within can retain opacity after pointer exit, so blur before measuring an exit fade.
- Message-origin held movement into the strip sets passThrough, suppressing strip/neighbor pointer targeting. Strip-origin mousedown sets pressedOnStripRef; button-free window mouseup OR mousemove clears release tracking. This is why outside-window release/re-entry needs actual native input, rather than a synthetic event or ordinary inside-page drop.
- [MessagesTimeline.logic.ts](https://git.cafe/pingdotgg/t3code/src/commit/366ec74cf818a8b0ccd032d115e2f6d353f61245/apps/web/src/components/chat/MessagesTimeline.logic.ts): g=max(0,(viewport−min(viewport,content))/2); h=clamp(floor(g)−12,0,40); persistent iff g>=48; neighbors pointer-interactive iff h>=14 and not passThrough. Thus N20 and N8 straddle the neighbor threshold, not persistence. h0 disables pointer targeting, not tab focus. Two items yield 8px natural height; fewer than two return null. BEFORE's active rail expands to 22rem; head removes that helper/constant only.
- [MessagesTimeline.tsx](https://git.cafe/pingdotgg/t3code/src/commit/366ec74cf818a8b0ccd032d115e2f6d353f61245/apps/web/src/components/chat/MessagesTimeline.tsx) measures the real viewport and data-timeline-root widths; navigation scrolls to user rowIndex with viewOffset 24 and animation unless reduced motion. Wait for settled scroll/current item before checking endpoint disabled states. Current item is derived from visible rows, not necessarily the most recently hovered preview.
- [timelineMinimapItems.ts](https://git.cafe/pingdotgg/t3code/src/commit/366ec74cf818a8b0ccd032d115e2f6d353f61245/apps/web/src/components/chat/timelineMinimapItems.ts) derives user items and final assistant before the next user, compacts blank user text to null (display fallback User message), and truncates assistant input to 1500 characters before markdown preview parsing. First/middle/last transforms remain 0/−50/−100 percent.
- Coarse absence comes from hidden plus [@media(pointer:fine)]:block, not an explicit coarse rule. Prove fine=false and computed display:none on an actual coarse browser. Coarse=true alone is insufficient if a device also reports fine=true.

## Fixture and rebuild

Read the complete [seed script](https://git.cafe/pingdotgg/t3code/src/commit/366ec74cf818a8b0ccd032d115e2f6d353f61245/scripts/fixtures/issue-16447.py) and [JSON data](https://git.cafe/pingdotgg/t3code/src/commit/366ec74cf818a8b0ccd032d115e2f6d353f61245/scripts/fixtures/issue-16447.json). They deterministically create synthetic-minimap-long/two/one/empty with 80/2/1/0 user turns, fixed timestamps and IDs, long assistant markdown/reference links, and reasoning every fifth long turn. Two has whitespace-only first user, no first assistant, then Short user message / Short final assistant. It does not contain an attachment-only case; blank fallback is the available case. Long includes paragraph 41 and https://example.com/#synthetic-41.

This is UI projection data, not backend/event proof. The seed deletes projection rows except v2 metadata and requires an already migrated isolated .t3 database. It documents STOPPED server, but does not enforce that precondition; it was not executed here. Rebuild only in separately prepared stopped sandbox state, never against running localhost:7456 or live userdata. Existing running synthetic app can be reused for capture without reseeding. BEFORE needs the same seed supplied externally because these fixture files are newly committed at AFTER. Read-only auditor need not switch checkout or restart owner server; owner supplies both revision environments for paired recovery.

## Honest minimum practical capture set

Preserve Wide primary, Comfortable supplemental, C0/C1 absence and narrow fine-pointer controls; do not rerecord them. To close every remaining row, the minimum new coverage is six paired interaction segments (D light and dark; N20, N8, actual Full Z, C2 light), four coarse full-surface stills (two revisions × two themes), and one independently rebuilt affected AFTER still. Segments can share a continuous whole-surface recording per revision/theme with labelled transitions; there is no requirement for twelve separate video files. Each interaction segment needs identified before/after semantic keyframes and result logs. Coarse stills and the independent still need no gratuitous videos. Existing matched valid states need not be duplicated.

With the currently exposed input, this entire set cannot honestly be marked complete: practical tool-only acquisition can close click/keyboard/hover/wheel/state comparisons and attempt native text drag, but cannot close held-pointer boundary behavior or M-coarse. A smaller delivered subset must carry those exact exceptions. Native operator input recorded in the same app, or an approved tool that really provides the missing input/emulation, is needed for full closure. No new capture was taken in this pass.

| Row / minimum scope | Acquisition and observable closure | Current tool boundary |
|---|---|---|
| D: long Comfortable h40, 1440×900, paired light + dark segments | Add settled first/middle/last previous/next actions: disabled endpoint must not navigate; enabled neighbor moves one user item. Reuse valid prior keyboard actions where established; fill focus-open preview→underlying text/blur and incomplete drag outcomes. Message-origin drag across strip/former footprint: message-owned range, no unintended scroll/navigation. Separately strip-origin held movement outward: preserve existing preview/click semantics, no unintended text selection. Release outside browser, return buttons=0, then intentional rail click proves recovery. Log selection owners/text, buttons, scroll anchor/offset/current item and disabled/focus state. | Native drag auto-scrolls source/target into view; a successful call is not proof of no jump. No separately held down/move/up or outside-window release. These boundary/recovery assertions remain unverified even if an ordinary drag succeeds. |
| N20: g32/h20 nonpersistent, paired light segment | Prefer real layout; otherwise labelled real-app geometry supplement. Normalize paragraph41, loaded count and scroll before recording. Hover/focus/exit, footprint message/link targets, neighbor click, message-origin drag/recovery. AFTER width stays20 while active; neighbors pointer-active except passThrough. Observe rail fade after exit with no focus retention. | Click/hover/focus and timed passive rendered samples are practical. Native drag cannot isolate no-jump/held crossing/re-entry; carry gap. |
| N8: g20/h8 nonpersistent, paired light segment | Same controlled normalization/sequence; AFTER active width8. Distinguish pointer-active rail from pointer-inactive neighbors, with real hit target/navigation observations; pointer-inactive does not mean keyboard-disabled. | Same drag limitation. Do not force-click neighbor and call it normal pointer proof. |
| Z: actual Full stored preference, paired light segment | Measure h0, disclose residual g (e.g.6 allowed). Native underlying text selection, known real link hit, wheel without unintended navigation; separately focus/keyboard preview, move to text, blur. Keep old CSS h0 supplemental only. | Native drag can establish range ownership if successful, but automatic scroll invalidates unqualified no-jump. A double-click alone does not establish text-drag invariance. |
| C2: two-user Comfortable, paired light segment | Exactly2 items, 8px HEIGHT, measured hit width separately. Blank fallback/no assistant first, short assistant last; retain valid prior first/last and keyboard records. Fill native text drag across the open preview footprint using real underlying selectable text, range ownership and recovery. Record actual bounding boxes; no injected text. | Short assistant may not geometrically intersect preview; establish overlap before claim. If none exists, report fixture/layout limitation rather than manufacture overlap. Same native drag auto-scroll caveat. |
| M-coarse: 390×844, paired light + dark stills | >=2 loaded items; actual coarse=true/fine=false, relevant hover/any-pointer queries, computed display:none from fine-only CSS, viewport/DPR/UA/theme. Four whole-surface stills suffice. Web browser only; no native mobile requirement. | No coarse/touch device emulation exposed. Viewport resize, CSS hiding or overriding matchMedia do not close this row. |
| Independent recapture: one AFTER Wide affected state | Fresh auditor reconstructs one delivered light Wide paragraph41 state at 1440×900 CSS, g48/h36, DPR2, root16px, 100% text scale, fonts settled, matching sidebar/scroll/loaded80/theme. One new actual screenshot and delivered-AFTER comparison. Identify source still/frame and acquisition/resizing path; exact zero/>16 outputs/counts, all visible differences disclosed. | Authenticated localhost:7456 is owner-reported available, removing former setup obstacle. Still requires independent future capture; pass1 forbids it. Original source artifact must be available for comparison; prior public-index 403 is historical, not retried or resolved here. |

All paired acquisitions use exact linked revisions, same fixture/count, viewport, fonts, theme, DPR, pointer mode, scroll anchor and sidebar/panels. Geometry overrides must appear in recording and manifest; do not call them ordinary Wide/Full. No isolated fake minimap. For endpoint navigation, allow intended smooth scrolling to settle; native target auto-scroll must be logged independently from app navigation. Do not interpret current-item endpoint state immediately after Home/End as settled navigation.

150ms is the source-configured opacity duration, not a promise of exactly150ms wall time. Record pointer exit and frame-aligned opacity observations through completion, measured interval and sampling uncertainty; do not reject honest frame quantization or claim timing from CSS/sleep alone. Preview disappears via state independently of fading outer rail.

For new controlled keyframe pairs and independent comparison provide original Before/After, per-channel absolute RGB delta amplified×8/clipped, strict max-channel delta>16 mask, changed counts and total. No hidden alignment/masks/crops/content replacement. >16 is sensitivity, not an AA classifier; video compression and snapshot compositor lag remain possible. Use the same acquisition/scaling path (desktop snapshot1280×800 is not CSS viewport1280×800; existing video2880×1800/light keyframes1440×900). Stills do not establish interaction or recovery. Passive selection/event/scroll observation is allowed; programmatic selection, synthetic events or forcing app refs/state is not input proof.

## FRICTION

| Friction / result | Consequence |
|---|---|
| Earlier auditor ran before checkout creation; now clean detached exact head and full diff/fixture read | Source blocker resolved; no substitute checkout or branch created. |
| Current catalog exposes preview_drag(source,target); no held-pointer move/up/outside or coarse emulation | Explicit user-reported scrollIntoView behavior limits no-jump proof; catalog does not offer missing primitives. No browser launched to probe or capture. |
| r3 overlabels C2 8px as rail width; source shows natural height | Corrected to height; measure width independently. |
| Prior N/Z/C normalization mismatches and lagging stills | Settle the same mounted paragraph/anchor before acquisition; keep invalid comparisons qualified rather than discard valid Wide. |
| Prior pairing failure versus now-running authenticated synthetic localhost:7456 | Historical failure retained as history; current app availability owner-reported, not independently browser-verified in pass1. |
| Prior published index403 / absent producer artifact bundle | Not retried here; delivered reference file availability remains a prerequisite for honest independent pixel delta. Prior arithmetic/asset verification remains attributed to proof2. |
| First batched document output was truncated | Re-read proof2/r3 and focused matrix/source sections; full four-file diff and fixture were returned without truncation. |
| Detached symbolic-ref query exits1 | Expected detached HEAD, not failed source checkout. |
| Scope | No captures, repo edits, seed execution, server changes, comments, branches or watch; only /tmp report plus required app PR registration. |

Status: SOURCE CHECK COMPLETE. PROOF STILL INSUFFICIENT: D N20 N8 Z C2 M-coarse independent-recapture. Valid primary Wide retained; no claim of exhaustive media inspection or new visual verification.
