docs(mobile): document the two mobile routes that intentionally skip deep links - #13164
Conversation
…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.
ApprovabilityVerdict: Approved at 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. |
|
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 configurationConfiguration used: Repository: pingdotgg/t3code/.coderabbit.yaml Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (1)
Limit details: You’ve used all 10 included reviews currently available. 📝 WalkthroughWalkthroughChangesMobile linking documentation
Priority: ⬇️ Low Estimated code review effort: 1 (Trivial) | ~2 minutes Change: Other Suggested reviewers: Merge Risk: ⚪ Minimal · up to No actionable merge risk remains; the documented deep-linking rationale is behavior-neutral. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 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.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
## 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
Problem
A route-coverage audit in
apps/mobilefoundSettingsUsageAccountandThreadSettingsSheetas the only two static screens (of 57) with nolinking:path inStack.tsx. Every other screen has one, and the rootNotFoundwildcard (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 likeonSelectModel → props.onUpdateModelSelection) that the activeThreadComposerpresents intoExistingThreadSettingsRouteProviderimmediately before pushing the route (ThreadComposer.tsx:settingsRoutePresentation.present(settingsRouteSession)thenStackActions.push("ThreadSettingsSheet")). None of that is URL-constructible. Reached without a presented session, the screen's own code path isnavigation.goBack()— a hypothetical deep link would flash and self-dismiss. It is also listed inWORKSPACE_OVERLAY_ROUTES, so it must never describe a workspace location. Thread deep links land onthreads/:environmentId/:threadId, where the sheet is one tap away. This differs from the new-task flow'sdraft/settingssheet, whose state comes fromNewTaskFlowProvidermounted 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:nowis the wall-clock of the tap,environmentIdsis the usage screen's local filter selection (nullable array), andwindowId/windowKindidentify freshly aggregated pools (PoolWindowCard.openAccountinUsageLimitsPooled.tsx). React Navigation round-trips non-path params through the URL as query strings (getPathFromState/getStateFromPathin@react-navigation/core7.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 atsettings/usage, which already exists and rebuilds this state fresh.Change
Comments on the two
createNativeStackScreenentries inapps/mobile/src/Stack.tsxdocumenting the invariant: these are the two routes that intentionally omitlinking:, 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 --noEmitinapps/mobile: clean.vp lint apps/mobile/src/Stack.tsx: clean.Created with callstack/Apex in the Pi harness.
Summary by CodeRabbit