Skip to content

[Bug] Claude Code:主会话空闲、后台 Subagent 运行中(continuation)发送消息会停止全部后台任务 #615

Closed

Description

@bwndlct

[Bug] Claude Code:主会话空闲、后台 Subagent 运行中(continuation)发送消息会停止全部后台任务

Area

Harness Adapter / Host Runtime

版本

摘要

#572 之后,Turn 正在执行根工具调用时,steer 已经能原生同轮插入、不打断工作。但存在另一个常见窗口没有覆盖:主会话回复已结束(end_turn)、后台 Subagent 仍在运行、Host Turn 仍持有的 continuation 状态。此时用户在 Desktop 发送消息(普通消息或划词标注),投递仍走「停止后重发」路径,结果是所有正在运行的后台 Subagent 被一并停止,用户没有得到任何确认或提示。

复现

  1. 在 Claude Code 外部 Thread 里让模型派一个后台 Subagent(run_in_background: true),例如执行 sleep 60;
  2. 等主会话回复结束(end_turn,进入 continuation,Thread 仍显示运行中);
  3. 此时发送一条普通消息或标注;
  4. 观察:后台 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 原生行为。

根因(源码链)

  1. external-turn-steering.ts 的 externalSteeringDelivery 依 session.capabilities.steer 判定;continuation 状态下该能力为 false → 判为 newTurn;
  2. #deliver("newTurn") → #replace → 对会话执行 turn.cancel;
  3. Claude 适配器 #cancelBackgroundWork 对 Turn 的后台任务显式调用 transport.stopTasks(taskIds),并对根段执行 abortContinuation() → activeQuery.interrupt();
  4. 后台 Subagent 全部停止;随后新输入作为新 Turn 启动。

即:为给新输入让路而执行的 cancel,复用了"用户主动停止"的语义(连停后台任务)。canSteerActiveTurn()(sdk-transport.ts)要求 #active !== null && #rootToolCalls.size > 0,恰好把 continuation 窗口排除在原生 steer 之外。

建议

方向与 #571/#572 一致,把原生送达扩展到 continuation:

  1. 续态同轮送达(首选):canSteerActiveTurn() 增加 continuation 分支(#active === null 且会话仍存活、有后台任务),以 priority: "next" 推入,Claude 会把它作为下一段处理,后台任务不受影响(TUI 实测验证)。需处理该段的 receipts/turn 归属绑定。
  2. 或投递前确认:#deliver 检测到目标会话有存活后台任务且将走 newTurn 路径时,向用户确认"发送将停止 N 个后台 Subagent"。
  3. 或排队投递:continuation 期间挂起输入,待后台任务 settle 后再投递;并提供显式"立即打断"入口。
  4. 另外建议评估把固定的 Agent SDK 从 0.3.273 升到 ≥0.3.286:priority: "now" 已改为"把运行中的 shell/子 Agent/MCP 调用转入后台并加入当前 Turn,而不是停止它们",与本场景直接相关。

相关

Activity

  1. bwndlct commented on Oct 26, 2026

    @bwndlct
    ContributorAuthor

    已提交修复 PR:#617。核心改动是把原生 steer 的准入门扩展到 held Turn 的 continuation(idle 流存活时推入的输入作为该 Turn 的下一段运行,后台任务不停),含单测与 CODEXHOST_RUN_CLAUDE_HOST_REAL=1 门控的真实 CLI 端到端验证(后台 Subagent 在 steer 后 finished: true,全程单 Turn)。

  2. added a commit that references this issue on Oct 27, 2026
    596afd8
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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions