Skip to content

fix(claude): steer interrupts the running turn instead of queueing behind it - #12541

Closed
nekohasekai wants to merge 2 commits into
pingdotgg:mainfrom
nekohasekai:fix/claude-steer-interrupts-turn
Closed

nekohasekai wants to merge 2 commits into
pingdotgg:mainfrom
nekohasekai:fix/claude-steer-interrupts-turn

Conversation

@nekohasekai

@nekohasekai nekohasekai commented Sep 19, 2026 •

Copy link
Copy Markdown

For Claude, Steer was indistinguishable from Queue: the message reached the CLI's stdin at once, but Claude only folds a queued user message into a running turn between tool rounds, so behind a long tool call or a subagent it sat there arbitrarily long. Stop was the only affordance that landed, and for Claude it closes the session and takes its commands and subagents with it.

This brings the arrow in line with Codex, where sending mid-turn interrupts rather than queues behind the current work.

ProviderSendTurnInput gains interruptActiveTurn. The Claude adapter aborts the running turn before opening a new one for the message, waiting on the turn's terminal result rather than the interrupt acknowledgement, which returns while tools are still unwinding; a CLI that refuses degrades to the previous steer. It is wired to the Follow-up behaviour setting, the per-message modifier, and the arrow on a queued row. Queue is unchanged, and Stop stays a hard session boundary, so nativeInterruptAndSend keeps Claude off ProviderService's generic interrupt-then-send, which is only safe where interruptTurn leaves the session alive.

Claude Sonnet 5 running ping -c 40 through Bash, arrow clicked mid-tool: the correction was answered after 35.2s before and 2.1s after, and the turn went from 51s to 15s.

before and after

Prepared with Claude Opus 5 in T3 Code.

Summary by CodeRabbit

  • New Features
    • Added support for interrupting an active response when sending a new message.
    • Steer actions can now stop the current turn and begin processing the new message immediately.
    • Improved provider handling with native interruption support and fallback behavior where available.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 19, 2026
Comment thread apps/server/src/provider/Layers/ProviderService.ts Outdated
@nekohasekai
nekohasekai force-pushed the fix/claude-steer-interrupts-turn branch from ca06d93 to 99db6dc Compare September 19, 2026 04:44
@coderabbitai

coderabbitai Bot commented Sep 19, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR

Comment @coderabbitai help to get the list of available commands.

…hind it

For Claude, Steer was indistinguishable from Queue. The message reached the
CLI's stdin at once, but Claude only folds a queued user message into a running
turn between tool rounds, so behind a long tool call or a subagent it sat there
arbitrarily long and the send-now arrow appeared to do nothing. The only
affordance that did land was Stop, which for Claude closes the session and takes
its commands and subagents with it.

ProviderSendTurnInput gains interruptActiveTurn. The Claude adapter aborts the
running turn before opening a new one for the message, waiting on the turn's
terminal result rather than the interrupt acknowledgement, which returns while
tools are still unwinding. A CLI that refuses or never settles degrades to the
previous steer, so a correction is late rather than lost. Wired to all three
entry points: the Follow-up behaviour setting, the per-message modifier, and the
arrow on a queued row. Queue is unchanged; the queue's own drain and annotation
drops do not interrupt.

Stop is untouched and stays a hard session boundary for Claude, as pingdotgg#5891 made
it. That makes nativeInterruptAndSend load-bearing rather than an optimisation:
adapters that do not declare it take a generic interrupt-then-send in
ProviderService, which is only safe where interruptTurn leaves the session
alive - Codex, Cursor, OpenCode, Grok, Antigravity. Mobile has no send-now
affordance and no Queue/Steer setting.

Measured against a real Claude Sonnet 5 session running ping -c 40 through
Bash: clicking the arrow mid-tool answered the correction after 35.2s before
(the ping's remaining runtime) and 2.1s after, with the turn cut from 51s to
15s.

Prepared with Claude Opus 5 in T3 Code.
@nekohasekai
nekohasekai force-pushed the fix/claude-steer-interrupts-turn branch from 99db6dc to 2bc6038 Compare September 19, 2026 04:45
@juliusmarminge

Copy link
Copy Markdown
Member

we're not making core orchestrator fixes on main right now awaiting v2. if it's still a bug when v2 lands feel free to re-file

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants