Skip to content

docs(mobile): document the two mobile routes that intentionally skip deep links - #13164

Merged
juliusmarminge merged 1 commit into
mainfrom
agent/mobile-audit-route-links-retry
Sep 23, 2026
Merged

juliusmarminge merged 1 commit into
mainfrom
agent/mobile-audit-route-links-retry

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Sep 22, 2026 •

Copy link
Copy Markdown
Member

Problem

A route-coverage audit in apps/mobile found SettingsUsageAccount and ThreadSettingsSheet as the only two static screens (of 57) with no linking: path in Stack.tsx. Every other screen has one, and the root NotFound wildcard (linking: "*") sends any unknown deep link there — so the omission read as an oversight. After inspecting the actual navigation for both, the omissions are correct and adding paths would create fake, broken links. This PR records the decision at the call sites.

Why each route should not have a deep-link path

ThreadSettingsSheet (ExistingThreadSettingsRouteScreen) — the route carries zero params; its entire content is a session object (staged model selection, provider groups, and live update callbacks like onSelectModel → props.onUpdateModelSelection) that the active ThreadComposer presents into ExistingThreadSettingsRouteProvider immediately before pushing the route (ThreadComposer.tsx: settingsRoutePresentation.present(settingsRouteSession) then StackActions.push("ThreadSettingsSheet")). None of that is URL-constructible. Reached without a presented session, the screen's own code path is navigation.goBack() — a hypothetical deep link would flash and self-dismiss. It is also listed in WORKSPACE_OVERLAY_ROUTES, so it must never describe a workspace location. Thread deep links land on threads/:environmentId/:threadId, where the sheet is one tap away. This differs from the new-task flow's draft/settings sheet, whose state comes from NewTaskFlowProvider mounted in that navigator's own layout and is therefore reachable from navigation state.

SettingsUsageAccount (UsageLimitAccountScreen) — its params are a tap-time snapshot of live usage state, not a stable resource address: now is the wall-clock of the tap, environmentIds is the usage screen's local filter selection (nullable array), and windowId/windowKind identify freshly aggregated pools (PoolWindowCard.openAccount in UsageLimitsPooled.tsx). React Navigation round-trips non-path params through the URL as query strings (getPathFromState/getStateFromPath in @react-navigation/core 7.21.13, with no type parsing wired into the static config), so any declared path would bake a permanently stale timestamp and filter into a "stable" URL — and the screen's own "This account is no longer reporting limits…" fallback would become the normal landing. Nothing produces such a link: the only deep-link producers are notification payloads (/threads/...), app shortcuts, and incoming shares. The linkable surface is the list at settings/usage, which already exists and rebuilds this state fresh.

Change

Comments on the two createNativeStackScreen entries in apps/mobile/src/Stack.tsx documenting the invariant: these are the two routes that intentionally omit linking:, and why. No behavior, contract, or path-config change — a fake path is worse than NotFound because it silently lands on a screen that either dismisses itself or renders with stale snapshot params.

Verification

  • tsc --noEmit in apps/mobile: clean.
  • vp lint apps/mobile/src/Stack.tsx: clean.
  • No visual or behavioral change, so before/after screenshots are not applicable; the evidence is the source reasoning above. No tests added — the change adds no behavior, and the repo guidelines call for tests of meaningful logic, not comment mirrors.

Created with callstack/Apex in the Pi harness.


Devin Review

Summary by CodeRabbit

  • Documentation
    • Clarified that certain settings screens cannot be opened directly through deep links.
    • Deep links continue to target the corresponding parent usage or thread screens instead.

…deep links

SettingsUsageAccount and ThreadSettingsSheet were the only static screens
without a linking: path, which a route-coverage audit flagged as possible
oversight. Both omissions are deliberate; record why at the call sites so
contributors do not add fake paths to satisfy the pattern.
@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 Sep 22, 2026
@macroscopeapp

macroscopeapp Bot commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at fab6a44

Macroscope's review found this PR approvable — Only explanatory comments were added to the existing mobile route definitions. No executable code, navigation behavior, defaults, or configuration changed.

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

@coderabbitai

coderabbitai Bot commented Sep 22, 2026

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: pingdotgg/t3code/.coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: b5063e23-cec4-40a4-9080-86566a8bc76c

📥 Commits

Reviewing files that changed from the base of the PR and between 242816a and fab6a44.

📒 Files selected for processing (1)
  • apps/mobile/src/Stack.tsx

Limit details: You’ve used all 10 included reviews currently available.


📝 Walkthrough

Walkthrough

Changes

Mobile linking documentation

Layer / File(s) Summary
Non-deep-linkable route documentation
apps/mobile/src/Stack.tsx
Documents why SettingsUsageAccount and ThreadSettingsSheet have no linking paths, and identifies their supported parent or thread deep links.

Priority: ⬇️ Low

Estimated code review effort: 1 (Trivial) | ~2 minutes

Change: Other

Suggested reviewers: chrisdeeming

Merge Risk: ⚪ Minimal · up to fab6a

No actionable merge risk remains; the documented deep-linking rationale is behavior-neutral.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: documenting the two mobile routes that intentionally omit deep-link paths.
Description check ✅ Passed The description explains the problem, the rationale for both routes, the exact code change, and verification results. It does not use the template headings exactly and omits the checklist, but it prov…
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 1…
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

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

@github-actions

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 13.5 KiB 13.5 KiB −42 B (−0.3%) 15.1 KiB ✅
Codex Thread snapshot wire 7.1 KiB 7.1 KiB +6 B (+0.1%) 7.3 KiB ✅
Codex Live turn WebSocket wire 6.5 KiB 6.4 KiB −48 B (−0.7%) 7.8 KiB ✅
Codex Live turn WebSocket decoded 56.3 KiB 56.2 KiB −44 B (−0.1%) 66.4 KiB ✅
Codex Live turn messages 10 9 −1 (−10.0%) 21 ✅
Claude Total thread wire 13.5 KiB 13.5 KiB +7 B (+0.1%) 15.1 KiB ✅
Claude Thread snapshot wire 7.1 KiB 7.1 KiB +4 B (+0.1%) 7.3 KiB ✅
Claude Live turn WebSocket wire 6.4 KiB 6.4 KiB +3 B (+0.0%) 7.8 KiB ✅
Claude Live turn WebSocket decoded 57.0 KiB 57.0 KiB 0 B (0.0%) 66.4 KiB ✅
Claude Live turn messages 9 9 0 (0.0%) 21 ✅

Baseline: 242816a · PR result: fab6a44 · 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: 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 merged commit 5d493d6 into main Sep 23, 2026
23 of 24 checks passed
@juliusmarminge
juliusmarminge deleted the agent/mobile-audit-route-links-retry branch September 23, 2026 00:32
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 23, 2026
## What's Changed
* chore(mobile): drop dead nitro-markdown tgz override and @expo/metro-runtime by @juliusmarminge in pingdotgg/t3code#13148
* feat(web): show settings scope as a sentence at the top of the page by @juliusmarminge in pingdotgg/t3code#13139
* refactor(web): move settings scope pickers into breadcrumbs by @Yash-Singh1 in pingdotgg/t3code#13165
* feat(auth): share provider sign-in flows and credential bindings by @juliusmarminge in pingdotgg/t3code#12983
* refactor(mobile): git sheets use uniwind platform variants instead of className ternaries by @juliusmarminge in pingdotgg/t3code#13161
* chore(mobile): name the two project favicon caches by their job by @juliusmarminge in pingdotgg/t3code#13160
* revert(mobile): git sheets back to Platform.OS ternaries (un-guarded uniwind variants broke both platforms) by @juliusmarminge in pingdotgg/t3code#13169
* docs(mobile): document the two mobile routes that intentionally skip deep links by @juliusmarminge in pingdotgg/t3code#13164
* refactor(mobile): break module cycles with focused extractions by @juliusmarminge in pingdotgg/t3code#13151
* fix(server): generate PR diffs from branch changes by @Yash-Singh1 in pingdotgg/t3code#13170
* fix(web): preserve nested scroll behavior in chat timeline by @Yash-Singh1 in pingdotgg/t3code#13167
* test(web): cover usage model ordering without static markup by @flamboh in pingdotgg/t3code#13104
* fix(desktop): find linuxbrew node for the WSL backend by @CodyRay in pingdotgg/t3code#7827
* chore(models): use GPT-6 Luna for text generation by @extoci in pingdotgg/t3code#13115
* fix(mobile): keep ordinary offline outbox failures out of console.warn by @juliusmarminge in pingdotgg/t3code#13144
* feat(providers): check remote compatibility ranges by @juliusmarminge in pingdotgg/t3code#13130
* chore(lint): keep mobile theme escape-hatch allowlist honest by @juliusmarminge in pingdotgg/t3code#13146
* fix(web): the pull request badge reads at the meta size again by @juliusmarminge in pingdotgg/t3code#13175
* fix(mobile): uniwind platform variants stay guarded on both platforms by @juliusmarminge in pingdotgg/t3code#13172
* refactor(mobile): git sheets use uniwind platform variants instead of className ternaries by @juliusmarminge in pingdotgg/t3code#13185
* refactor(mobile): remaining className platform ternaries become class variants by @juliusmarminge in pingdotgg/t3code#13188
* fix(web): align provider emails without clipping by @Derpedyea in pingdotgg/t3code#13174
* perf(mobile): recycle the default v2 home list and scope the snooze minute tick by @juliusmarminge in pingdotgg/t3code#13149
* refactor(mobile): retire the legacy grouped thread list by @juliusmarminge in pingdotgg/t3code#13183
* fix(server): background PR checks spend less GitHub quota by @juliusmarminge in pingdotgg/t3code#13189
* fix(server): background PR sync reads summaries in batches by @juliusmarminge in pingdotgg/t3code#13198
* fix(server): GitHub PR lookups stop probing owner-qualified heads by @juliusmarminge in pingdotgg/t3code#13200
* chore(mobile): clear the legacy-list deletion fallout by @juliusmarminge in pingdotgg/t3code#13203

## New Contributors
* @CodyRay made their first contribution in pingdotgg/t3code#7827

**Full Changelog**: pingdotgg/t3code@v0.0.43-nightly.20260922.2123...v0.0.43-nightly.20260923.2135

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.43-nightly.20260923.2135
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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