# Proof audit pass 1 — minimum fixture matrix

Read-only source audit; no device run, capture, test execution, server launch, repository edit, or forge mutation performed. Capturing lead owns execution and evidence. Statements about existing recordings and seeding below are supplied context, not artifacts independently inspected in this pass.

## Revision and scope

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code).
Before/merge base: [bfc7177f](https://git.cafe/pingdotgg/t3code/commit/bfc7177f9f54b0a4b9d3571d30723a51cd4b31bd).
After: [d3de380d](https://git.cafe/pingdotgg/t3code/commit/d3de380d7a5f39986844467f53b2da9165e834ee), checked-out HEAD; worktree clean at inspection. Merge-base command confirms the specified before is the actual merge base.

Full three-file diff reviewed:

- [useThreadListV2.ts](https://git.cafe/pingdotgg/t3code/blob/d3de380d7a5f39986844467f53b2da9165e834ee/apps/mobile/src/features/threads/useThreadListV2.ts): passes inboxVersion into observe inside the memo callback; removes dependency lint suppression.
- [threadInbox.ts](https://git.cafe/pingdotgg/t3code/blob/d3de380d7a5f39986844467f53b2da9165e834ee/packages/client-runtime/src/state/threadInbox.ts): optional unused numeric observe argument and explanatory API comment. No timer, classification, sorting, or placement algorithm change.
- [reactCompilerCoverage.test.ts](https://git.cafe/pingdotgg/t3code/blob/d3de380d7a5f39986844467f53b2da9165e834ee/apps/mobile/src/reactCompilerCoverage.test.ts): AST regression assertion that the compiled observe cache guard reads inboxVersion. Uses Metro iOS release caller flags; this is compiler evidence, not Android device evidence.

The bug requires a previously observed working thread, then an ordinary nonworking shell, then the 2,000 ms placement grace expiring without another shell change. Tracker snapshots intentionally retain their old answers. Previously the compiler could cache observe without inboxVersion, leaving the old working snapshot in use after the timer notification. The new callback reads the version as an argument, forcing the compiler dependency.

## Callers and render paths

[HomeScreen](https://git.cafe/pingdotgg/t3code/blob/d3de380d7a5f39986844467f53b2da9165e834ee/apps/mobile/src/features/home/HomeScreen.tsx) and [ThreadNavigationSidebarPane](https://git.cafe/pingdotgg/t3code/blob/d3de380d7a5f39986844467f53b2da9165e834ee/apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx) are the only production hook callers. Both consume layout, list items, shelf counts and return ordering from the same hook/module-scope tracker. Sidebar uses the plain pane on Android and SidebarNavigationShell on iOS. [AdaptiveWorkspaceLayout](https://git.cafe/pingdotgg/t3code/blob/d3de380d7a5f39986844467f53b2da9165e834ee/apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx) mounts that sidebar in split view; a phone screenshot of a different drawer is not proof of this caller.

Both callers pass shells, environment/project scope, search matches, permissions, queued keys, ordering, current minute, preference readiness, enable/expand states, and selection. Only the inbox observation's version dependency changes. No layout/style diff exists.

## Fixture inputs and oracle

Use a native compiled client with React Compiler enabled, connected to an isolated server started with an explicit --home-dir outside live userdata. Record exact client bundle revision/platform/build mode, isolated server home, environment/project/thread identifiers, device model and viewport. Pool-hosted native phone/tablet clients count; a web viewport or a fabricated screenshot does not. Do not assume a tablet name guarantees split view: verify the actual ThreadNavigationSidebar is visible.

Reuse the reported real Codex seeding method: prompt the agent to run `sleep 30` then reply `Done`. This pass does not run it. Keep the tested list mounted and visible before completion; a completed record first opened afterward cannot reproduce the stale memo. Use one ordinary unpinned, unsnoozed, unarchived, unsettled, non-subagent thread with no approval/input/subagent request, actionable plan, failure, runtime error, or guest attention. Include one older idle Inbox thread as an ordering/control row. Empty search, matching environment/project scope, preferences loaded, Working enabled. Choose the 30-second run near the beginning of a minute to avoid a minute-tick rebuild during the decisive interval.

Correlate server completion with native placement. Server completed status alone is not success. On head, after the two-second grace, target appears once in Inbox/active area with fresh return ordering, Working count drops, and the header disappears if it reaches zero. Execution status may already be complete during grace; the grace holds placement only. Record several seconds beyond grace without tapping, navigation, search, refresh, new messages, or preference changes. Later input could mask the bug. Retain a short server completion transcript alongside the recording.

## Minimum actual native matrix

Android leads because Android reported the bug. Rows marked RECORDING require continuous motion evidence, not stills. Reuse the same small fixture design; fresh real runs are needed when demonstrating a transition in a different visible caller.

| Row | Revision / native target | Inputs and interaction | Expected proof / evidence |
|---|---|---|---|
| B1 — RECORDING | Matching before bfc7177f, Android phone, Home | Working enabled and expanded; start ordinary sleep30/Done run, return to Home while running, leave it visible across completion + grace | Reproduce completed target stuck in Working beyond grace without another input; pair server completion with placement. Existing older-main video is supplemental only. |
| A1 — RECORDING | Head d3de380d, Android phone, Home | Same fixture and expanded shelf as B1 | Working → grace → Inbox automatically; count/header and return ordering correct; idle control unchanged. This is the primary matched before/after. |
| A2 — RECORDING | Head d3de380d, Android tablet in actual split view, thread sidebar | Keep target selected and Working collapsed before completion; stay on thread with sidebar visible | Selected row is retained while collapsed, then moves to Inbox automatically and count/header update after grace. After the decisive interval, select the returned row to prove it still opens the same thread. Covers second caller and collapsed/selected branch without a separate run. |
| A3 — RECORDING | Head d3de380d, native iOS tablet in actual split view | Ordinary completion with Working expanded in sidebar | Brief counterpart through the iOS native sidebar wrapper; same automatic return oracle. Platform-neutral fix does not require another full iOS phone × Home run. |

Minimum: one matched Android before recording plus three head recordings, covering Android phone/Home, Android tablet/sidebar, and the distinct iOS sidebar wrapper. No phone/tablet/orientation/theme Cartesian product. If scope is explicitly Android-only, A3 can be deferred with that limitation stated; do not silently call iOS verified. No matching-before recording is required for every downstream render branch: B1 demonstrates the shared memo failure, A2/A3 demonstrate reachability and corrected consumption.

## Conditions distinguished from affected proof

| Condition / path | Impact and minimum treatment |
|---|---|
| Working enabled, expanded | Directly affected: visible placement, count/header, return timestamp sorting. A1. |
| Working enabled, collapsed | Timer still affects count/header and selected retained card; nonselected cards hidden until they return. A2 covers selected branch; hidden-card branch follows the same layout filter, no extra video. |
| Working disabled, or preferences not yet loaded | observe(null) clears tracker; no Working grace placement. Unaffected control; source inspection suffices for this tiny change. Toggle off/on after A1 if a cheap runtime check is desired, after capturing the decisive transition. |
| Search active (title or content), environment/project mismatch, archived/subagent hidden | Search is a flat ranked list with zero shelf counts/headers; scoped/hidden targets cannot demonstrate the shelf bug. Clear search and choose matching scope for recordings. Filtering/ranking unchanged; no separate captures. |
| Pinned, settled, snoozed; placement explicitly moved; removed thread | Existing classification precedence and timer cancellation/exclusion unchanged. Use none on target. Existing tracker tests cover these mechanisms; no unrelated interaction recordings. |
| Approval/user input/subagent request, actionable plan, guest attention, error/failed run; resume during grace | Existing immediate-return or resumed-work conditions unchanged; not the ordinary expiry reproduction. Existing tracker tests cover boundary behavior. No additional provider matrix. |
| First observation already completed | No prior working state, no grace transition; inadequate proof even if Inbox placement is correct. Existing seeded completion can be control data only. |
| Web / Electron | Production web Sidebar calls observe directly without the mobile memo; optional second argument preserves old callers. No changed web/desktop behavior or native-layout screenshot requirement. |
| Other providers, agent/MCP entry points, relay/tunnel | No protocol, orchestration, provider, server or transport change. One actual Codex run is sufficient; use the lead's existing remote connection. No extra transport/provider matrix. |
| Compiler regression test | Relevant focused automated proof; inspect/run on before and head separately if lead needs execution evidence. New test exists only at head; a before failure requires applying it in a separate authorized test workspace. This audit did not edit or run tests. |

## FRICTION and outstanding evidence

- REVISION: Existing before video starts on main 3de45c6254 (supplied context), not the final merge base. B1 must use bfc7177f for a matched claim; do not relabel the older video. No artifact comparison was available here.
- REACHABILITY: Verify native phone Home and real tablet split sidebar; Android workspace chrome alone does not prove ThreadNavigationSidebarPane rendered.
- BUILD/COMPILER: AST test uses iOS release settings. Android-led compiled native evidence remains necessary; verify bundle revision to avoid stale Metro/cache evidence.
- SEED/STATE: Supplied sleep30/Done isolated-home method is appropriate. Supplied server completed record plus Home placement recording is useful only if the list observed the running → nonworking → timer transition. Neither supplied artifact was inspected here.
- MASKING: Navigation/remount, another shell update, minute ticks or manual refresh can make a stale memo appear fixed. Preserve uninterrupted visible list evidence across the grace window.
- EVIDENCE: All matrix device rows are pending/unverified in this audit. No capture/device claim is made. Lead should attach recordings and completion transcript, with exact revisions, against these rows.
- SCOPE: No style changes; no screenshot catalog, layout redesign proof, unrelated visual feature sweep, repo scratch, server/browser/device work, merge or watch is warranted in this audit.

Audit result: source change targets the stated compiler dependency failure with a compatible optional API argument. Proof readiness remains conditional on the matched-before and native recordings above; this is not a device-pass verdict.
