# Independent proof fixture matrix — pass 1

PR [#32840](https://git.cafe/pingdotgg/t3code/pull/32840), reviewed head [2beab6c9d5](https://git.cafe/pingdotgg/t3code/commit/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d), against its merged main parent [ac5e48c612](https://git.cafe/pingdotgg/t3code/commit/ac5e48c612061895511f549d363a2186a6a005ea).

This matrix was derived from the changed source and its callers before consulting the existing matrix or evidence write-up. No intended visual change: the changed branches depend on writer identity and committed tab activity, not presentation data. NativeStackScreenOptions renders null. NativeHeaderToolbar renders only that options component. The native header consumes its output elsewhere.

## Findings and required-row coverage

**No missing required capture rows. No additional capture requested.** The fix has sufficient primary state proof and the requested native compatibility evidence. This is a proof-sufficiency verdict for the writer/reader state defect, not a claim to have reproduced the intermittent TestFlight startup failure.

I independently ran the current test file: 10 passed. A read-only Vite pre-load overlay replacing only the two implementation modules with baseline main contents produced exactly 3 failed / 7 passed. All three new cases failed with an empty retained toolbar instead of New chat. Main at the current merge parent and the original capture baseline have identical versions of both implementation modules. Neither implementation nor test source was modified.

The implementation patch has identical stable patch-id `e2900512605b3c952eb99238bbfa0030b9424cfc` at captured and reviewed heads. No file under apps/mobile/src/native changed in the head's merge. I checked the merged AdaptiveWorkspaceLayout diff: it changes Android navigation-rail/sidebar geometry; navigationRailWidth is zero on iOS, so those arithmetic/layout changes do not invalidate the folded-iOS fixture.

| Required row | State / effect | Kind | Status | Inspected evidence and reason |
|---|---|---|---|---|
| C1 | Folded Chats cold-launch endpoint; New chat + Search | still | **Covered** | PR-body retake [before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8ff9d2ae8b6ca544/C1-before.png), [after](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ff1a4e870e5d612c/C1-after.png), [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/61b4eedeeac84ee5/C1-Diff0.png), [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/51cadb4720d6945e/C1-DiffT.png). All four opened. Both stills are 466×678, clock 5:36, three ages <1m; independently computed ImageMagick AE is 0. |
| I1 | Chats → New chat → Choose project → Back → Chats | recording | **Covered** | [I1-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/631aa734d8c4e3e3/I1-before.mp4), [I1-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c45624612a86d188/I1-after.mp4), 15.130 s / 14.648 s. ffmpeg decoded both; 2 fps contact sheets inspected. Picker at ~4.5 s, brief New thread during Back at ~13.5 / ~13 s, Chats with compose/search by ~14 / ~13.5 s; final endpoints contain both controls. |
| I2 | Chats → PRs → Chats; retained-tab handover | recording | **Covered** | [I2-before.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b5607f0274d8d0ee/I2-before.mp4), [I2-after.mp4](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c653e599870ac685/I2-after.mp4), 173.912 s / 11.562 s. Decoded at 2 fps; inspected first 12 s plus before tail samples through 173.5 s. PRs Search-only plateau then Chats with compose/search at ~10 s. Before's long idle tail is disclosed and does not obscure the round trip. |
| H1 | Stable right items, writer replacement | unit trace; recording if visualized | **Covered** | Existing screen-options-writer regression test independently red on main / green on head. No normal-app capture is claimed to force replacement identity; extra harness video is unnecessary. |
| H2 | Stable right items, active reader replacement | unit trace; recording if visualized | **Covered** | Existing retained-reader regression test independently red/green. I2 is an app integration analogue, not evidence that a reader identity actually changed. |
| H3 | Commit inactive reader then unmount retained toolbar | unit trace; recording if visualized | **Covered** | Existing inactive-unmount regression independently red/green. A successful tab round trip alone cannot prove this cleanup; the state assertion does. |

### Additional linked media and documentation consistency

I also opened all four older C1 files in the linked evidence write-up: [before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/52ab2a2196eb1fc2/C1-before.png), [after](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a985fb67096cd45c/C1-after.png), [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/59d4f304ce92be51/C1-Diff0.png), [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/59c5d40859d59707/C1-DiffT.png). These show the same toolbar; differences are clock 4:33 versus 4:52 and thread ages 53m versus 1h. They are superseded for the exact matched-still claim by the PR-body retake; no recapture is necessary. Their different metrics in evidence.md are for different files, not a contradiction in the accepted retake.

The existing matrix also links four historic GitCafe attachment stills. I downloaded/opened each: [E1](https://git.cafe/api/attachments/attach_01m6wy801qfk59537eh2gkhxsv), [E2](https://git.cafe/api/attachments/attach_01m6wy80rxfk59537p5ygqpmtx), [E3](https://git.cafe/api/attachments/attach_01m6wy81bffk59537xhbv6kn9y), [E4](https://git.cafe/api/attachments/attach_01m6wy81xzfk5953819et2m2e0). They all show resting folded Chats with both controls and different synthetic thread titles/ages. They are historical corroboration only: E3/E4 would be insufficient for interaction proof on their own, which the newer I1/I2 recordings now provide.

The old matrix's X1 concerns causal reproduction of the persistent production startup report. It is expressly outside this state-fix capture sufficiency pass. The PR already acknowledges that limitation. Do not ask a capturer for more resting shots, devices, or themes to fill X1; none would establish that causal link.

Media completeness: 12 still/diff images and 4 recordings opened through local image viewing / ffmpeg contact sheets. All 4 recording SHA-256 values match the uploaded capture-proof.json. This is sampled frame inspection, not an assertion that every native frame is artifact-free. No new app/device run was started.

## Complete changed-component branches

| Component/path | Input partition / visible result | Diff impact and collapse |
|---|---|---|
| Screen option destination | Workspace slot setter + defined route key; otherwise navigator; absent navigator gives null | New writer is included in application signature for either real destination. One identity transition is sufficient at this boundary; no native geometry differs by destination. |
| Screen option application | Options undefined / writer null: no write; inactive tab: reset signature and do not write; active: same writer + same signature skips; new writer or changed options/version writes | Writer transition is changed. Active/inactive guard and options normalization unchanged. |
| Option data | Boolean/number/string/null/undefined, functions, symbols/bigints, arrays/objects, React elements/types, refs/cycles; headerTintColor string conversion | Existing signature/wrapper algorithms unchanged. Changed writer must reapply every shape; no new shape-specific behavior. |
| Screen subscriptions | No navigation/listeners versus listeners subscribed and unsubscribed | Unchanged. name prop is unused. |
| Toolbar placement | left; explicit right or omitted placement; bottom | Cleanup target differs (left/right/headerToolbar items). SearchBarSlot filtered out for top items and retained at bottom. Changed reader cleanup is common to all placements. |
| Toolbar contents | Empty/invalid children; one or multiple buttons; custom valid React element; menu with direct/nested/inline actions; fixed (default 8 or supplied width) / flexible spacer; search placement | Converter unchanged. Same lifecycle fix applies to all. Label helper includes string/number/nested element text, ignores unsupported values; Label alone produces no header item. |
| Button presentation | Label or accessibility-label fallback; symbol/image/no icon; disabled; axis/visibility priority; shared/separate background; tint; plain/done/prominent; identifier | Unchanged layout/presentation fields. onPress dispatches current committed handler, absent handler is a no-op. |
| Menu presentation | Title/accessibility label; icon; disabled; axis; shared/separate background/tint/variant/identifier; empty/nonempty/nested items; selected/on; destructive; subtitle/discoverability label; inline submenu | Unchanged converter and dispatch. |
| Toolbar lifecycle | No activity provider, active reader, inactive reader; same/replaced writer; same/replaced reader; changed children/route.params; committed versus discarded render; unmount | New committed reader ref eliminates cleanup on reader replacement and uses latest committed reader on unmount. Writer replacement still clears old destination and must refill new one. |
| Theme / dimensions / platform / time | No theme, width, length, loading, error or timer conditional in either changed component. iOS uses real toolbar; Android resolves toolbar to a null stub, but shared ScreenOptions remains active. | No Cartesian product of colors/viewports/content counts is justified for this state fix. Upstream branches below are documented and unchanged. |

## Caller render paths and all upstream presentation partitions

Every direct caller of NativeStackScreenOptions: NativeHeaderToolbar; AppBar (iOS and Android); SheetDismissGuard and NativeSheetHeader (iOS); SheetHeader (Android); WorkspaceRootContent (iOS); WorkspaceRoot (Android, two hide-header paths); SidebarColumnHeader; WorkspaceListEmptyDetail; WorkspaceExtraTab; WorkspaceToolbar.

Toolbar is the sole production wrapper of NativeHeaderToolbar. With placement it delegates; without placement it renders an iOS glass container / Android floating toolbar and is outside the changed root. The Android placed toolbar is a null stub. ScreenHeaderButton is an alias of Toolbar.Button on iOS.

| Caller family | All conditional partitions that influence native header output | Seeding / representative unchanged fixture |
|---|---|---|
| WorkspaceRootScreen | Settings / zero enabled tabs / Chats / PRs / Usage; title brand versus text; split/primary sidebar/pad/native vertical rail; width and trailing-item width; Liquid Glass versus opaque header; empty title/search/items clears; compact/system/sidebar tabs; keyboard/bottom clearance affects content | Paired app; select each registered tab and vary supported device/window and sidebar. R1 = no enabled tabs requires a labelled harness: only three sections exist and navigation customization is gated until >4; hidden preferences are currently ignored. R2 = split list brand and filter. |
| WorkspaceToolbar | Folded Duo compose only in Chats with no active draft; folded Search versus Close search; settings scope menu; non-Duo regular compose when not pad split/picker/floating; pre-Glass search button; tab resting/active/expanded query; bottom search slot only visible when search visible and sidebar not picker; optional bottom navigation buttons; hidden/unpresented primary column; focus/restore on transition and keyboard shortcut | Paired synthetic projects/threads, Chats; New chat/back; PRs/back. R3 = enter/query/close search (recording); R4 = Settings and scope menu (recording); R5 = Usage/section toolbar. |
| WorkspaceSectionToolbar | Compose enabled versus disabled; suppressed for picker/unfolded/compact; optional bottom tab buttons; enabled tab count/order/selected tint; PR image icon versus symbol | Select Usage; a labelled harness is needed for arbitrary enabled/hidden tab counts because customization is currently gated. R5, unchanged. |
| WorkspaceListHeader | No sidebar returns null; sidebar width / trailing count affect brand; customized filter icon; nested menu content; sidebar shown/hidden; stacked search and delayed keyboard focus after reveal | iPad/unfolded split, Chats, filter/search. R2 (recording for reveal/filter/search), unchanged. |
| WorkspaceListEmptyDetail | Empty title and cleared left/right/bottom/search, then left New task; connection/add-connection and sidebar visibility affect empty content only | Split Chats without selected detail. R6 = empty detail with left compose, unchanged. |
| WorkspaceExtraTab | Clears search then Usage | Select Usage. R5, unchanged. |
| AppBar iOS | embedded/sheet return null; inspector owns bar; Back/Close/guarded Back/split Back/sidebar/compose; back visibility; title/subtitle absent/nonempty/long; match-search surface; search absent/compact mail/inline or integrated/stacked and Duo bottom; first menu moved into compact filter versus remaining menus; 0/1/many actions and menus; action loading custom spinner; trailing content; confirmation absent/disabled/loading/prominent; inspector close | Project picker in I1 is representative title/back/action/search. Other examples: Thread, Files, PR detail/review, Settings, Connections; isolate using synthetic stopped thread/file/PR and UI settings. R7 = loading custom header, R8 = nested menu (recording), R9 = confirm busy to enabled (recording); unchanged. |
| SheetHeader iOS | native/default versus inline; optional dismissal guard; Cancel versus Close label; dismiss disabled; title/subtitle; 0/1/many actions/menus; action disabled or loading; trailing custom content; confirmation absent/disabled/loading/prominent. Inline header does not use changed native toolbar (dismiss guard still may apply) | Thread menus: Agents, Queue, Branches, Git confirmation, thread settings, arrangement, snooze; synthetic stopped thread and local git fixture. R10 = native sheet close/confirm/menu (recording); inline static header exempt. |
| PR bottom toolbar | Vertical controls versus horizontal with flexible spacers; files control; optional agent menu; merge/other primary control; nested thread menus, disabled/destructive/selected actions | Synthetic PR linked to a stopped thread, open PR details. R11 = PR bottom controls (recording), unchanged. |
| AppBar / SheetHeader / WorkspaceRoot Android | Native toolbar stub; inline Android header controls; workspace app-bar versus standalone; search open/closed/inline/controlled, hardware Back; optional match-search background, title and headerShown false; sheet optional gesture guard; split versus compact root | Android paired synthetic data, same routes. R12 = Android custom header (recording for navigation), unchanged presentation; shared writer logic covered at lowest unit layer. |
| Writer hosts | React Navigation navigation cache; compiler-cached retained workspace slot setter and activity reader; memoized inspector slot setter | No normal RPC can force context/function identity replacement or discarded React commit. Label these transitions as unit harness fixtures H1–H3 below, not an asserted real-device reproduction. |

Theme (light/dark), standard/large font, short/long text, empty/one/many/loading/error body data, phone/pad/folded/unfolded and portrait/landscape remain existing upstream presentation axes. Counts affect native item arrays and upstream content, but the changed lifecycle predicates do not inspect them. R1–R12 are reference families, not additional required captures for this diff. Each unique converter branch is listed above; combinations compose without introducing new changed behavior.

## Minimum fixture and proof set

Required native capture product: one relevant viewport × one theme × three rows = folded Duo outer display 466×678 pt, portrait, iOS with Liquid Glass, light, standard font; before and after C1, I1, I2. Two synthetic projects and three stopped threads; enabled Chats and PRs; no active draft; connected environment; stable clock/ages for still comparison. Theme/viewport multiplication is unnecessary because no new visual branch exists.

| Row | Diff affected? | Named fixture, data and expected output | Kind | Real-app seeding / driver | Minimum proof |
|---|---|---|---|---|---|
| C1 | Lifecycle applies; static layout unchanged | Cold launch, active Chats; New chat + Search visible, 2 projects / 3 stopped threads | still | Pair dev client with isolated synthetic server; Chats selected, no active New task; relaunch into Chats | Matched before/after stills and diff |
| I1 | Toolbar unmount/remount and writer reuse/reapplication | Chats → New chat → Choose project → Back → Chats; New chat + Search restored | recording | Same seed as C1; tap New chat, wait for picker, tap Back; capture entire return and settled header | Before/after recording; stills insufficient |
| I2 | Retained activity handover and restored toolbar | Chats → PRs → Chats; Search-only PRs then New chat + Search in Chats | recording | Same seed; PRs tab enabled (empty PR list acceptable); switch tabs and return; capture settled header | Before/after recording; does not prove a reader identity replacement |
| H1 | Yes: writer included in signature | Stable right New chat items; replace navigation context/writer identity, same contents; must retain New chat | recording if visually captured; primary proof is unit test | No deterministic normal-app driver; labelled React/navigation harness using current regression table, baseline implementations versus head | Failing-before / passing-after unit test; no extra capture required for this nonvisual state bug |
| H2 | Yes: reader replacement no longer clears header | Active reader replaced with a new active reader, stable toolbar children; must retain New chat | recording if visually captured; primary proof is unit test | No normal RPC controls reader identity; labelled activity-context harness regression table | Failing-before / passing-after unit test; no extra capture required |
| H3 | Yes: cleanup consults latest committed reader | Render active, commit inactive reader, unmount; do not clear visible header | recording if visually captured; primary proof is unit test | No deterministic normal-app route to force retained inactive subtree teardown independently; labelled context harness | Failing-before / passing-after unit test; no extra capture required |

Existing parameterized left/right/bottom handler tests, custom-element equality test, suspended-render test and post-unmount handler isolation test cover the unchanged surrounding branches. They are not replaced by native recordings.

## Expanded fixture coverage (unchanged presentation variants)

These rows enumerate the visually different upstream fixtures for completeness. They are **not** extra requirements for this nonvisual lifecycle fix. “Missing, optional” means no dedicated capture exists and none should be added for this pass. All interaction or time-dependent rows are recordings; their still endpoints alone would be insufficient if those behaviors were claimed.

| Row | Visually distinct fixture / data | Diff effect | Capture type / viewport × theme | Seed route or labelled harness | Current status and file/reason |
|---|---|---|---|---|---|
| V1 | Folded Chats with active draft: compose intentionally absent | Shared lifecycle only; conditional unchanged | recording, folded 466×678/light | Chats → New chat into existing draft flow | Missing, optional dedicated fixture; I1 shows the new-task navigation analogue. No defect inferred from intentional compose absence. |
| V2 | Folded search active: Close search, bottom field/keyboard; query empty/matching/no-match has same toolbar | Shared lifecycle only | recording, folded/light | Chats → Search → type → close; hardware search shortcut equivalent | Missing, optional; no search-open recording linked. |
| V3 | Folded PRs resting: Search only, zero PRs | Shared lifecycle only | still extracted from recording, folded/light | PRs tab with same synthetic server | Covered by I2-before.mp4 and I2-after.mp4, middle plateau ~4.5–9.5 s. |
| V4 | Folded Settings: Search + scope menu with selected/nested choices | Shared lifecycle only | recording, folded/light | Settings → environment scope menu → return | Missing, optional; no linked menu-open capture. |
| V5 | Ordinary current-iOS iPhone compact/floating tabs: header compose absent by design | ScreenOptions writer shared, layout unchanged | still, ordinary phone default portrait/light | Same seed on non-Duo phone | Missing, optional; folded captures do not cover this device. |
| V6 | Legacy iOS: explicit compose/search and stacked search | Shared writer, capability branch unchanged | recording, older-iOS phone/light | Compatible OS device; labelled capability harness if unavailable | Missing, optional; cannot seed OS support through an appearance setting. |
| V7 | Unfolded Duo: picker or vertical rail/sidebar columns; compose in detail, search placement changes | Shared left/right/bottom lifecycle | still for resting; recording for reveal/rotate, unfolded/light | Unfold/rotate, show sidebar, no selected detail; repeat rail state if claiming it | Missing, optional; two geometries documented, no new fix-specific branch. |
| V8 | iPad split sidebar: brand width and 1/2 trailing items; sidebar reveal/filter/search | Shared writer, width/count formula unchanged | recording, iPad split/light | Paired synthetic thread, reveal sidebar; exact count via labelled header harness | Missing, optional; no iPad capture linked. |
| V9 | Usage: search cleared, section toolbar; bottom tabs where sidebar toolbar used | Shared writer, clear payload unchanged | still, folded/light; wide variant optional | Select Usage; synthetic usage data not needed | Missing, optional. |
| V10 | Navigation with zero enabled sections: empty right/search items | Shared writer, empty branch unchanged | still, labelled iOS harness/light | Cannot seed through shipped UI/preferences while three-section customization gate is off; inject zero sections | Missing, optional harness; do not send a capturer to a nonexistent settings control. |
| V11 | Compact AppBar: picker title, Back, Add project action, search | Shared left/right/native option lifecycle | recording, folded/light | New chat with two pickable projects and permission to add | Covered by I1-before.mp4 and I1-after.mp4, Choose project plateau ~4.5–12.5 s. |
| V12 | AppBar split/inspector: sidebar, split Back/compose, close inspector; long title/subtitle | Shared writer; left item combinations unchanged | recording, unfolded/pad/light | Open synthetic Thread → Files/Browser inspector; close; synthetic long names | Missing, optional; I1 covers compact AppBar only. |
| V13 | Button/menu payloads: nested/direct action, selected/disabled/destructive/subtitle, image/SF/no icon | Shared handler refs; converter unchanged | recording if visualized, labelled harness/light | Exact combined flags via harness; file/filter menus are real analogues | Covered for unchanged handler behavior by left/right/bottom unit table; missing optional native menu-open capture. |
| V14 | Custom/loading header: Connecting → Reconnecting; action/confirm busy → enabled | Shared factory lifecycle; presentation branches unchanged | recording if visualized, labelled harness/light | Exact states via controlled harness; native analogues connection recovery or pending synthetic save | Covered for custom-element update by existing test; missing optional native busy capture. |
| V15 | Native sheet: Close/Cancel, title/subtitle, optional actions/menus/trailing, disabled or loading confirm/dismiss | Shared left/right writer, guard payload unchanged | recording, iPhone/light | Open Branches/Git confirmation/Review sheet with synthetic repo; exact flags via harness | Missing, optional; no native sheet sequence linked. |
| V16 | Inline sheet / embedded or sheet AppBar | Only optional gesture guard goes through ScreenOptions; toolbar bypass | still for static layout, recording for dismissal, iPhone/light | Inline preview sheet; exact props via labelled harness | Missing, optional; inline controls do not use changed toolbar root. |
| V17 | PR bottom controls horizontal: helpers, primary, Changed files with flexible spacers; absent/disabled primary; zero/one/many thread menus | Shared bottom lifecycle, converter/ordering unchanged | recording, ordinary phone/light | Synthetic loaded PR; local draft comment changes primary; no actual submission | Missing, optional native fixture; retained bottom actions tested. |
| V18 | PR bottom controls vertical rail: files/helpers/primary, no spacers | Shared bottom lifecycle, native relocation unchanged | recording, Duo with rail/light | Same synthetic PR; supported rail layout | Missing, optional; resting Chats cannot cover PR controls. |
| V19 | Android workspace/standalone/embedded header and sheet guard | Shared ScreenOptions writer; toolbar is null stub | recording for navigation/search, Android/light | Paired synthetic data, Thread/Back, sheet/search | Missing, optional; iOS evidence does not imply Android visual verification. |
| V20 | No writer or undefined options; empty/invalid toolbar children; active/unscoped cleanup | Shared signature/cleanup guards; no new layout | recording if visually captured, labelled harness | Context without navigator; undefined options; empty children; unmount for left/right/bottom | Covered for no-navigator write and retained action cleanup by existing tests; no additional native capture required. |

Dark theme, long text/large font, empty/loading/error **body** content and other widths are optional modifiers of these unchanged fixtures. No changed branch inspects these inputs, so none multiplies the minimum capture product.

## Source caller inventory

Direct wrapper/component callers are exhaustively listed below (production source only). These are locations, not new capture requests.

### NativeStackScreenOptions

- [apps/mobile/src/components/ui/SheetHeader.android.tsx:43](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/SheetHeader.android.tsx#L43)
- [apps/mobile/src/components/ui/SheetHeader.tsx:40](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/SheetHeader.tsx#L40)
- [apps/mobile/src/features/layout/workspace/WorkspaceExtraTab.tsx:10](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceExtraTab.tsx#L10)
- [apps/mobile/src/features/layout/workspace/WorkspaceRootScreen.android.tsx:57](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceRootScreen.android.tsx#L57)
- [apps/mobile/src/features/layout/workspace/WorkspaceRootScreen.android.tsx:90](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceRootScreen.android.tsx#L90)

### NativeHeaderToolbar

- [apps/mobile/src/components/ui/Toolbar.android.tsx:10](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/Toolbar.android.tsx#L10)
- [apps/mobile/src/components/ui/Toolbar.tsx:6](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/Toolbar.tsx#L6)

### Toolbar

- [apps/mobile/src/components/ui/AppBar.tsx:153](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/AppBar.tsx#L153)
- [apps/mobile/src/components/ui/AppBar.tsx:161](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/AppBar.tsx#L161)
- [apps/mobile/src/components/ui/AppBar.tsx:196](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/AppBar.tsx#L196)
- [apps/mobile/src/components/ui/AppBar.tsx:251](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/AppBar.tsx#L251)
- [apps/mobile/src/components/ui/SheetHeader.tsx:61](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/SheetHeader.tsx#L61)
- [apps/mobile/src/components/ui/SheetHeader.tsx:70](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/components/ui/SheetHeader.tsx#L70)
- [apps/mobile/src/features/layout/workspace/WorkspaceListEmptyDetail.tsx:31](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceListEmptyDetail.tsx#L31)
- [apps/mobile/src/features/layout/workspace/WorkspaceSectionToolbar.tsx:69](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceSectionToolbar.tsx#L69)
- [apps/mobile/src/features/layout/workspace/WorkspaceSectionToolbar.tsx:78](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceSectionToolbar.tsx#L78)
- [apps/mobile/src/features/layout/workspace/WorkspaceToolbar.tsx:188](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceToolbar.tsx#L188)
- [apps/mobile/src/features/layout/workspace/WorkspaceToolbar.tsx:193](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceToolbar.tsx#L193)
- [apps/mobile/src/features/layout/workspace/WorkspaceToolbar.tsx:217](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceToolbar.tsx#L217)
- [apps/mobile/src/features/pull-requests/PullRequestControls.tsx:159](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/pull-requests/PullRequestControls.tsx#L159)
- [apps/mobile/src/features/pull-requests/PullRequestControls.tsx:275](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/pull-requests/PullRequestControls.tsx#L275)
- [apps/mobile/src/features/pull-requests/PullRequestControls.tsx:282](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/pull-requests/PullRequestControls.tsx#L282)

### AppBar

- [apps/mobile/src/features/development/ComponentCatalogScreen.tsx:62](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/development/ComponentCatalogScreen.tsx#L62)
- [apps/mobile/src/features/files/AttachmentFileScreen.tsx:245](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/files/AttachmentFileScreen.tsx#L245)
- [apps/mobile/src/features/files/ThreadFilesRouteScreen.tsx:421](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/files/ThreadFilesRouteScreen.tsx#L421)
- [apps/mobile/src/features/layout/workspace/WorkspaceListEmptyDetail.tsx:38](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceListEmptyDetail.tsx#L38)
- [apps/mobile/src/features/layout/workspace/WorkspaceRootScreen.android.tsx:91](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/layout/workspace/WorkspaceRootScreen.android.tsx#L91)
- [apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:832](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx#L832)
- [apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:185](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx#L185)
- [apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:202](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx#L202)
- [apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:932](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/NewTaskDraftScreen.tsx#L932)
- [apps/mobile/src/features/threads/ThreadRouteScreen.tsx:143](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/ThreadRouteScreen.tsx#L143)
- [apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1264](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/ThreadSettingsSheet.tsx#L1264)

### SheetHeader

- [apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:132](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx#L132)
- [apps/mobile/src/features/threads/ThreadAgentsSheet.tsx:130](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/ThreadAgentsSheet.tsx#L130)
- [apps/mobile/src/features/threads/ThreadBackgroundWorkSheet.tsx:64](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/ThreadBackgroundWorkSheet.tsx#L64)
- [apps/mobile/src/features/threads/ThreadQueueControl.tsx:362](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/ThreadQueueControl.tsx#L362)
- [apps/mobile/src/features/threads/git/GitBranchesSheet.tsx:218](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/git/GitBranchesSheet.tsx#L218)
- [apps/mobile/src/features/threads/git/GitConfirmSheet.tsx:173](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/git/GitConfirmSheet.tsx#L173)
- [apps/mobile/src/features/threads/thread-inspector-preview.tsx:42](https://git.cafe/pingdotgg/t3code/blob/2beab6c9d5a70bf5d02cd9da2c6d9fba0290b12d/apps/mobile/src/features/threads/thread-inspector-preview.tsx#L42)

## Audit execution and friction

All downloaded media, extracted frames, scripts, manifests and raw logs remain under `/tmp/lead-32840-r2/proof-audit-1/`. No files were deleted. The supplied worktree remains clean. Test and ffmpeg sessions completed; no server, device lease, browser tab or persistent process was started. Finished within the 45-minute budget.

FRICTION:
- tool | Python urllib downloads returned HTTP 403 although curl retrieved the same public files successfully; switched to curl. | Document curl as the supported evidence downloader in this environment.
- tool | Pillow is absent; contact-sheet creation used installed ImageMagick montage instead. | Name ffmpeg and ImageMagick as the available media-inspection tools.
- brief | Linked matrix/evidence documents predate the accepted C1 retake and newer recordings; they describe superseded files and gaps. | Link a consolidated current evidence index or label the older reports as historical.

VERDICT: SUFFICIENT
