# Read-only proof audit — pass 1

Scope: mobile iOS only; folded iPhone Duo Back → list → another thread visibly opens; expanded split behavior stays unchanged. No takeover implementation is needed for this spec on the inspected main snapshot. Code inspection establishes equivalent intent and a stronger transition model, not visual proof.

## Revision identity

- Original [#20633](https://git.cafe/pingdotgg/t3code/pulls/20633) ([GitHub mirror](https://github.com/pingdotgg/t3code/pull/20633)): contributor [mweinbach/t4code](https://github.com/mweinbach/t4code), branch `t3/fix-folded-iphone-thread-navigation`, live reported head [fa42b9ba](https://github.com/pingdotgg/t3code/commit/fa42b9ba3aaac1d87dacecef55adcbf285fe1820), full SHA `fa42b9ba3aaac1d87dacecef55adcbf285fe1820`; target main. Contributor identity supplied by dispatcher; GitCafe sourceRepo/headRepo fields are null.
- Original parent / merge base: [c20eab44](https://github.com/pingdotgg/t3code/commit/c20eab44e1d9e97a96df21699434032e9da16cbd), full SHA `c20eab44e1d9e97a96df21699434032e9da16cbd`. Complete original diff: 3 files, +52/-3.
- Audited worktree HEAD and origin/main: [3cc31ed2](https://github.com/pingdotgg/t3code/commit/3cc31ed27c8956b36cee35a50509fb7c6869592b), full SHA `3cc31ed27c8956b36cee35a50509fb7c6869592b`. Worktree `/home/ubuntu/wt/pr-20633`, clean before/after inspection. Local branch ref named main points elsewhere (`07d38b8d17167c8d17fba1184dbe13a307fada74`); it was not the audited snapshot.
- Equivalent implementation source: [4af32312](https://github.com/pingdotgg/t3code/commit/4af32312db6eebad26b158e65a0f2771abecd543), full SHA `4af32312db6eebad26b158e65a0f2771abecd543`, merged via [#22526](https://git.cafe/pingdotgg/t3code/pulls/22526). Confirmed ancestor of audited HEAD. Merged PR's reported source head was [f9a3b5c2](https://github.com/pingdotgg/t3code/commit/f9a3b5c2fbbf856382a26f81909690eb49c9e284), full SHA `f9a3b5c2fbbf856382a26f81909690eb49c9e284`.

## Three-file equivalence

1. [iOS navigator](https://github.com/pingdotgg/t3code/blob/3cc31ed27c8956b36cee35a50509fb7c6869592b/apps/mobile/src/features/layout/createWorkspaceStackNavigator.ios.tsx#L241): original clears current detail when primary didAppear while collapsed. Current follows primary and detail appearance, gates on native collapse plus JS split layout, tracks visible column and departure, and calls show when needed. Collapse resets bookkeeping; expand disables cleanup (lines 199–200, 241–277, 314, 360). Navigator has other changes since source commit; it is not byte-identical.
2. [Projection helper](https://github.com/pingdotgg/t3code/blob/3cc31ed27c8956b36cee35a50509fb7c6869592b/apps/mobile/src/native/workspace-stack-projection.ts#L46): original nativeCollapsedRevealPopAction pops all current detail. Current collapsedSplitTransition captures the departing key, cancels it when it reappears, and source-anchors nativeStackPopAction to Home, preserving later pushes/presentations. This file is byte-identical to the equivalent source commit. Original overlapping-selection review concern is addressed by this source anchoring; native timing remains unproven.
3. [Projection tests](https://github.com/pingdotgg/t3code/blob/3cc31ed27c8956b36cee35a50509fb7c6869592b/apps/mobile/src/native/workspace-stack-projection.test.ts#L167): current collapsed Back cases cover subsequent selection, presentation during Back, cancelled swipe, JS navigation, and cold-link callbacks. These are modeled callback/router assertions, not device observations. Inspected, not executed in this proof-planning pass.

## Compact recording fixture matrix

Fixture: isolated iOS Duo client on macmini, known stopped threads A/B with visibly distinct titles/content, nested file F, and Settings sheet S. Record exact tested app/server SHA, iOS version, simulator/device identity, fold state and build in capture manifest. Begin each row from its stated state; capture the gesture/button and settled destination continuously. “Recording required” applies to every variant, including negative controls; a still cannot prove cancellation or sequencing. No fixture was launched here.

| ID | Start and interaction (variants required) | Observable acceptance | Code basis | Evidence |
|---|---|---|---|---|
| B1 | Folded: open A → Back button → select B; repeat selecting A itself | List is visible after Back; tapped thread visibly opens with correct title/content, no hidden-detail-only highlight; repeat cycle works | primary didAppear cleanup + show effect; test next selection | Recording required; UNVERIFIED — macmini capture needed |
| B2 | Folded: A → complete edge swipe Back → select B, then same-thread variant | Completed swipe returns to list and next selected thread is visibly foregrounded | same completion path as B1 | Recording required; UNVERIFIED — macmini capture needed |
| C1 | Folded A: begin edge swipe then cancel (also cancel near completion); subsequently complete Back and select B | Cancellation keeps A visible and usable, no route loss or list flash; later Back/select still works | willAppear cancels leaving; cancelled-swipe test | Recording required; UNVERIFIED — macmini capture needed |
| N1 | Folded A: select B as list is being revealed, before Back settles; exercise row selection and repeat with an available notification/command-palette thread navigation entry | B survives cleanup and becomes visible, correct content; stale A cannot consume/remove B | captured departing key + source-anchored POP; home-thread-navigation pushes during dismissal | Recording required; UNVERIFIED — macmini capture needed; log actual callback/navigation ordering if timing is ambiguous |
| E1 | A open: unfold; use expanded list to select B; fold again; Back then select A. Include expansion during a partially started Back where available | Expansion preserves open detail; expanded list/detail selection remains unchanged; refolded Back/select works without clearing B prematurely | native and JS split guards, onExpand/onCollapse reset | Recording required; UNVERIFIED — macmini capture needed |
| P1 | Folded A → nested F → return through detail history; perform column Back to list → select B | Inner Back preserves A where appropriate; column Back removes hidden detail history; B appears without stale F/A resurfacing | source-anchored pop to Home; native dismissal path | Recording required; UNVERIFIED — macmini capture needed |
| P2 | Folded A/F: open S normally, dismiss; separately open S during column Back animation, then dismiss and select B | Normal presentation preserves underlying detail; concurrent S remains visible/dismissible while old detail is cleared; B then opens | projection separates overlays; presentation-during-Back and JS navigation tests | Recording required; UNVERIFIED — macmini capture needed; concurrent variant needs reproducible trigger |
| L1 | Cold/deep-link to A with list appearance preceding detail; separately JS push/pop a nested detail | A or intended destination appears and remains; primary appearance alone cannot erase detail | no leaving key → no pop; cold-link/JS navigation test | Recording required; UNVERIFIED — macmini capture needed |

## Evidence limits and handoff

Linux iOS unavailable per dispatcher. No captures, browsers, servers, simulators, tests, edits, commits, pushes, PR comments, or watchers were run/created. Android is not a substitute for UIKit collapsed-split behavior. Web/desktop/Android have no changed runtime surface in this diff; no cross-wire contracts or provider changes apply.

The merged PR description reports simulator verification and contains historic before/after recordings. Those are historical evidence tied to prior work, not fresh captures of this audited HEAD; they were not replayed or recaptured in this pass. Main's equivalent code and modeled tests cannot establish actual callback order, animation completion, visible selection, or unchanged expanded presentation on current iOS.

Pass 1 result: code-equivalence supported; visual acceptance UNVERIFIED. Needs macmini iOS capture of every matrix row/variant. Pass 2 cannot be sufficient without captures. A second read-only review, historic recordings, or Android verification cannot close that gap.

FRICTION category|what|avoidance

- environment|Linux has no iOS runtime per dispatcher|capture on macmini; do not substitute Android or start a Linux server/browser
- evidence|historic merged-PR recordings can be mistaken for current proof|label historical; bind fresh recordings to exact tested SHA and matrix row
- timing|new selection/presentation overlaps native Back callbacks|record continuous interaction and identify actual event order; do not infer native ordering from helper tests
- revision|local main ref differs from audited HEAD/origin-main snapshot|pin all evidence to full SHAs; do not label local main as the inspected revision

Artifact only under `/tmp/ev-20633-proof`; no repository modifications. Prepared by GPT-6.1 through the Codex harness, 2026-10-24 UTC.
