Skip to content

fix(mobile): keep a send rejected with 409 or 426 retryable - #1968

Merged
elie222 merged 1 commit into
elie222:mainfrom
jfr956:fix/mobile-retry-conflict-and-update-sends
Oct 23, 2026
Merged

elie222 merged 1 commit into
elie222:mainfrom
jfr956:fix/mobile-retry-conflict-and-update-sends

Conversation

@jfr956

@jfr956 jfr956 commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Why

The mobile outbox marks any 4xx other than 408, 425 and 429 as refused. A refused send shows "Not sent" and can't be retried. #1778 made one of those, the missing-model error, retryable once a model is connected. Two more rejections clear on their own:

  • 409 "Stop teaching first". threads/send answers this while the bot is in a teaching session, for example one started on desktop while the user writes from the phone. Once teaching stops, the same send would go through, but the message stays "Not sent".
  • 426 update required. Since feat: client/server build handshake, kill switch, and shared retry policy #1849 the API refuses a client older than RAKAZO_MIN_CLIENT_BUILD, and the app offers an over-the-air update or the store. The unsent message is saved to disk as refused, so after the update it comes back with no way to resend it.

What changed

sendWaitingMessages in thread-feedback.ts treats 409 and 426 like 408, 425 and 429: the send fails as retryable ("Not sent · Tap to retry", Try Again in the long-press menu) and resends with the same client nonce. Nothing resends automatically. Every other client rejection stays refused, and the "keeps unrelated client rejections refused" test is unchanged.

Consent conflicts that reach the outbox wrapped in AiConsentBlocked were already retryable (acc401f). This covers a 409 that comes straight from the server.

Known residual: a 426 that a build without this fix already saved as refused stays refused after the update. The saved entry keeps only the error text, not the status, so restoring it as retryable would mean matching on copy.

No UI copy, server, or web changes.

How I tested

  • New test in thread-feedback.test.tsx, run for 409 and 426: a send rejected with that status shows "Not sent · Tap to retry", the tap calls retry, and a manual resend is accepted. Both cases fail on main (Expected: "failed", Received: "refused") and pass with the fix.
  • The mobile suite, pnpm check and pnpm lint show the same results before and after the change, apart from the two new passing tests.
  • Not tried on a device or simulator.

🤖 Generated with Claude Code

The mobile outbox marks any 4xx other than 408, 425 and 429 as refused,
and a refused send can't be retried. Two of those rejections clear on
their own. threads/send answers 409 "Stop teaching first" while the bot
is in a teaching session, and the API answers 426 when the app is older
than RAKAZO_MIN_CLIENT_BUILD (elie222#1849). After teaching stops, or after the
update the app itself offers, the same send would succeed, but the
message stays "Not sent" with no way to resend it.

Both now fail as retryable: "Not sent · Tap to retry" and Try Again.
Other client rejections stay refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 23, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
rakazo-www Skipped Skipped Oct 23, 2026 3:51pm UTC

Request Review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-23T15:55:22.111901Z d58f12c PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] This PR appears safe to merge.

Summary

Mobile sends rejected with 409 or 426 now remain available for manual retry instead of becoming permanently refused.

  • Mobile sends rejected with 409 or 426 can be retried.

Reviews (1) · Last reviewed commit: "fix(mobile): keep a send rejected with 4..." · Reviewed by Greptile

@elie222
elie222 merged commit 07732af into elie222:main Oct 23, 2026
28 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Playwright screenshots

No new feature frames; gallery is suite-vs-main drift.

Open screenshot gallery · Dashboard · CI run

Updated for commit d58f12c.

This branch was previously deployed

1 inactive deployment
Preview — d58f12ca Deployed Oct 23, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants