# Visual proof drivers

These drivers use fresh synthetic projects and the real server, orchestration, adapters, and web client. No production state or paid agent is used.

Use a checkout of current main with the scenario runner installed (`vp i`). Place `stop-pending.e2e.ts` and `stop-compact.e2e.ts` in `scripts/scenarios/`. The shared `t3.ts` and `shell.ts` helpers already ship there.

The core proof uses the normal scenario startup. Keep only the web target in `scripts/e2e.config.ts`, then run `vp run scenarios:prove scripts/scenarios/stop-pending.e2e.ts` with the desired base and head options. The driver replaces the replay fixture temporarily with an approval containing relative paths, then restores it. It holds only outgoing `thread.stop` commands to expose acknowledgement and the ten-second retry state; it releases them before checking repeated clicks. Question prompts use the built-in question replay.

For the compact-history supplement, place `synthetic-agent.cjs` next to `start-app.ts` and temporarily replace `start-app.ts` with `compact-start-app.ts`. Run the compact scenario against each app commit with the same proof runner. Restore the normal startup afterwards. This startup enables only a local synthetic protocol executable, which reports synthetic usage through the real Claude adapter. The browser clock is offset to make the history stale without waiting seventy minutes. This verifies the compact-controls UI; it does not measure a live provider's cancellation latency.

Still images crop the composer region after two captures 500 ms apart have identical pixels in that region. Reduced motion is enabled and incidental CSS animations are paused for still stability. Captions outside the app crop report the button's captured accessible name and disabled flag. `control-states.json` contains those observations. The recordings retain the full viewport and trim startup loading only.

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