# Stop during provider startup: reproduction driver

Real web app, Chromium, 1280×800, light theme, a fresh isolated database and a synthetic git project per side. Replay (dev) uses the public showcase recording. No unit tests serve as evidence.

Commits: [base 1a1f9ac18e](https://github.com/pingdotgg/t3code/commit/1a1f9ac18ed7cfa246207884aea93e3ce06851ce), [fix d24268c7dd](https://github.com/pingdotgg/t3code/commit/d24268c7dd292789e9d1d81e705aec791cf30118).

The scenario support files come from [8024e50c6f](https://github.com/pingdotgg/t3code/commit/8024e50c6fef20525f5360448cede149fbda460f): scripts/e2e.config.ts and scripts/scenarios/{t3,shell,start-app}.ts. Keep only the web target in the config. Install dependencies in both app checkouts and the harness checkout with `vp i`.

Before starting either app, run `python3 install-race-command.py <base-checkout> <head-checkout>`. This adds only the temporary CLI command from the triage reproduction. Install it before startup: the development watcher otherwise restarts the server. The server lifecycle and provider implementation are unchanged.

Put stop-during-provider-start.e2e.ts beside t3.ts. From the harness scripts directory, run this once per app checkout:

```sh
T3CODE_DEV_SEED=0 T3_SCENARIO_APP_DIR="$APP_CHECKOUT" EVIDENCE_OUTPUT_DIR="$OUTPUT_DIR" vp exec e2e run scenarios/stop-during-provider-start.e2e.ts --target web
```

Create OUTPUT_DIR first. The driver creates three fresh threads. Each warms up with Start and waits for completion, sends a second message and immediately interrupts it through the public MCP tools, then sends and waits for a follow-up. It captures the resulting UI and records the browser. Workspace paths are redacted in the browser; server behavior is unaffected. The browser reload after the follow-up refreshes the capture and does not affect reproduction.

The final base run failed all three follow-ups with “previous turn is still running”; the final head run completed all three. observations.json contains the synthetic CLI results. Videos begin 17 seconds into each original recording, after pairing and initial warm-up, and retain all three race attempts. The first race shows the difference in the opening seconds. No pairing screen or credential is included.

The automated two-commit runner was attempted twice. A sidebar text locator failed first; after correcting it to the accessible row button, CLI instrumentation triggered a watched-file restart during the head setup. The final comparison runs the same browser driver separately on both commits with the instrumentation installed before server startup.

Not exercised: rollback, a real Claude process, desktop shell, mobile, or both internal effect interleavings independently.

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