智能体 Harness 速查表:组件、文件、常见问题与启动清单
更新于: · Skillaria.Top
智能体 Harness 由五个子系统组成:指令、工具、环境、状态和反馈。最小文件集包括:作为简短路由的 AGENTS.md、验证脚本(make check、verify.sh)、进度文件,以及带状态的功能列表。“通过”状态由脚本设置,而不是由智能体自行标记。
Harness 的五个子系统
| 子系统 | 含义 | 产物 | 失效的症状 |
|---|---|---|---|
| 指令 | 智能体应当知道的项目知识 | AGENTS.md / CLAUDE.md、skills、docs/、ADR | 违反已知约定 |
| 工具 | 智能体能做什么 | shell、测试、代码检查、浏览器、MCP 服务器 | “想做却做不了” |
| 环境 | 智能体在哪里工作 | 锁文件、Docker/devcontainer、git worktree、沙箱、init.sh | 每个会话都从修环境开始 |
| 状态 | 重启后仍然保留的内容 | PROGRESS.md、DECISIONS.md、feature_list.json、提交记录 | 新会话不知道上次停在哪里 |
| 反馈 | 智能体如何得知自己出错 | make check、端到端测试、钩子、架构检查、评估者 | 宣布“完成”,但功能不工作 |
从零搭建的顺序:反馈 → 指令 → 状态 → 环境 → 工具。
Harness 文件
| 文件 | 用途 | 规则 |
|---|---|---|
| AGENTS.md / CLAUDE.md | 入口:项目是什么,如何启动,如何验证 | 简短的路由(约 80 行),附带“何时阅读”条件的文档链接 |
| docs/*.md | 各主题的细节 | 按需阅读,不整篇加载 |
| .claude/skills/*/SKILL.md | 可重复的流程(部署、评审) | 任务与描述匹配时才加载 |
| PROGRESS.md | 状态、已完成内容、阻塞项、下一步 | 每次会话结束时更新 |
| DECISIONS.md | 决定、理由、被否决的方案 | 记录路径,而不只是结论 |
| feature_list.json | 功能:behavior、verification、state | 恰好一个功能为 active(WIP=1) |
| scripts/verify.sh | 验证功能并将其设为 passing | 唯一能设置 passing 的脚本,并附带提交 SHA |
| scripts/arch-check.sh | 架构边界检查 | 退出码 1,输出中包含 WHY 和 FIX |
| scripts/init.sh | 工作前检查环境 | 环境正常、git 工作区干净、make check 为绿色、有活动功能 |
| sprint contract | 编码前对功能的约定 | 范围内 / 范围外 / 待决问题 |
| .claude/settings.json | Claude Code 的权限与钩子 | 在事件上进行检查,而不依赖智能体的记忆 |
AGENTS.md 骨架
# 项目:支付后端(FastAPI、PostgreSQL)
## 启动
docker compose up -d && ./scripts/init.sh
## 验证
make check # 代码检查、类型、单元测试、arch-check
make e2e # 端到端场景
## 完成定义
- make check 和 make e2e 退出码为 0
- 功能通过脚本 scripts/verify.sh 设为 passing
- PROGRESS.md 已更新
## MUST
- 数据库访问只能通过仓储
- 密钥只能来自环境变量
## 文档
- docs/payments.md——涉及支付和退款的任务
- docs/migrations.md——修改数据库结构的任务
功能状态
| 状态 | 含义 | 由谁更改 |
|---|---|---|
| pending | 排队中 | 规划者 |
| active | 进行中(同一时间只能有一个) | 智能体开始工作时 |
| passing | 验证通过 | 只能由 verify.sh |
| blocked | 需要人来决定,附原因说明 | 智能体 |
验证层级
| 层级 | 内容 | 何时运行 |
|---|---|---|
| 1 | 代码检查、类型检查 | 始终 |
| 2 | 单元测试与集成测试 | 始终 |
| 3 | 端到端测试 | 修改涉及多个层次;宣布“完成”之前 |
| 4 | arch-check | 出现新的跨层导入时 |
只有通过最高层级之后,才有资格宣布“完成”。绿色的单元测试不等于完成。
将规则机械化
| 层级 | 工具 | 成本 |
|---|---|---|
| grep 守卫 | 带模式搜索和 WHY/FIX 信息的脚本 | 几分钟 |
| 代码检查规则 | import-linter(Python)、dependency-cruiser、eslint-plugin-boundaries(JS/TS) | 约一小时 |
| 架构测试 | CI 中的测试,违反分层时失败 | 更多,但在 make check 中可见 |
#!/usr/bin/env bash
fail=0
if grep -rn "from app.db" app/services/; then
echo "WHY: 服务层不直接访问数据库"
echo "FIX: 使用 app/repositories/ 中的仓储"
fail=1
fi
exit $fail
常见问题与解决方法
| 问题 | 子系统 | 解决方法 |
|---|---|---|
| CLAUDE.md 中的规则没有被遵守 | 指令 | 精简文件,把规则变成检查或钩子 |
| 智能体无法运行测试 | 工具 | 开放该命令的权限,把依赖装进镜像 |
| 不同机器上行为不一致 | 环境 | 锁文件,Docker/devcontainer,固定运行时版本 |
| 会话之间失忆 | 状态 | PROGRESS.md、会话交接说明,会话开始时阅读 |
| 三个功能都开始了,没有一个完成 | 状态 | 在 feature_list.json 中设置 WIP=1 |
| “完成”,但功能不工作 | 反馈 | 完成定义、端到端测试、verify.sh、独立评估者 |
| 单元测试通过,功能却坏了 | 反馈 | 使用真实数据库和配置的端到端测试 |
| 智能体复制了糟糕的模式 | 反馈 | 从第一天就引入 arch-check |
| 不清楚智能体做了什么 | 状态 | 小步提交,在 PROGRESS.md 中报告,记录 DECISIONS.md |
| 智能体一夜之间破坏了环境 | 环境 | 沙箱,git worktree,检查点,通过 init.sh 回滚 |
| 同一条评审意见出现两次 | 整个 Harness | 把它变成 make check 中的检查,并从指令中删掉这段文字 |
长任务中的角色
| 角色 | 负责 | 不负责 |
|---|---|---|
| 规划者 | 带验收标准的功能 | 不写代码 |
| 生成者 | 实现一个功能,运行测试 | 不决定是否完成 |
| 评估者 | 依据评分标准给出结论,附文件、行号或日志引用 | 看不到生成者的推理 |
| 合并 | 当 review == pass 时提交 | 这是代码,不是智能体 |
自主工作的预算
- 目标用一句话描述(例如:让所有功能都达到 passing)。
- WIP=1,每个功能有时间和尝试次数的上限。
- 指标单调上升,出现回归立即回滚。
- 迁移、基础设施、资金:升级给人处理。
- 多次评审失败之后,用干净的上下文重新开始该功能。
智能体启动清单
- 存在 AGENTS.md:技术栈、启动方式、验证命令、完成定义。
- make check 在干净的克隆上通过。
- 环境可复现:锁文件,Docker 或 devcontainer。
- 智能体拥有所需的命令权限,危险的命令被禁止或放在沙箱中。
- 至少有一个覆盖主要场景的端到端测试。
- 存在 PROGRESS.md,并规定会话开始时先读取它。
- 功能列表中有状态,且只有一个处于 active。
- passing 状态由脚本设置。
- 检查信息中包含 WHY 和 FIX。
- 任务有验收标准,并明确了范围边界。
- 明确哪些事项需要人来决定。
- 在改动之前计算了 verification gap,以便之后比较。
Harness 指标
| 指标 | 计算方法 |
|---|---|
| Verification gap | 10 个任务中,宣布“完成”但未经验证确认的比例 |
| MTTR | 从出故障到恢复可工作状态所花的时间 |
| 冷启动 | 新会话能否在没有猜测的情况下回答“我们在哪里,下一步是什么” |
| 消融 | 在固定任务集上关闭某一子系统后的性能下降 |
总结
Harness 是一个闭环,而不只是一个文件:指令、工具、环境、状态和反馈。从验证开始,让 AGENTS.md 保持简短,把“完成”的判定交给脚本,并定期审查 Harness。所有这些都在 Harness 工程课程中,汇聚到一个基于实际项目的完整 Harness 上。
常见问题
AGENTS.md 和 CLAUDE.md 有什么区别?
作用相同,都是智能体的指令文件。CLAUDE.md 由 Claude Code 读取,AGENTS.md 是适用于多种智能体的通用格式;在 CLAUDE.md 中可以直接引用 AGENTS.md。
AGENTS.md 应该有多少行?
没有硬性上限,但入口文件应保持简短,约一百行左右,像目录一样。细节放在独立的文档中。
小项目需要 feature_list.json 吗?
单次的小修改不需要。当智能体连续或跨多个会话处理多个功能时,它才有价值。
智能体需要访问的密钥应该放在哪里?
放在环境变量或密钥管理器中,而不是指令文件或代码里。给智能体的是对环境的访问权限,而不是写在文本中的值。
通过视频学习本主题
课程“Harness Engineering: инженерия надёжности AI-агентов”结合实践详细讲解了这一主题。
- Из чего состоит harness AI-агента: инструкции, инструменты, среда, состояние, обратная связь
- Харнес AI-агента с нуля: AGENTS.md, feature_list.json, verify.sh и автономный цикл