# Corrected proof matrix — pass 1

PR [#22840](https://git.cafe/pingdotgg/t3code/pulls/22840): head [8c8993a824](https://git.cafe/pingdotgg/t3code/commit/8c8993a824) versus base [96f09c6558](https://git.cafe/pingdotgg/t3code/commit/96f09c6558).

This replaces the [over-scoped first matrix](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/90b573820b4d654b/pr-22840-proof-matrix-pass1.md). It is a source-derived capture plan, not executed visual evidence. The exact budget is seven rows: six matched before/after still pairs and one matched before/after recording pair. Each row specifies one state, viewport, and appearance; there are no additional subcases or supplementary captures. Wide means **1440×900**, narrow means **390×844**, in CSS pixels.

## Change and real-app fixture

The production change replaces the collapsed `ComposerBanner.Peek` shadow utility with `shadow-composer-peek`, defined as `0 6px 18px rgb(0 0 0 / 6%)`. This shadow is unconditional across themes and border variants. Expanded banner surfaces and the main composer retain their existing shadows. Stack interaction and hover code are unchanged.

Future capture preparation, with the isolated worktree's server stopped:

1. Run `vp run migrate-dev-db` to create disposable `.t3/userdata/statev2.sqlite` from a read-only snapshot of live data. Never start a server against live userdata.
2. Run `python3 scripts/fixtures/composer-banner-shadow.py` in the head worktree. It requires a completed Claude run on the active provider thread of an unarchived, undeleted thread. It sets that provider thread's active goal to “Check the composer banners” with 1,200/10,000 token progress, inserts an active three-step todo list (one completed, two pending), renames the thread “Composer banner shadow”, and replaces copied message/turn-item text with neutral fixture text. It prints the thread ID.
3. Preserve that stopped, seeded disposable database as the common fixture for base and head. The script is new at head; do not assume it exists at base. Supply copies of the same seeded state to each isolated comparison environment while stopped, keeping it within disposable dev state.
4. Open the printed thread in the real app for every row. Confirm both goal and tasks are present and `data-slot="composer-banner-peek"` exists when collapsed. With no urgent notice or sync phase, task activity is in front and the neutral goal is hidden behind it. Do not mount the supplemental urgent harness.

Keep the same content, scroll position, glass settings, empty prompt, and unfocused editor across before/after. Use stock light/dark appearance only. Keep the tasks drawer closed and unrelated notices absent. “Collapsed” and “expanded” below refer only to the **notice stack**, not the tasks drawer or the mobile editor. At narrow width keep the mobile composer in its normal resting, blurred state for both captures; do not add a focused-editor comparison. For collapsed stills, leave pointer and focus outside the stack. Expanded stills are settled after activating “Show other notices”.

## Seven-row capture matrix

Every still row is one base/head pair of the same real-app fixture. Include the complete composer and enough surrounding conversation background to judge the shadow. The recording row is one base/head clip pair of the specified sequence only.

| Row | Notice stack | Viewport | Appearance/content | Capture and acceptance |
| --- | --- | --- | --- | --- |
| 1 | Collapsed | 1440×900 | Stock light; seeded goal/tasks over light conversation background | Still pair: peek shadow is softer without a thick gray band; cap border, alignment, and main composer elevation remain stable. |
| 2 | Collapsed | 1440×900 | Stock dark; seeded goal/tasks over dark conversation background | Still pair: judge the same softer cap shadow against dark content; no seam, clipping, or surrounding elevation change. |
| 3 | Collapsed | 390×844 | Stock light; seeded goal/tasks over light conversation background | Still pair: softer cap shadow remains visible without horizontal overflow, clipped border, or displaced composer. |
| 4 | Collapsed | 390×844 | Stock dark; seeded goal/tasks over dark conversation background | Still pair: inspect cap/background seam and border at narrow width; surrounding composer elevation remains stable. |
| 5 | Expanded | 1440×900 | Stock light; seeded goal/tasks over light conversation background | Still control pair: revealed goal and front task banner retain their existing surface shadows; collapsed peek is invisible. |
| 6 | Expanded | 390×844 | Stock dark; seeded goal/tasks over dark conversation background | Still control pair: revealed goal fits at narrow width, expanded surfaces retain existing shadows, and collapsed peek is invisible. |
| 7 | Collapsed → expanded → collapsed | 1440×900 | Stock light; seeded goal/tasks over light conversation background | Recording pair: keyboard-activate “Show other notices”, allow expansion to settle, then Escape to collapse and allow it to settle. Show the revealed goal and the 150 ms transition; the cap disappears and returns without a shadow flash, seam jump, or layout shift. |

No independent hover row or extra hover capture: hover selectors and handlers are unchanged. Row 7 is the single transition row, using only the keyboard sequence stated above.

## Explicitly out of scope

These exclusions are deliberate boundaries of this one capture budget, not additional evidence requirements:

- **Custom themes:** surface/outline theme code is unchanged; the new peek shadow is the same unconditional token.
- **Urgent warning/error variants and the supplemental harness:** variant borders are unchanged and use that same unconditional peek shadow. All seven rows use the real-app neutral goal/tasks fixture.
- **Backdrop-filter fallback:** fallback surface logic is unchanged and uses the same unconditional shadow.
- **Remaining expanded combinations (wide dark and narrow light):** expanded surfaces and their shadow code are unchanged; rows 5 and 6 are the two selected controls.
- **Focused/expanded narrow editor and zero/one-banner states:** editor behavior is unchanged; a zero/one-banner stack has no changed peek. No separate capture is requested.
- **Desktop shell, native mobile, and remote/relay/tunnel or multi-device permutations:** desktop uses the same web component; native mobile does not use this component; connection transport does not select a different shadow. Shell, native, and connection code are unchanged.

## FRICTION

- The earlier matrix concealed extra combinations and substituted 1440×1000. This correction fixes wide size to 1440×900 and limits the entire plan to the seven rows above.
- This audit read the diff and fixture source only. No browsers, servers, seeding, forge writes, or `gh` commands were run; no visual pass/fail is claimed.
- Seeding requires the specified completed Claude run in copied dev data. If absent, capture preparation needs suitable disposable source data; an empty thread is not an equivalent fixture.
- The fixture directly edits disposable rendering projections and copied message text. It proves the rendered goal/tasks state for this visual comparison, not command/event orchestration. Keep seeded state isolated and stopped during copying.
- No worktree files were modified. This artifact contains fixture instructions, not copied database contents or credentials.
