# Proof audit pass 2 — PR #22788

Reviewed [#22788](https://git.cafe/pingdotgg/t3code/pulls/22788), [GitHub mirror #22788](https://github.com/pingdotgg/t3code/pull/22788). Local audited head [f4bce0f27c](https://github.com/pingdotgg/t3code/commit/f4bce0f27c5c7777c67c7b30e62d8e13062dad44), production fix [ca449ec80e](https://github.com/pingdotgg/t3code/commit/ca449ec80ee41858d61e7ad1d48e83308f20872c), pinned base [74541bab17](https://github.com/pingdotgg/t3code/commit/74541bab17270c35f4418d4e543d85628632ed8f). Head checkout `/home/ubuntu/wt/issue-20366`; base checkout `/tmp/issue-20366-before`. Head is clean. Only `acp-mock-agent.ts` and `timeline-follow-fixture.ts` differ between production fix and audited fixture head. Base checkout has those fixture files as local changes; its fixture helper is byte-identical to head.

Findings, in priority order:

1. **Actual-app delayed-hydration cause remains unproved.** The final manifest explicitly marks a persistent ChatView hook with no list beyond 20 RAF as unverified. Every settled long control passes both base and head. The draft-placeholder recording proves a different-node lifecycle, but switching to a draft can change hook/component lifetime; it does not establish that the original hook exhausted its retry budget before the list appeared. The browser regression source exercises that condition in `FollowHarness`, using synthetic wheel. Its fail-old/pass-new execution is parent-reported, not independently rerun here. Neither that harness nor the historical main clip substitutes for a matched actual-app delayed-hydration reproduction.
2. **The native-input and supplemental acceptance rows remain incomplete.** Long cells use trusted native PageUp at both widths. Short cells use PageUp plus synthetic wheel/touch; narrow dark is explicitly synthetic-touch-only. Native wheel, native touch, scrollbar drag, nested scroller/ctrl-wheel filtering, composer PageUp/release, iframe chaining, reduced-motion, and exact listener installation/removal counts have no direct acceptance evidence in this bundle. Old-node inertness and current-node PageUp response are useful partial lifecycle proof, not an exact listener-count assertion.
3. **Clock matching is incomplete.** Screenshots visibly retain real wall times and unequal Working/Worked durations. For example, wide/light short stable shows Working for 28s versus 41s. A late Intl formatter shim cannot freeze formatters the app already cached. Runtime Date/RAF/timers must remain live to preserve stream delivery; the attempted runtime freeze interfered with it. Early narrow/dark short used the old runtime freeze and is not on the identical clock configuration. These differences remain unmasked and are honestly observable, but do not satisfy the requested shared frozen-clock capture condition. No layout delta is dismissed as anti-aliasing.
4. **Clip phase timing is not fully indexed.** The manifest has screenshot UTC and phase order, but explicitly warns against mapping those timestamps linearly into MediaRecorder seconds. It supplies no verified per-phase clip ranges. I sampled all 20 videos at four clip times each, and independently performed the long head control, but have not silently converted capture times into reliable video ranges.

No new concrete production code defect established by this proof audit. The missing evidence is not evidence of a regression.

The local final bundle is [index](/tmp/pr-22788-capture/final/index.html), [manifest](/tmp/pr-22788-capture/final/manifest.json), and [all pixel pairs](/tmp/pr-22788-capture/final/pixel-diffs.json). I independently recomputed **all 42 matched pairs, all 84 diff PNGs, and both counts per pair**: no errors; 28 pairs have zero differing pixels. Diff0 is absolute RGB ×8 clamped at255, count max-channel>0. DiffT is magenta where max-channel>8/255, black elsewhere. Both sides composite alpha onto opaque white; no alignment, masking, or post-capture resizing. Wide CSS1440×900 produces PNG1280×800 through the preview cap; narrow CSS390×844 produces PNG780×1688 at DPR2. These are whole-view captures, not cropped desktop viewports or native mobile captures.

| Matrix row | Before/after direct evidence | Status against requested row |
|---|---|---|
| L wide/light | `L-wide-light-v3`, seven paired checkpoints and A/B recordings; detached→tool start→finish→prose holds Paragraph077 at y77.28125, top4403; resume top6263 then6424 | PASS settled PageUp/hold/pill/resume; MISSING delayed mount and native wheel |
| L wide/dark | `L-wide-dark`, same seven checkpoints and measured geometry on both sides | PASS settled PageUp/hold/pill/resume; MISSING delayed mount and native wheel |
| L narrow/light | `L-narrow-light`, seven pairs; Paragraph091 y140.359375/top11269 held while height grows12754→15237; resume14445 then14747 | PASS PageUp control; MISSING native touch and delayed mount |
| L narrow/dark | `L-narrow-dark`, seven pairs; same detached hold geometry and resume behavior | PASS PageUp control; MISSING native touch and delayed mount |
| S wide/light | `S-wide-light-v2`, stable/completed pairs plus A/B videos; realBottom225→258→292, client848, top0/follow=true/no pill | PASS fitting-content PageUp/synthetic-input control; MISSING native wheel and delayed/replacement path |
| S wide/dark | `S-wide-dark-v2`, same measured fit and follow state | PASS fitting-content control; same input/lifecycle gaps |
| S narrow/light | `S-narrow-light-v2`, realBottom229→262→300 < client792; follow=true/no pill | PASS fitting-content PageUp/synthetic-input control; MISSING native touch and delayed/replacement path |
| S narrow/dark | `S-narrow-dark`, two pairs and A/B videos; same final realBottom300/client792, no pill | PASS observed fitting-content result; CLOCK EXCEPTION and native-touch/lifecycle gaps |
| Same-node thread switch | `switch-wide-light`: both directions same node on A/B; PageUp false/pilltrue; Paragraph077 y77.28125 through new prose; resumed following | PASS observed wide/light supplement |
| Actual list→placeholder→new list | `lifecycle-narrow-dark`: no list for25RAF; old node disconnected, distinct replacement; synthetic events on old node leave follow unchanged; native current PageUp detaches | PARTIAL: pass observed narrow/dark lifecycle, not delayed hydration or exact listener counts; not repeated in all L/S cells |
| H harness | Committed regression renders loading FollowHarness for20 frames, mounts overflowing list, sends synthetic wheel and expects cancellation | HARNESS-ONLY; parent-reported fail-old/pass-new execution, not independently rerun |
| I supplemental controls | No actual native wheel/touch/scrollbar/nested-scroller/ctrl-wheel/composer/iframe acceptance trials supplied | UNVERIFIED |
| Matched pixels |42 B/A pairs,84 correctly defined independently validated diffs; exact dimensions and per-pair counts in pixel-diffs.json | PASS outputs; clock differences retained and disclosed |
| Rebuild one affected capture | Independent supported CLI seed, real ACP→server→client, own paired preview tab; head wide/light detached capture reproduced exactly | PASS: Diff0=0, DiffT=0 |
| Provenance/publication | Local head/fixture SHA and process CWDs verified. Parent later reports successful push of f4bce0f27c. Final public index/PR-body update not inspected at report creation | LOCAL VERIFIED; remote publication pending final supplied links, not claimed blocked by old DNS/auth errors |

Independent rebuild command, from `/home/ubuntu/wt/issue-20366`:

```sh
node apps/server/scripts/timeline-follow-fixture.ts print > /tmp/audit-timeline-fixture.json
node apps/server/scripts/timeline-follow-fixture.ts seed /home/ubuntu/wt/issue-20366/.t3 /tmp/pr-22788-synthetic-workspace timeline_fixture long
node apps/server/scripts/timeline-follow-fixture.ts release /tmp/pr-22788-A-S-narrow-light-v2/95184-1 entry
node apps/server/scripts/timeline-follow-fixture.ts release /tmp/pr-22788-A-S-narrow-light-v2/95184-1 tool-start
node apps/server/scripts/timeline-follow-fixture.ts release /tmp/pr-22788-A-S-narrow-light-v2/95184-1 tool-finish
node apps/server/scripts/timeline-follow-fixture.ts release /tmp/pr-22788-A-S-narrow-light-v2/95184-1 prose
node apps/server/scripts/timeline-follow-fixture.ts release /tmp/pr-22788-A-S-narrow-light-v2/95184-1 resumed
```

The releases were separated by browser actions/measurements, not run in one batch. New thread `mcp:461fc243-2083-4c37-9599-a6b165591636`, project `9c0d2091-fc09-4bcf-86a2-4b175a9a784b`, environment `d46a1778-49f9-4c3b-b4ea-70045ec8bd92`; root `/tmp/pr-22788-A-S-narrow-light-v2`, fresh unique child `95184-1`. Existing `timeline_fixture` provider/model default, no provider config mutation. Fixture JSON SHA256 `c26f312ce0ea3f4c3fd33bf5e9b431de178535a49fe93318a9cdd51d35f35b87`.

Environment: machine freestyle, Linux6.1.102 x86_64, Node24.21.0, Chrome154.0.0.0 Linux, en-US/UTC, DPR2/zoom1, CSS1440×900, light, reducedMotion=false, document.fonts loaded, system16px/24px. Parent-owned web7647/server15687; no servers started/restarted. Normal pairing UI route completed without an exposed auth workaround; paired route redirected into the app without a Continue screen requiring interaction. All browser actions used own tab `tab_4_8fc5c28a-405b-4062-acc2-9cdff347bd89` explicitly. Main sidebar collapsed; thread details card geometry matches reference. Supported 24-hour client preference used; runtime clocks stayed real. Measurement script was retried after trimming required whitespace. Formatter installed after entry render in this rebuild; this does not affect the chosen detached capture, whose time regions are offscreen and whose entire image is identical.

Entry setup set scrollTop=1e9 once, before detaching. Native prose click720,400 then PageUp gave top4403/followfalse/pilltrue and Paragraph077 y77.28125. That stayed exact through tool-start, tool-finish and prose while height5993→7111. Actual Scroll to end button click gave top6263/followtrue/pillfalse; resumed chunk gave6424/7272 and Paragraph112 y59.7265625. All five .done files exist. These are phase-barrier chunks (100 paragraphs in one entry update,20 in one prose update,2 in resumed), not individually paced continuous122-paragraph streaming. Historical/manual real-provider footage is separate evidence, not claimed as this deterministic matched run.

Rebuilt [detached PNG](/tmp/pr-22788-audit-pass2/rebuilt-detached.png) versus accepted `L-wide-light-v3-detached-A.png`: **Diff0=0, DiffT=0**, intrinsic1280×800. Entry comparison: Diff0=13093, DiffT=217, bbox(301,653,979,800), confined to composer focus/caret/control rendering, not timeline position. Both deltas retained in [audit directory](/tmp/pr-22788-audit-pass2); [rebuild recording](/tmp/pr-22788-audit-pass2/rebuild.mp4). No after-detach alignment, masking, or forced scroll used.

What else changed is consistent with the final diff: no production styles, composer predicates, contracts, providers or native mobile code changed. Environment/thread IDs and home/origins differ. Server elapsed durations and cached timestamp formatting remain real. The base draft has an extra onboarding choice and a different placeholder layout from isolated environment state; the manifest must not describe that as a listener fix or anti-aliasing. Narrow PageUp collapses composer inset; paired detached phases match. Web evidence applies to the shared Electron renderer but does not test Electron native scrollbars. React Native, settings/palette, service/MCP/scheduler and transport behavior are outside this renderer-only change.

| FRICTION category | Happened | Prevention |
|---|---|---|
| Pairing-file parsing | CLI output contained warnings, origin text and QR before the actual pair URL; naive parsing caused invalid URL calls | Extract only the /pair URL privately; never print the file or token |
| Preview expression schema | Trailing newline rejected clock script | Trim script string before evaluate; inspect isError |
| Capture matching | Initial composer caret/focus/control pixels differed; detached capture was exactly equal | Match named paragraph and geometry; choose the affected detached checkpoint and report both deltas |
| Clock | Runtime freeze interfered with stream delivery; cached Intl formatters escaped late shim | Establish display-only deterministic clock before module initialization; preserve runtime scheduling and declare uncaptured cases |
| Input capability | Available preview scroll is programmatic; no native wheel/touch tools | Label synthetic/native input explicitly; do not upgrade a PageUp control into touch acceptance |
| Causal reproduction | Both settled builds pass; draft lifecycle does not hold the same hook through delayed hydration | Capture genuine held hydration or retain explicit harness-only limitation |
| Video indexing | Screenshot UTC cannot reliably become MediaRecorder seconds | Record explicit clip phase markers or verify ranges from decoded frames |
| Publication | Initial DNS/auth failure later reportedly resolved | Update stale publication metadata and verify final artifact links; no credential investigation by auditor |

Read-only source/forge audit: no source edits, commits, pushes, comments, watches, auth code changes, real database reads, or own server starts. Only isolated supported fixture seed/release and browser state, generated browser evidence, plus temporary audit artifacts. PR registered in thread; no watcher added. Disk first2.8GB free, remained2.8GB; no cleanup necessary. Work completed within60-minute budget; no budget exhaustion claimed.

VERDICT: INSUFFICIENT delayed-hydration actual-app L/S rows; native wheel/touch and I supplement; exact lifecycle counts/repetition; shared-clock matching; verified clip phase ranges
