# PR #33706 evidence matrix (scoped to the diff)

Derived from proof audit pass 1 (full feature inventory: https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b758fad613898041/fixture-matrix.md), cut to what this diff can change.

The diff changes two things. Web: which run the composer compares a prompt suggestion against. When the thread's latest run was cancelled before it started, the comparison now uses the last run that actually ran, once thread detail includes that cancelled run. Server (commit 5a51e85c70): the newest window of thread detail now always includes the run the shell reports as latestRun, so a freshly loaded detail (page reload, a second client) holds the steer-cancelled run as a live session already does; without it the web guard kept the suggestion hidden after a reload. No layout, CSS, placeholder, key handling, dismissal or subscription code changed. Every row below is a visible difference or a control for one.

Before = main at merge-base 934c7f8d8e. After = d2dd2acd8b for R1–R3 (web change only; the later commits change only the server's fresh-load query, which these live-session rows do not exercise) and 5a51e85c70 for R4 and the R1-at-head still pair. The final head adds only restored test assertions on top of 5a51e85c70. Real app, web dev server per checkout, fresh database (`T3CODE_DEV_SEED=0`), Labs → "Suggest next prompt" on before creating the thread, native Claude provider on its cheapest model (Haiku) via the existing hub configuration. The free Replay provider emits no suggestions, so it cannot produce these rows.

| Row | Sequence | Expected before | Expected after | Capture |
| --- | --- | --- | --- | --- |
| R1 Steer promotion (the bug, #33705) | Send a read-only task long enough to leave a window. While it runs, Queue a second message, wait for its real queue row, click "Send now" (Steer) while the first run is still active. Wait for the turn to complete and the suggestion. | Composer shows the ordinary placeholder, no suggestion | Composer shows the suggestion text + Tab hint; Tab fills it without sending | Recording before + after, 1440×900 dark, narrated steps with timestamps. End-state stills before + after at 1440×900 and 390×844 (composer focused/expanded, fine pointer), light and dark, with Diff0/DiffT |
| R2 Queued message removed (side effect found in review) | Send a read-only task. While it runs, Queue a second message, wait for its row, click "Remove queued message". Wait for the turn to complete and the suggestion. | No suggestion (the removed run is cancelled-unstarted and is still latestRun) | Suggestion shown | Recording before + after, 1440×900 dark; end-state still pair 1440×900 dark with diffs |
| R4 Reload after a steer (server commit) | R1's flow, then reload the thread page and let it settle | No suggestion before or after the reload | Suggestion before the reload and still shown after it; Tab fills it | Recording before + after, 1440×900 dark; end-state still pair after the reload with diffs; plus an R1 end-state still pair at 5a51e85c70 from the same run |
| R5 Cold client after a steer (isolates the server change) | R1's flow in one browser context, then open the thread in a brand-new context with no stored state | Web-only change d2dd2acd8b: cancelled run absent from detail, no suggestion | Final head ed45eeae87: cancelled run in detail, suggestion; Tab fills it | Recording per side 1440×900 dark; cold-context still pair with diffs |
| R3 Ordinary completion (informational control, unaffected path) | One plain turn, no queue | Suggestion shown | Suggestion shown (unchanged) | End-state stills 1440×900 dark; no pixel-identity claim (see below) |

Not captured, with reason:
- Fallback selection logic, tested in `apps/web/src/components/chat/usePromptSuggestion.test.ts` (no visible difference from rows already captured): several never-started cancelled runs in a row still fall back to the turn that ran (offered); a later run that started and was then stopped hides the old suggestion; a newer completed run behind a cancelled shell run hides the old suggestion; cached detail missing the shell's cancelled run hides it. The server side (the newest window includes the shell's latest run) is tested in `ProjectionStore.test.ts` ("reads a fixed SQL turn-item window for long histories and repeated clients") and captured as R5.
- Paths the diff does not touch (the offered value feeds the same unchanged composer code): draft threads, disabled Labs setting, coarse pointer, composer suppression gates, specialized placeholders, side chat, dismissal, command menus. No test in this PR covers these; none is needed because none of their code changed.

R3 is an informational control for the unchanged direct path (a turn with no queue): it shows both versions still offer a suggestion. Its two sides are separate real turns whose reply and suggestion wording differ, so it carries no pixel-identity claim and is not a before/after diff row.

Mobile has no prompt suggestions. Desktop wraps the same web component; no desktop-only path changed.
