# Proof audit, pass 1 — [#32936](https://git.cafe/pingdotgg/t3code/pull/32936)

Read-only audit of [4980e33628](https://git.cafe/pingdotgg/t3code/commit/4980e3362893ef185de653a8c2350e3b034f9013) against main at [80e1e4d14d](https://git.cafe/pingdotgg/t3code/commit/80e1e4d14dddae107d017ed8a1baf0acd3389f17). Branch `fix/issue-32884`. Source: clean supplied worktree and the saved PR body; live GitCafe metadata agrees with both SHAs. No source edit, push, comment, review, server, simulator, lease or new worktree.

## Findings

1. **Proof-package repair needed for exactly F2, F3, F5, F8, I2 and G1.** The intended states and useful before/after frames already exist. Their published comparisons highlight pixels the PR does not change; under this audit’s explicit evidence rule, those comparisons do not close their rows. Repair the comparison regions using the existing frames before scheduling more device work. F2/F5/I2 need inspector-only comparisons; F3 needs its status clock excluded; F8 needs a labelled timestamp-excluding comparison; G1 needs the actual run1 before/after inspector, not run3’s before/before pair. No code regression is established by these proof gaps.
2. **Earlier capture heads are acceptable for these fixture render paths.** `git diff ca796d5211 eb39186ba6 -- apps/mobile` is exactly the PR’s five files (13 insertions,16 deletions), not a Legend List upgrade. `eb39186ba6..f76e21be6c` changes comments only. The first-parent path `f76e21be6c..4980e33628` contains only three main merges. The feed, sidebar, useBarInset implementation, native column metrics/wrappers, and iOS workspace navigator have no intervening runtime edits. Later mobile edits are file preview/assets plus AdaptiveWorkspaceLayout. The latter changes Android rail reservation: `shouldRenderNavigationRail` requires Android, so its width is0 on iOS; nativeWorkspace also returns before the changed fallback JSX. The listed iOS fixture geometry remains equivalent. Closed file/video modals and feeds without attachments do not exercise the preview changes. The PR body’s current “only preview/asset changes” and “final head22c0b10456” statements should be corrected, but they do not force blanket recapture.
3. **Do not reuse inflated historical capture requirements.** The old matrix’s separate required pending-Search row, full compact-glass send lifecycle, and both-OS exhaustive resize matrix partly rested on a renderer-upgrade claim which does not apply between these capture SHAs. This matrix keeps them visible as inventory, not new blockers. S6a shares the same one-line empty-list geometry as S6b; S8 and G2 retain identical PR inputs; I4’s actual sidebar resize is represented. G1 remains the one native-inset regression control. Optional rows marked MISSING/INSUFFICIENT below are not silently claimed verified and do not enlarge the minimum.
4. **Interaction proof is real, with limits.** Independent samples extracted from the actual I1/I2/I3/I4/I5/Search videos corroborate the linked contact sheets. I1 has a real disabled/loading checkpoint, successful prepend and first-row/return stills; I2 records retry from a visible wrapped error to success. I3 really sends through the composer into an empty thread and exercises the changed anchor. A pre-existing long-history thread cannot exercise that anchor (`resolveThreadFeedSubmissionAnchor` returns null when there is already a started turn or user message); its incomplete return-to-end clip is not a missing first-send fixture. I4 proves hide/restore, not rotation/dragging. I5 proves keyboard-dismissed older-message landing, not a fix for the existing keyboard-up jump behavior.

## Render-path inventory derived from the current source

- **Sidebar caller and wrappers:** `WorkspaceThreadSidebar` is the sole JSX caller of `ThreadNavigationSidebar`; the adaptive/native workspace and Android sidebar host it. `WorkspaceSidebarColumn` supplies an independent native stack/bar. Compact iPhone Home is a different component. Props width/visible control the column, reveal/search shortcut and swipe width; selected thread and all navigation/settings/new-thread/pending/PR callbacks do not branch the new inset. iOS uses AnimatedLegendList + NativeScrollView with automatic content and indicator insets, paddingTop6 and safe-bottom padding. Android uses another list/empty branch with a bottom bar/floating-tabs/FAB clearance. iOS hides its vertical indicator, so enabling indicator adjustment adds no separate visible sidebar-indicator fixture.
- **Sidebar data/branches:** pending rows, normal rows and working/snoozed/settled shelf headers; Show more appends for hidden settled count, with idle/loading/failed states. List counts cover empty, short and overflowing; shelf expansion/pagination change count. Selected/pinned/queued/working/snoozed/time/project/environment/search-match state and long labels change individual row size, not the inset rule. Empty text selects connections loading, Android no environments, searching/no matches, empty project or globally empty. Search changes the native stacked header and keyboard state; results, no matches and clear/cancel are the minimum lifecycle. Filters, row selection/jump, hardware shortcuts, reveal, scrolling/swipe-close and undo are inventoried, not separately recaptured for an unchanged action implementation.
- **Feed caller and routes:** `ThreadFeed` has one JSX caller, `ThreadDetailBody`; `ThreadScreenHost` renders `ThreadDetailScreen` from `ThreadScreenBinding`. `ThreadRouteScreen` reaches it for ordinary threads and nested child inspector; `FullscreenThreadRouteScreen` supplies compact inspector navigation. `draftMode`, `showContent=false`, route fallbacks and the render-error fallback bypass the feed. All providers share this renderer; no provider adapter or network contract changed. Local/remote environments affect data loading, not the inset branch; F5 exercises disconnected data.
- **Inset branches:** `usesAutomaticContentInsets && iOS` gives manual spacer0, explicit native contentInset.top=barInset, indicator top=barInset and first-send anchor offset=barInset+constant. Other iOS paths use measured column.safeArea.top, falling back to SafeAreaContext.top, for spacer/indicator/anchor. Android returns0. Native measurement before/after mount and after resize is temporal; compact/split/inspector examples and I4 cover representatives. The changed material threshold callback is unreachable from live route props and has no visual artifact to capture.
- **Feed layout/data:** unavailable+zero queue returns the early placeholder; unavailable+queue renders the list. Loading suppresses the ready-empty overlay. The ready overlay requires zero presented rows, no setup and no active work. Header children are manual spacer, header setup when no user row, optional history control. With a first user row, setup/working attaches inline. History has no-control, more/idle, more/loading/disabled, more+wrapped error and error-only variants. The footer can contain a pending handoff. `contentBottomInset` comes from composer/status clearance; questions in flow and fitShortFeedToViewport are Android-only. Side insets, compact16/split20 padding, maximum reading width and measured column width affect wrapping, not a new top-inset branch.
- **Feed row inventory/interactions:** guest-pending, run-fold, thinking, work-toggle, activity groups (ordinary, subagent, handoff, secret, link, compaction), user/assistant/agent/automation messages, review comments, attachments, HTML renders and MCP apps inherit one list inset. Length, multiline markdown/code/tools, collapsed/expanded work, fresh entrance, streaming/failed/settled state change their heights. Group disclosure, selection/copy, links/files/media/playback/share/review/diff navigation and reduce-motion do not add another inset algorithm. Thread change/freeze, end following, jump-to-message, history prepend, first-send anchoring, software keyboard and width reflow are the relevant temporal representatives.
- **Appearance/platform collapse:** light and dark both appear in affected iOS18 paths. Default system text size large is the normal default; use wrapped rows instead of a Cartesian product of text sizes. Stills are 1× points. iPad18 is 1080×810 landscape, iPhone Xs/iOS18 is375×812 portrait; iPad Pro11 M4/iOS26 is1210×834 landscape. Other OS minor versions/font accessibility settings were not recorded. Native encoded video sizes/rotation are not mistaken for device-point viewports.

## Real-app seeding / driver recipes

These are instructions for any repair that truly needs a new app state; none were executed by this audit. All listed fixtures are reachable in the real app unless explicitly HARNESS/source-excluded. Reuse the linked [RPC seed](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/66887c650c1447d1/seed-rpc.mjs) and [driver](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b518792c6594f011/driver.md), adapting task-local paths/actual ports. The seed imports a version-specific ws path and leaves project.create as a documented separate precondition; it is a reference driver, not portable unchanged.

| Seed | Route/state/driver |
|---|---|
| Z | Fresh isolated dev client with no paired environments; open split workspace/sidebar. |
| S | Isolated server: projects.mutate project.create, orchestration.dispatchCommand thread.create; create20 deterministic numbered stopped threads. Use thread.settle/unsettle and archive to expose only intended rows. Pair and cold mount sidebar top. Add an empty long-name project for S4b. |
| S+ | Add long/multiline titles, a unique message-only token, pending/queued/pinned/working/snoozed/settled rows, >10 settled for Show more. Drive mutations through app/RPC. Search native field, dismiss keyboard through native Search/Enter, clear, cancel. |
| P | Existing ready parent with13 completed Replay turns, wrapped markdown/code/tool content and identifiable ROW01/04/07/end. Navigate `t3code-dev://threads/<environment-id>/<thread-id>`. The recent window admits10 user turns, so loaded top is normally ROW04; verify actual metadata rather than assuming a tool-call count forces paging. |
| H | Link a real child using delegated_task.request on the synthetic parent, append13 completed child turns via message.dispatch/subscribeThread. Open its app card into inspector or full-screen phone. Scroll to loaded-page top; use UI control for paging; distinguish loaded ROW04 from actual all-history ROW01. |
| E | Existing thread with ready detail, zero rows/queue/setup/active work. Select it; do not use an unsent new-task draft. |
| U | Create disposable parent/child; cache only parent. Disable that test environment in Settings > Environments. Open uncached child via parent card, producing Messages not cached. Keep parent Worked collapsed to avoid model-label exposure. Do not disable a live environment. |
| Q | Disposable transparent proxy against the isolated environment: hold actual catalog/search/detail request to show pending; fail the real earlier-history HTTP request once with contract-valid EnvironmentInternalError, then pass through retry. No fake component props. Error-only history may use a labelled schema-valid snapshot fixture; no separate required capture. |
| R | Free Replay(dev), existing empty/short thread; type and send through actual composer for native keyboard and anchor. Await persisted completion for stills. RPC-only send is adequate for settled F8 geometry, not I3 interaction. |
| W | Disposable worktree setup held by a task-local setup hook; or labelled schema-valid synthetic projection in isolated stopped server state. No live userdata writes. Include with/without first user row, then release work. |
| HARNESS | I7 has no current visual consumer. Only a labelled component harness with an explicit callback consumer could demonstrate it; do not present such a frame as a real route. |

Any new session must use the device-pool lease and test-t3-mobile workflow, matching native client, isolated home and single origin. No paid provider is necessary. No tests or new captures were run for this read-only proof audit.

## Matrix

**Minimum =16 rows.** Still rows use a controlled Before/After/Diff0/DiffT package; transition rows require recordings and their specified settled checkpoints. COVERED never endorses a separately rejected full-screen diff. INVENTORY/source-excluded rows are included to enumerate branches; MISSING there does not mean a new mandatory capture. Preserve IDs from the older matrix for handoff.

| Row | Fixture / necessary data | Diff relevance | Minimum viewport × theme × proof | Seed | Status | Existing capture |
|---|---|---|---|---|---|---|
| S1 | 20 stopped ordinary threads, numbered newest first; unfocused Search, cold mount at top | Affected: iOS list automatic top inset | iPad18 landscape, light; still quartet | S | COVERED | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/06e36e1830570e22/before-S1.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4d6f91d852f252a5/after-S1.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/911f9bb3503b5382/S1-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e18d5ee8c8441759/S1-diffT.png); 20/19 hidden before; 20 below Search after. No unrelated diff regions. |
| S2 | Zero rows / no paired environments: No threads yet | Affected: same iOS list, ListEmptyComponent | iPad18 landscape, light; still quartet | Z | COVERED | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/41e0c6a92b20ec35/before-S2-clean.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2b18f4fd8e6118be/after-S2-clean.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e5c770a4ff9fc9cd/S2-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/329700ceffff9ce2/S2-diffT.png); empty label clears Search. |
| S3 | Pending, selected, pinned, queued, working, snoozed, settled, long thread/project/environment labels; short and scrolling counts | Same list-level inset; row decorations do not branch the new calculation | Inventory; representative long/multiline rows in S5/I4 | S+ | INVENTORY — no separate capture required | [S5 results crop](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b38e3a34262b5205/after-S5-sidebar.png) covers wrapped labels; individual decoration states are not claimed visually verified. |
| S4a | Connections loading: Loading threads… | Same one-line ListEmptyComponent as S2 | Inventory; recording if collected | Q | MISSING — inventory only | No linked loading checkpoint; collapsed into S2 for the inset proof. |
| S4b | Empty selected project; long project name wraps No threads in… | Same empty wrapper/top edge; variable label height | Inventory; use long empty-project label if independently checking text wrapping | S | MISSING — inventory only | No dedicated attachment; unchanged text layout, no new inset branch. |
| S5 | Focused native Search: matching title/message rows; keyboard; clear and cancel | Affected: native Search changes header/keyboard layout | iPad18 landscape, dark; recording plus result still/cropped diffs | S+ | COVERED | [Before Search recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5e2ede702b3dd3e0/before-S5S6b.mp4) / [After Search recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/35797ca343881fb3/after-S5S6b.mp4); [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cb1db37349a8c722/before-S5-sidebar.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b38e3a34262b5205/after-S5-sidebar.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/eac05aa56fac32c0/S5-sidebar-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/66be024759eca7db/S5-sidebar-diffT.png). Use the sidebar crops. Full-screen comparisons and the clear/cancel counter comparison are rejected as controlled diffs: unrelated parent position and Working(1) differ. Recordings still show focus, results, clear, cancel. |
| S6a | Nonempty query, no rows yet, message search pending: Searching thread messages… | Same single-line empty wrapper with focused Search as S6b | Inventory; recording if captured; no independent minimum checkpoint | Q | MISSING — collapsed into S6b | No legible deliberately held pending state in the recordings. The earlier matrix made this separately mandatory; it adds no distinct inset/height path here. |
| S6b | Completed Search with no matches, then clear | Affected: focused-header empty-list branch | iPad18 landscape, dark; recording shared with S5 and still quartet | S+ | COVERED | [Before lifecycle](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5e2ede702b3dd3e0/before-S5S6b.mp4) / [After lifecycle](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/35797ca343881fb3/after-S5S6b.mp4); [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b8caf7734ffe7863/before-S6b-sidebar.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5597d266643f65dd/after-S6b-sidebar.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bcb18a7cd5917fef/S6b-sidebar-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8d0a967e2d59627c/S6b-sidebar-diffT.png). These crops exclude the unrelated parent feed. |
| S7 | Expand/collapse shelves, Show more idle/loading/failed/retry (>10 settled, +25), filters, swipe/undo, selected row and PR actions | Same list inset; data/actions unchanged | Inventory; recording for any interaction claim | S+Q | MISSING — inventory only | No dedicated recording; inset minimum is S1/S5. No claim that these actions were exercised. |
| S8 | iOS26 populated sidebar with native Search toolbar | Unchanged: both list inset props already have their after values | Inventory/control; no extra minimum beyond native-glass smoke G1 | S | INSUFFICIENT — inventory only | [Run1 before G1 full screen](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6b79c3ab0873f3c1/before-G1-top-v4.png) / [Run1 after G1 full screen](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fa8c5aa08f5d37cd/after-G1-top.png) have different sidebar data/order; [after-S8-clean](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/1d590f8b2b3489b5/after-S8-clean.png) has no matched before. Do not call S8 covered. No fresh device capture required for this invariant branch. |
| F1 | Ready ordinary parent; long wrapped markdown/code/tool history; top of loaded page with earlier-history control | Affected: manual spacer before list header | iPad18 landscape, light; still quartet | P | COVERED | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3401ddf491175524/before-F1-pane.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6a868354673a5c56/after-F1-pane.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c3ca37d099b311d3/F1-pane-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c08164316ef4141e/F1-pane-diff5.png); labelled 730×600 pane crop excludes Expo overlay, sidebar and header strip. Run1 full frames preserve device/header context; clipped first prompt before is the reproduced bug. |
| F2 | Paginated child in narrow 260pt right inspector; loaded-page ROW04, control at top | Affected: separate native column metrics, spacer, wrapped rows | iPad18 landscape, light; still quartet; motion separately I1 | H | INSUFFICIENT — comparison repair | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/0fa27d0aeffa7fd2/before-F2.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/92d1e9a06b0f6379/after-F2.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8481778c25777c73/F2-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/4917a47b764d6523/F2-diffT.png); geometry is good, but parent replay duration labels differ (360/356ms, 612/651ms, etc.) and light up the full diffs. Repackage these existing frames as the inspector crop, preserving its native header, e.g. 260×740+820+24. No new app state is missing. |
| F3 | Paginated child opened full screen on compact iPhone; loaded-page ROW04 | Affected: compact/native safe-area path; no double gap | iPhone18 portrait, light; still quartet | H | INSUFFICIENT — comparison repair | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/545ba28b3e03d686/before-F3-final.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/50a5a6b03a946f27/after-F3.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/66a8694f010380cb/F3-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/639805347b462424/F3-diffT.png); correct phone/geometry, but status clocks 9:41 and 2:54 light up the diffs. Exclude only the labelled 24pt status strip, retaining the navigation bar (375×788+0+24); use the existing frames. |
| F4 | Existing ready empty thread; no rows, worktree setup, queue or active work | Affected: ready-empty overlay top padding/centering | iPad18 landscape, light; still quartet | E | COVERED | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7dd8fc5da6fd84e6/before-F4-pane.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/83d29902e19e69e7/after-F4-pane.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/13d4cbc083a277a6/F4-pane-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/78c559a89a04dc4d/F4-pane-diff5.png); use the clean body pane crop, not run1 full-screen diffs or the larger run3 crop with Expo/bottom-edge changes. This is not a new-task draft. |
| F5 | Unavailable, no cached detail and no queue; narrow inspector; Messages not cached with wrapped detail | Affected: early return placeholder, separate ancestor from F4 | iPad18 landscape, light; still quartet | U | INSUFFICIENT — comparison repair | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cd7988e5de8eb89c/before-F5.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/308a25d0002c96dd/after-F5.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7dac9285072256ef/F5-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2778eb0ab07ecf6b/F5-diffT.png); correct placeholder, 35pt down after; full diff additionally highlights 5.5s/5.3s parent duration and bottom edge. Use the existing narrow inspector frames cropped to its own column; do not substitute the wide companion for the narrow wrapping state. |
| F5d | Unavailable no-cache placeholder in ordinary detail column | Same placeholder; optional wide companion to F5 | Inventory; iPad18 landscape, light | U | COVERED — optional | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c12237ac9b02f88e/before-F5-detail.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/61050854f85cb361/after-F5-detail.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/c25e3bbee3f9931f/F5-detail-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/225fa2cd0189e3b1/F5-detail-diffT.png); only placeholder and empty-sidebar inset changes are visible in the comparison. |
| F6 | Unavailable but queuedMessages.length > 0: list/guest-pending row instead of placeholder | Affected list spacer; same container as ready list | Inventory; recording if queue transition claimed | U+R | MISSING — inventory only | No dedicated uncached-plus-queue attachment. Distinct branch inventoried; same list inset already represented by F1/F8. |
| F7 | Loading detail with no cache; list mounted, no ready-empty overlay; Loading messages status | Same list/spacer, overlay suppressed by kind=loading | Inventory; recording if held loading state collected | Q | MISSING — inventory only | No accepted steady/loading proof. Do not use a spinner frame as a completed feed capture. |
| F8 | Ready short parent: one completed prompt/reply, no submission anchor; content aligns at end | Affected manual spacer, distinct short-list/end alignment | iPhone18 portrait, light; settled still quartet; sending motion in I3 | R | INSUFFICIENT — comparison repair | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3930bac3299ccc9c/before-I3.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d7a85e326a0745e4/after-I3.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/88af44c6a586164b/I3-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/05b6337bbf518dfb/I3-diffT.png); settled geometry matches, but 3:37/3:38 message/reply timestamps are the only lit-up pixels. Repackage a clearly labelled timestamp-excluding comparison or stage deterministic timestamps; existing raw frames suffice for the geometry. |
| F9a | Worktree setup with no user row: setup card in ListHeader before history control | Affected spacer shifts header card; card internals unchanged | Inventory; still if collected | W | MISSING — inventory only | No setup capture; its list header uses the same spacer as F1/F2. |
| F9b | Setup or working header attached to first user group; setup transitions to work/finished | Same inset, inline card instead of list header | Inventory; recording if claimed | W+R | MISSING — inventory only | No dedicated sequence; grouped row layout does not branch the new top calculation. |
| F10 | Handoff footer, queue, status/approval/question controls, keyboard, fitShortFeedToViewport and bottom clearance | Bottom layout unchanged; new top/anchor scalar shared | Inventory; representative composer/keyboard in I3 | R+W | COVERED only for keyboard/composer representative | [After first-send recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/afa86730b0789ef1/after-I3-anchor.mp4); handoff/setup/approval variants are not individually verified. Android in-flow question/minHeight branch has no runtime delta. |
| I1 | Inspector: tap history control, disabled/loading, prepend, scroll to actual ROW01, away and return | Affected spacer + visible-content/anchor behavior | iPad18 landscape, light; RECORDING | H | COVERED | [Before unreachable-control tap](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fa43c2a029570516/before-I1-v2.mp4) / [After paging recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/28318eaa7667ba62/after-I1.mp4); after tap ~10.6s, loading visible near 11s, ROW01 appears after panning. [First-row still](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3460ab5a6575c9bf/after-I1-first.png) / [Returned settled still](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/a9aa4b6c3fef2d01/after-I1-returned.png) supplement the video end. Before successful prepend is impossible through the covered control, and is not claimed. |
| I2 | Narrow inspector: hasMore=true + wrapped history error; retry/loading/success; before control unreachable | Affected variable-height header immediately after spacer | iPad18 landscape, light; RECORDING plus error still comparison | H+Q | INSUFFICIENT — comparison repair | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8a712e861ddeb568/before-I2.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/75246e3afd71530c/after-I2-final.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2a559a3734b06fa6/I2-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/734be58afeabef49/I2-diffT.png); [After retry recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/e2d9bf4d0b750666/after-I2-retry.mp4) shows error → loading → success/ROW01; [Success still](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/64d20c06c22ddcd0/after-I2-retry.png). The retry is covered. The error comparison includes unrelated 5.2s/5.5s parent timing; crop the existing stills to inspector. Before unreachable versus after error must stay explicitly labelled; no before error is claimed. |
| I3 | First actual composer send into existing empty thread; keyboard, reply, reopen/dismiss keyboard, blank anchored-space pans | Affected anchorOffset = columnTopInset + constant; first-send only | iPhone18 portrait, light; RECORDING plus up/down settled stills | E+R | COVERED | [Before first-send anchor recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3f53c0c4a1410d1a/before-I3-anchor.mp4) / [After first-send anchor recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/afa86730b0789ef1/after-I3-anchor.mp4); [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/278bfdecf4b4a46f/before-I3-anchor-up.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/ed035e8374b354de/after-I3-anchor-up.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/678eebfa1aec1e10/I3-anchor-up-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d8d6a0198c04c874/I3-anchor-up-diffT.png); [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/9fe37fd36639f68d/before-I3-anchor-dismissed.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/23af21384b19fb9f/after-I3-anchor-dismissed.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7ad378971008c12c/I3-anchor-dismissed-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5341e71fa06ee505/I3-anchor-dismissed-diffT.png). The after bubble clears the 88pt header by 16pt. These are first-send clips, not the separate admitted incomplete long-history experiment. |
| I4 | Native detail width changes: hide/restore sidebar while reading identifiable wrapped ROW07 | Affected feed/list layout under actual column width changes | iPad18 landscape, dark; RECORDING | P | COVERED | [Before sidebar resize recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/99f488745787f371/before-I4-final.mp4) / [After sidebar resize recording](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/8bf6493ca819e1d9/after-I4-final.mp4). Own frame samples confirm hide near 8s, restore near 15s, same row retained. 5pt cross-build starting mismatch means published static diffs are not pixel proof; the recordings establish within-build retention. |
| I4b | Orientation/window narrowing, inspector open/close/drag at top/middle/end, glass width changes | Same inset paths as compact F3, split F1/F2, glass G1; broader interaction inventory | Inventory; RECORDING if separately claimed | P+H | INSUFFICIENT — inventory only | [Before glass width clip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d531651a8c475f7d/before-I4-glass.mp4) / [After glass width clip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/634f9188bba407b1/after-I4-glass.mp4) do not execute a matched rotation/width lifecycle. The existing I4 verifies sidebar hide/restore only. No divider dragging, orientation, or every-position claim is accepted; no extra mandatory recording for unchanged resize machinery. |
| I5 | Message-only Search result jumps through older history to ROW04, keyboard dismissed, target remains visible | Affected feed path, existing jump mechanism uses viewPosition .2 | iPad18 landscape, dark; RECORDING | S+P | COVERED | [Before older-message jump](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/de4bb7093335728c/before-I5-v3.mp4) / [After older-message jump](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d0c2e6e3ca725798/after-I5-v3.mp4); [Before landed target](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/89c2d38f396a85f5/before-I5-final.png) / [After landed target](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/80d48b14dcb907c1/after-I5-final.png). Landing at about122/120pt clears header and persists. Does not claim to fix the existing keyboard-up jump issue or prove switch-away/back. |
| I6 | Expand/fold turns/work groups, variable tool/markdown/media/HTML/MCP rows, streaming, copy/link/menu/preview, reduce motion | All rows inherit new list inset; their internal renderers unchanged by PR | Inventory; RECORDING for disclosures/streaming/playback | P+R | PARTIAL — inventory only | I1/I4 contain real wrapped tool/message rows; I3 contains reply growth. No separate media/HTML/disclosure/reduce-motion claim. File preview/asset changes merged later are outside these no-attachment fixture states. |
| I7 | Header material threshold y+nativeInset >6 versus y>6 on spacer path | Changed expression, no live route supplies optional callback | No real-app visual row; harness only if callback is artificially wired | HARNESS | SOURCE-EXCLUDED | ThreadDetailScreen forwards the optional callback but no caller supplies it. No visible header transition can be honestly captured without adding a labelled harness. No capture required. |
| G1 | Native glass inspector at loaded page top; explicit native contentInset; manual spacer remains 0 | Unchanged arithmetic control for native/manual split | iPad26 landscape, light; one controlled still quartet | H | INSUFFICIENT — comparison repair | [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6b79c3ab0873f3c1/before-G1-top-v4.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/fa8c5aa08f5d37cd/after-G1-top.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/bed457d2d43933fb/G1-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2cb6324a042a1f2b/G1-diffT.png) is a real before/after pair, but its diffs highlight changed sidebar data/order and status clock. Crop its inspector, retaining bar/control, instead of full screen. Run3 [control A](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/dd90d23f4b5e2d69/before-G1-top-v4-1-a.png) / [control B](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/767ed006bee77344/before-G1-top-v4-1-b.png) are both BEFORE, [blank Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6bb7684e6ad9ad0e/G1-stability-diff0.png) / [blank DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/cd569a915efd6def/G1-stability-diffT.png) prove temporal stability only; the “G1 complete” heading cannot be used as code comparison. No new native-glass session is necessary. |
| G2 | Compact glass: empty/short send + keyboard/dismissal and long feed top | No PR scalar change: native top inset/anchor unchanged; same list version | Inventory; RECORDING if full lifecycle claimed | E+R+H | INSUFFICIENT — inventory only | [Before compact-glass clip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/569822f9458c1cad/before-G2-I3-final.mp4) / [After compact-glass clip](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/00f02d581fdb8090/after-G2-I3-recovered.mp4) are partial/unmatched and the after has an Expo tools overlay; [Before](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/aa83288978b585ca/before-I3-glass-message-rest.png) / [After](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/aa511437f6efba48/after-I3-glass-rest.png) / [Diff0](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/b9659468cd133363/I3-glass-rest-diff0.png) / [DiffT](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/764c472e283ac772/I3-glass-rest-diffT.png) has an after-only overlay and differing work duration/timestamps. Do not claim this row covered. One G1 native-inset control is the scoped minimum; no second unchanged compact-glass lifecycle is required. |
| G3 | Glass ready-empty/unavailable placeholders | Unchanged topContentInset=0; common placeholder | Inventory; no separate minimum | E+U | MISSING — inventory only | No controlled separate placeholder comparison; do not infer manual top padding on glass. |
| X1 | Android phone/tablet, compact/split, floating tabs/rail, question, keyboard | No PR runtime delta: sidebar separate branch; useContentTopInset returns0 | Source exclusion; no required capture | S+R | SOURCE-EXCLUDED | No Android capture. Later main Android rail fix is not part of this PR’s mobile inset proof. |
| X2 | New-task draft, hidden showContent, route loading/deleted fallback, RenderErrorBoundary fallback; web/desktop; other useContentTopInset users | Bypass ThreadFeed or comment-only/no edited package | Source exclusion; no required capture | App navigation | SOURCE-EXCLUDED | No screenshot is accepted as a substitute for the actual ThreadFeed empty/unavailable branches. |

## Exact finish handoff

- **Device-state recaptures required by this audit: none yet.** First repair F2/F3/F5/F8/I2/G1 from existing raw frames; the original sources are linked in their rows. Do not automatically spend time redoing S1/S2/S5/S6b/F1/F4/I1/I3/I4/I5.
- **F2/F5/I2:** crop the native inspector column including its header, keeping the crop fixed in both sides. Existing iPad18 inspector begins x820 and is260pt wide. A crop around `260x740+820+24` removes parent timings and global clock while preserving bar/control/wrapped text; inspect its bottom before publishing. These are labelled crops, with complete source frames retained.
- **F3:** a fixed `375x788+0+24` removes the unrelated global clock while retaining the navigation header. Recompute both diffs.
- **F8:** use fixed labelled crops that retain bubble/reply/composer geometry and exclude timestamp glyphs, or make a deterministic-timestamp pair. Do not describe a diff containing only generated timestamp changes as visual proof of no change.
- **G1:** choose run1’s real before/after. A fixed inspector crop around `484x800+726+34` excludes the sidebar/clock and retains header/control; this audit measured only3 differing pixels in it with no geometry delta. Inspect the edge pixels/appropriate final scope before publishing. Run3’s two before files and blank diffs are a temporal stability control, not an after build.
- Correct PR prose to the requested current head and disclose the later Android layout merge. The screenshot provenance remains the old captured SHAs; never relabel them as current-head captures.

The broader old matrix’s S6a/S8/G2 and exhaustive I4b remain honestly unverified inventory. G1 is the single retained native-inset regression control. This change does not justify recapturing unchanged media, disclosure, provider, Android, web or desktop paths.

## Source anchors and coverage limits

- [Sidebar row switch](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx#L369)
- [Sidebar empty/iOS/Android branches](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx#L554)
- [Sole sidebar caller](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/layout/workspace/WorkspaceThreadSidebar.tsx#L43)
- [Manual top inset](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/components/ui/useBarInset.ts#L45)
- [Inset and anchor derivation](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/ThreadFeed.tsx#L2773)
- [Scroll/material threshold](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/ThreadFeed.tsx#L3203)
- [Anchored end offset](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/ThreadFeed.tsx#L3298)
- [Placeholder/list/header/empty branches](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/ThreadFeed.tsx#L3635)
- [History control branches](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/ThreadFeed.tsx#L3772)
- [Sole feed JSX caller](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/ThreadDetailScreen.tsx#L1466)
- [Native glass route flag](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/ThreadRouteScreen.tsx#L1043)
- [First-send anchor preconditions](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/threads/thread-feed-scroll-position.ts#L16)
- [Android-only rail condition](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx#L327)
- [Native workspace early return](https://github.com/pingdotgg/t3code/blob/4980e3362893ef185de653a8c2350e3b034f9013/apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx#L949)

Downloaded all193 unique PNG/MP4 resources linked directly or through the four write-ups (about315MB), opened all still/contact-sheet assets in labelled montages and inspected key originals. Also independently extracted frames from10 actual selected recordings, including loading and settled/returned checkpoints. Older recordings explicitly marked partial were not upgraded to complete. No runtime or test result is inferred beyond these artifacts and source checks. The audit completed within the45-minute budget. Scratch downloads/derived images are removed after this report is uploaded; the supplied lead worktree is preserved clean.

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

FRICTION:
- tool | Python urllib received HTTP403 from the evidence host; curl downloaded all resources successfully | use curl for these public attachment URLs.

VERDICT: INSUFFICIENT F2 F3 F5 F8 I2 G1
