# Revised evidence matrix — PR 19687

Before [952921f](https://github.com/pingdotgg/t3code/commit/952921f39acd7793187e2b14650f1cbc447f483d); after [271e7b6f](https://github.com/pingdotgg/t3code/commit/271e7b6f110b5817e70bba16c46a91b2475ccf09).

The pass1 N assumption is withdrawn. The server chooses completed/failed/interrupted source runs for context handoff; cancelled/rolled_back-only history has no eligible source and is accepted without context. It is not a nonportable blocked case. See [handoff source policy](https://github.com/pingdotgg/t3code/blob/952921f39acd7793187e2b14650f1cbc447f483d/apps/server/src/orchestration-v2/Orchestrator.ts#L6227). Attached sessions retain authoritative `supportsProviderSwitchingViaHandoff`; no-session active runs remain blocked. The final helper retains the source association guard and removes only its native-reference requirement: [helper](https://github.com/pingdotgg/t3code/blob/271e7b6f110b5817e70bba16c46a91b2475ccf09/packages/client-runtime/src/state/threadWorkflows.ts#L91).

| Row | Fixture / route | Before | After | Proof |
|---|---|---|---|---|
| A | Attached completed source, capability true; pointer picker | target selectable (before-sequence) | source turn completed; attached picker not separately exercised | partial capture |
| P1 | Real source turn → API detach → isolated null native ref; pointer picker | target blocked | target selectable | captured; see manifest timestamps |
| P2 | Same; model-picker keyboard opener | blocked | selectable | captured; see manifest timestamps |
| P3 | Same; next/previous provider navigation | blocked | selectable | captured; see manifest timestamps |
| P4 | Same; model jump | blocked (no target candidate) | UNVERIFIED | after script stopped at Favorites navigation before jump |
| P5 | Same; Favorites/search | blocked | selectable | captured; see manifest timestamps |
| H | Send target follow-up; captured target input contains saved sentinel | cannot choose target | saved sentinel received | captured; see manifest timestamps |
| C | Attached source session capability false | scoped helper coverage only | UI UNVERIFIED | fixture failed to establish attachment; captured projection has zero sessions, so screenshot is not a C=false test |
| R | No-session active run | blocked (helper policy) | blocked (helper policy) | UI UNVERIFIED: startup recovery cancelled synthetic active row; scoped helper tests only |
| S | No active source association, nonempty native history | scoped helper coverage | blocked | control-missing-source.png plus returned projection and grouped recording |
| N | Cancelled/rolled_back-only history, valid source association | baseline native-ref rule | accepted, no context | scoped source/helper coverage; no fabricated UI claim |
| M | Native mobile picker and unavailable alias | unverified | unverified | infrastructure: Device access disabled; no emulator launched |

Actual entry routes: composer picker, resolved keyboard opener, provider navigation, jump, Favorites/search. No independent global Settings or command-palette handoff control was found. Desktop wraps this web implementation but shell execution is unverified. 390px captures prove responsive web only. Target-unavailable/non-consuming cases will only be listed as exercised if the actual product exposes them.

All data synthetic; no live home accessed. Runtime protocol peers replace provider executables; web app/server code remains exact checkout code. Clearing nativeThreadRef is a stopped-server projection-only fixture adjustment, explicitly separate from event-backed source-turn creation/detach and actual target dispatch.

## Actual proof and gaps

`clean-sequence.mp4`: clean final-head source completed → API detach → stopped-server null native-reference fixture → target picker search/selection → target follow-up completed. At 00:33:13.105Z the actual target user input contains the prior sentinel; follow-up is only “Report the marker from our saved conversation.” Both runs completed. Source and target are different drivers, codex and claudeAgent.

`before-blocked-routes.mp4`: after clearing isolated caches, source association present, completed history, no sessions, null native ref. Target disabled; keyboard open/Escape, next/previous navigation, search and numbered jump cannot change source selection. Model jumps have no target candidate when search is filtered by lock; this does not prove a disabled target can be force-selected.

Favorites before is not a separately recorded favorite selection; search and provider navigation are recorded. After favoriting succeeded, but the Favorites navigation step failed to locate its button; favorite selection is UNVERIFIED. After numbered jump was not reached in this grouped route script due to that failure. Shift-click additive selection and reverse target→source send are not captured. Failed/interrupted source-history variants, queued-target timing, loading boundaries, and all additional pass1 hypothetical cross-products are unverified in the real client. Parent reports 61 scoped tests across four files; this evidence task did not rerun that completed suite.

Native mobile and Electron shell are unverified. The active no-session fixture was correctly cancelled by startup recovery and cannot be used to claim live active-run blocking. No unavailable/non-consuming target variant was exposed by the configured real product catalog.
