# Citation evidence reproduction

Accepted evidence: C0/W1/W2 in recording A and M1/M2 in native frame C. W3/W4 remain unverified: repeated draft-reload retakes retained a Syncing messages indicator, and one video export retained a translucent popover frame. No rejected narrow frame is represented as accepted evidence.

All work is synthetic and confined to the two isolated worktrees. No live T3 database was read or copied. No tracked file was changed. The base worktree was detached at 2359643cffa6ba9ee84d6f2694b935de54a8013e and installed with vp install. Head was e3d7260bc6e260051d705492bf64c867bba4d976.

## Seed

1. Create the base checkout with the exact worktree command in the task. Start each checkout once with T3CODE_DEV_SEED=0 so its own migrations create a fresh .t3/userdata/statev2.sqlite; stop both captured process groups and confirm their ports are closed.
2. Give both isolated .t3/userdata/environment-id files the same synthetic UUID: 321dbe4b-8608-46c2-a0f4-d53c9d1c5980. This is not a credential.
3. Put the supplied fixtures.json beside seed.mjs. Run `node seed.mjs /home/ubuntu/wt/pr-28084 /tmp/lead-28084-r1/evidence-capture 321dbe4b-8608-46c2-a0f4-d53c9d1c5980`, then the same arguments with seed-mobile.mjs. Both write schema-checked events through the actual EventSink persistence and projection layers. The first driver creates two assistant sources plus two user messages. The second adds the separate static Mobile citation proof thread.
4. With both servers stopped, checkpoint and close the isolated SQLite database and copy that database to base. Never copy from ~/.t3. restore-state.mjs records the exact checkpoint/copy procedure; its final-seed-state.sqlite is deliberately not uploaded because SQLite auth tables are unrelated to this proof.
5. Start each dev server with T3CODE_DEV_SEED=0. The accepted A recording used start-servers.mjs and freeze-clock.mjs, fixing browser/server Date at 2026-11-03T01:00:00Z. Later *running-timers* and *live-timers* scripts are rejected narrow-capture diagnostics, not accepted A/C configuration. Use a fresh browser profile for a restored database: old client caches can retain a higher sequence.

## Web recording A

Actual T3 web app, Chromium 156 on Linux, no device emulation, 1440x900 CSS viewport, DPR 2, dark; app interface font 16px, prompt 14px, zoom 1. Preview stills are full-surface resamples to 1280x800; the MP4 is 2880x1800. Reduced-motion emulation is unavailable in this preview browser. Caret painting is disabled by web-setup.js equally on both sides. Sidebar and detail panel are closed.

Pair with each isolated server, navigate to the seeded Animal containers thread, choose Replay (dev) / Multi turn, close the picker, and await the rendered assistant source and loaded fonts. This bundled fixture provider only supplies a deterministic response to actual Send; this is not a live Pi-provider smoke test.

Evaluate web-setup.js and web-driver.js in the tab. Assign `proof.commentedMarker` from the emitted seed fixture's commented.marker. Start recording, then schedule `proof.runA()` without awaiting its 34-second promise in the browser tool. The driver logs monotonic interaction times:

- 0s select the 512-character source ID; 1s Cite; 4s Cancel.
- 5s select the 631-character source ID; 6s Cite; 10s enter comment; 12s Save.
- 13s paste the identical serialized commented fixture on both sides. Base has no comment editor, so this lets the real Send compare identical input bytes. Head's editor Save is exercised before this replacement.
- 15s actual Send; 25s open the last sent citation if recognized; 29s Go to source if available; hold to 34s.

Take C0 at 2.4s, W1 at 8s, and W2 at 26.5s. Each accepted PNG has a corresponding *-check.png taken 500ms earlier with pixel difference zero. No animations, overlays, loading state, or screenshot crops were introduced to the accepted frames. Review A contact sheets and video frames, then review both full PNGs and both diff images per row.

## Native frame C

Prepare each checkout with `vp run mobile:install android --prepare`. Both returned native fingerprint 541b3da3e5f7b2ad504aaa6303bdcea8d7194d22, so the same cached native client was installed with mobile:install; the Metro JavaScript bundle changed between the two actual checkouts. Lease Pixel 9 through device-pool, session proof-28084. Android 16/API 36, sdk_gphone64_x86_64, physical screenshots 1080x2424, dark, animations off, text-size medium (reported Android font_scale 0.94). Logical viewport and DPR were not exposed by the capture output and were not measured; do not infer them from the matrix's suggested 412x915.

Run base Metro on all interfaces at port 8081, install using `vp run mobile:install android --session proof-28084 --metro http://fs-19.tail131df4.ts.net:8081`, launch the Expo development-client URL in native-driver.sh, pair through pair-mobile.sh, and open Mobile citation proof. Capture two full screenshots 500ms apart with --normalize-status-bar; accept only AE=0. Stop the exact base Metro PID, start head Metro at the same address, relaunch the same native client, and repeat on the same thread/device/settings. Both native bundles used the same isolated head backend so history was identical. The displayed message dates are fixed at Jan 10 noon; status-bar time is normalized to 9:41. The native JavaScript Date object was not mocked.

The existing Model unavailable composer notice is the same on both sides and comes from the synthetic thread's Pi model selection. It does not affect static message rendering. No mobile Cite/send capability is claimed. Close the lease after the pair.

## Artifacts and limits

generate-artifacts.py and diff.py build full-surface sheets. Diff0 highlights every nonzero RGB-channel difference at full magenta intensity; DiffT uses maximum absolute RGB-channel difference >16/255. No threshold-based claim of nothing else changed is made.

recording-events.json contains the accepted A interaction logs. legacy-browser-state.json preserves the original raw draft that base saved through the actual composer before reload. web-driver-b.js documents the attempted narrow add/clear/save/reload/Cancel/send sequence; its existence is not a replacement for missing accepted W3/W4 captures.

H1/A1/N1/C1 are supplementary, parser-verified, not captured, using the supplied auditor matrix/diagnostics rather than a new visual claim. No PR body, commit, push, or merge was performed. The temporary base checkout, own servers/Metro, browser tabs, and device lease are cleaned up after upload.
