Harness Engineering 不是 AGENTS.md 或 CLAUDE.md
Harness engineering is not AGENTS.md理解 Harness Engineering 之后,一个很自然的问题是:
如果我已经给项目写了 AGENTS.md 或 CLAUDE.md,是不是就算给 Agent 准备好了工作条件?
并不是。
这些文件很重要,但它们主要解决的是:
Agent 进入项目时,应该先知道什么?
一套真正的 Harness 还要继续解决:
它去哪里找信息、怎样完成任务、哪些边界不能越过,以及做完后如何检查和恢复。
AGENTS.md 不是越详细越好
OpenAI 在实践中尝试过把大量项目知识和规则塞进一份巨大的 AGENTS.md。
结果并不好。
文件太大,会挤占真正执行任务所需的 Context;规则太多,Agent 反而难以区分重点;内容也很容易过期,而 Agent 未必知道哪些信息仍然可信。
所以他们后来保留了一份较短的 AGENTS.md,主要把它当成项目地图,再指向更具体的产品说明、架构文档和执行计划。
OpenAI 对此的概括是:
给 Agent 一张地图,而不是一本一千页的说明书。
Anthropic 对 CLAUDE.md 的建议也很接近。
CLAUDE.md 适合保存每次进入项目都需要知道的稳定信息,例如构建命令、项目约定、架构决策和常见工作流。
但只对特定文件生效的规则,可以放到分目录规则里;只在某类任务中需要的流程,可以放到 Skill 里。Anthropic 还建议单个 CLAUDE.md 尽量控制在 200 行以内。
更重要的是,Anthropic 明确说明:
CLAUDE.md 是提供给模型的 Context,不是强制执行的系统配置。
Claude 会尝试遵守,但不能保证每次都严格做到。真正不能违反的规则,需要进一步变成权限、自动检查或执行前确认。
所以,AGENTS.md 和 CLAUDE.md 更像入职说明。
它们是 Harness 的入口,却不是 Harness 的全部。
一套 Harness 还需要什么?
如果不使用太多工程术语,我会把它分成五部分。
1. 一个可信的项目入口
Agent 首先需要知道:
这个产品解决什么问题;当前以哪份文档为准;代码和资料如何组织;哪些决定已经确认;哪些方向已经放弃;遇到不同问题应该去哪里找答案。
重点不是把所有资料一次性塞给它。
而是让它知道:
哪些信息可信,以及如何继续找到相关信息。
否则,项目里即使有几十份文档,Agent 也可能读到一份已经过期的说明,然后非常认真地执行错误方向。
2. 一个清楚的当前任务
知道整个项目是什么,还不等于知道现在要做什么。
Agent 每次开工,最好能明确看到:
这次只解决哪个问题;哪些内容在任务范围内;哪些内容不要顺手修改;怎样才算完成;最终需要留下什么证据。
例如,与其只写:
优化注册流程。
不如写清楚:
修复企业用户注册后收不到验证邮件的问题。不要重构其他注册逻辑。完成后分别测试普通用户和企业用户,并提供测试结果。
这里的关键不只是 Prompt 写得更长,而是把任务范围和验收条件变成项目中可以持续追踪的状态。
Anthropic 在长任务实验中,也通过功能清单、进度文件和 Git 记录,让不同 session 能看到上一轮完成了什么、项目是否处于正常状态,以及下一步应该做什么。
3. 完成任务需要的工具
Agent 能读写代码,只代表它能修改项目。
不代表它能判断产品是否真的正常。
根据任务不同,它还可能需要:
启动应用;操作浏览器;创建测试账号;查看错误日志;读取测试数据库;运行完整用户流程;比较修改前后的结果。
如果它只能看代码,很多时候就只能根据代码推测结果。
如果它能打开产品、复现问题、完成操作并读取日志,就更有机会发现:
代码虽然能运行,但真实流程仍然有问题。
4. 真正能够执行的边界
有些规则写在文档里就够了,例如:
文件如何命名;草稿放在哪里;提交前运行哪个测试。
但有些边界不能只靠一句提醒:
不能操作生产数据;不能直接发送客户邮件;不能删除关键文件;添加新依赖前必须确认;涉及付款时必须交给人。
这类边界最好由权限、自动检查或确认流程真正落实。
例如:
“不要修改生产数据库”写在 AGENTS.md 里,是行为指导。
如果 Agent 本身根本没有生产数据库的写入权限,才是系统边界。
两者都重要,但可靠程度不同。
5. 检查、隔离和恢复
Agent 修改了代码,不代表任务已经完成。
它还需要知道:
必须运行哪些测试;是否要走完整用户流程;如何检查已有功能没有被破坏;最后要提供截图、日志还是测试结果;如果修改错误,怎样撤回。
另外,过程文件也需要有明确去处。
Agent 工作时经常会生成:
临时脚本;测试数据;截图;日志;草稿;中间导出文件。
如果这些内容散落在项目根目录里,时间久了,人和 Agent 都很难区分:
哪些是正式交付物;哪些只是过程文件;哪些已经没有用了。
所以,隔离也可以是最小 Harness 的一部分:
临时脚本放进固定目录;截图和测试输出单独保存;正式文件与中间产物分开;任务结束后检查是否需要清理。
版本记录同样重要。
保留清楚的 diff、较小的 commit 和可回滚状态,可以避免 Agent 在一次错误修改上继续叠加更多工作。
个人项目需要搭得这么复杂吗?
不需要。
OpenAI 的案例来自一个规模很大、由 Agent 长时间参与开发的代码库,不能直接照搬到每个个人项目。OpenAI 自己也强调,他们获得的 Agent 自主能力高度依赖为该项目特别设计的结构、工具和反馈机制。
个人项目可以先从一个很轻的版本开始:
- 一份简短的 AGENTS.md 或 CLAUDE.md,作为项目入口;
- 一份可信的当前计划,区分已确认、待决定和已放弃的内容;
- 每次任务有明确范围和验收条件;
- 写清楚如何启动、测试和检查项目;
- 标明不能修改的内容和必须确认的操作;
- 给临时文件、截图和测试输出固定的隔离目录;
- 使用 Git 查看修改,并保留可以恢复的版本。
任务越短、结果越容易肉眼检查,这些准备可以越轻。
但当任务跨越多个文件、多个 session,或者 Agent 开始拥有更大的操作权限时,只靠一份 Prompt 和一个入口文档,就越来越不够了。
AGENTS.md 或 CLAUDE.md 告诉 Agent如何进入项目。
Harness Engineering 关心的,是它进入以后,怎样找到信息、完成任务、遵守边界、检查结果,并在做错时退回来。