智能体测试框架
Agent Harness
你是一名 harness 操作员,而非英雄。决定工作何时完成的是循环机制,而非你的乐观态度。你的职责是:将目标编译为带有检查项的任务,一次执行一个任务,由控制器裁定验证结果,并在状态机指示停止时停止。
契约
目标 (GOAL) → goal_compiler → 计划 (PLAN) → loop_controller: [执行 → 验证]* → 关闭 (CLOSE)
↑______重试 (≤ 最大尝试次数, 改变方法)
└── 预算耗尽时升级 (ESCALATE) —— 绝不伪造成功三层结构,全部为 JSON:每个领域提交的 manifest(定义存在哪些技能/工具/检查)、每个目标的 plan(定义哪些任务、哪些验证、什么才算“完成”),以及每次运行的 state file(唯一事实来源;新会话仅凭此文件即可恢复)。
快速上手
# 0. 选择领域 manifest (assets/harnesses/ 下有 18 个提交的文件,例如 engineering-team.json)
ls assets/harnesses/
1. 编译目标 (若目标模糊,将以 exit 3 退出并强制提问)
python3 scripts/goal_compiler.py \
--goal "审计支付服务并设计带有错误预算的 SLO" \
--manifest assets/harnesses/engineering.json --out plan.json
2. 初始化循环状态
python3 scripts/loop_controller.py init --plan plan.json --state .agent-harness/state.json
3. 驱动循环 —— 重复执行直到指令为 "close" 或 "escalate"
python3 scripts/loop_controller.py next --state .agent-harness/state.json
→ {"action": "execute", "task": "T1", ...}: 打开任务对应的技能文件 (skill_path 下的 SKILL.md),使用其工具完成工作,然后:
python3 scripts/loop_controller.py record --state .agent-harness/state.json \
--task T1 --phase execute --exit-code 0
→ 控制器将自行运行任务的检查项 (子进程, 超时, 证据日志):
python3 scripts/loop_controller.py verify --state .agent-harness/state.json --task T1 --cwd <repo-root>
4. 关闭 —— 若有任何任务未验证且未放弃,则拒绝关闭 (exit 4)
python3 scripts/loop_controller.py close --state .agent-harness/state.json在技能变更后重新生成 manifest (diff 稳定,可由 CI 检查):
python3 scripts/harness_manifest_builder.py --domain engineering-team \
--repo-root <repo-root> --out-dir assets/harnesses --no-timestamp硬性规则
1. 绝不自行裁定验证结果。 verify 通过子进程运行检查;如果没有 --evidence 而直接提交 record --phase verify 将被拒绝 (exit 6)。你无权宣布任务已验证。
2. 绝不修改用于评判你的门禁。 检查命令必须来自 manifest 或 plan。
修改检查项以使其通过属于“奖励黑客”(reward-hacking)失效模式(参见 references/verification_discipline.md)——这与 autoresearch-agent 的锁定评估器具有相同的不变性。
3. 一次仅执行一个任务,写入需串行化。 读取和判定可以并行,但绝不能有两个任务同时写入同一个产出物(参见 references/agentic_loop_canon.md)。
4. 重试意味着改变方法。 相同的命令 + 相同的输入 = 相同的失败。重试指令已明确要求如此,请务必遵守。
5. 预算是终止状态,而非建议。 max_attempts_per_task $\rightarrow$ 上报(exit 2);max_loop_iterations $\rightarrow$ 上报(exit 5)。预算耗尽绝不能报告为成功——只有人类可以豁免(close --waive T3 --reason "..."),你不能。
6. 新鲜上下文优于长上下文。 每个 next 指令都必须能由一个仅读取计划(plan)和状态(state)文件的全新会话执行。对于长期目标:每次迭代都应作为独立会话针对持久化状态运行。
7. 状态存储在 .agent-harness/ 中 —— 绝不要放在 .agenthub/、.autoresearch/ 或 docs/TC/ 中(这些属于兄弟技能)。
8. 计划和状态文件是信任边界。 verify 会 shell 执行每个任务的检查命令;仅在由你或 goal_compiler.py 生成的计划/状态文件上运行 harness,绝不要在不可信的输入文件上运行(参见 references/verification_discipline.md)。
强制性问题(在编译前询问;每轮一个,并附带推荐答案)
| # | 问题 | 推荐答案 | 原因 (规范) |
|---|---|---|---|
| 1 | 哪个单一的可观察结果意味着“完成”? | 一个具名产出物 + 一个对其执行且返回 0 的命令 | 验证者定律:优先投资于可验证性 |
| 2 | 适用哪个领域 harness? | 产出物所属技能的领域;若涉及两个,则运行两个顺序循环 | 编排者-执行者模式:范围明确的目标优于宏大目标 |
| 3 | 什么绝对不能更改? | 列出不可触碰的路径;将其放入目标文本中,以便编译器的计划能继承这些限制 | 边界是子代理规范的一部分 |
| 4 | 谁负责审核上报,响应速度如何? | 指定的负责人;设计上上报会阻塞循环 | “需要审批”是一个终止状态,而非干扰项 |
| 5 | 迭代预算是多少? | 默认 12 次循环迭代 / 每个任务 3 次尝试;增加预算必须提供理由 | 限额是运行时错误,而非建议 (类似 OpenAI SDK 的 max_turns) |
退出码(机械化分支处理)
| 代码 | 工具 | 含义 |
|---|---|---|
| 0 | 所有 | 正常 / 已发出指令 |
| 2 | loop_controller | 需要上报 —— 人类必须审核证据日志 |
| 3 | goal_compiler | 目标过于模糊 —— 请回答强制性问题并重新编译 |
| 4 | goal_compiler / loop_controller | 未匹配到技能 / 拒绝关闭(存在未验证任务) |
| 5 | loop_controller | 达到全局迭代上限 |
| 6 | loop_controller | 无效转换(在已验证任务上记录、缺失证据、未知任务) |
可验证的成功标准
python3 scripts/harness_manifest_builder.py --sample、scripts/goal_compiler.py --sample和scripts/loop_controller.py --sample均返回 0。
- 模糊目标(
--goal "make it better")返回 3 并打印强制性问题。
- 在包含未验证任务的状态上执行
loop_controller.py close返回 4。
loop_controller.py --sample中的演示循环显示:验证失败会消耗一次尝试,且只有在验证通过并提供证据后循环才会关闭。
相关技能
ls- workflow-builder:用于为 Claude Code 的 Workflow 工具编写确定性的
.js脚本。不用于目标闭环状态(本技能)。
- agenthub:在 git worktrees 中让 N 个并行 Agent 竞争完成同一个任务。请在需要竞争尝试的 harness 任务内部使用。
- autoresearch-agent:针对锁定评估器对单个文件进行指标优化。当任务的
done_when为“指标提升”时使用。
- tc-tracker:记录每次代码变更的生命周期。用于变更簿记;harness 状态文件是基于目标的,而非基于变更的。
- loop-library:通过对话方式发现/审计已发布的 loop 方案。本技能是对该词汇表的执行强制实施。
- ship-gate / self-eval / spec-driven-workflow:作为任务
verification[]中的结项检查插件。
有关三层架构、复用映射以及如何提升领域 harness 质量,请参阅 references/domain_harness_design.md。