跳转至

3.8 Agent 跑偏、报错、卡住时如何恢复

阅读完本节后,你应该能处理本地 Agent 常见失败:理解错需求、改错文件、测试失败、上下文漂移、陷入反复修补。

会用 Agent 的关键,不是它永远不犯错,而是你能把它拉回可控轨道。

常见失败类型

类型 表现 根因
需求跑偏 做了你没要求的功能 Goal / Out of Scope 不清楚
文件跑偏 改了无关模块 Context Pointers 不足,没先 research
风格跑偏 写法和项目不一致 没要求复用现有模式
修补循环 修一个错引入另一个错 没先定位根因
验证逃避 不跑测试就说完成 Done Definition 太弱
上下文污染 把废案当需求 长对话里历史信息冲突
破坏用户改动 回滚或覆盖已有 diff 没检查工作区状态

恢复第一原则

不要在混乱状态下继续让 Agent “再试试”。

先停下来,做三件事:

1. 冻结当前改动。
2. 重新建立事实。
3. 再决定修复、回退还是重做。

恢复提示词

停止继续实现。现在进入恢复模式。

请先不要修改文件,完成以下分析:
1. 当前任务原目标是什么。
2. 当前 diff 改了哪些文件。
3. 哪些改动和目标相关,哪些可能无关。
4. 当前失败的具体现象是什么。
5. 最可能的根因是什么。
6. 你建议保留、修改、撤销哪些改动。

注意:不要回滚用户已有改动,只讨论本次任务相关 diff。

这会把 Agent 从“继续写”切回“读和判断”。

测试失败时

不要让 Agent 盲修。

错误流程:

测试失败了,修一下。

正确流程:

测试失败了。先不要修改文件。
请分析失败日志:
- 哪个测试失败。
- 失败断言是什么。
- 是本次改动导致,还是环境/旧问题。
- 需要看哪些文件来确认根因。
- 给出最小修复计划。

如果它没有完整日志,把完整错误贴进去。不要只贴最后一行。

改错文件时

先让它识别无关改动。

请检查当前 diff,列出所有可能无关的文件和原因。
不要执行回滚。先告诉我哪些改动应该保留,哪些应该撤销。

确认后再让它用补丁方式撤销自己的无关改动。

只撤销你刚才列出的无关改动,保留用户已有改动和本任务必要改动。

不要让 Agent 用粗暴命令清空工作区,除非你非常确定且已经备份。

上下文漂移时

长会话里,Agent 可能混入旧目标。处理方式是重新压缩上下文。

请把当前会话压缩成一份继续任务所需的状态摘要:
- 原始目标。
- 已确认的约束。
- 已完成改动。
- 当前失败或阻塞。
- 下一步计划。
- 不要再考虑哪些废案。

然后开启新会话,把摘要和当前 diff 状态交给新的 Agent。

修补循环时

如果 Agent 连续修三次还失败,停止。

进入根因分析:

你已经连续修复多次但问题仍未解决。现在不要继续改代码。
请做 root cause analysis:
1. 我们实际观察到的事实是什么。
2. 哪些假设被验证过,结果是什么。
3. 哪些假设还没验证。
4. 最小复现是什么。
5. 下一步应该先加测试、打日志、读代码,还是回退方案。

修补循环通常说明缺的是事实,不是更多代码。

什么时候换工具

情况 换什么
需要重新思考产品方案 网页 Claude / GPT
需要长文档对照 Gemini CLI 或长上下文工具
需要真实读仓库和改文件 Claude Code / Codex / OpenCode
需要浏览器复现 Playwright / Browser MCP
需要查最新框架用法 文档 MCP / 官方文档
需要多人并行探索 多 Agent / worktree
需要切换模型或本地模型 OpenCode

换工具不是逃避,而是承认当前工具上下文不合适。

恢复检查表

  • [ ] 当前失败现象已经具体化。
  • [ ] 当前 diff 已经看过。
  • [ ] 无关改动已识别。
  • [ ] 没有使用破坏性回滚命令。
  • [ ] 根因假设至少验证一个。
  • [ ] 新改动有对应测试或验证。
  • [ ] 如果开启新会话,已准备状态摘要。