Skip to content

[Bug]: Resume retries Claude after selecting Codex, while Send hands off successfully #15555

Closed

Description

@MatthewFeroz

Before submitting

  • I searched existing issues and did not find a duplicate of this Resume behavior.
  • I included a real affected thread, reproduction steps, and source references.

Area

apps/web, also used by the desktop client.

Steps to reproduce

  1. Start a Claude conversation and let a turn fail with a usage-limit error.
  2. In the same thread, select Codex in the composer model picker.
  3. Click Resume without sending a new message.
  4. Observe which provider runs the generated Continue where you left off. message.
  5. For comparison, keep Codex selected and send an ordinary message in the same thread.

Expected behavior

Resume should use the provider/model currently shown in the composer and carry the prior conversation through the existing handoff path, as Send does. Please confirm the intended behavior if Resume is deliberately tied to the previous provider.

Actual behavior

Resume starts another Claude turn and immediately hits Claude's limit again. Sending an ordinary message starts Codex and successfully hands off the same conversation.

Real example

This occurred on October 4, 2026 while investigating a floating-preview drag problem. The reporter confirmed that they selected Codex and then clicked Resume. The following records were read from that thread's persisted timeline and run metadata. Times are America/Los_Angeles, UTC-07:00.

Time Action / message Provider recorded for the run Result
00:14:41 Initial investigation reaches the limit claudeAgent / claude-opus-5-5 Failed with usage-limit error
00:19:36 Resume generates Continue where you left off. claudeAgent / claude-opus-5-5 Failed at 00:19:37 with the same limit
00:19:53 Another Resume generates the same message claudeAgent / claude-opus-5-5 Failed again within a second
00:31:00 Ordinary message: testing codex / gpt-6.1-sol Handoff created; run completed at 00:33:54

The successful run recorded a provider context handoff covering app runs 1-3. Codex's first response explicitly picked up the preview-drag investigation from that handoff. This comparison happened in the running app; the local source patch had not been installed.

Impact

Minor bug or occasional failure. Resume cannot move this usage-limited work to the selected provider, but sending a message works.

Version or commit

  • Installed desktop app at investigation: 0.0.46-nightly.20261004.2644.
  • Local source inspected: e19a48d220a18ef198178b48d12aa1a034596489.
  • The same omission is present on upstream main at d60a71ef6e371d8b345ecb1f7575117d675187c7.
  • The running app's exact source SHA was not independently verified.

Environment

macOS 27.0.1, Apple silicon, T3 Code Nightly desktop. Claude to Codex within one existing thread.

Logs or stack traces

Claude usage limit reached. This turn is paused until the 5-hour limit resets in 3h 41m.
You've hit your session limit · resets 4am (America/Los_Angeles)
Claude API rate limit reached. Try again later.

Source evidence and verification limits

Four local integration cases verify that an explicit Codex selection on a manual continuation of usage-limited Claude work preserves the original request and partial response, for new/existing Codex conversations and native/inline history delivery. The focused hands off tests passed, 20 tests total. These tests exercise the server path, not the browser click. No automated end-to-end UI reproduction has been performed.

This differs from #10967, where the picker blocked provider switching entirely. Here Codex is selectable and the same conversation successfully switches through Send.

Workaround

Select Codex, then send a normal message such as Continue where you left off. instead of clicking Resume. The real successful comparison above used testing.

Activity

  1. juliusmarminge commented on Oct 4, 2026

    @juliusmarminge
    Member

    Note

    Grok responding on behalf of Julius.

    Triage

    Thanks for the real thread timeline and the source links, @MatthewFeroz. They made this easy to confirm. Resume retries the thread's saved provider and model, while Send uses whatever is selected in the composer, which is why the same thread hands off through Send.

    What I found

    • Changing the picker only updates the local composer draft (onProviderModelSelect in apps/web/src/components/ChatView.tsx) and doesn't write to the thread.
    • The Resume handler in ChatView.tsx calls startThreadTurn with manualContinuationOfRunId and no modelSelection. persistThreadSettingsForNextTurn can store a nextModelSelection, but Resume doesn't pass one.
    • The client forwards modelSelection only when it's set (packages/client-runtime/src/operations/commands.ts), and the server falls back to command.modelSelection ?? projection.thread.modelSelection (apps/server/src/orchestration-v2/Orchestrator.ts). So the continuation stays on Claude and hits the same limit.
    • Send passes ctxSelectedModelSelection from the composer, which takes the handoff path.
    • The same gap drops a model or option change within one provider too, not just a switch from Claude to Codex. Desktop uses this web view. Mobile has no matching Resume handler.
    • This isn't [Bug]: Thread doesn't allow provider swap #10967, since the picker already allows the switch here. Automatic usage-limit recovery is a separate path that keeps the saved provider.

    Your workaround is right: with Codex selected, send a normal message instead of clicking Resume.

    Likely fix area

    • One option is for the Resume handler in ChatView.tsx to pass the composer's modelSelection, the same way Send does, so a manual Resume follows the picker.
    • If Resume is meant to stay on the previous provider, another option is to make that visible in the UI when the composer selection differs.

    A maintainer will decide on the fix direction.

  2. added
    bugSomething is broken or behaving incorrectly.
    via-triageFiled through npx t3 triage
    on Oct 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is broken or behaving incorrectly.via-triageFiled through npx t3 triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions