Proof audit, pass 1: [#32899](https://git.cafe/pingdotgg/t3code/pull/32899), branch `fix/issue-32891`, reviewed head [80adbdeb83](https://github.com/pingdotgg/t3code/commit/80adbdeb833fc2c564f262749296a1cc270141c6).

Finding: proof is incomplete for **R5, an ended `failed` provider turn whose run has not settled**. The new predicate accepts this status, the PR description promises it, and the requested fixture matrix explicitly includes it, but the test table contains no `failed` row and the before/after transcript contains no execution of that case. Add the row to the existing integration table and supply its before-failure/after-success transcript. This is an evidence finding; this audit does not establish a functional defect in that path.

The other six affected named fixtures have both tests and before/after evidence in the existing PR description. No capture or recording is required: this is a server dispatch decision with no changed renderer, layout, animation, or UI interaction implementation. The transcript runs the orchestrator and effect worker with a controlled provider adapter; a live paid-provider/MCP race is not required to demonstrate the server decision.

The description labels the transcript's after revision [48782caff6](https://github.com/pingdotgg/t3code/commit/48782caff66ceaf2a289a23dac415b6427bdc723), rather than the reviewed merge head. Both changed files have exactly identical Git blob IDs at those two revisions, so this is applicable source evidence, not a source mismatch. The current remote head was confirmed read-only with `git ls-remote`. The PR diff against main's merge base [feb9c6b842](https://github.com/pingdotgg/t3code/commit/feb9c6b8425efc05dd0d3b198999ef90e16fc62c) is exactly two files, 162 insertions and 3 deletions. Local `main` was older; the audited diff used `origin/main...HEAD`, whose merge base matches the PR metadata. The latest remote main was [61cb845d96](https://github.com/pingdotgg/t3code/commit/61cb845d9699d0ecce5a9b660d3b32907914df8b).

The test shorthand **T(status, settled)** means `starts a restart that missed the turn ($status, run settled: $settled) as a new turn` in the [new table](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts#L1819). **T-Stop** means [starts a restart sent into a run that Stop reached once the stop settles](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts#L1777). Existing tests named below are present at the PR head but were not added by this PR.

| ID / named fixture | Affected by diff? / server decision | Test mapping at PR head | Existing transcript / proof needed / status |
| --- | --- | --- | --- |
| R1 completed-run restart | Yes: completed target becomes `start_immediately`. | T(completed, true). | Listed failing before; full file passes after. Test + runtime transcript supplied. **PROVEN**. |
| R2 inactive-noncompleted restart | Yes: `!isActiveRun(target)` becomes `start_immediately`; interrupted is the representative. | T(interrupted, true). Other non-active values (`failed`, `cancelled`, `rolled_back`, `queued`) use the same predicate; they are not individually exercised by the added tests. | Interrupted row listed failing before; full file passes after. Test + runtime transcript supplied for this decision class. **PROVEN representative**, with the stated value-level limit. |
| R3 ended-completed, unsettled-run restart | Yes: run still running/waiting, latest matching provider turn completed; becomes a start, queues until settlement. | T(completed, false). The fixture drives a running run; waiting is the same explicit OR branch, without its own row. | Listed failing before; full file passes after. Test + runtime transcript supplied. **PROVEN representative**. |
| R4 ended-interrupted, unsettled-run restart | Yes: terminal provider turn qualifies despite unsettled run. | T(interrupted, false). | Listed failing before; full file passes after. Test + runtime transcript supplied. **PROVEN**. |
| R5 ended-failed, unsettled-run restart | Yes: `failed` is neither pending nor running and therefore qualifies. | **UNCOVERED**: no T(failed, false). | No before failure, after result, or other row-specific runtime proof. Needs a row in the existing test table plus before/after runtime transcript. **MISSING**. |
| R6 ended-cancelled, unsettled-run restart | Yes: terminal provider turn qualifies despite unsettled run. | T(cancelled, false). | Listed failing before; full file passes after. Test + runtime transcript supplied. **PROVEN**. |
| R7 Stop-reached restart | Yes: running target has persisted interrupt marker; restart becomes a start and queues behind the stopping run. | T-Stop sends `run.interrupt` before restart, before worker delivery. `thread.stop` reaches the same persisted-marker decision. | Listed failing before; full file passes after. Test + runtime transcript supplied. Client/user source is exercised; agent/server queue holds follow existing source rules, not separately asserted by this new case. **PROVEN representative**. |
| U1 still-running restart | No: running turn, no Stop marker; retains restart mode and uses forced interrupt/restart. | Existing [retries a failed selection restart session open before completing](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/SelectionRestart.integration.test.ts#L287) dispatches explicit `restart_active` into a confirmed running provider turn. | No before failure expected. Existing regression coverage; not a new PR-body row. **UNCHANGED / covered**. |
| U2 auto, active running turn | No: resolves from provider capabilities to native steer, queue, or restart. | Existing [resolves automatic message delivery from authoritative provider capabilities](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/CommandPolicy.test.ts#L70). | No before failure required. **UNCHANGED / covered**. |
| U3 auto, no active run or provider-turn gap | No: start with no active run; queue during preparation/startup or without a running matching turn. | Same policy test plus [queues only automatic delivery when the active run's provider turn %s](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/CommandPolicy.test.ts#L136). | No before failure required. **UNCHANGED / covered**. |
| U4 auto, Stop reached | No: existing auto guard queues before the new explicit-restart Stop guard. | Existing [queues a plain send behind the stopped queue and releases its hold](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts#L1925). | No before failure required. Full-file after success includes this existing test. **UNCHANGED / covered**. |
| U5 steer, running turn | No: existing steer/native capability decision stays intact. | Existing [steers a changed turn-scoped selection into a running turn the provider could restart](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts#L956). | No before failure required. **UNCHANGED / covered**. |
| U6 steer, completion already won | No: existing completed-run/completed-turn fallback remains. | Existing [delivers $label when completion wins $timing](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts#L40), steering / before dispatch entry exercises the completed-turn fallback; completed-run steer is not separately driven by the added fixtures. | No before failure required. Full-file after success includes the existing table. **UNCHANGED / covered**. |
| U7 steer, Stop reached or noncompleted terminal target/turn | No: restart-only clauses leave explicit steer rejection intact; the completed fallback still takes precedence. | **UNCOVERED directly** by the added tests. Existing queued-message promotion-after-Stop test exercises a different command and does not prove explicit steer rejection. | No new behavior proof obligation; no claim of direct test evidence. **UNCHANGED / coverage limit**. |
| U8 restart guards: target absent; preparing/starting target; missing or pending turn | No: absent target cannot satisfy the new target guard; active pre-turn states and nonterminal/missing turns do not meet the new fallback (unless Stop independently applies). | **UNCOVERED directly** by the added integration table; existing policy tests cover only intent resolution for pre-turn gaps. | No new before failure required. Existing validation/dispatch behavior is preserved. **UNCHANGED / coverage limit**. |

All rows: **capture: none; recording: none**. The six supplied failures are explicitly named in the transcript. Three sample error causes are shown; it is not necessary to print six duplicate stacks. The after line is an aggregate `41 passed (41)` for the entire file, rather than six separately printed success lines, which is sufficient to establish those included rows passed. It cannot establish a missing test row passed.

There is no changed render path. The only changed production function is [dispatchMessage](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/Orchestrator.ts#L5846); the other changed file is a server integration test. It normalizes an existing dispatch union after [resolveMessageDispatchIntent](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/CommandPolicy.ts#L95), using target existence, active run classification, latest matching root/attempt provider turn, and a persisted Stop marker. The branches then enter existing start/queue or [steer dispatch](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/Orchestrator.ts#L6307). No contract or client shape changes.

The complete direct production caller list for that function is the [message.dispatch command handler](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/Orchestrator.ts#L13696), [PR-watch wake](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/Orchestrator.ts#L3334), [delegated child launch](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/Orchestrator.ts#L8413), [link-answer wake](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/Orchestrator.ts#L9463), and [async runtime answer](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/Orchestrator.ts#L9857). The internal wake/launch callers do not request restart; their paths are unchanged. MCP `t3_thread_send` goes through [ThreadManagementService.sendToThread](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/server/src/orchestration-v2/ThreadManagementService.ts#L815), which resolves and sends an explicit target. Client sends go through shared [startThreadTurn](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/packages/client-runtime/src/operations/commands.ts#L672), which carries delivery intent for server-side resolution.

Web submission comes from [useComposerSend](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/web/src/components/chat/useComposerSend.ts#L1232). Desktop uses that web renderer. Mobile submission comes from [threadOutboxDelivery](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/mobile/src/state/threadOutboxDelivery.ts#L909). The resulting existing run/message projection feeds web's [ChatView timeline](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/web/src/components/ChatView.tsx#L3415) and mobile's [ThreadDetailScreen / ThreadFeed](https://github.com/pingdotgg/t3code/blob/80adbdeb833fc2c564f262749296a1cc270141c6/apps/mobile/src/features/threads/ThreadDetailScreen.tsx#L1466). The observable result changes from a rejected/lost send to an ordinary queued/new turn. All existing text, attachment, run-state, error and feed layouts render the same shapes with the same logic; there are no new layout fixtures or gestures to capture. Provider-specific adapters and local/remote/tunnel transport contracts are unchanged.

Evidence reviewed: [PR description snapshot](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c0f65bf5aacc9ee3/pr.json), full two-file PR diff, related callers, contracts, and existing tests. No tests or live agents were rerun during this read-only proof audit. No edits, pushes, PR comments, dev servers, or second worktrees. Completed within the 45-minute budget. Scratch was saved under `/tmp/lead-32899-r2/proof-audit-1/` for upload and is removed before handback per the shared rules.

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

FRICTION: none

VERDICT: INSUFFICIENT R5: failed provider turn, run not yet settled; missing test row and before/after runtime transcript
