[Bug] Claude Code 会话陷入重复工具调用循环:约 50 分钟 141 次重复搜索、零文本产出,时间看门狗不拦截
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 401
- Avg merge
- 21h 40m
- Merged PRs (30d)
- 805
Description
### 问题描述
2026-08-14 凌晨,一个 Claude Code 会话在执行「在本地 fork 仓库中查找某个文件」类任务时,陷入约 50 分钟的重复工具调用循环:
- 期间共发出 153 次 Bash 调用,其中 141 次是两条几乎相同的 grep 命令交替执行(各约 70 次,每 15~20 秒一次)
- 模型零文本输出——没有思考进展、没有提问、没有报错
- 进程全程活跃、持续消耗 token;回合从未静止,因此现有的时间型 turn-stall 看门狗(45 分钟)不会触发
- 最终靠人工肉眼发现「窗口不动了」并介入才结束
### 触发诱因(观察)
该会话按一份工作计划开工,计划引用的目标文件(`apps/desktop/src/main/maker-host/shell-command-policy.ts`)已被上游提交 `fa418f900` 删除(#2414 相关:shell 守卫误拒普通命令后整套撤掉)。搜索结果反复只命中「接口引用」(`base-agent.ts:731` 的 `getShellCommandPolicy` 契约声明),始终找不到实现本体。模型没有接受「文件不存在」这一结论,而是退化为反复重跑同一搜索——每条命令的结果与上一条完全相同,无任何新信息,但循环持续了 50 分钟。
### 一个值得注意的宿主侧现象
几乎每条 Bash 工具结果都附带「Shell cwd was reset to <工作目录>」提示(本次 153 次调用中约 150 次出现)。命令本身都带 `cd` 前缀、实际执行正确,该提示并非错误;但它出现在工具结果正文里,模型可能将其解读为「环境异常、命令没有在预期目录执行」,从而放大了重试行为。建议评估该提示对 agent 输出的必要性与措辞。
### 期望
1. **宿主层低熵循环防护**:同一工具 + 同一参数(或极小参数集)连续重复 N 次且结果无变化时主动介入——例如向模型注入提示(「重复执行同一命令 N 次且结果未变,请停下来换思路或上报」)或中断回合。检测可放在 PreToolUse hook 层(按 command 串哈希计数),无需跨进程观测。
2. **评估「Shell cwd was reset」注入**:避免把非错误信息混入工具结果正文误导模型。
### 影响
- 纯浪费:约 50 分钟 token 消耗、零产出
- 无自动恢复路径,只能人工发现并介入
- 这是「会话卡死」家族的第三种模式:此前有 #1915(回合 done 后宿主不收尾)、#1932(回合完成信号丢失)、#2681/#2642(Codex 重建死循环)——本案是「回合活跃但低熵空转」,现有防护(时间型看门狗)覆盖不到
### 环境
- 客户端版本:0.1.46(08-13 自动更新)
- 系统:Windows 10 Pro 19045
- 会话类型:Claude Code 会话
Contributor guide
Research direction
Start by tracing the PreToolUse hook and the host code that injects “Shell cwd was reset...” into tool results. The only code reference is the getShellCommandPolicy contract at base-agent.ts:731; the named implementation file was deleted. Done means the repeated-call behavior and cwd message are evaluated with an agreed intervention or wording change.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- ai, devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Needs clarification
- Newbie friendliness
- 45/100