arrow_backRetour aux issues
MilkSU-Official/milksu
#14
Débutant
Ouvrirarrow_forward
Débutant
Ouvrirarrow_forward
Débutant
Ouvrirarrow_forward
Agent tool-call infinite loops and Go runtime unavailable during abnormal restart recovery
ecoDébutant
bug
help wanted
descriptionDescription
## 摘要
在 macOS arm64 上观察到两个相互关联但应分别修复的问题:
1. **Agent 工具调用会进入无进展的无限/近无限循环**。模型在工具结果没有提供新信息时,持续生成 `bash` 调用,直到用户或外部条件中断。
2. **MilkSU 发生异常退出并自动重启后,前端可能在 Go runtime 尚未 ready 时调用 IPC,显示 `MilkSU Go runtime is unavailable`**。该错误是已确认的恢复竞态表象;上一次异常退出的低层退出原因没有被持久化,因此目前不能将它严谨地归因于 Go panic 或工具循环本身。
本 issue 汇总可供 Agent/开发者直接复现和分析的原始 session、trace、runtime 日志及系统证据。
## 环境
- 应用:MilkSU `26.818.1`
- 平台:macOS arm64
- 事发日期:2026-08-18
- 受影响模型路由(两个循环 session):`provider=milksu-account`,`model=grok/grok-4.6`,`api=openai-completions`
- 工作目录:`/Users/sorrowrain/Documents/Code/milksu`
## 原始证据
Secret Gist(需访问链接权限;包含未进一步脱敏的原始对话和工具调用记录):
- https://gist.github.com/SorrowRain/43ae9c1a5d679606d9eee7eb82ca8bb3
Gist 内容:
- `tool-loop-session-0a8420a2.jsonl`:完整原始 session,主循环案例
- `tool-loop-session-8673bf82.jsonl`:完整原始 session,进程过滤循环案例
- `current-analysis-session-56a163ec.jsonl`:本次诊断/分析对话的完整原始 session
- `session-*.trace.tsv`:工具调用顺序
- `session-*.tool-counts.txt`:调用计数
- `runtime-lifeline.log`、`runtime-lifespan.json`:runtime 恢复状态
另有本地完整诊断包,未上传到 Gist 的原因是 Gist 不支持二进制文件:
```text
milksu-diagnostics-20260818-220404.tar.gz
milksu-evidence-20260818.tar.gz
SHA-256: 58430bcad1cbffec96ee3da77efbb05adbe842142fa106671bbf44e18ce6862e
```
合并证据包包括以上三份原始 JSONL 与诊断包。原诊断包包含:runtime log、SQLite 在线备份、session JSONL、conversation mirror、process sample、unified log extract、SHA256SUMS 和文件清单。采集脚本已排除 `credentials.db`、认证会话、Cookies 等常见敏感文件;原始 session 内容按报告方要求保留。
---
# 问题 1:工具调用无限循环 / 无进展循环
## 案例 A:文件列表查询不断放大范围后重复相同命令
- Session ID:`0a8420a2-74a5-4220-ba30-fdd39dc162a7`
- 工具统计:`bash = 219`,`ls = 1`,`read = 1`
- 用户最初要求:clone 源码到 `Code` 目录并准备修复/提 issue/PR;之后描述两个工具类问题。
工具调用起初合理,但在没有获得新信息的情况下持续重复。例如后段按如下轨迹执行:
```bash
cd /Users/sorrowrain/Documents/Code/milksu && find . -name "*.md" -o -name "*.ts" -o -name "*.tsx" | head -50
cd /Users/sorrowrain/Documents/Code/milksu && find . -name "*.md" -o -name "*.ts" -o -name "*.tsx" | head -100
cd /Users/sorrowrain/Documents/Code/milksu && find . -name "*.md" -o -name "*.ts" -o -name "*.tsx" | head -200
...
cd /Users/sorrowrain/Documents/Code/milksu && find . -name "*.md" -o -name "*.ts" -o -name "*.tsx" | head -1000 | tail -900
cd /Users/sorrowrain/Documents/Code/milksu && find . -name "*.md" -o -name "*.ts" -o -name "*.tsx" | head -1000 | tail -900
```
同时也重复执行过:
```bash
ls /Applications/MilkSU.app/Contents/Resources/milksu-sidecar/node_modules/@playwright/mcp/
cd /Users/sorrowrain/Documents/Code/milksu && git log ...
```
问题不在 shell 卡住:各命令均快速返回;而是模型继续生成相近调用,且 orchestrator 没有检测到其结果没有推进任务。
## 案例 B:`ps | grep -v ...` 过滤链无限追加
- Session ID:`8673bf82-2224-4be1-8326-c064807f9aaa`
- 工具统计:`bash = 7`,`bg_status = 1`
- 用户请求:检查项目下另一个重复 `ls`/`cd` 的 session。
模型从一个进程查询开始:
```bash
ps aux | grep -E 'bash|zsh|sh' | grep -v grep
```
随后没有切换为直接读取 session、Agent 状态或工具调用记录,而是单调追加排除项:
```bash
... | grep -v WeChat | grep -v QQ | grep -v ChatGPT | grep -v 1Password | grep -v enterprise
... | grep -v MilkSU
... | grep -v Chrome
... | grep -v mdworker
... | grep -v AUCrashHandlerService | grep -v diagnosticspushd | grep -v keychainsharingmessagingd | grep -v ReportCrash | grep -v sharingd
... | grep -v CKSharingManagementDaemon | grep -v diagnosticspushd | grep -v osanalyticshelper
```
这是一种典型的近似重复工具调用:命令字符串变化,但信息收益持续为零,且行为模式明确为“根据前一结果继续人工过滤”。
## 预期行为
- 同一 turn 内工具调用应在达到任务目标、缺少信息、无进展或明显重复时停止,而不是无限延续。
- 用户发送新消息时,应取消当前未完成模型请求、尚未执行的 tool call 和其后续调度链,然后开始新的 turn。
- 工具结果不应仅作为下一次模型输出的上下文堆积;Agent loop 应具备独立的进展/重复判断。
## 实际行为
- 相同或近似 `bash` 调用在同一个 Agent turn 持续出现。
- `head N`/`tail N` 参数递增、`grep -v` 排除条件追加,绕过简单的“完全相同字符串”判定。
- 调用次数没有硬上限或熔断,没有面向用户的清晰终止原因。
- 前端会持续接收工具状态更新,可能放大 renderer/IPC 压力。
## 根因判断(基于现有证据)
高置信度结论:这是**模型 tool-use 行为与应用侧缺少循环防护的组合问题**,不是 bash/shell 命令卡死。
相关但未被证实为唯一根因的因素:两个异常 session 均使用 `grok/grok-4.6` 与 `milksu-account` 路由。需要用其他模型和相同 prompt 重放,判断是否存在模型特异性;无论结果如何,应用侧都必须提供通用熔断机制。
## 建议修复
### 1. 精确重复和近似重复检测
在每个 tool result 后,对调用做规范化并记录滑动窗口。至少识别:
- 完全相同的 tool name + arguments
- `find ... | head N` 中仅 `N` 变化的调用
- `... | grep -v X` 仅追加排除条件的调用
- 相同命令前缀、相同 cw
Issues similaires
medik8s/fence-agents-remediation
star18
Poids du dépôt moyen
v0.8.0 starts a cluster-scoped Secret informer despite namespace-scoped Secret RBAC
## Description While testing Fence Agents Remediation (FAR) v0.8.0, I observed the manager repeatedly attempting to li…
Go
good first issue
Wayfare-labs/wayfare
star1
Poids du dépôt léger
Check that an issuer's home_domain round-trips to the same stellar.toml
Written to the standard set by #33 — read that issue first for the expected level of detail and the acceptance criteria…
Go
help wanted
area:corridor
Wayfare-labs/wayfare
star1
Poids du dépôt léger
Report auth_immutable: whether an issuer's flags can still change
> **This issue is the reference standard.** Every other check issue links back here for the expected level of detail. I…
Go
help wanted
good first issue