给 agent 一个可验证的终点:/goal 完成条件实战
用过 coding agent 的人大概都熟这个循环:agent 说”改完了”,你跑一遍测试,红了,你说”再修一下”,它再改,你再跑。一来一回,人被困在回合之间当裁判。Claude Code 的 /goal 命令处理的就是这一段:你把完成条件写死,它自己反复干到条件被证实满足,不用你每一步按继续。[1] 这个功能 2026 年 5 月随 Claude Code v2.1.139 一起发布。[1]
机制一句话能说清:设置完成条件后,每个回合结束,一个小而快的模型检查条件是否满足;不满足就开下一个回合,而不是把控制权还给你。条件满足、被判定不可能、或回合卡在必须你亲手修复的错误上时,目标自动清除。[3][4] 真正要紧的是”独立评估”:判断完成的是另一个新鲜的模型,不是干活的这个。[3] 官方文档的说法是两者互补,auto mode 消掉每个工具的确认,/goal 消掉每个回合的提示。[3][4]
评估器只看对话记录#
动手之前先接受一个事实:评估器不跑命令、不读文件,只根据 Claude 在对话里呈现的内容判断条件。[3] 社区 skill 的总结很直接:一句没说清楚的条件,能在你发现之前烧掉几十个回合。[5]
推论也很直接:条件必须写成 Claude 自己的输出能证明的东西。“test/auth 里所有测试都通过”有效,是因为 Claude 会运行测试,结果落在对话里给评估器读。[3] 而”把 legacyAuth 重构干净”这种话,Claude 中途说一句”重构完了”,评估器读到这几个字就清了目标,实际调用点没动、类型错误还在、测试命令压根没跑过。[5]
条件的长度上限是 4,000 个字符,足够写清楚;评估本身跑在小型快速模型上,费用相对主回合通常可以忽略。[4]
条件四件套#
社区那个 skill 把健壮的条件拆成四个槽位:可测量的终点、证据、不变式、上限。缺一个对应一种失败:没有终点,评估器永远看不到”完成”;没有证据,评估器只能猜代码改得对不对,误判率高;没有不变式,范围外的改动混进 PR;没有上限,token 烧到你手动介入。[5]
迁移场景的完整例子,四个槽位都在:
/goal 把 legacyAuth() 的所有调用点迁移到 auth.verify(),
证明方式:
1) rg "legacyAuth\(" -t ts 返回零匹配,且
2) bun run typecheck 退出码为 0,且
3) bun test test/auth 退出码为 0,
不修改 vendor/、node_modules/、*.generated.ts 下任何文件,
或 20 个回合后停止。
三个客观信号都是 Claude 必须贴出来的退出码,加上不许碰的目录和回合上限。[5] 我自己的经验是回合子句一定要写,条件覆盖不到的岔路会让它绕很久。官方文档也支持这个写法:要限制运行时间,就在条件里加回合或时间子句,例如 or stop after 20 turns。[3]
快速上手#
按顺序跑一遍,半小时能摸熟。
- 设置。输入 /goal 加条件,设置会立刻启动一个回合,条件本身当指令,不用再发提示;会话上方会出现 ◎ /goal active 指示器。[3]
- 无人值守要配 auto mode。目标不改变权限模式,手动模式下做工具调用仍会问你;想让回合自己跑,把 /goal 和自动模式配对。[3]
- 查进度。不带参数运行 /goal,能看到条件、已运行时长、已评估回合数、token 支出和评估器最近一次的理由。[4]
- 清除。/goal clear 提前移除目标,stop、off、reset、none、cancel 都是别名,条件满足前想停就停。[3]
- 非交互跑长任务。claude -p “/goal …” 会在单次调用里循环到完成;默认输出在条件满足前什么都不打,看着像卡住,加 —output-format stream-json —verbose 能看到逐条消息,Ctrl+C 随时打断。[3][4]
- 恢复会话注意回合预算。—continue 或 —resume 会把活跃目标带回来,但回合数、计时器、token 基线全部重置。[4] 社区提醒过:resume 静默重置回合上限,resume 三次,“20 回合”就悄悄变成 60 回合。[5]
实战提醒#
先有检查,再谈自动化。官方最佳实践的第一句就是:给 Claude 一个能跑的检查,测试、构建、截图都行,这是”盯着的会话”和”可以走开的会话”的区别。[6] /goal 只是把检查变成跨回合的闸门,检查本身得先存在。[6]
配合后台 subagent 更好用。Claude Code 六月底起 subagent 默认后台运行:等 subagent 时主 agent 继续干活,结束再收结果。[2] 大重构可以拆成几个后台 subagent 分头做,主会话挂 /goal 盯终态;从 claude agents 启动的后台 agent 干完活会直接 commit、push、开 draft PR,而不是停下来问。[2]
留个失败预案。评估器判定条件不可能满足时,会清掉目标并记录失败原因,不用你手动清。[4] 认证失败、额度耗尽、上下文溢出、模型不可用这四类错误也会清目标,警告以 Goal cleared after an unrecoverable error 开头,修好原因重新 /goal 就行。[4]
/goal 不会让 agent 更聪明,它只解决”人反复按继续”这一个问题。但把”什么叫做完”写成可验证的条件,这个动作本身会逼你想清楚终态。Vibe Coding 里最值钱的可能就是这一步。
Sources#
[1] https://code.claude.com/docs/zh-CN/whats-new/2026-w20 — Claude Code 第 20 周更新(/goal、agent view) [2] https://code.claude.com/docs/en/whats-new/2026-w27 — Claude Code Week 27(后台 subagent、Sonnet 5) [3] https://code.claude.com/docs/zh-CN/goal — 让 Claude 朝着目标工作(官方文档·中文) [4] https://code.claude.com/docs/en/goal — Keep Claude working toward a goal(官方文档·英文) [5] https://github.com/CSZHK/goal-conditions — goal-conditions: /goal 条件编写配方(社区 skill) [6] https://code.claude.com/docs/en/best-practices — Best practices for Claude Code(官方)