Skip to content

feat(mobile): prototype Duo on the shared v5 navigator - #12648

Draft
juliusmarminge wants to merge 4 commits into
mobile/rns-v5-migrationfrom
mobile/duo-v5-stack
Draft

juliusmarminge wants to merge 4 commits into
mobile/rns-v5-migrationfrom
mobile/duo-v5-stack

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Sep 19, 2026 •

Copy link
Copy Markdown
Member

Keep the Duo prototype separate from the general v5 migration in #12646. This draft moves the existing Duo work onto that shared navigator instead of maintaining a second split-stack/header implementation. The original v4 experiment remains in #12557.

This layer adds iOS 27.1 fold/occlusion geometry and vertical-bar traits to the native layout observer, reserves the active toolbar edge and fold around thread lists/composers, and binds UIBarButtonItem.axisBehavior through v5's neutral header. The RNS patch file is 1,340 lines here versus 1,290 in the shared migration. The difference includes diff context. Generic stack rendering, iPad columns, search/menu/toolbar/appearance bindings, modal presentation, and markdown resizing belong below this PR.

The same Expo app and React Navigation router remain in use. UIKit owns split-column collapse/expansion; the selected conversation and draft stay in the application model. The experimental split host is enabled on iPad and iOS 27.1; production device gating remains open.

The branch inherits the shared native header background/shadow bindings and custom-title geometry fix. Main already supplies a native label geometry guide so UIKit can recognize React custom titles when shaping automatic scroll-edge effects; the shared migration now ports that compatibility fix to v5's native header-content factory. It applies to custom title/subtitle content without T3 Code semantics or an extra blur API. The forced navigation-bar material workaround has been removed. The iOS 26 iPad sidebar also uses the automatic native effect, with top Settings/filter controls, floating search, and a darker inset background. Files loading and terminal Back retain one owner.

Validation: mobile typecheck and the four scroll-edge helper tests pass after this rebase; the existing focused navigation/layout/reserved-region suite passed 69 tests. A fresh Duo native build passes and the installed fingerprint matches. The current unfolded landscape client shows the selected review, preserved draft, automatic native header protection, and conversation/composer clearance from the toolbar rail with the 43-thread fixture. Navigation and screenshot scroll positioning use the existing callbacks/list API through CDP; these are not new physical touch or pose-transition checks. Earlier touch checks confirmed sidebar and filter callbacks but predate this revision. XCTest still targets the inactive display for some Duo interactions, so folded/book/portrait, keyboard, sheets, inspector transitions, and actual touch behavior need further checks on this revision.

This is a progress draft while the upstream native APIs settle. The shared iPhone header before/after, iOS 26 iPad automatic-effect capture, scroll recording, and native search/filter/Back checks are in #12646. All library patches should either fix generic library behavior or expose UIKit capabilities using the library's existing conventions.

Current unfolded landscape — native split columns, selected review, preserved draft, and system toolbar rail:

Duo unfolded landscape with automatic native header effects and the preserved draft

The sidebar scrolled under UIKit's automatic header protection:

Duo custom sidebar title shaping the automatic native scroll-edge blur

Follow-up screenshot matrix:

Display and pose Capture
Inner, flat landscape Sidebar open and closed; conversation; Files/Git/terminal inspector
Inner, flat portrait Sidebar open and closed; conversation; inspector
Inner, partially folded book, landscape Thread list + conversation; composer near the fold; inspector
Inner, partially folded, portrait Column arrangement; fold clearance; composer
Outer, closed portrait Thread list with search/filter/compose; conversation with Back; settings and project-picker sheets
Outer, closed landscape, if supported Thread list; conversation; sheets

For each supported pose, capture keyboard hidden and visible with a draft, then light and dark appearance. Include active search and an open filter menu; record one uninterrupted flat → book → closed → open transition to show draft and selection retention.

Built with GPT-6 in the Codex harness.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Sep 19, 2026
@juliusmarminge
juliusmarminge added this pull request to stack #12649 September 19, 2026 22:56
@github-actions github-actions Bot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 19, 2026
@github-actions

github-actions Bot commented Sep 19, 2026 •

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ No successful main baseline artifact is available yet. This run establishes the initial measurement.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire — 13.5 KiB — 15.1 KiB ✅
Codex Thread snapshot wire — 7.0 KiB — 7.3 KiB ✅
Codex Live turn WebSocket wire — 6.5 KiB — 7.8 KiB ✅
Codex Live turn WebSocket decoded — 56.2 KiB — 66.4 KiB ✅
Codex Live turn messages — 9 — 21 ✅
Claude Total thread wire — 13.5 KiB — 15.1 KiB ✅
Claude Thread snapshot wire — 7.1 KiB — 7.3 KiB ✅
Claude Live turn WebSocket wire — 6.4 KiB — 7.8 KiB ✅
Claude Live turn WebSocket decoded — 57.0 KiB — 66.4 KiB ✅
Claude Live turn messages — 9 — 21 ✅

Baseline: unavailable · PR result: 5b715dc · Source CI: failure

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 114.0 KiB
  • Claude decoded thread snapshot: 114.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@juliusmarminge
juliusmarminge force-pushed the mobile/duo-v5-stack branch 2 times, most recently from 3f80f56 to 2669f8d Compare September 19, 2026 23:31
@juliusmarminge
juliusmarminge force-pushed the mobile/duo-v5-stack branch 7 times, most recently from a8ed8f8 to 8b56c0e Compare September 20, 2026 02:53

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. size:XL 500-999 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant