Skip to content

[Bug]: Claude refuses every message as a "model or setting change" when a thread moves between mobile and web while background work runs #15471

Description

@vitalyiegorov

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/server

Steps to reproduce

  1. Use a Claude thread from the mobile app, and have the agent start a background shell or a background agent (here gh pr checks --watch).
  2. Without changing the model, effort or any option, send a message to the same thread from the web or desktop client while that work still runs.

Expected behavior

The message goes to the live Claude process. Nothing about the model or its settings changed.

Actual behavior

Every message fails with:

Claude is still running background agents or commands, and this model or setting change would end them. Wait for them to finish, or press Stop, then send the message again.

The thread accepts nothing until the background work ends on its own. Stop doesn't help either, which is tracked separately.

Cause

The two clients send the same Normal speed differently. Mobile omits fastMode. The web composer always adds fastMode: false (withImplicitFastModeDefault in apps/web/src/components/chat/composerProviderState.tsx).

compileClaudeModelSelection (apps/server/src/claudeModelOptions.ts) keeps the two apart: settings is {} for one and { fastMode: false } for the other, so queryIdentity differs. openQuery in ClaudeAdapterV2.ts then sees a selection change. Since #14726 it refuses that change with ClaudeBackgroundWorkBlocksQueryReplacementError whenever background work runs. Before #14726 it silently restarted the process, which killed the work.

From the affected thread's run records:

Runs Sent from modelSelection.options Result
1–14 mobile none completed
15–16 server (continuation after the update restart) none completed; run 16 started the background shell
17–19 web [{ id: "fastMode", value: false }] failed with the error above

Suggested fix

Compile an unset fastMode as false for models that support it. That is the Normal speed the web composer already sends, so both clients produce the same settings and the same query identity. It's a one-line change in compileClaudeModelSelection; the guard from #14726 stays as it is. I can open the PR.

Impact

Blocks work completely

Version or commit

t3@0.0.46-nightly.20261004.2644 (main 8fb068c)

Environment

Linux host (systemd service). macOS desktop client and the mobile app on the same thread.

Screenshots, recordings, or supporting files

The model and effort are unchanged (Claude Opus 5.5, Medium · 1M), yet each message is refused as a setting change:

Messages refused as a model or setting change while a background shell runs

Once the shell ended, the next message showed a context handoff from Claude Opus 5.5 to Claude Opus 5.5, again with no model change:

Context handoff from Claude Opus 5.5 to Claude Opus 5.5

Workaround

Keep sending from the client the background work was started from, or wait until the work ends.

Related

Activity

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