# Capture workflow
Captured 2026-11-10 for [#33038](https://git.cafe/pingdotgg/t3code/pull/33038).

Before: [577c524089](https://git.cafe/pingdotgg/t3code/commit/577c524089368176e00b331a8217b642fd6d06a5). After: [8e252d57cd](https://git.cafe/pingdotgg/t3code/commit/8e252d57cd524d2ed2beca9a55ca0b4a0252c21b). No tracked changes.

## Start and seed
Run each checkout with `T3CODE_DEV_SEED=0 vp run dev`, retain its process/session, and read actual server/web ports from dev-runner. Do not use live data. Run `bash seed.sh CHECKOUT before|after` once against each fresh server. This creates an empty synthetic git project, A/B with nine short Replay turns, and Two with exactly two. Authenticate the preview browser using its own server's startup pairing link; do not publish that link.

Browser: T3 Browser preview tools, Chrome 157 / Linux x86_64, no device emulation, DPR 2, visual viewport scale 1, fine pointer. CSS viewport 1440x900 except W02 1100x900; saved pixels 2880x1800 / 2200x1800. Default interface/root font 16px; W02 transitions through the app settings to 14px and Wide chat. No custom fonts. Browser tools expose color-scheme emulation but no reduced-motion emulation; prefers-reduced-motion was false. All videos use ordinary motion.

Evaluate browser-driver.js after each reload. It freezes browser Date/Date.now to 2026-11-10T09:00:00Z, waits for document.fonts.ready, blurs the active element, and exposes capture helpers. Performance.now remains real for the overlay timer. Server timestamps remain real and synthetic. capture.theme('light'|'dark') changes both app theme and appearance mode.

## Static scenes
F01: open A (9 turns), close right/details panels and main sidebar, comfortable chat width, bottom=0, hover the Next center (coordinates needed for disabled pointer-events). Timeline width 1440, lane 736, gutter 352, scrollHeight 1305, clientHeight 848, scrollTop 457. Capture light and dark separately. No measurement overlay in stills.
F06: navigate/reload Two to mount its actual list, rather than capturing a reused list with temporarily stale strip state. Close sidebar/details. Exactly two strips must both be in view; scrollHeight=clientHeight=848, scrollTop=0.
Wait for page loading to finish, fonts, and settled layout; snapshot twice at least 500ms apart. Compare full PNGs with ImageMagick AE=0. The preview tools do not provide a network-idle primitive; captures were taken after seeding/requests finished and resource loading settled, with only the dev persistent connections remaining. Every chosen still had AE=0 against its second frame. Run diffs.sh: zero-threshold RGB difference amplified 255x; DiffT8 is grayscale difference >8/255. Open all full frames and masks.

## F03 and F04
Keep A at 9 turns. Evaluate F03.js asynchronously and continuously record the whole browser. It positions the actual timeline scroll node at measured distances 0,1,2,30,40,120; dwells for refresh; clicks Next only if enabled; then records top and returns bottom. Log settled states separately from immediately-after-input states. The conditional before-side extra clicks at 0/1 extend its timestamps. F04 settled top: distance457, Previous disabled, Next enabled, strips1-7 in view.

## F11
Preparatory growth retakes left A with 11 synthetic turns, identically on both sides. B remains 9. Expand the sidebar's Working group so A can be selected. Select B, evaluate detach.js (real wheel listener + scrollTop positioning) and wait for remembered position atEnd=false, scrollTop157/distance300. Select A and leave its remembered bottom at scrollTop707/distance0. No scroll after each switch inside the recording. Evaluate F11.js and record continuously. Saved videos retain the first 16 seconds from the originals using ffmpeg stream copy, including all steps; only an accidental idle tail is omitted.

## F13
Starts with A at 11 turns, ordinary motion. Record capture.overlay() and mark followed start. Send `bash growth.sh CHECKOUT THREAD followed` through that checkout's CLI, wait for completion, mark settled. This is external-client input, with the browser observing real Replay streaming, not a DOM-inserted message.
Followed: scrollHeight1555->1680, scrollTop707->832, final distance0.
Evaluate detach.js; wait for distance300 and Next enabled before sending `bash growth.sh CHECKOUT THREAD detached`. Detached: scrollTop532 remains fixed, scrollHeight1680->1805, distance300->425. Mark final and stop. Intermediate size changes/smooth follow remain in the video and JSON; no claim of instantaneous disabled-state updates.

## W02
A now has 13 turns. Reset 16px/comfortable using updateClientSettings, resize to 1100x900, keep sidebar visible. Start recording/overlay. After 1.5s evaluate W02-settings.js, using the app's actual settings API: fontSizeInterface14, chatWidth wide. Viewport remains 1100x900 throughout. Measured timeline844/lane760 => g42, persistent=false, hit width30, fine pointer.
Move pointer away: rail opacity0. Hover Next at its measured center (270,534.75): opacity1. At bottom before Next enabled, after disabled. Dispatch wheel deltaY -120 and position distance120; hover Next, both enabled. Focus Next, move pointer away, rail remains visible through focus. Press Enter with preview_act; it returns to distance0. After disables Next and loses its focus ring; before retains enabled focus ring. No CSS override was used to manufacture the gutter.

## Guest caller
guest-probe.js uses actual serverEnvironment commands and appAtomRegistry. It temporarily enables guest sharing, attempts createGuestShare on synthetic A, returns only the error (no credentials), and resets guest sharing false. Both fail GuestShareCreateError(connect_unavailable). GuestShareService requires an active managed T3 Connect connector hostname both to create and authorize an invite; the isolated servers have none. No valid /guest invite can be redeemed in these fresh VM environments without setting up Connect. C01 is UNVERIFIED. No error-page or component-harness capture is substituted.

## Review and cleanup
Inspected each selected still and diff; reviewed the recorded sequences via full-surface extracted contact sheets and critical end frames. Rejected early stale-strip and non-detached trials were not selected. No tests were requested or run, no paid provider turns, no PR edit, no live database seed. Publish only selected synthetic artifacts and these scripts; never server pairing logs/settings/database. Stop owned servers, close owned preview tabs, remove the temporary before worktree.

AI-assisted; verified with the tests and tools listed above.

