Proof audit, pass 1: [#32866](https://git.cafe/pingdotgg/t3code/pull/32866) ([GitHub mirror](https://github.com/pingdotgg/t3code/pull/32866)).

1. **One fixture is missing: R33, late-started ordinary work and transient busy.** All 32 existing rows are supported by the linked transcripts, the original PR-body transcript, or the named tests inspected and run at head. The existing matrix's MISSING labels predate its 21 newer row transcripts and should be replaced by the statuses below.
2. **R33 needs a proof row, not only prose.** The request signal expires at delivery + timeoutMs in [handleRequest](https://github.com/pingdotgg/t3code/blob/4052b2f7d093767c3652028720153dc823aa084b/apps/server/src/preview/ServerBrowser.ts#L2327). [SessionControl](https://github.com/pingdotgg/t3code/blob/4052b2f7d093767c3652028720153dc823aa084b/apps/server/src/preview/SessionControl.ts#L107) lets an ordinary queued action start while that signal is still live and retains its slot afterward; [overdue](https://github.com/pingdotgg/t3code/blob/4052b2f7d093767c3652028720153dc823aa084b/apps/server/src/preview/SessionControl.ts#L92) becomes true when the signal aborts. An operation such as [evaluate](https://github.com/pingdotgg/t3code/blob/4052b2f7d093767c3652028720153dc823aa084b/apps/server/src/preview/ServerBrowserPage.ts#L889) or [waitFor](https://github.com/pingdotgg/t3code/blob/4052b2f7d093767c3652028720153dc823aa084b/apps/server/src/preview/ServerBrowserPage.ts#L948) starts its own operation budget when it actually runs. A follow-up can therefore receive busy even though the normally timed operation will settle later. Existing proof either never starts queued work (R07/R08), starts the timed action immediately (R09/R11), or exercises the special expired-stop exception (R17). Add a named deterministic server test or timestamped transcript that shows late start, request expiry, fast busy, no overlapping action, settlement, and a successful fresh call. Also amend the PR body's “nothing agent-visible” claim to disclose this temporary state. This is a missing-proof finding, not a claim that a permanently stuck tab was reproduced.
3. **No existing row needs recapture at head.** Capture after = [b088b88d19](https://github.com/pingdotgg/t3code/commit/b088b88d19fb0edc43f754da2e1d199bda70d6d8), before = [fa2f4ff2a2](https://github.com/pingdotgg/t3code/commit/fa2f4ff2a2bac5ac92e07749f6b83b0003d642a0). Audited head = [4052b2f7d0](https://github.com/pingdotgg/t3code/commit/4052b2f7d093767c3652028720153dc823aa084b), merge-base = [4c924ff4e6](https://github.com/pingdotgg/t3code/commit/4c924ff4e6d0828e0a5810336ec7d7827d752645). A direct capture-to-head diff under apps/server/src/preview and packages/contracts contains only ServerBrowser.test.ts changes: milestone typing/assertion and expired queued recording-stop coverage. ServerBrowser.ts, SessionControl.ts, the contracts file, broker, and preview MCP handlers are byte-identical. The final main merge changes only DesktopBrowserHost and its test. Earlier upstream merges also include unrelated mobile, orchestration, provider, and VCS work; those are not additional preview production changes. R24's scratch direct-CDP fixture does not exercise the changed desktop shell/bootstrap transport. Keep its disclosed scope limitation; its server/native zoom proof remains applicable.
4. **The transcripts were inspected, not merely downloaded.** Read before/after steps, exact tool errors, timing, host identities, page/CDP/encoder milestones, mirror call order, and warnings for all 21 supplied row transcripts. Identical shared-fixture records were cross-checked across rows. R02's original PR-body transcript is sufficient for message content; timing and retained-host claims are credited to the deterministic test and newer captures, not its truncated status excerpts. The contract's new busy literal and recovery message are exercised through broker-decoded errors in R02/R18 and the eval harness's real contracts-message replay test.
5. **Verification at the requested head:** `vp test run apps/server/src/preview/ServerBrowser.test.ts apps/server/src/preview/SessionControl.test.ts apps/server/src/mcp/PreviewAutomationBroker.test.ts` passed 3 files / 109 tests. `vp test run evals/mcp-tool-use/run.test.ts` passed 1 file / 487 tests; these are harness/grader unit tests and invoke no live provider. Existing live-model eval results are reported by the PR; this audit did not rerun them. No server was started, no checkout created, and no worktree source, PR body, comment, or branch was changed. Disk availability was 107 GB at start and remained above the 5 GB floor.

“Affected” below means the behavior is directly touched by the fix or its changed deadline/mirror scheduling. “No” marks unchanged control/cleanup guards checked as regression coverage. A single named test can cover several rows. All proof kinds are transcript or named-test; no UI render path changed and no recording of pixels is needed.

| Row id | Behaviour | Fixture / how seeded | Affected | Kind | Status | Action needed |
| --- | --- | --- | --- | --- | --- | --- |
| R01 | Hung request answers before host eviction | Owned A; hold dark appearance; deterministic broker/server timeout test | Yes | named-test | OK: timeout then status succeeds on retained host | None |
| R02 | Busy mutations; contracts busy value and recovery message | Original PR-body click/resize transcript; broker-decoded busy assertion in stuck-stop test | Yes | transcript | OK: exact recovery guidance; busy survives contracts/broker decoding | None |
| [R03](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c1c6b95698bbd167/R03.md) | Owning-agent snapshot/waitFor refusal | C1: own A; held appearance; parallel owner reads, then status | Yes | transcript | OK: busy in milliseconds; before waits/disconnects; status survives | None |
| [R04](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a74b586b5837c450/R04.md) | Explicit reuse of busy tab | C1: preview_open(tabId=A,reuseExistingTab=true) | Yes | transcript | OK: immediate busy; before open queues and disconnects | None |
| [R05](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ac9ed70aa7d6b282/R05.md) | New-tab and second-thread recovery | C1: fresh B in owner session; fresh C from second synthetic thread; evaluate both | Yes | transcript | OK: both actionable; after retains initial connection; before reconnects | None |
| [R06](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/398b48697dc13fcd/R06.md) | Close bypass and recording cleanup | C1: record A before stall; close A; list; evaluate B; encoder/page/context milestones | No | transcript | OK: A removed and resources close without awaiting held queue | None |
| R07 | Queued calls receive their own deadline answer | Stalled A; queue click before A expires; named queued-calls test | Yes | named-test | OK: both timeout; subsequent dialog calls reach live host | None |
| R08 | Ordinary work expired before dequeue never runs | Long-budget predecessor; short click; release after click expiry; locator execution assertion | Yes | named-test | OK: click times out and locator never runs | None |
| [R09](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bd5c9609d38634df/R09.md) | Serialization retained; busy clears on fulfillment/rejection | C2: held A; refuse read; enqueue manager light; resolve and reject in separate fixtures | Yes | transcript | OK: light starts after original settles; fresh evaluate succeeds both ways | None |
| R10 | Own failure wins inside answer margin | Named late-failure test: reject Playwright at T+100 ms | Yes | named-test | OK: execution error wins over host timeout | None |
| [R11](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4b49f4003be1af6b/R11.md) | Own success wins inside answer margin | C2: dark emulateMedia delay 15100 ms for 15000 ms request | Yes | transcript | OK: successful result at about T+110 ms; status/evaluate succeed | None |
| [R12](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/884b61760de7471c/R12.md) | Final cutoff ignores later settlement | C2: delay 15750 ms; R09 also supplies a late rejection | Yes | transcript | OK: before succeeds; after times out at T+505 ms, then settles and remains usable | None |
| R13 | Dialog precedes busy for actionable owner | Named queued-calls/dialog test; emit dialog after timeout; click and active-recording stop | Yes | named-test | OK: both return reason=dialogPending | None |
| [R14](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/37572e726c6747c9/R14.md) | Real overdue dialog recovery | C3: record; real confirm blocks appearance; status/open/stop; release viewer; accept; evaluate | Yes | transcript | OK: confirm visible; stop gets dialogPending; accept unblocks original; fresh work succeeds | None |
| [R15](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/da85b929868826ca/R15.md) | Ownership and human-control precedence | C1/C3: second session; viewer take/release while held, with/without confirm | No | transcript | OK: foreign mutation stays agentMismatch; owner under viewer stays humanControl | None |
| [R16](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/267b999c5892182e/R16.md) | Observer reads bypass foreign owner queue | C1/C3: foreign snapshot/waitFor; human reservation; repeat with pending confirm | No | transcript | OK: foreign reads succeed while held; dialog blocks reads; owner under human gets humanControl | None |
| [R17](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c17469d144403b1b/R17.md) | Expired recording stop still executes | C4: record; queue stop before busy; hold beyond 120 s; release; inspect encoder; retry | Yes | transcript | OK: after timeout at 120.5 s, stop starts at 122 s and encoder closes; retry finds none | None; head also adds a deterministic expired-stop assertion |
| R18 | Started recording stop hangs and becomes busy | Named stuck-stop test: active recording; CDP detach never resolves; follow-up click/status | Yes | named-test | OK: stop timeout followed by reason=busy; host remains reachable | None |
| [R19](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/537063e5d2d9f323/R19.md) | Stop requested after another action becomes busy | C1 recording plus stalled appearance; C3 dialog and viewer variants | Yes | transcript | OK: busy without dialog; dialogPending with confirm; human control still wins | None |
| R20 | Closed system() returns rejected promise | Closed SessionControl; direct call and rejection assertions | Yes | named-test | OK: no synchronous throw; returned promise rejects closed | None |
| R21 | Closed/stale queued work stays rejected | SessionControl close and takeover/release generation tests | No | named-test | OK: queued/new actions never revive after close or control changes | None |
| R22 | Color mirror progresses on another tab | Named cross-tab setting test: A dark action hangs; manager adjusts B dark | Yes | named-test | OK: B emulateMedia dark milestone resolves while A stays stuck | None |
| [R23](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ac00ed069d989e0a/R23.md) | Viewport mirror; equal-setting control | C5: A held; manager resize B to 800x600 then repeat; page dimensions and native calls | Yes | transcript | OK: B becomes 800x600 before A release; equal setting adds no viewport call | None |
| [R24](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3695cb2198bfc20f/R24.md) | Zoom mirror; equal zoom; desktop zoom skip | C5 headless 1.25 zoom; C24native real Electron WebContents via scratch CDP binding | Yes | transcript | OK: headless 640x480 before release; native zoom stays 1.25 without backend override | None; full desktop shell is outside this fixture |
| [R25](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c2042bd4408f2b73/R25.md) | Hard reload mirror and false/absent control | C5: synthetic counter page; hardReload true then ordinary/false adjustments | Yes | transcript | OK: Page.reload(ignoreCache=true) and page reload before A release; no extra false reload | None |
| [R26](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c70e2def34902794/R26.md) | Cookie clear mirror and clear-before-reload order | C5: seed synthetic cookie on B; clear=cookies plus hardReload | Yes | transcript | OK: cookie becomes empty before A release; CDP clear completes before reload | None |
| [R27](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ff64ff94cf7e6e44/R27.md) | Cache clear mirror and no-clear control | C5: fixture page fetches cacheable /asset; clear=cache; ordinary adjustment | Yes | transcript | OK: clearBrowserCache runs before A release; no extra clear on control | None; proves command dispatch, not a separate browser cache implementation |
| [R28](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/349755ede8c5cfec/R28.md) | Same-tab FIFO while other tabs proceed | C5: hold B system dark; queue viewport/light+zoom/cookies+reload; resize C; release B | Yes | transcript | OK: C progresses before B settles; B native calls preserve order without overlap | None |
| [R29](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2c1691f9c4777215/R29.md) | Manager open/close pass a stalled resized job | C5: keep A held; RPC open D and close C; inspect tab.created/page.closed | Yes | transcript | OK: actual D creation and C close precede A release after fix; before waits | None |
| [R30](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/398ec6305773e11d/R30.md) | Asynchronous mirror failure logs and stream continues | C5: one injected dark rendering failure on B; light B; resize D; status/evaluate | Yes | transcript | OK: warning captured; same/other-tab updates execute afterward on both revisions | None |
| [R31](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fd69b466c07380be/R31.md) | Metadata read keeps no-grace timeout exception | C2meta: post-evaluate status delayed 800 ms against internal 500 ms budget | Yes | transcript | OK: metadata fallback at 500 ms; evaluate succeeds; late status and fresh calls retain connection | None |
| R32 | Ambiguous tab and no-recording guards | Named ownership/explicit-target test: same session owns A/B; omitted/explicit stop and evaluate | No | named-test | OK: tabRequired remains distinct from RecordingNotActive; explicit own action succeeds | None |
| R33 | Late-started ordinary action causes transient busy | Queue a timed operation behind finite predecessor; start before request expiry; cross delivery deadline while operation timer still runs; follow up; settle | Yes | named-test | MISSING: none of R07/R08/R09/R11/R17 starts ordinary queued work late and probes this window | Add deterministic named test or new before/after transcript at head; disclose transient busy in PR body |

Named-test mapping (exact names):

- R01/R02: “a stuck agent action times out on the server and later calls on its tab fail fast”.
- R07/R13: “calls queued behind a stuck agent action time out on their own, and dialogs come first”.
- R08 and extra head coverage for R17: “a queued action whose timeout passes while it waits never runs”.
- R10: “an action that fails just after its timeout still reports its own failure”.
- R18 and busy reason decoding: “a recording stop that never finishes leaves its tab busy”.
- R20: “rejects system work on a closed tab instead of throwing”.
- R21: “closes after running work finishes and never runs queued or new actions”; “drains running work before takeover and cancels previously queued agent actions”; “does not revive stale actions when takeover is released before running work finishes”.
- R22: “a tab stuck in an agent action does not hold back setting changes for other tabs”.
- R32: “enforces provider ownership and explicit targets when a session has multiple tabs”.
- Contracts/eval replay: “replays an earlier preview error as T3's error result, with its contracts message”; grader checks: “grades busy-tab recovery by the tab the agent acts on, not just the tool”.

Replay guidance: no repeat capture is required for R01–R32. The existing driver groups are C1 (R03–R06/R15/R16/R19), C2 (R09/R11/R12), C2meta (R31), C3 (R14 and dialog variants), C4 (R17), C5 (R23–R30), and C24native (R24 native branch). The downloaded driver hardcodes its old scratch root, capture worktree names, ports, and provenance SHA. Adapt those first, use a separate isolated checkout/home and fresh synthetic auth, apply setup.py, hang.py, foreign.py, extra-instrumentation.py (plus desktop-attach.py for native), then run `node <scratch>/driver.mjs after seed` and `node <scratch>/driver.mjs after <group>`. The driver creates a fresh timestamped run directory. C4 alone holds a real 120-second public stop budget; the other groups are cheaper. Existing groups do not cover R33; extending a deterministic gated server test is the smallest way to add it. Do not run the downloaded driver unchanged against the audited worktree or previous capture directories.

FRICTION:
- tool | Python's default HTTP client received 403 from the evidence worker; curl downloaded every file successfully | use curl for these direct evidence downloads.
- tool | The first PR-metadata redirect raced initial scratch-directory creation and failed before issuing the forge command; retry after directory creation succeeded | create the scratch directory before parallel reads.

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

VERDICT: INSUFFICIENT R33
