[Bug]: t3_thread_send mode "restart" always fails on a running Claude thread ("cannot redirect an active run")#32890
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
- Start a Claude Agent thread and have it run a long foreground command, for example
python3 -c 'import time; time.sleep(150)'. - From another thread, call
t3_thread_send {threadId, mode: "restart", message: "…"}on it while that turn is running. - Repeat step 2 against a Codex thread whose turn is running.
Expected behavior
t3_thread_send documents restart as "interrupt and restart". The running Claude turn should be interrupted and the message should start as the next turn, as happens on a Codex thread.
Actual behavior
On the Claude thread, every restart fails:
| 1 | {"_tag":"OrchestratorMcpFailure","code":"orchestration_error","message":"Unable to send to thread mcp:28390183-…: Claude-worker cannot redirect an active run. Stop it first, then send the message."} |
The Claude driver reports these session capabilities: supportsInterrupt: true, supportsActiveSteering: true, supportsSteeringByInterruptRestart: false. So decideSteeringExecution with forceRestart rejects the call as interrupt_restart_steering. The same call on a Codex thread restarts the turn.
As a result, an agent that wants to interrupt another thread has to know which driver the target uses, or parse this message, before it can call t3_thread_interrupt and send again with queue. T3 can already interrupt a Claude turn. Could restart, on a driver without native interrupt-and-restart, do exactly that: interrupt the turn, then start the message as the next turn? If not, could the tool description say that restart works on Codex only, and say what to do instead?
Impact
Minor bug or occasional failure
Version or commit
T3 Code (Beta) Desktop 0.1.7
Environment
macOS; codex-cli 0.167.0; Claude Code 2.1.319
Workaround
t3_thread_interrupt on the Claude thread (task_cancel for a delegated child), then t3_thread_send with mode: "queue".