# Evidence report — issue 13706

Issue: [#13706](https://git.cafe/pingdotgg/t3code/issues/13706). No production bug confirmed through the actual product. This positive red→green proof uses the installed actual LegendList dependency in an isolated synthetic browser harness.

Head: [e84990bae5](https://git.cafe/pingdotgg/t3code/commit/e84990bae57049749dc7ddb0835e15452eb336ab). Base: [b5a226e49c](https://git.cafe/pingdotgg/t3code/commit/b5a226e49c52ecab4ddc2d678a7012d97e651a6a). Implementation remains the six null guards from [604f48b99c](https://git.cafe/pingdotgg/t3code/commit/604f48b99c); this task added only fixture/materializer commits. No push, public comments, PR, server launch, DB writes, or provider requests by this test agent.

## Essential A1 — fresh v2 evidence

Four paired recordings, all at the committed centered-label/stability fixture SHA above. Before failure 4/4, after failure0/4. Requested shrink150ms; actual times are recorded below. All runs start offset5000, total135000, 150 known900px rows (public setItemSize warm-up), estimate90, initialScrollAtEnd, MVCPdata+size. No forced scheduler or dependency-state mutation. The warm-up makes the original intermittent race reliable and pins size accounting; it is an explicit harness condition, not a product workload.

| CSS viewport/theme | before timer/after mutation ms | after timer/after mutation ms | before min total / settled offset / enddistance | after min total / settled offset / enddistance |
|---|---|---|---|---|
| 1440×900 light | 160/204.2 | 180.9/185.9 | 90 / 0 / 133300 | 134100 / 133300 / 0 |
| 1440×900 dark | 174.1/187.2 | 151.3/156 | 90 / 0 / 133300 | 134100 / 133300 / 0 |
| 390×900 light | 195.6/205 | 154.1/174.4 | 90 / 0 / 133300 | 134100 / 133300 / 0 |
| 390×900 dark | 151.1/158.2 | 154.6/158.1 | 90 / 0 / 133300 | 134100 / 133300 / 0 |

Every mutation has active index149/viewPosition1; after removal resolved targetId=null. Before target itemSize becomes90 and measured-cache entries151; after target itemSize stays900 and measured-cache entries150. After data total remains134100. All four fresh before runs settle at0/enddistance133300. All fresh after runs settle DOM=internal133300/enddistance0 and visibly render centered Row148.

Completion is observed, not inferred from2400ms: after minimum1200ms the driver requires >=3 successive layout frames and >=200ms unchanged total/internal scroll/DOM scroll/DOM height, no active target, and internal-vs-DOM difference<=1px. A10s watchdog throws instead of accepting an unsettled result. A second two-layout-frame observation after each screenshot confirms the same endpoint. The JSON traces include row and label bounds. Final row bounds top0,bottom900; scroller top100,bottom900; centered label439.5..459.5 within viewport. The original top label could sit100px above viewport; previous blank-looking stills are superseded, not proof of missing render.

Recordings share the identical driver, starting geometry and semantic phases. Browser/OS scheduling differs; requested150ms is not claimed as identical wall-clock execution. Raw recordings and per-frame traces preserve actual timing. Side-by-side seven-second clips align the first recorded active-animation frame (before left, after right), holding the last frame as needed; this is semantic frame alignment, not subframe synchronization. Alignment offsets are supplied in v2-video-alignment.json. Raw capture frame rate is variable and may not show every transient frame; the trace records the90px collapse directly. Aligned ready/settled stills are compared without masking or manual image scaling.

## Pixel comparisons

Threshold0 counts a pixel changed when any RGB channel differs; threshold8 requires max channel delta>8. Raw absolute channel differences (1x), amplified8x, binary threshold8, labeled before/after panels, and untouched captures are supplied for every pair at ready and settled. All four ready pairs have0 changed pixels/maxdelta0. Settled differences are expected visible row identity/label position, scroll offset/end-distance readout and its wrapping; row palette/geometry/fonts/header/buttons match. No unrelated product visual changes are claimed.

| CSS width/theme | exported PNG raster | settled changed>0 | changed>8 | max channel delta |
|---|---|---:|---:|---:|
| v2-A1-1440-light | 1280×800 | 3985 | 3923 | 238 |
| v2-A1-1440-dark | 1280×800 | 4045 | 3961 | 215 |
| v2-A1-390-light | 780×1800 | 6948 | 6726 | 238 |
| v2-A1-390-dark | 780×1800 | 7152 | 6854 | 215 |

Capture scaling: actual layout1440×900 CSS, DPR2; Browser snapshots export1280×800 PNG (8/9CSS,4/9device-pixel dimensions), while recording streams are2880×1800. Narrow390×900 CSS,DPR2 exports780×1800 PNG and video. This is a Browser screenshot export policy, not1440×900 raster evidence. Before/after in each pair use identical policy; metrics refer to the exported raster. No narrow-web test is labeled native mobile.

## Matrix disposition — nothing silently dropped

| Row | Status / limitation |
|---|---|
| A1 | PASS all four web width/theme pairs; positive dependency red→green with stable visible final row. |
| A2 | UNVERIFIED actual size-only prepareMVCP execution. Exploratory data=false,size=true shrink produced transient90 before and coherent total after, but props+shrink do not prove which prepareMVCP invocation ran. Do not count as branch proof. Raw v1 control traces retained separately. |
| C1 | INCONCLUSIVE valid-target resize integration. targetId149 survives and itemSize900→1000, total135000→135100→135000 on both revisions. Public setItemSize warm-up and subsequent actual measurement complicate final sizing; no preserved-correctness claim. |
| C2 | Partial observed controls at1440light on both revisions: MVCP disabled and viewPosition0 avoid collapse and land at end; nonanimated runs freshly loaded have no active target at mutation and land at end. Earlier reused-page control runs had interfering scroll state and are not accepted. Pending-end-before-target, explicit data-only settings, and ordinary-anchor restore remain UNVERIFIED. |
| P1 | UNVERIFIED paired product shrink race. Lead reported seeded long product thread no jump; no positive product reproduction. |
| P2 | Partial lead-owned actual product smoke: real Claude short/long and busy main thread reportedly no jump; final after Sonnet5.5 OK completed with enddistance0.5. Integrated recording covers send/pending, not completed reply. Not four paired replay clips; no committed product transcript seed/replay from this test task. |
| P3 | UNVERIFIED empty/short, remembered middle, find/citation, reduced-motion product navigation; essential A1 prioritized. Nonanimated dependency control is not equivalent. |
| P4 | UNVERIFIED nested tool-group and native work-log follow; no representative integrated flow captured. |
| N1 | UNVERIFIED actual iOS/Android feed/keyboard/insets. Only Linux web available; no native simulator/client used. |
| D1 | UNVERIFIED Electron shell. Web React bundle proof does not establish Electron integration. |
| U1 | UNVERIFIED ancillary catalog controls and mobile variants; no positive null-target exposure established; essential race prioritized. |

Direct react-native.web bundle test parity remains unverified. Existing focused suite tests react.js/mjs and react-native.js/mjs and passed14/14; no native runtime claim follows.

## Rebuild and verification

Committed canonical fixture: scripts/fixtures/issue-13706/repro.tsx; deterministic synthetic data IDs0..149 generated there. Materializer: scripts/materialize-issue-13706.ts. Run `node /path/to/fixed/scripts/materialize-issue-13706.ts /path/to/destination-worktree`, then use an already authorized dev server’s `/issue-13706.html?theme=light` or dark. This script never starts servers or accesses SQLite. It copies the same committed fixture into either revision. Browser driver: wait for150×900px text, `await window.repro.prepare()`, require total135000/offset5000, start recording, `await window.repro.run()`, require stable endpoint, screenshot, observe two more layout frames via `window.repro.sample`, stop recording. Narrow/wide resize through Browser panel, not user-agent emulation.

Focused commands run successfully at final fixture SHA:

- `vp fmt --check scripts/materialize-issue-13706.ts scripts/fixtures/issue-13706/repro.tsx` — pass.
- `vp lint scripts/materialize-issue-13706.ts scripts/fixtures/issue-13706/repro.tsx apps/web/src/issue-13706-repro.tsx` — pass.
- `vp exec tsc-rs --noEmit -p /tmp/13706-fixture-typecheck.json` — pass. Temp config extends the web tsconfig; composite/incremental false; includes only materialized web TSX and materializer; node typeRoots resolve via workspace/web node_modules. This checks canonical TSX through its byte-identical materialization in web dependency context. Temp config is included with evidence.
- `vp test run scripts/legend-list-initial-reveal.test.ts` —14passed,42.70s; run before the label/stability-only fixture change; production/test source unchanged after it.
- Earlier `vp run --filter @t3tools/web typecheck` passed with existing Effect suggestion diagnostics; no repo-wide checks run.

The canonical fixture deliberately lives outside production entrypoints; it is retained under explicit user authorization to commit reproducible fixture data/driver. Diagnostic fiber inspection is read-only, tied to React development and LegendList3.3.5, and throws loudly if absent. Generated scratch HTML/TSX are removed after proof capture; canonical files remain committed. No screenshots, videos, report notes or fixture database committed.

## Environment/provenance

Ubuntu24.04.5 Linux6.1.102 x86_64; Chromium154.0.0.0 desktop UA; DPR2; visualViewport scale1; reduced motionfalse; loaded generic monospace16px/20px; React/ReactDOM19.3.0; LegendList3.3.5; Vite8.3.4 via vp1.3.0. Frozen display clock2026-10-22T12:00UTC; Date/performance/animation clocks deliberately not frozen. Host generic monospace resolves WenQuanYi Zen Hei Mono Regular; font binary SHA and exact fixture/patch/bundle hashes are in manifest. Host fc-match is not a browser font-file assertion. Identical font rendering is substantiated by zero-difference ready frames.

No database snapshot SHA applies to isolated dependency fixture: it has no DB. Deterministic synthetic row-data SHA and fixture SHA recorded in manifest. Do not confuse this with a product state snapshot. Live userdata was never read or written by this agent; Browser-generated sanitized screenshots/recordings were copied from its artifact paths only. No provider credentials or private messages uploaded.

## What else changed

Task-only commits add the reproducible fixture/materializer and improve proof label visibility/stability. Product implementation, dependency guard, lockfile and focused tests unchanged by this test agent. Harness versus original reporter setup: rows now900px border-box instead of accidental901;100px diagnostic header; monospace theme/fixed displayed date; public size warm-up; flushSync mutation; read-only development-state tracing; centered labels and observed endpoint. These conditions are identical before/after. They do not prove product reachability.

## FRICTION

| category | observation / handling |
|---|---|
| tool | Navigation returned before React effect readiness once; discarded invalid capture and added visible-text readiness plus explicit5000/135000 preconditions. One navigation15s timeout recovered with60s explicit timeout. |
| tool | Browser snapshot scales wide exports to1280×800; recorded true CSS/DPR and raster separately. Built-in ffmpeg lacks H264 decoding; extracted existing cached imageio ffmpeg to/tmp for video inspection; no project dependency added. |
| brief | Essential dependency race proof and committed fixture prioritized over broad product/catalog matrix; every omitted row explicitly unverified. |
| runbook | scripts tsconfig excludes TSX and web dependencies resolve only after materialization; focused temporary web-context config typechecks exact bytes. |
| infra | Shared machine load causes delayed timers/native event delivery and variable video frames; actual timings logged, fixed2400ms completion replaced by geometry stability. No other processes or primary servers stopped. |
| model | First pass treated size-only props as branch evidence and valid resize as successful control too strongly; revised A2unverified/C1inconclusive. Blank final row was label geometry, not established missing render. |
| policy | Explicit user request authorizes committed reproducibility fixture; no PR-only artifacts committed, no push/comments/PR. |

Model/harness: gpt-6.1-sol through Codex/T3 Browser panel. Used test-t3-app and ghdrop skills.
