# Proof audit: fixture matrix, pass 1

PR [#33129](https://git.cafe/pingdotgg/t3code/pull/33129). Inspected checkout: `/home/user/wt/pr-33129`, clean at [12ac6ac](https://git.cafe/pingdotgg/t3code/commit/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b). Local `main` and merge base: [73fb49d](https://git.cafe/pingdotgg/t3code/commit/73fb49d0b3a61bff74aebc362fc6c17d6c0d39be). Sources: supplied diff and supplied PR description, checked against that checkout. Read-only audit; no application launch, tests, capture, repository edits, forge writes, or additional worktrees. Every capture below is still missing.

## Findings

1. **Current-head performance proof is missing.** The body explicitly says the after measurements preceded the hint-delay follow-up and used web defaults, where desktop-only jump bindings are inactive. The supplied PR snapshot also identifies an older head. Its numbers cannot establish the result for the inspected head with active jump bindings. Require P1, P2 and P3 with explicit build SHA, effective bindings and thread counts.
2. **The browser test does not exercise the actual terminal shortcut.** It presses/releases Mod, changes the terminal store, and focuses a synthetic textarea; it never presses J. It counts five row function calls with two unconditioned jump bindings, not a real Electron session with nine desktop-conditioned bindings. Valuable regression coverage, but P1–P3 and H5/H6 still need integrated proof.
3. **No intended visual difference includes a timed visibility contract.** Still images cannot establish no flash, delayed appearance, release, second hold, terminal suppression, picker-close restoration, or zero sidebar commits. All interaction/time rows below require recordings. Include visible input-event and hint-count traces with timestamps in a labelled evidence overlay or synchronized log.
4. **The input space extends beyond the sidebar.** The modifier refactor reaches composer queue/steer controls and two pull-request quick-action surfaces. C1, R1 and R2 cover them without invoking paid providers or destructive forge actions. The removed terminal-focus hook had only the sidebar caller.
5. **Context transitions now use a different timer boundary.** The old hook delayed after `shouldShow` became true; the new store delays an unchanged modifier combination and then applies context. A picker closing or a terminal/preview condition becoming eligible after a long hold can therefore restore hints immediately. Record that explicitly in H5–H9 and describe the accepted behavior; do not claim frame-for-frame timing equivalence to main. Switching between two matching modifier combinations also restarts the new timer; H1 covers that branch.
6. **A hook status is not a visible row label.** `jumpLabelByKey` calls `shortcutLabelForCommand` without the live context. A binding eligible only under positive `terminalOpen`/`previewOpen` may make the hook true while producing no mapped badge. For real-app context recordings use negative conditions, whose label resolves in the default closed context, and verify navigation separately. If a positive-context hook host is captured, label it as harness evidence; it does not prove real row rendering.

## Caller and branch inventory

- [Sidebar](https://git.cafe/pingdotgg/t3code/blob/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b/apps/web/src/components/Sidebar.tsx): one production caller, `AppSidebarLayout` as `ThreadSidebar`; root layout supplies `showSidebar={!isWelcome}`. The changed component's only prop is `routeReveal` (observed/pending active-route reveal). It is mounted on ordinary web/Electron thread routes, drafts and other main-app routes; Settings/Usage are modal routes. Welcome omits it. Browser tests mount it under `SidebarProvider`.
- Sidebar consumes `useThreadJumpHintsVisible` once; `threadShortcutContext` has that snapshot caller and the thread-navigation keydown caller. The latter ignores prevented/repeated keys, open command palette and open model picker, then handles previous/next or jump 1–9. Empty/out-of-range targets do nothing; successful navigation clears selection, resolves an environment-scoped thread and closes the narrow-web sidebar. This is behavior shared by keyboard entry, palette/history/link route changes and row clicks; there is no new settings control or wire contract.
- [Hint store and context](https://git.cafe/pingdotgg/t3code/blob/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b/apps/web/src/components/Sidebar.logic.ts): 200 ms unchanged-modifier deadline; first subscribe, last unsubscribe and remount reset; snapshots false/true; repeated holds; matched/unmatched/changed/zero modifiers; keybindings updates. Context reads focused terminal, route thread's drawer open state, focused preview, route thread's active preview surface, global picker count, `isWeb` and `isDesktop`. Null routes and unpromoted drafts have no drawer or preview open. Promoted drafts resolve their server thread. Subscriptions cover focusin/out, all terminal/right-panel store writes, picker 0↔nonzero and hold transitions. A terminal focused in either drawer or right panel suppresses hints regardless of the `when` clause.
- [Jump matcher/defaults](https://git.cafe/pingdotgg/t3code/blob/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b/packages/shared/src/keybindings.ts): default jumps are `mod+1..9` under `!modelPickerOpen && isDesktop`; ordinary web defaults have no eligible jump hints. Custom bindings can use other modifiers, unmodified keys or context gates. Mac Mod is Command; other platforms use Control. Desktop default model-picker jumps reuse the digits under the opposite picker condition. Config parse errors fall back/report upstream; resolved empty/disabled/ineligible rules are the same no-label snapshot class for this change.
- Sidebar list/data branches: zero projects; zero threads with one/multiple project scopes; draft-only; 1, 2–9, 10+ and hundreds of visible threads; first nine ordered rows can receive labels, subsequent rows cannot. Ordering is pinned → active/project-folder rows → visible working → visible snoozed → rendered settled. Collapsed shelves/folders preserve the route row; other hidden rows are excluded from jump ordering. Project grouping, scope, sort and delegated-under-parent filtering change that order. Search has populated results, pending/no results; search result rows do not receive `jumpLabel`. Older settled pagination has more/loading/failed/retry states. No new loading/error markup is introduced.
- [Thread row rendering](https://git.cafe/pingdotgg/t3code/blob/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b/apps/web/src/components/sidebar/SidebarThreadRow.tsx): one normal-list `SortableThreadRow` callsite supplies the changed `jumpLabel` prop. Four layouts: active/pinned/working `card`; snoozed/settled `slim`; grouped `folder`; grouped `folder-multiline`. Card height varies with empty/nonempty metadata; multiline rows have a second line only when metadata exists. Label replaces the status/time/action slot using the existing badge CSS. Dragging replaces the slot with a destination badge; sweep hides it; snooze menu sets its label null. Hover/focus exposes actions unless overridden by the hint. Other unchanged presentation inputs are active/route/selected, pin, unsent draft, renaming/regenerating title, long/RTL title, project name/icon, branch/worktree or scratch machine, local/remote environment icon/name, provider stack, running terminals, PR badge/stack, diff counts, preparing/working/input/request/failed/settled status, receding/read/unread/woke state and snooze wake time. Capability/grant flags enable actions. H1–H4 use composite fixtures covering metadata absent/present and representative status/badge congestion; unchanged status colors and every icon permutation are not multiplied into separate captures for a subscription-only diff.
- [Shared modifiers](https://git.cafe/pingdotgg/t3code/blob/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b/apps/web/src/shortcutModifierState.ts): `useShortcutModifierState(false)` production caller is `ComposerPrimaryActions`; Sidebar reads the shared store directly. `true` callers are `PullRequestSpeedModeProvider` and `EnabledThreadPullRequestsPanel`. Both stores track Meta/Ctrl/Alt/Shift, physical modifier aliases and flag-based release on ordinary keys; paste/blur reset both; focus into input/textarea/select/contenteditable/role=textbox including shadow descendants resets only the editable-ignoring store. Multiple subscribers, mount under already-held keys and last unsubscribe are distinct lifecycle paths. Existing modifier tests only call the event reducer; they do not prove subscription sharing/reset lifecycle.
- [Composer](https://git.cafe/pingdotgg/t3code/blob/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b/apps/web/src/components/chat/ComposerPrimaryActions.tsx): production callers are `ChatComposer`'s detached pending-action controls and `ComposerFooterControls`' ordinary controls. Mod flips queue/steer only for applicable running, sendable, non-editing state. Other branches are pending question previous/next/submit/responding and compact/noncompact labels, stop-only without sendable text, resume, edit queued message, idle send, compact-before-send/keep-history, busy spinner, unavailable/preparing/disabled and stage-backdrop styles. Those unchanged branches do not create additional modifier-derived visual classes; C1 captures the two modifier-sensitive queue/steer directions, C2 checks late mount and an inert control state.
- [Quick-action provider](https://git.cafe/pingdotgg/t3code/blob/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b/apps/web/src/components/pullRequest/PullRequestSpeedActions.tsx): `PullRequestListGroups` → provider → `PullRequestRow` → action group, ultimately in `/pull-requests`. Shift alone exposes actions; added Mod/Alt/Ctrl hides them. Busy actions stay shown; no supported actions returns null. Open/draft/closed/merged, stack, capability/grant and pending state select/disable actions, without changing the shared modifier predicate. R1 can carry representative actionable and inert rows in one screen.
- [Linked panel](https://git.cafe/pingdotgg/t3code/blob/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b/apps/web/src/components/pullRequest/ThreadPullRequestsPanel.tsx): sole production caller is `RightPanelSurfaceContent`, `pull-requests` surface. Unsupported environment returns an unavailable state before the modifier subscriber; supported empty returns no-links; populated uses virtualized rows and `extraData.speedMode`, hides overflow controls only when quick actions exist. Null snapshot, missing project/capability or merged rows have no quick-action entry; stack depth changes indentation and count metadata. R2 includes actionable and inert rows, plus enough links to scroll.
- [Model picker count](https://git.cafe/pingdotgg/t3code/blob/12ac6ac5cf5b0154b92af29fc82a45f4b1fa164b/apps/web/src/modelPickerVisibility.ts): sole registration is `ModelPickerContent` layout effect; sole production caller of that content is `ProviderModelPicker`. All `ProviderModelPicker` sites are composer footer; Voice settings; Text generators settings; SettingsPanels; Project defaults (two sites); Source-control writing settings (two sites); Scheduled tasks settings. All share the same registration independent of model count/search/loading/error/disabled-model list layout. Count 0/1/2+ transitions are H7/H7b. `isModelPickerOpen` remains read by existing key handlers; they do not subscribe. No provider adapters, mobile-native code, contracts, server behavior or new transport paths change. Web remote/hosted use the same client stores; one remote browser pass suffices as an overlay, not a per-provider matrix.

## Seed and capture conventions

All seed operations below are instructions for the capturer, not actions performed by this audit. Use an isolated dev home with synthetic data, never the live database. Start from a new empty home with auto-seeding disabled. For bulk threads, use the app's `orchestration.launchThread` RPC with a project created through Add project, explicit synthetic title, valid Replay selection, valid workspace strategy, `generateTitle:false`, and **omit `initialMessage`** to avoid starting agent turns. Derive remaining required arguments from `OrchestrationV2ThreadLaunchInput` and the app's own request. Create 201 or more threads only where requested; record both total and actually rendered row counts. Keep thread titles, paths and logs synthetic.

Route a thread through `/<environmentId>/<threadId>`, a draft through `/draft/<draftId>`. Add custom jump bindings using `/settings/keybindings` or `server.upsertKeybinding` with `{key,command,when?}`; restore the initial config before the next fixture. Use `/settings/labs` to set `boringSidebarEnabled` and `boringSidebarMultilineRows`; client settings expose working shelf and grouping. Pin/settle/snooze/rename using row controls and expand/collapse using their headers; use the app RPC for bulk data. Long titles should be 100+ characters; long branch/project names 60+ characters. Include one active and one inactive row. If any state is injected by test spies, direct module stores, synthetic DOM terminal owners, mocked Electron bridge, or mocked network/projection data, label the capture **HARNESS**, list the injected inputs and do not call it real app/Electron proof.

Capture codes: **D** = 1280×800, dark, standard sidebar width; **L** = same, light; **N** = 1280×800 dark with sidebar dragged to its supported minimum; **W** = 390×844 dark, narrow web drawer open; **E** = actual macOS Electron window with 1280×800 content area, dark; **H** = labelled integrated/component harness at 1280×800 dark. A listed set is the minimum viewport × theme × row, not a demand for all cross-products. Every row marked recording needs full transition footage; stills are optional comparison frames. Record identical main/head setups for P1–P3 and H1–H4; head-only is enough for additional edge controls, with explicit intended timing differences. Several rows may share one continuous clip if chapters/time ranges and all row IDs are listed.

For profiling, use identical development/profiling build settings, browser/machine/viewport, sidebar settings, data/order and instruments on both commits. Record settled mount, then baseline counts, physical or browser-protocol Mod down → J down/up → Mod up, terminal opened and input focused, total commit window, Sidebar commit count and row-render deltas. Trace the entire interaction through release and more than 200 ms afterward; the first React commit alone can miss delayed commits. Include an idle control, repeated open/close, isolated modifier press, focus-only transition and a deliberate long hold. Report raw repeated samples and no numerical speedup claim beyond the measured configuration. Expected head sidebar/row delta is zero when the *derived hint visibility stays false*, not zero for real hint show/hide, navigation, clock updates or data changes. Never show private runtime model identifiers, credentials, pairing URLs, real paths or customer threads in public evidence. Attribution: AI-assisted; verified with the tests and tools listed above.

## Fixture matrix

“Pending” means no capture supplied or inspected. “Covered by” is a deliberate equivalence reduction, not a verified result. All rows marked Direct or Shared are affected by the diff. Exempt rows document unchanged rendering paths without inflating the minimum capture set.

| ID / named fixture | Effect | Data and real-app seed / fallback | Interaction and observable result | Minimum capture | Status |
| --- | --- | --- | --- | --- | --- |
| P1 / web-default large sidebar | Direct | One project, 201+ empty synthetic threads via launchThread; normal cards, no custom jumps; thread route. Also record a 1-thread control from a separate isolated fixture. | Actual Ctrl+J opens/focuses drawer; repeat close/open, isolated Mod and focus. No web-default hint flash. Record before/after Sidebar and row deltas, full commit window and samples. | **recording D**, main + head; 1-thread control can be a chapter. | **Pending; body has historical transcript only.** |
| P2 / web with active jumps, many threads | Direct | Same 201+ data, custom unconditional `mod+1..9`; verify all effective rules in settings. | Actual quick Ctrl+J below 200 ms, terminal focus, Mod release; then deliberate long hold and release with terminal blurred. Zero sidebar renders only on false→false paths; labels still cause legitimate renders. | **recording D**, main + head. | **Pending; five-row synthetic test is partial support.** |
| P3 / macOS Electron defaults | Direct platform | Actual Electron, stock `!modelPickerOpen && isDesktop` `mod+1..9`, same large fixture. If unavailable, report cannot-verify; web bridge/platform spoof is only H evidence. | Real Cmd+J quick open/close/focus; Command hold/release; Cmd+1 changes thread. Confirm desktop labels and model picker gating. Same before/after profiler/render counters as P2. | **recording E**, main + head. | **Pending; no Electron runtime proof.** |
| H1 / card slots and delay | Direct layout | 10+ ordered threads; active/pinned/working cards; metadata-free and long metadata-rich cards, one inactive congested badge/status row. Unconditional mod jumps; optionally a second binding using Mod+Shift. | Hold <200 ms (hidden), continue past 200 (shown), release (hidden); second hold needs fresh delay; add/remove Shift between two matching combinations and record restart. First 9 label, 10th none; hover/focus restores correct status/actions on release, no title jump. | **recording D + L + N**, main + head. | **Pending; hook/props tests do not show the slots.** |
| H2 / slim snoozed and settled slots | Direct layout | Use settle/snooze controls; expanded shelves, rows within first nine; include snooze wake label and ordinary settled age, long title. | Same hold/release; verify wake/time/status and hover actions return, labels do not overlap trailing controls. Expand/collapse shelf and verify new numbering/route-row exception. | **recording D + L**, main + head. | **Pending.** |
| H3 / folder single-line rows | Direct layout | `/settings/labs`: boring on, multiline off; two projects, long titles, metadata/status variations, pinned row above. | Hold/release, collapse/reopen folder with route row retained. Visible numbering follows current ordered rows; navigation targets the numbered row. | **recording D + N**, main + head. | **Pending.** |
| H4 / folder multiline rows | Direct layout | Boring on, multiline on; empty and nonempty metadata, long branch/project, diff/terminal/PR/provider badges where safely available. | Hold/release and hover/focus; check title-line badge and second-line height/truncation are unchanged, then restore ordinary mode. | **recording D + L**, main + head. | **Pending.** |
| H5 / drawer terminal focus | Direct context | 2+ threads with unconditional mod jumps, live drawer terminal; open via toolbar/palette as well as keyboard; keep one composer focus target. | With matured Mod hold, focus terminal → hints hidden; return focus outside terminal → hints eligible again; release → hidden. While terminal focused, hold long and press a jump key: no sidebar jump. Show actual active element and terminal owner. | **recording D**, head; can share P2 footage. | **Pending; current hook test uses synthetic owner.** |
| H6 / right-panel terminal focus | Direct context | Same small real-app fixture; open a terminal surface in right panel, not drawer. | Repeat focused hold and focus-away transitions; no jump interception while focused. Distinguishes both recognized terminal owners. | **recording D**, head. | **Pending.** |
| H7 / composer picker, held Mod | Direct context | Real composer model picker with synthetic/test-safe model choices, 2+ threads; Electron defaults or web mod jumps gated by `!modelPickerOpen`. | Mature Mod hold → open picker by pointer without releasing Mod → sidebar hints hidden → close picker still held → hints return → release hides. Digit during picker belongs to picker and must not navigate thread. | **recording E or D**, head; no paid turn. | **Pending; registration-only test is partial support.** |
| H7b / other picker sites and multiple mounts | Shared lifecycle | Production sites listed above all use same content registration. Capture one Settings picker as representative if Sidebar is visible; count 2→1→0 requires labelled H with two registered contents because a normal simultaneous-open path is not established. | Verify one closing picker cannot publish false while another remains mounted; last close restores eligibility. Overlay hook result when modal obscures sidebar. | **recording H** for 2→1→0; Settings representative may share it but must state which path is real. | **Pending; all remaining picker sites covered by common registration, no separate styling captures required.** |
| H8 / route terminal-open conditions | Direct context | Two threads A/B with different drawer-open state, custom jump `when: !terminalOpen`; include unpromoted draft/null route. Use app controls and binding settings. Positive `terminalOpen` is a labelled hook harness if used. | Hold past delay, open/close A while focused outside terminal, navigate to B, operate B; only current route's drawer gates hints and current keydown navigation. Gate becoming valid after matured hold may restore immediately; record timing. | **recording D**, head; optional positive-condition **H** is not a substitute. | **Pending; positive hook test alone does not establish badges or routing.** |
| H9 / preview-open and focus conditions | Direct context | Two threads, preview surface in current route; separate custom bindings `when: !previewOpen` then `when: !previewFocus`, with unconditional fallback disabled. Use panel UI and actual focusable preview target. | While matured Mod is held, open/close or switch active preview surface; then focus/unfocus preview target. Hints follow context, and immediate keydown uses newest state without unrelated render. Include route switch; webview-specific focus may use E/H and must be labelled. | **recording D**, head; browser preview path required, Electron webview only if that focus path is claimed. | **Pending; no preview condition evidence supplied.** |
| H10 / no-modifier and keybinding updates | Direct timing | 2+ threads; F1→jump.1 with no modifier, plus another row with no effective binding. Set via UI/RPC. | From mount/activation observe initial hidden state, then eligible label after 200 ms unchanged modifiers; press/release Mod to remove/restore exact-match condition. Add/remove/rebind live and verify labels/predicate refresh, absent binding stays blank. | **recording D**, head; timer-at-mount exactness may be labelled H. | **Pending; hook test covers initial delay only.** |
| H11 / resets and fresh subscription | Direct shared store | Small fixture, mod jump; also composer mounted. Drive native paste and actual window blur/refocus; controlled poisoned flag event only in labelled H. | Show hints then paste reset; repeat with blur (no keyup), ensure no stuck hints, fresh hold works; leave/remount Sidebar and last subscriber to check clean startup. Shared store must not revive stale modifiers. | **recording D**, head; H appendix for synthetic dictation/reducer event. | **Pending; reducer tests do not cover listeners or teardown.** |
| N1 / navigation and overlay guards | Direct event context | Two projects with ≥10 ordered rows across shelves, selection active, draft/null route, A/B context differences; use app scope and sort UI. | Actual jump 1/9, out-of-range target in 1-thread fixture, previous/next, route change from palette/history/link, clear selection. Repeat with palette/picker open (no thread navigation), event repeat/prevented guarded via H only if needed. Verify route-reveal and current context rather than stale terminal/panel state. | **recording D**, head; share H1–H3/H8/H9 clips. | **Pending; guard implementation unchanged, event-time context changed.** |
| E1 / zero, one and draft-only | Direct degenerate | Fresh no-project `/`; add project without threads; scope two empty projects; create unsent draft; one launched thread with a single jump. No database writes needed outside app/RPC. | Hold/release; empty/draft-only views get no phantom badge/target. 1-thread gets exactly one label. Existing no-project/no-thread copy and disabled New thread unchanged. | **recording D**, head; sequential chapters; 1-thread chapter may reuse P1 control. | **Pending; empty variants share zero-label branch.** |
| S1 / search and pending/error list chrome | Direct caller, unchanged search layout | From mixed H1 data enter matching then no-match search. Pending search/older settled loading/failed/retry require controlled read-RPC delay/failure or labelled H; expand settled tail to show pagination. | Hold/release during search: results get no jump badges because `SidebarSearchResultRow` has no label prop. Clear search restores ordinary label path. No duplicate/stuck badges after retry/data arrival. | **recording D** real search; **recording H** for pending and failed controls if not reproducible through isolated RPC fault injection. | **Pending; loading/error variants can be one labelled montage.** |
| W1 / narrow web drawer | Direct responsive | 390×844 browser, open sidebar drawer, 2+ threads with long titles and active mod jumps; hardware/browser-protocol keyboard. Native mobile app is not this path. | Hold/release labels within narrow width; activate a numbered row, drawer closes; reopen after release, no stale hints. Ordinary offcanvas desktop collapse/reopen can be another chapter. | **recording W**, head. | **Pending; no native mobile capture needed.** |
| I1 / suppressed action slots | Direct label recipient, unchanged guards | H1–H4 data with active row drag, action sweep, rename and snooze menu; use app controls. Status/badge permutations already represented there. | Mature hold while dragging or sweeping: destination slot stays authoritative; snooze menu suppresses hint; cancel restores correct slot. Rename input remains focused and usable; hover actions recover on release. No destructive action need complete. | **recording D**, head, as chapters appended to H1/H2. | **Pending; no separate theme cross-product.** |
| C1 / composer running queue↔steer | Shared modifier consumer | Real Replay turn with sendable text; set each follow-up default queue/steer, can-steer supported. Need a Replay fixture that stays running through observation; otherwise labelled component H, not an invented paid provider run. | With editable composer focused, press/release Meta or Ctrl; queue/steer icon and accessible label follow both default directions, reset on paste/blur. Do not submit. Pending question, stop, resume, queued edit, busy/disabled, compact-history and visual backdrop branches remain unchanged modifier-inert classes. | **recording D** real Replay preferred, **H** explicitly allowed if unavailable. | **Pending; other inactive composer branches covered by unchanged markup plus C2.** |
| C2 / late-mounted shared consumers | Shared lifecycle | Keep Sidebar+composer subscribed, hold Mod, mount a second composer consumer; keep one PR speed provider subscribed and mount linked panel while Shift held. Real side pane/navigation if available, otherwise H. | New consumer immediately agrees with shared held state; releasing resets both. Switch first/last subscribers and verify no listener leak/stuck state. Include idle or queued-edit composer state: Mod does not change action. | **recording H** permitted; real routes may replace where mount can be demonstrated. | **Pending; not covered by reducer-only tests.** |
| R1 / pull-request list Shift actions | Shared editable-ignore consumer | `/pull-requests` with synthetic actionable open/draft/closed plus inert merged/unsupported rows, long title and stack. Use safe isolated read-only fixture/RPC interception; if authenticated list unavailable, labelled `PullRequestListGroups` H. | Shift alone shows quick actions; release or extra Mod/Alt hides; focus search input while held clears speed mode. Return to noneditable target and press again; no sticky controls. Busy row stays shown using mocked busy state, never launch merge/close. | **recording D or labelled H**, head. | **Pending; host/action/grant variants covered in same fixture, not forge mutations.** |
| R2 / linked pull-request panel Shift actions | Shared editable-ignore consumer | Thread right panel `pull-requests` with enough synthetic links to scroll, actionable row plus null snapshot/merged/missing-project inert row and stack indentation. Link a harmless fixture through app/RPC; use H for fabricated host snapshots. | Shift shows actions and hides eligible overflow control, release restores. Focus editable target resets speed mode; scroll virtualized rows while held. Show no-links and unsupported capability as unchanged controls in same harness if needed. | **recording D or labelled H**, head. | **Pending; separate virtualization path from R1.** |
| X1 / other unchanged branches and surfaces | Exempt, enumerated | Remaining icon/status permutations, provider list loading/error/search/count variations, PR pending/grants, settings picker host locations, unavailable environment/empty pull-request states, theme background variants beyond light/dark, hosted/local/remote transports. | No new markup, schema, permission, adapter or native-mobile branch. Reuse composite row proofs above; one connected remote browser run of P2 is useful but not a second platform implementation. Actual data/route/time updates may still legitimately render Sidebar; ongoing streaming performance is not fixed by this patch. | **No additional standalone capture required.** If remote support is claimed as directly exercised, add remote D recording instead of inference. | **Exempt with explicit scope; not verified by this audit.** |

## Handoff and acceptance

Minimum work is the capture cells for P1–P3, H1–H11 (including H7b), N1, E1, S1, W1, I1, C1/C2 and R1/R2. Share clips freely across row IDs; dark is the default, with light only H1/H2/H4, minimum sidebar width only H1/H3, narrow-web only W1, actual macOS Electron only P3 (and optionally H7). Harness-only lifecycle/count/fault states must be labelled; they cannot clear P1–P3 or replace real terminal/picker interaction rows. If Electron is unavailable, preserve P3 as missing and narrow claims rather than silently substituting a browser platform string.

Capture index should list row ID, file/URL, time range, viewport/theme, real-app versus harness, before/after SHA, effective bindings, seed summary and any exception. Export profiler/count logs beside videos, sanitized before upload. No evidence has been captured or audited in pass 1; the existing test and profiler statements have only been read, not rerun. No servers/processes or secondary worktrees were created by this audit. Disk available at start: 108 GB. FRICTION: none.

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

VERDICT: INSUFFICIENT P1–P3, H1–H11 (including H7b), N1, E1, S1, W1, I1, C1/C2, R1/R2 require the listed recordings and current-head profiling evidence.
