Skip to content

fix(mobile): keep native screens ordered during stack pops - #17231

Merged
juliusmarminge merged 1 commit into
mainfrom
fix/mobile-stack-transitions
Oct 8, 2026
Merged

juliusmarminge merged 1 commit into
mainfrom
fix/mobile-stack-transitions

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Oct 8, 2026 •

Copy link
Copy Markdown
Member

Back transitions in the v5 stack could disturb both the screen and its header. Our retention logic moved the outgoing screen ahead of the root while UIKit was still animating the pop. Fabric child moves can enqueue additional native pop/push operations in the Screens host.

Keep outgoing screens in their previous positions until dismissal finishes, including when another page is pushed immediately afterward. Derive active screens' header back state from router history rather than the retained native child list.

Scope and approval

Requested by Julius after recording broken Settings/Environments transitions. This PR only changes the shared iOS v5 stack's screen retention and header back state, with regression coverage. No Swift or dependency changes; compatible with an OTA on the current native runtime.

Verification

  • All 17 stack projection/dismissal tests passed, including Settings pop/re-push and multi-page pop cases.
  • Mobile TypeScript check and targeted lint passed.
  • React Doctor found no issues in the changed React files.
  • Device verification remains pending with Julius. The supplied recording was inspected, but no post-fix visual verification is claimed.

Model: GPT-6.1-sol. Harness: Codex through T3 Code.


Devin Review

@juliusmarminge juliusmarminge added the 🚀 Mobile Continuous Deployment Trigger Expo preview build label Oct 8, 2026
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Oct 8, 2026
@juliusmarminge juliusmarminge added the macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

🚀 Expo continuous deployment is ready!

  • Project → t3-code
  • Platforms → android, ios
  • Scheme → t3code-preview
  🤖 Android 🍎 iOS
Fingerprint cc64b89b3964de7f7d53a74c3fb993282ba49370 61079c09f769c8f8df76c88c99aac1bfeab50919
Build Details Build Permalink
DetailsDistribution: INTERNAL
Build profile: preview:dev
Runtime version: cc64b89b3964de7f7d53a74c3fb993282ba49370
App version: 2.0.0
Git commit: ffd8a3c947cc777817cb1ab936c5e1fa99de1472
Build Permalink
DetailsDistribution: INTERNAL
Build profile: preview:dev
Runtime version: 61079c09f769c8f8df76c88c99aac1bfeab50919
App version: 2.0.0
Git commit: 35faaa8455f9e2681cbe3a673e0e951ccfec4d83
Update Details Update Permalink
DetailsBranch: pr-17231
Runtime version: cc64b89b3964de7f7d53a74c3fb993282ba49370
Git commit: 35faaa8455f9e2681cbe3a673e0e951ccfec4d83
Update Permalink
DetailsBranch: pr-17231
Runtime version: 61079c09f769c8f8df76c88c99aac1bfeab50919
Git commit: 35faaa8455f9e2681cbe3a673e0e951ccfec4d83
Update QR

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 4.9 KiB −23 B (−0.5%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB −23 B (−1.9%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 20.9 KiB 20.8 KiB −41 B (−0.2%) 29.3 KiB ✅
Codex Live turn messages 2 1 −1 (−50.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB −24 B (−0.5%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB −24 B (−2.0%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.2 KiB 21.2 KiB −41 B (−0.2%) 29.3 KiB ✅
Claude Live turn messages 2 1 −1 (−50.0%) 8 ✅

Baseline: 9a3070b · PR result: dd24df8 · Source CI: success

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: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

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

@coderabbitai

coderabbitai Bot commented Oct 8, 2026

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Team
  • Run ID: af751402-f088-48f6-91c5-118162450dd8
📥 Commits

Reviewing files that changed from the base of the PR and between 9a3070b and dd24df8.

📒 Files selected for processing (3)
  • apps/mobile/src/native/createV5StackNavigator.ios.tsx
  • apps/mobile/src/native/workspace-stack-projection.test.ts
  • apps/mobile/src/native/workspace-stack-projection.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

The iOS stack navigator now derives back navigation state from the current route position when attached. Stack reconciliation retains outgoing screens at their prior positions until they are current or native dismissal completes.

Changes

Mobile stack behavior

Layer / File(s) Summary
Retain outgoing screens in stack order
apps/mobile/src/native/workspace-stack-projection.ts, apps/mobile/src/native/workspace-stack-projection.test.ts
Reconciliation inserts outgoing screens at their prior positions, capped at the current list length. Tests cover unfinished pops, immediate pushes, dismissal completion, and multiple outgoing screens.
Derive back state from route position
apps/mobile/src/native/createV5StackNavigator.ios.tsx
Attached routes use their index in navigation state to determine back navigation state. Detached routes continue to use their rendered index.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to dd24d

No actionable issue was established in the changed stack behavior. The PR is mergeable after normal checks; device verification remains pending.

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: preserving native screen order during stack pops.
Description check ✅ Passed The description explains the problem, the fix, scope, regression coverage, verification results, and remaining device verification. It does not include a direct issue or approval link, but it provides…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@macroscopeapp

macroscopeapp Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at dd24df8

Macroscope's review found this PR approvable — This is a focused iOS navigation bug fix that preserves native screen order during stack pops and keeps header back-state aligned with the active route. The production changes are limited and supported by targeted regression tests, with no schema, security, billing, deployment, default, or static-analysis impact.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge merged commit a6ec88f into main Oct 8, 2026
36 of 37 checks passed
@juliusmarminge
juliusmarminge deleted the fix/mobile-stack-transitions branch October 8, 2026 16:17
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 8, 2026
## What's Changed
* fix(web): link pull requests to threads in folders that aren't Git repos by @shivamhwp in pingdotgg/t3code#15946
* feat(web): find messages and plans in the current thread by @Noojuno in pingdotgg/t3code#10439
* feat(web): improve terminal scrollback navigation and snapshots by @StiensWout in pingdotgg/t3code#17091
* docs(internals): add a checklist for adding a provider by @juliusmarminge in pingdotgg/t3code#17229
* fix(mobile): keep native screens ordered during stack pops by @juliusmarminge in pingdotgg/t3code#17231


**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261008.2819...v0.0.46-nightly.20261008.2833

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261008.2833
github-actions Bot added a commit to davidvanderklay/t3code-flake that referenced this pull request Oct 8, 2026
## What's Changed
* fix(web): link pull requests to threads in folders that aren't Git repos by @shivamhwp in pingdotgg/t3code#15946
* feat(web): find messages and plans in the current thread by @Noojuno in pingdotgg/t3code#10439
* feat(web): improve terminal scrollback navigation and snapshots by @StiensWout in pingdotgg/t3code#17091
* docs(internals): add a checklist for adding a provider by @juliusmarminge in pingdotgg/t3code#17229
* fix(mobile): keep native screens ordered during stack pops by @juliusmarminge in pingdotgg/t3code#17231


**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261008.2819...v0.0.46-nightly.20261008.2833

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261008.2833
adampeterhiggins added a commit to adampeterhiggins/t3code that referenced this pull request Oct 9, 2026
* fix(web): link pull requests to threads in folders that aren't Git repos (pingdotgg#15946)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(web): find messages and plans in the current thread (pingdotgg#10439)

Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(web): improve terminal scrollback navigation and snapshots (pingdotgg#17091)

* docs(internals): add a checklist for adding a provider (pingdotgg#17229)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(mobile): keep native screens ordered during stack pops (pingdotgg#17231)

* fix(server): pairing tokens work on Node versions that cannot bind booleans (pingdotgg#16730)

* fix(mobile): HTML pages in a thread no longer trap scrolling on Android (pingdotgg#17211)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): centered scrollers no longer shift when the scrollbar appears (pingdotgg#17077)

Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>

* fix(web): distinguish thread search matches from code tints (pingdotgg#17263)

* fix(server): Pi extension wakes get an owned continuation turn (pingdotgg#17214)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): Pi discovers optional T3 tools on demand (pingdotgg#17220)

* fix(web): stack merge dialog closes as soon as you confirm (pingdotgg#17116)

* fix(server): Pi editor dialogs prefill the answer composer (pingdotgg#17206)

* fix(desktop): generate valid User-Agent that follows RFC 9110 guidelines (pingdotgg#17264)

* fix(server): Pi discovers workspace skills and commands (pingdotgg#17190)

* fix(mobile): preserve navigation after native swipe back (pingdotgg#17268)

* fix(server): keep newly discovered models out of legacy groups (pingdotgg#14314)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* feat(editors): open remote projects in JetBrains IDEs over SSH (pingdotgg#17271)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* test(desktop): expect JetBrains IDEs among remote editors (pingdotgg#17291)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): recognize authenticated GitHub Enterprise hosts (pingdotgg#11059)

Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>

* fix(connect): relay client updates itself and skips incompatible cloudflared (pingdotgg#17275)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(shared): relay client install waits out a brief Windows file lock (pingdotgg#16998)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(shared): release relay install locks on cancellation (pingdotgg#10585)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* chore(shared): bump managed cloudflared to 2026.10.0 (pingdotgg#11184)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(shared): bound cloudflared download with 10-minute timeout (pingdotgg#14139)

Co-authored-by: Kevin Rajan <kevin@kvnloo.dev>

* refactor(provider-core): add provider-core and provider-testing packages (pingdotgg#17299)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(settings): drop the legacy per-driver providers map (pingdotgg#17300)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(provider-pi): move Pi into its own provider package (pingdotgg#17302)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(models): tell users when a CLI update unlocks a new model (pingdotgg#17307)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): collapsed composer reserves room for wide send actions (pingdotgg#17016)

* fix(muse): workflow subagents no longer stall on hidden approvals (pingdotgg#17329)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(provider-core): share attachment prompts, notifications, and event loggers (pingdotgg#17330)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): file previews handle downloads, in-page links, and repo paths, and favicons stop leaking internal hosts (pingdotgg#16950)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(server): environment-hosted browser tabs behave like a normal browser (pingdotgg#16963)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(desktop): browser tab fixes for fullscreen, shortcuts, links, reload and hidden tabs (pingdotgg#16961)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): desktop opens remote environments' browser tabs locally (pingdotgg#17316)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(desktop): the t3 command warns instead of installing behind another t3 (pingdotgg#17351)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): images, video, HTML and PDF preview in a thread before its first message (pingdotgg#17352)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(provider-muse): move Muse Code into its own provider package (pingdotgg#17331)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): semantic branch naming hint lines up with its setting (pingdotgg#16972)

* fix(mobile): restore chat image previews in the v5 stack (pingdotgg#17361)

* feat(mobile): fade working threads and match web's status labels (pingdotgg#17368)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): agent browser tools stop bloating history, fall back sensibly, and respect ownership (pingdotgg#16956)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix(web): add room for thread timeline markers (pingdotgg#17372)

* fix(web): drop sidebar context before cancelling pointer drag (pingdotgg#17373)

* refactor(providers): namespace-import service modules in core, Muse, Pi, and testing (pingdotgg#17375)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(auth): show connection permissions and enforce session lifetime (pingdotgg#17370)

Co-authored-by: Bear Huddleston <bear@bearhuddleston.dev>

* refactor(provider-opencode): move OpenCode into its own provider package (pingdotgg#17345)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(provider-cursor): move Cursor into its own provider package (pingdotgg#17349)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(provider-acp): move the shared ACP adapter into its own package (pingdotgg#17354)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* refactor(provider-grok): move Grok into its own provider package (pingdotgg#17357)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): speed up long thread message sync (pingdotgg#17387)

* fix(desktop): cancel backend pipe reads to avoid slow shutdown (pingdotgg#17386)

* refactor(providers): adapter factories yield their services (pingdotgg#17381)

* fix(web): show a row spinner instead of a banner when expanding a folder (pingdotgg#17378)

* fix(server): a timed-out browser drag no longer exits the server (pingdotgg#17360)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): a logged-out Claude CLI no longer reports as authenticated (pingdotgg#15459)

* fix(server): Pi loads every selected skill without losing prompt text (pingdotgg#17194)

* fix(server): keep the Claude MCP token out of process arguments (pingdotgg#17408)

* fix(server): reconcile Pi native session rewinds (pingdotgg#13839)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* test(provider-pi): cover continuation offers through the driver (pingdotgg#17407)

* refactor(provider-acp-registry): move the ACP Registry into its own package (pingdotgg#17405)

* fix(server): relay client updates no longer drop the host off T3 Connect (pingdotgg#17366)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Jono Kemball <Noojuno@users.noreply.github.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: chise <lqff.yt@gmail.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: jztmanyl <jztmanyl@gmail.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Grzegorz Mandziak <4248465+alimek@users.noreply.github.com>
Co-authored-by: Scott Norteman <snorteman@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Aaron Queen <bompus@users.noreply.github.com>
Co-authored-by: Kevin Rajan <7121943+kvnloo@users.noreply.github.com>
Co-authored-by: Kevin Rajan <kevin@kvnloo.dev>
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Daniel Alvim <danielalvim@tuta.io>
Co-authored-by: Bear Huddleston <bear@bearhuddleston.dev>
Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews 🚀 Mobile Continuous Deployment Trigger Expo preview build size:S 10-29 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