Build each commit in its own checkout, after vp i: T3CODE_DEV_SEED=0 vp run dist:desktop:artifact --platform linux --target dir --arch x64 --mock-updates --mock-update-server-port 19441 --output-dir "$BUILD_OUTPUT" Run the identical uploaded drive.mjs for each packaged build: WORKTREE="$CHECKOUT" EVIDENCE_ROOT="$OUTPUT" SIDE=base APP_EXE="$BUILD_OUTPUT/linux-unpacked/t3code" headless-desktop node drive.mjs Use SIDE=head for the head build. Paths above are caller-supplied absolute paths. The driver serves a local 9.9.9 update feed and sends 64 KiB of a claimed 10 MiB download before closing the socket. The packaged app uses its real Electron updater and IPC; updater state and UI text are never injected. APPIMAGE enables the AppImage updater in the unpacked production build; no installation is attempted. The driver waits for the real startup update check, opts out of importing provider history, clicks Start, opens Settings > About, downloads, dismisses the error toast, and hovers Download. It then closes Settings and starts another failed download from the sidebar pill before hovering it. Screenshots require two identical captures 500 ms apart. Both sides use 1280x900, light theme, Linux x64, and fresh isolated databases. The video masks only the unrelated local CLI path. Published Settings stills crop the full screenshot to 1000x250+280+40; sidebar stills are uncropped.