# Reproduce refreshed A1

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

This supplements the original reproduce.md for A1 only. Use the updated all-scripts.zip, unpacked to `/tmp/lead-33396-r1/evidence-capture-2/scripts`. Keep all outputs in `/tmp/lead-33396-r1/evidence-capture-2`. Every run gets a new timestamped capture directory. Do not use live state, migrate or copy a database, or set VITE_HTTP_URL/VITE_WS_URL. No provider turn is started.

1. Use after checkout `/home/ubuntu/wt/pr-33396` at `0263c024fb575767d8affba5af2aa19c35a2af4c`. Create before with `git -C /home/ubuntu/t3code worktree add --detach /home/ubuntu/wt/pr-33396-before 73fb49d0b3a61bff74aebc362fc6c17d6c0d39be`. Run `vp install` in before. Build each real app with `vp run --filter @t3tools/desktop build`. From each checkout's apps/desktop, run `node node_modules/electron/install.js` once.
2. Run `python3 scripts/seed-files.py` from the scratch root. This creates exactly the same 24-file synthetic project for both revisions. Run `python3 scripts/control.py dev`. It starts each checkout's own dev server with T3CODE_DEV_SEED=0 and explicit scratch homes. Read actual web ports from the private `dev-before.log` and `dev-after.log` dev-runner lines. This run used before 8057, after 8725. Never upload startup logs containing credentials.
3. Run `python3 scripts/control.py run before 8057` and `python3 scripts/control.py run after 8725`, substituting actual web ports. Each invocation creates a NEW timestamped T3 home/database and Electron profile/config directory; it starts the real built app under headless-desktop with `--no-sandbox --disable-gpu --force-device-scale-factor=1`. Debug ports are before 9331, after 9332; isolated Electron servers are before 17761, after 17762. Stop earlier owned runs before reusing these ports. The process registry records every spawned root PID.
4. Run `node scripts/prepare-desktop.mjs before` and `node scripts/prepare-desktop.mjs after`. The helper completes onboarding without imports, creates the project and draft through the real UI, and seeds the shipped version-14 right-panel envelope with 11 files. It explicitly rehydrates the production panel store so a pending in-memory persist cannot overwrite that envelope. It waits for the panel after reload. No replacement component or app API is installed.
5. Run `python3 scripts/resize-desktop.py before 1280 800` and `python3 scripts/resize-desktop.py after 1280 800`. The helper follows only each captured Electron process tree to obtain DISPLAY/XAUTHORITY and resizes the actual app window. Verify its returned window id; this run used 2097155 on both isolated X displays. If yours differs, substitute it in capture-desktop.mjs. No device/viewport emulation is used.
6. Run `node scripts/capture-desktop.mjs before A1` then `node scripts/capture-desktop.mjs after A1`. The SAME driver navigates Settings -> draft to establish back history, reloads, awaits fonts/network/no loaders and the actual `fixture01` code token through the shadow-aware locator. Once the active-file breadcrumb exists, it finds every scrollable descendant/ancestor used by that breadcrumb, including the overflow-hidden/truncated label, disables smooth scrolling/anchoring there, and holds their offsets at (0,0). A capture-phase scroll listener re-pins only that set. The tab-strip viewport is explicitly excluded and remains free to process native input. Geometry/offsets are recorded before and after input. A1's tab strip starts at 150; one SYNTHETIC CDP Input.synthesizeScrollGesture moves left 600px with mouse source, speed800, preventFling=true. There is no physical macOS momentum claim. Recordings keep the visible steps/input/revision overlay. It is hidden only for the final stills. The driver takes two full-window screenshots 500ms apart and fails if any pixel differs.
7. Stop the two Electron runs with `python3 scripts/control.py stop <captured-before-pid> <captured-after-pid>`. Repeat steps3–6 to obtain a SECOND fresh database/profile for each side. Do not reuse a home or profile. `control.py run` always creates fresh timestamped state.
8. Run `python3 scripts/process-a1.py`. It uses the last two successful A1 event directories per side, asserts start/max/final route, zero pinned offsets and within-run pixel identity, and produces full-resolution before/after/repeat stills, videos, Diff0 (any nonzero max RGB -> white), DiffT (max RGB >8 -> white), repeatability masks/sheets and a JSON manifest. It also decodes EVERY video frame and places every decoded frame exactly once in labelled 30-frame contact sheets; full-resolution start/gesture/release/end images supplement them. Inspect all frames/sheets/stills before uploading.
9. Upload only synthetic publication assets, reviewed contact sheets, scripts and this recipe with `ghdrop upload -m`. Never upload runtime profiles/databases, startup logs, tokens or operational metadata. Stop all retained roots with `python3 scripts/control.py stop` after captures. Remove only the before worktree with `git -C /home/ubuntu/t3code worktree remove --force /home/ubuntu/wt/pr-33396-before`. After uploading, remove this scratch root by its literal absolute path. Leave the after checkout in place.

Environment: Linux x86_64; Electron44.10.1/Chromium152.0.7977.169; Xvfb1920x1080; real window/viewport1280x800; dark; DPR1; no emulation; font100%/16px; reduced motion; fonts settled; JavaScript Date frozen at 2026-11-10 00:00UTC. ImageMagick full-window screenshots; ffmpeg x11grab30fps. Composer buttons are identically hidden before recording to exclude private attribution; the gesture target is visible and unchanged.

Observed results: before fresh-run final frames differ by0 pixels. After differs by8 pixels at zero threshold, 0 above8/255, max5/255, confined to control raster edges at x1194–1260,y40–49. The breadcrumb is pixel-identical. Every within-run500ms pair is exactly identical. Before returns to General; after stays in the draft at scrollLeft0. Cross-revision masks contain699120 (>0) and306510 (>8) changed pixels, explained by the intended history/Settings destination. These recordings do not establish universal indicator clearance; prior synthetic post-end input observations remain qualified in the evidence index.
