fix: unbreak shipped clients broken by #5337 - #5356
Merged
Merged
Conversation
PR #5337 changed activeSessions.getToken from a query to a mutation. Every installed client calls it as a query, so tRPC rejects the call: 405 on a plain GET, and 400 "Cannot mix procedure types in call" on any batch that pairs it with user.getMe. The mobile app then shows "Could not load your account". Shipped app builds and installed extensions cannot be updated in step with the server, so the procedure type must stay a query. The one-use web-ticket body is unchanged.
Minting is not idempotent, so createWebTicket is a mutation and is the path forward. Web, mobile and extension now call it. getToken stays a query for clients that are already installed, with a TODO for its removal. Shipped app builds and installed extensions cannot update in step with the server, and tRPC answers a query-shaped call to a mutation with 405, or fails the whole batch with 400 "Cannot mix procedure types in call" when it sits beside a query. Both procedures share one mintWebTicket handler.
eshurakov
approved these changes
Aug 18, 2026
Contributor
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Files Reviewed (8 files)
Reviewed by grok-4.6 · Input: 58.6K · Output: 7.8K · Cached: 318.3K Review guidance: REVIEW.md from base branch |
PR #5337 gave the mutation a required input, so builds already in the stores get a 400 on the delete-account flow. Make the input optional and keep the old support-ticket path for a call without one: it emails the user and support, stamps the cooldown, and deletes nothing, which is exactly what those builds tell the user happened. A call with a challenge still reauthenticates and performs the GDPR removal. The branch carries a TODO for its removal.
iscekic
enabled auto-merge (squash)
August 18, 2026 19:26
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two procedures in #5337 changed shape in ways that already-installed clients cannot follow. Both keep a compatible path with a TODO for its removal, and both keep the new path as the way forward.
1.
activeSessions.getToken— the outageMobile shows "Could not load your account". Axiom pins it to deployment
dpl_GWB6AQmWy8dgLjhUHCZ83SdQRycz(live 18:40 UTC 2026-08-18), which shipped #5337. That PR changedactiveSessions.getTokenfrom a query to a mutation.Every already-installed client still calls it as a query. tRPC 11.17 then fails the call two ways:
GET /api/trpc/activeSessions.getToken→ 405, the method map allows only POST for a mutation.Cannot mix procedure types in call: query, mutation, which fails the whole batch,user.getMeincluded. The mobile root layout reads that as a bootstrap error.Confirmed across Android (
okhttp/4.9.2), iOS (Kilo/97,137,143,144), browsers andnode. The previous deployments show zero of either status.Fix
createWebTicket— new mutation, the path forward. Minting a one-use ticket is not idempotent, so it belongs on a mutation. Web, mobile and the extension now call it.getToken— stays a query for clients that are already installed. Store builds and installed extensions cannot update in step with the server.mintWebTickethandler, so behaviour cannot drift.httpBatchLinkkeeps a separate loader per operation type, so the new mutation never batches beside a query.Remove
getTokenonce the mobile and extension releases that callcreateWebTickethave rolled out and its traffic in Axiom reaches zero.2.
user.requestAccountDeletion— required input#5337 gave the mutation a required
{ challengeId, code }. Shipped builds call it with no input and now get a 400, so the delete-account flow is dead for them.Fix
The input is optional again. With no input the mutation keeps the old support-ticket path: it emails the user and support, stamps the 1 h cooldown, and deletes nothing — exactly what those builds tell the user happened ("Account deletion request sent. Check your email for confirmation."). With a challenge it reauthenticates and performs the GDPR removal as #5337 intended.
No re-auth requirement is weakened: the input-less path never deletes.
Remove the branch, and make the input required again, once the mobile release that sends
{ challengeId, code }has rolled out and input-less traffic reaches zero.Checks
pnpm run typecheck— cleanpnpm run lint— cleanuser-web-connection-providertests — 2 passedapps/webjest needs a local Postgres that is not running here, so the two new cases inactive-sessions-router.test.tsanduser-router.test.tsare unverified locally and ride on CI.