关于 goal-prompt
goal-prompt 是用于 Claude Code 和 Codex 的 Agent 技能,帮助将较大任务整理为可检查的完成条件,并格式化为单行 /goal 提示词。它强调依据已有信息起草,无法确定的要求会标为缺失。
主要功能
- 01起草可验证的完成条件
- 02包含范围、检查与不变量
- 03设置停止或受阻条件
- 04格式化单行 /goal 提示词
- 05标出缺失的条件要素
适用场景
- 01将多轮开发任务拆成明确目标
- 02为任务指定命令及预期检查结果
- 03整理较长目标并引用 GOAL.md
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ trailofbits/ skills --skill goal-prompt安装后在 Claude Code 中输入/goal-prompt确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlscripts/format_goal_prompt.pytest_format_goal_prompt.py详细介绍
目标提示词
/goal 会让 Agent 持续工作,直到满足完成条件。Claude Code 和 Codex 都将其视为一行内容,最多 4,000 个字符。在 Claude Code 中,每轮结束后,一个小型模型会仅根据对话记录重新判断条件;它无法运行命令。
起草一个能够终止的条件,然后将其格式化。目标适用于工作量超过一轮、且有可检查的完成标准的任务;与其写一个庞大的目标,不如将小目标串联起来,并在目标之间进行审查。
起草
加入以下各项,并用 AND 连接——绝不要用“or”,因为循环会选择成本较低的分支:
- 写明最终状态,而非活动——“所有
legacyAuth()调用点都使用auth.verify()”,而不是“迁移身份验证代码”。活动可以声称已经完成;最终状态则非真即假。 - 先说明要读取的范围——采取行动前需要读取的文件、问题、日志或计划。
- 明确检查方式——准确的命令及其可观察到的结果(“
npm test以状态码 0 退出”),并要求运行命令、展示输出;未出现在对话记录中的结果,对评估器而言就不存在。 - 不变量——哪些内容不得更改(“不得修改 vendor/”),并且始终包括“不得削弱、跳过或编辑检查本身”。
- 停止上限或受阻条款——“或在 20 轮后停止”“如果受阻,则停止并报告阻碍”。缺少这一项时,错误表述的条件可能导致无限循环;格式化工具会在缺少该项时发出警告。(Claude Code 会在会话恢复时重置轮数计数器,因此轮数上限会在多次恢复后悄然延长。)
保持精简。 每条约束都会缩小模型可探索的状态空间。尽可能归并为一个可终止的标准,将范围和定义移至引用的文件中,并删去非目标——只有能够堵住真正容易钻的空子时,约束才值得保留。
对于较长的目标,还要说明最终证据(差异、报告、产物),并要求记录进度日志文件——以便在上下文压缩和恢复后保留状态。如果说明超过 4,000 个字符,请将详细信息放入 GOAL.md,并在目标中引用该文件。
绝不臆造缺失内容。 每个要素都必须以用户请求、对话内容或仓库为依据——应查证,而非猜测。如果无法根据现有信息补全某项内容,仍应优化并格式化用户提供的内容,省略该项,并将其标记为缺失(参见“格式化”)。臆造的成功条件会让目标按错误的约定终止。
堵住容易钻的空子
格式化前,像懒惰的模型那样重新审视起草的条件:怎样才能用最低成本让所有检查通过,却不做预期的工作?堵住最容易钻的空子——优先配合已有检查,而不是增加约束,也不要把所有可能的空子都列入非目标。常见的空子:
- 删除或存根,而非修复——“搜索结果为空”在调用方已被删除时同样成立;应配合一项能够证明该功能仍可用的检查。
- 只通过部分检查——只运行一个测试文件、缩小搜索路径,或将目录排除在检查之外。
- 钻检查的空子——跳过测试、标记为预期失败(xfail)、硬编码预期输出、针对测试输入添加特例、编辑检查本身(遵守不变量规则)。
- 未运行检查就声称完成——在对话记录中没有检查输出的情况下宣称完成或受阻(遵守展示输出规则)。
同样遵循以上原则:无法根据现有信息堵住的空子,应在 Missing: 列表中作为警告列出——臆造荒谬的约束,比明确指出缺口更糟。
安全研究目标
将审计目标收束为一个终止条件,例如:识别、触发并验证一个符合所引用威胁模型文件要求的高危漏洞。范围、攻击者能力、严重性基准以及需要跳过的已知发现应由该文件说明,而不是目标本身。使用中性措辞(“触发并验证”,而非“证明此漏洞可利用”),要求展示前置条件——假定攻击者具备访问权限是最常见的误报来源——并在每项发现后停止,交由人工审核,而不是堆积未经分类的报告。发现结果必须由另一位新 Agent 进行第二轮验证,绝不能只由发现者自行验证。
格式
对草稿(文件或标准输入)运行 uv run --no-project {baseDir}/scripts/format_goal_prompt.py --fenced。它会将空白字符压缩为一行,移除 /goal 前缀、引号和代码围栏;若缺少停止条款则发出警告;若输出超过 4,000 个字符则拒绝处理——请缩短内容或将细节移至文件中,然后重新运行。
仅返回一个 text 围栏代码块,且内容为一行:
/goal <single normalized objective>
不要在代码块周围添加说明文字——但如果某些检查清单要素无法从上下文中得到依据,则应在代码块后添加 Missing: 列表,每项缺失内容占一行,告诉用户需要补充什么。
示例
草稿:
/goal Migrate the auth module:
- replace legacyAuth() with auth.verify()
- make sure the tests still work
改写并格式化后:
/goal All legacyAuth() call sites use auth.verify(): `rg "legacyAuth\(" -t ts` prints nothing AND `npm test` exits 0 (run both, show the output), without modifying vendor/ or weakening any test. If blocked, stop and report attempted paths and the blocker, or stop after 20 turns.
这里的 npm test 来源于仓库的 package.json,并非猜测;将它与零匹配检查结合起来,就能堵住最容易钻的空子:删除调用点,而不是迁移它们。如果没有上下文依据来支撑某项要素,就按现有内容格式化,并指出缺失项:
草稿:make checkout faster,上下文中没有任何指标或基准:
/goal Make checkout faster
Missing:
- 可衡量的最终状态——哪些指标和阈值才算“更快”
- 验证方式——用于证明这一点的基准测试或命令
- 停止边界——例如“或在 20 轮后停止”