让 Claude Code 长时间运行去一口气解决一个复杂任务,是很常见的用法,比如让它把一个 feature 从设计、实现到测试一次做完,或者修复一个跨多个文件的 bug。
但这种场景有个老问题:Claude 经常自己觉得「做完了」就停下来,实际上任务远没到位。
用 Hooks 给 Claude Code 加规矩 的例 5 里我们配过一个 Stop hook,在 Claude 想停下来时强制跑一遍 typecheck 和测试,没过就不让它停。这种做法提高了 Agent 工作的可靠性,脚本验证通过不了就继续干,直到验证通过为止。
可问题是,「任务到底完成没」这种判断,往往不是一两个 shell 脚本能精确表达的。typecheck 和测试只能验证基础正确性,但实际开发里「实现思路是否合理」「测试有没有覆盖关键边界」「文档是不是补齐了」这类东西,根本不是确定性脚本能判定的。
那怎么办?一个自然的思路是:专门开一个评判器(LLM judge)来当验收员。
把目标用一句话告诉这个评判器,主 agent 想结束时触发它检查一下。评判器看一看当前的情况,返回一段 JSON:
// 通过
{ "done": true }
// 没通过
{ "done": false, "reason": "测试里没覆盖空输入的情况" }通过了就放行,没通过就把 reason 字段的内容反馈给主 agent,让它接着干。改完之后想停,再走一遍验收循环。
这套做法本质就是把干活的和验收的分开:主 agent 负责干活,另开一个评判器负责监督,比让主 agent 自己判断「我做完了没」要可靠得多,因为人都有给自己打高分的倾向,模型也一样。监督这件事天然就该交给一个利益不相关的第三方。
思路就是这样。在 Claude Code 里我们并不需要自己去搭这套监督机制,它已经内置了,对应的就是 /goal 命令。这篇就来看看它是怎么实现的。