Repository navigation
[Bug] Claude Code:主会话空闲、后台 Subagent 运行中(continuation)发送消息会停止全部后台任务 #615
Copy link
Copy link
Closed
Description
[Bug] Claude Code:主会话空闲、后台 Subagent 运行中(continuation)发送消息会停止全部后台任务
Area
Harness Adapter / Host Runtime
版本
- codexhost 0.14.0(含 feat(claude-code): steer running Turns natively in the same Turn #572 原生同轮 steer)
- Claude Code CLI 2.1.303,Agent SDK 0.3.273(codexhost 固定版本)
- macOS arm64,Codex Desktop 本机 Host
摘要
#572 之后,Turn 正在执行根工具调用时,steer 已经能原生同轮插入、不打断工作。但存在另一个常见窗口没有覆盖:主会话回复已结束(end_turn)、后台 Subagent 仍在运行、Host Turn 仍持有的 continuation 状态。此时用户在 Desktop 发送消息(普通消息或划词标注),投递仍走「停止后重发」路径,结果是所有正在运行的后台 Subagent 被一并停止,用户没有得到任何确认或提示。
复现
- 在 Claude Code 外部 Thread 里让模型派一个后台 Subagent(
run_in_background: true),例如执行sleep 60; - 等主会话回复结束(end_turn,进入 continuation,Thread 仍显示运行中);
- 此时发送一条普通消息或标注;
- 观察:后台 Subagent 立即收到
status: killed/ "was stopped by user",随后消息作为新 Turn 送达。
真实会话证据(2026-10-26,Claude Code 2.1.303,事件窗内三次发送、四次 kill,毫秒级对齐):
17:05:39.333 子Agent transcript 出现 [Request interrupted by user for tool use]
17:05:39.407 kill 通知入队(was stopped by user)
17:05:39.597 主会话记录 [Request interrupted by user]
17:05:41.742 用户消息作为新回合送达
对照实验(同一台机器、同一 CLI 2.1.303,原生 TUI):主会话空闲 + 后台 Subagent 运行中,在输入框直接发消息 不会 杀死 Subagent——消息只是开启下一段,Subagent 的 meta 终态为 finished: true,全程无 interrupt 标记。说明这是投递策略问题,不是 Claude Code 原生行为。
根因(源码链)
external-turn-steering.ts的externalSteeringDelivery依session.capabilities.steer判定;continuation 状态下该能力为 false → 判为newTurn;#deliver("newTurn")→#replace→ 对会话执行turn.cancel;- Claude 适配器
#cancelBackgroundWork对 Turn 的后台任务显式调用transport.stopTasks(taskIds),并对根段执行abortContinuation()→activeQuery.interrupt(); - 后台 Subagent 全部停止;随后新输入作为新 Turn 启动。
即:为给新输入让路而执行的 cancel,复用了"用户主动停止"的语义(连停后台任务)。canSteerActiveTurn()(sdk-transport.ts)要求 #active !== null && #rootToolCalls.size > 0,恰好把 continuation 窗口排除在原生 steer 之外。
建议
方向与 #571/#572 一致,把原生送达扩展到 continuation:
- 续态同轮送达(首选):
canSteerActiveTurn()增加 continuation 分支(#active === null且会话仍存活、有后台任务),以priority: "next"推入,Claude 会把它作为下一段处理,后台任务不受影响(TUI 实测验证)。需处理该段的 receipts/turn 归属绑定。 - 或投递前确认:
#deliver检测到目标会话有存活后台任务且将走 newTurn 路径时,向用户确认"发送将停止 N 个后台 Subagent"。 - 或排队投递:continuation 期间挂起输入,待后台任务 settle 后再投递;并提供显式"立即打断"入口。
- 另外建议评估把固定的 Agent SDK 从 0.3.273 升到 ≥0.3.286:
priority: "now"已改为"把运行中的 shell/子 Agent/MCP 调用转入后台并加入当前 Turn,而不是停止它们",与本场景直接相关。
相关
- [Feature] Claude Code 外部 Thread 支持原生同轮 steer:运行中追加输入不应打断当前 Turn #571 / feat(claude-code): steer running Turns natively in the same Turn #572:活跃 Turn 的原生同轮 steer(未覆盖 continuation)
- [Bug] Claude Code: Host Turn is held for a background Subagent's whole runtime (composer blocked for minutes); text+image message cannot be steered in #234:后台 Subagent 运行期间 composer 被占用(已关闭,早于 feat(claude-code): steer running Turns natively in the same Turn #572,现象不同:当时是发不进,现在是发进但杀任务)
- [BUG] Pressing Esc to exit /btw mode rejects the pending tool-use prompt instead of just exiting the mode anthropics/claude-code#64568:Claude Code 侧 interrupt 会终止后台任务的根因(上游未修复)
Metadata
Metadata
Assignees
Labels
No labels
Activity
bwndlct commentedon Oct 26, 2026
已提交修复 PR:#617。核心改动是把原生 steer 的准入门扩展到 held Turn 的 continuation(idle 流存活时推入的输入作为该 Turn 的下一段运行,后台任务不停),含单测与 CODEXHOST_RUN_CLAUDE_HOST_REAL=1 门控的真实 CLI 端到端验证(后台 Subagent 在 steer 后 finished: true,全程单 Turn)。
fix(claude-code): steer a held Turn's continuation instead of stoppin…