ErrorStreak 伪进展检测
wesgine 的 ErrorStreakDetector 检测 Agent 在连续多轮中反复遇到错误但仍在继续的"伪进展"场景。
设计目标
CycleDetector 检测的是"完全相同的操作 + 完全相同的结果"(真循环)。ErrorStreak 检测的是另一种病态:Agent 每轮都做不同的事,但每轮都失败。
典型场景:
- 工具执行反复报错,Agent 换不同参数重试
- 文件操作连续失败(权限、路径不存在)
- 网络请求连续超时
从 counter 角度看没有循环(参数每次都不同),但从用户视角看就是"AI 在原地打转"。
检测机制
Turn 1: exec("make build") → error
Turn 2: exec("go build ./...") → error
Turn 3: exec("go build -v ./...") → error
Turn 4: read("Makefile") → ok
Turn 5: exec("make build VERBOSE=1") → error
→ ErrorStreak 触发
ErrorStreakDetector 跟踪连续错误次数,达到阈值时:
- 触发 HITL(Human-in-the-Loop)请求
- 询问用户是否继续、换方向、或终止
- HITL 超时后自动终止 Run
与 CycleDetector 的区别
| CycleDetector | ErrorStreak | |
|---|---|---|
| 检测对象 | 完全相同的调用 | 连续失败的不同调用 |
| 触发条件 | 相同参数+相同结果 | 工具返回 IsError=true |
| 第一步 | 自愈(纠正消息) | HITL 询问 |
| 最终手段 | HITL → 超时终止 | HITL → 超时终止 |
不变量
INV-STREAK-01:ErrorStreak HITL 超时后终止 Run,与 CycleDetector 的终止路径共用 ApplyTermination 状态迁移。
INV-TERM-01:ErrorStreak 的内部 counter 不会自主终止 Run——它总是先经过 HITL 环节让用户决定。
事件
ErrorStreak 触发时发出 error_streak 事件,前端可据此显示警告提示。
相关文档
- CycleDetector →
cycle-detection.md - Run 终止哲学 →
run-termination.md - HITL 机制 →
hitl.md - Run 生命周期 →
run-lifecycle.md