目标提示
/goal 让代理持续工作直至满足完成条件。Claude Code 和 Codex 均将其视为单行命令,最多 4000 字符。在 Claude Code 中,一个小模型会在每次交互后仅根据对话记录重新判断条件——它无法运行命令。
起草一个可以终止的条件,然后对其进行格式化。一个目标应适用于超过一次交互的大任务,并带有可检查的终点;将小目标串联起来并在它们之间进行审查,而不是编写一个巨大的目标。
起草
包含以下内容,用 AND 连接——永远不要用 "or",否则循环会走更便宜的分支:
- 结束状态,而非活动——"所有
legacyAuth()调用点都使用auth.verify()",而不是"迁移认证代码"。活动可以被声称完成;结束状态要么为真要么为假。 - 先指定阅读范围——在行动前需要阅读的文件、问题、日志或计划。
- 明确的检查——确切的命令及其可观察的结果("
npm test退出码为 0"),加上运行该命令并展示输出的指令;一个从未出现在对话记录中的结果对评估器来说是不存在的。 - 不变条件——哪些不能改变("不修改 vendor/"),始终包括"不削弱、跳过或编辑检查本身"。
- 停止边界或阻塞子句——"或在 20 次交互后停止","如果被阻塞,停止并报告阻塞原因"。没有它,表述错误的条件会导致无限循环;格式化程序会在缺少时发出警告。(Claude Code 在会话恢复时重置交互计数器,因此交互边界会在恢复后静默延长。)
保持精简。 每个约束都会缩小模型可以探索的状态空间。尽可能简化为一个终止标准,将范围和定义移入引用的文件中,并删除非目标项——一个约束只有在其能堵住一个真正的"捷径"时才有存在的理由。
对于长目标,还要命名最终证据(差异、报告、工件)并要求日志文件——这是跨压缩和恢复的持久状态。如果描述超过 4000 字符,将详细信息放入 GOAL.md 并从目标中引用该文件。
切勿发明缺失元素。 每个元素都必须基于用户的请求、对话或仓库——查询信息而非猜测。如果无法根据可用信息填充某个元素,仍要优化和格式化用户提供的内容,省略该元素,并将其标记为缺失(参见“格式化”)。包含虚构成功条件的目标会终止于错误的合约。
堵住捷径
在格式化之前,以一个懒惰模型的角度重新阅读起草的条件:让每个检查都通过而不做预期工作的最便宜方法是什么?堵住最便宜的几条——首选将已有的检查配对,而不是添加约束,并且不要枚举所有可以想到的捷径变成一个非目标列表。常见的捷径:
- 删除或存根而非修复——“搜索无输出”在调用者被删除时同样成立;将此类检查与一个证明功能仍可用的检查配对。
- 在子集上通过——运行一个测试文件,缩小搜索路径,从检查中排除目录。
- 欺骗门控——跳过/预失败测试,硬编码预期输出,对测试输入进行特例处理,编辑检查(即不变条件规则)。
- 声称而不运行——仅声明完成或阻塞,但没有检查输出出现在对话记录中(即展示输出规则)。
与上述相同的纪律:一个你无法从可用信息中堵住的捷径将进入 Missing: 列表作为警告——一个虚构的或荒谬的约束比一个标记出的缺口更糟糕。
安全研究目标
将审计目标简化为一个终止标准,例如识别、触发并验证一个在引用的威胁模型文件下有效的高严重性漏洞。该文件(而非目标)承载范围、攻击者能力、严重性基线和需要跳过的已知发现。使用中性措辞(“触发并验证”,而非“证明这是可利用的”),要求展示先决条件——假设的攻击者访问权限是最常见的误报——并在每个发现后停止以进行人工审查,而不是堆积未经分类的报告。通过一个全新的代理(而非原始查找者)进行二次验证来确认发现。
格式化
在草稿(文件或标准输入)上运行 uv run --no-project {baseDir}/scripts/format_goal_prompt.py --fenced。它会将空白符压缩为一行,移除 /goal 前缀、引号和围栏,在缺少停止子句时发出警告,并拒绝长度超过 4000 字符的输出——缩短或将细节移至文件后重新运行。
仅返回一个围栏的 text 代码块,一行:
/goal <单一规范化的目标>
不要在其周围添加任何散文——除非检查列表元素无法被具体化:这种情况下,在代码块后跟一个 Missing: 列表,每行一个缺口,告知用户需要提供什么。
示例
草案:
/goal 迁移认证模块:
- 用 auth.verify() 替换 legacyAuth()
- 确保测试仍然可用
重新起草并格式化后:
/goal 所有 legacyAuth() 调用点都使用 auth.verify():`rg "legacyAuth\(" -t ts` 打印无结果 AND `npm test` 退出码为 0(运行两者,展示输出),不修改 vendor/ 或不削弱任何测试。如果被阻塞,停止并报告尝试的路径和阻塞原因,或在 20 次交互后停止。
这里的 npm test 来自仓库的 package.json——不是猜测——并且将其与零匹配检查配对堵住了最便宜的捷径:删除调用点而不是迁移它们。当没有任何元素可以具体化时,格式化存在的内容并标记缺口:
草案:让结账更快,上下文中没有任何指标或基准:
/goal 让结账更快
缺失:
- 可测量的结束状态——哪个指标和阈值算作“更快”
- 验证——证明其更快的基准或命令
- 停止边界——例如“或在 20 次交互后停止”