# Reproducing the captures

The raw capture driver is `driver-executed.mjs`, paired with `launch.py`, `observe-http.cjs`, `watch-timeout.mjs`, `readback.mjs`, and `stop.py`. All source is synthetic. The launcher creates a new UTC-stamped run directory, random private dev token, separate empty T3 homes and synthetic projects for both sides, and records the PIDs it starts. Do not publish generated `private-token.txt`, startup pairing URLs, or unfiltered server startup logs.

1. Create the detached base checkout at the exact SHA recorded in the index and install its dependencies with `vp install` from that checkout. Head dependencies must also be installed.
2. Run `python3 launch.py` from the requested scratch location. The script pins T3 ports 41801/41802 and OpenCode ports 42801/42802; read actual dev-runner ports from the private logs. Both T3 servers run `vp run dev --home-dir <fresh-home> --port <port>` with `T3CODE_DEV_SEED=0`; each OpenCode instance runs `opencode serve` from its own synthetic project.
3. Before the long capture, preflight the selected listed model. The supplied successful preflight used `openai/gpt-6-luna`, with the routing in `provider-routing-sanitized.json`. `anthropic/claude-haiku-4-5` was listed but failed at the hub. `preflight.mjs` is pinned to the initial pilot's dedicated after OpenCode server and must be pointed at the current isolated instance for reuse.
4. Run the same driver once per side in parallel: `node driver-executed.mjs <checkout> <run-dir> <before|after> <t3-port> <opencode-port>`. It uses the checkout's actual Effect RPC group and schemas, enables the OpenCode instance via `server.updateSettings`, registers the project via `projects.mutate`, creates a thread, subscribes, and dispatches `/slow 330` with `start_immediately`. The command fixture is `slow.md`. Both captures used full-access mode.
5. Start `watch-timeout.mjs` before the request timeout; set its run path to the current run. It watches the diagnostic request-error log, reads native status, and invokes `readback.mjs`. The preload observer only subscribes to undici diagnostics; it changes no network settings or production source.
6. The executed driver initially accepted any terminal-shaped stream status. This produced an early head snapshot still marked running immediately after native idle. Keep that raw snapshot, and invoke `readback.mjs` independently after the actual persisted run terminal update. The supplied final readback is completed. The revised driver in `diagnostic-experiments.tar.gz` tightens that predicate to `run.updated`; it was not the driver used for M1. Do not substitute it when auditing exactly what ran.
7. Stop all processes through their captured PIDs/process groups with `stop.py`. None of the homes were sourced from the live T3 database.

## Adapter harnesses

Temporarily place the supplied `evidence-capture.test.ts` and `optional-controls.test.ts` in the checkout's `packages/provider-opencode/src/server/` as `evidence-capture.test.ts` and `evidence-controls.test.ts`. The same files run on both revisions. From `packages/provider-opencode`, run:

```sh
EVIDENCE_HARNESS_LOG=<new-timestamped-output.jsonl> vp test run --config ../../vite.config.ts --dir . src/server/evidence-capture.test.ts
EVIDENCE_HARNESS_LOG=<another-new-timestamped-output.jsonl> vp test run --config ../../vite.config.ts --dir . src/server/evidence-controls.test.ts
```

The JSONL files are the recordings; the accompanying Vitest runner logs only show harness completion. All SDK endpoints and native events are mocked, and the model identifier in those payloads is not a model call. The actual adapter at the named revision and Effect's real MixedScheduler execute the logic. M3 uses observer wrappers that delegate to the original Deferred operations, rejecting a normal native Promise at the receipt-success assignment. Budgets 8 and 12 force request-error guard evaluation before submitPrompt/caller settlement; default-budget runs are also recorded. No production code was modified.

Upload the sources and recordings before removing the two temporary files by their literal absolute paths. Check both worktrees are clean; remove only the temporary base checkout.
