This scenario runs the real T3 server, GitHub adapter, watch reactor, replay agent, and Chromium web client. Only GitHub's HTTP responses are synthetic. It makes no writes to GitHub.

Place merge-queue-removal.e2e.ts in scripts/scenarios in a current main checkout with the scenario runner installed. Start github-queue-fixture.mjs with QUEUE_PROOF_DIR set to a fresh scratch directory. In a separate config directory, write config.yml containing `http_unix_socket: <scratch directory>/github.sock`. Set GH_CONFIG_DIR to that config directory and GH_TOKEN to the synthetic string `queue-scenario-fixture`.

Add `inheritEnv: ["GH_CONFIG_DIR", "GH_TOKEN", "T3CODE_DEV_SEED"]` to each app command in scripts/e2e.config.ts, and set its scenario timeout to 900000. These changes configure the harness only, not either app commit.

Run with T3CODE_DEV_SEED=0:

    vp run scenarios:prove scripts/scenarios/merge-queue-removal.e2e.ts --base 39ab6a2d2ff5337c60f545c80262714c46510bad --head 2c72fcf0985e0b43346a3c3035995f4c60641dee --upload-command "ghdrop upload"

The fixture holds a still-open PR's head checks green after a single removal event with reason `manually removed`. There are no remarks, conflicts, head changes, or merge. Enqueue and removal occur between sweeps; only the removal timeline event and its fingerprint count change. The app runs its normal two-minute sweeps. The scenario records the checks-passed wake, removal sweep, and next unchanged sweep. The last assertions read the actual persisted wake message from the isolated database in read-only mode to check the removal reason, and use MCP to verify the watch stays active.

This does not prove real GitHub queue configuration, authenticated enqueue/dequeue, or a live failing merge-group workflow. It isolates GitHub's response boundary so both app commits see the same synthetic external events.

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