来源:《Learn Harness Engineering》sanbuphy 著(共127页)| 整理时间:2026-05-11 核心结论:Agent 效果不好,不一定是模型的问题,很可能是你的 Harness 不够好。


一、核心概念:什么是 Harness Engineering?

关键公式

Agent = Model + Harness

Harness = 模型权重之外的一切工程基础设施,包括:

  • 指令文件(AGENTS.md / CLAUDE.md)
  • 工具访问权限
  • 运行环境配置
  • 状态持久化机制
  • 验证与反馈回路

三次范式迁移

年份范式核心问题
2023Prompt Engineering如何跟模型说话
2024-25Context Engineering给模型看什么
2026Harness Engineering如何让 Agent 在真实世界持续可靠地工作

反直觉前提

同一个模型(Opus 4.5),同一段提示词(“做一个 2D 复古游戏编辑器”):

  • 裸跑:20分钟,花 $9,游戏核心功能跑不起来
  • 配上完整 Harness(planner + generator + evaluator):6小时,花 $200,游戏可以正常游玩

模型没变,变的是马鞍


二、Harness 五子系统模型(“厨房比喻”)

子系统类比核心内容
指令子系统菜谱架AGENTS.md:项目概览、技术栈、硬约束、文档链接
工具子系统刀具架Agent 的工具访问权限(最小权限原则)
环境子系统灶台依赖锁定、版本固定、环境可重现(Docker/devcontainer)
状态子系统备菜台PROGRESS.md:已完成/进行中/已知问题/下一步
反馈子系统出菜检查口显式验证命令:pytestmypy --strictruff check

投入产出比最高的是反馈子系统——先把验证命令写清楚。

量化案例:TypeScript + React 项目(4 阶段递进)

阶段添加的组件成功率
只有 README20%
+ AGENTS.md指令子系统60%
+ 验证命令反馈子系统80%
+ 进度文件状态子系统接近100%

三、12 讲核心要点速查

L01 模型能力强 ≠ 执行可靠

  • Agent 失败的五层归因框架:任务规范、上下文供给、执行环境、验证反馈、状态管理
  • 遇到失败先检查 Harness,再换模型
  • 一个 AGENTS.md 可能比换一个更贵的模型更有效

L02 Harness 到底是什么

  • 仓库是唯一事实来源——Agent 看不到的信息等于不存在
  • “给地图,不给说明书”:AGENTS.md 控制在 100 行,充当目录而非百科全书
  • 等模型对照实验量化各子系统的边际贡献

L03 让代码仓库成为唯一的事实来源

冷启动测试:开全新 Agent 会话,只看仓库内容,能否回答:

  1. 这是什么系统?
  2. 怎么组织的?
  3. 怎么运行?
  4. 怎么验证?
  5. 现在进度如何?

ACID 状态管理原则

  • 原子性:每次逻辑操作用一个 git commit 原子化
  • 一致性:定义验证谓词,不一致的中间状态不 commit
  • 隔离性:多 Agent 并发时用独立进度文件或 git 分支隔离
  • 持久性:跨会话必须的知识写到文件里

L04 把指令拆分到不同文件里

“巨型指令文件"陷阱:AGENTS.md 膨胀 → 中间迷失效应(Lost in the Middle)→ 关键约束被忽略

拆分架构

AGENTS.md(50-200行)
├── 项目概览(2句话)
├── 运行命令(make setup / make test)
├── 全局硬约束(不超过15条)
└── 专题文档链接
    ├── docs/api-patterns.md
    ├── docs/database-rules.md
    └── docs/testing-standards.md

重构后:安全约束遵循率从 60% → 95%,任务成功率从 45% → 72%。

L05 让跨会话的任务保持上下文连续

核心问题:上下文窗口有限 → 长任务必然跨会话 → 信息丢失(“失忆的工匠"困境)

连续性四件套

  • PROGRESS.md:当前状态/已完成/进行中/已知问题/下一步
  • DECISIONS.md:重要决策 + 原因 + 否决方案
  • git checkpoint:每完成原子工作单元就提交
  • 会话上下班流程(在 AGENTS.md 中定义)

量化效果:重建时间减少约 78%,功能完成率从 58% → 100%,隐含缺陷率从 43% → 8%。

Anthropic 发现:对于 Sonnet 4.5,“上下文焦虑"严重,需要上下文重置(新会话 + 进度文件);对于 Opus 4.5,压缩策略基本够用。Harness 设计需要针对具体模型而非通用模板

L06 让 Agent 每次工作前先初始化

关键原则:初始化和实现的优化目标不同,必须分离。

自举契约(Bootstrap Contract):项目能被全新 Agent 无歧义操作的四个条件:

  1. 能启动(make dev
  2. 能测试(make test
  3. 能看进度(PROGRESS.md)
  4. 能接手下一步(任务分解文件)

独立初始化 vs 混合方式:总重建时间减少约 60%,“慢即是快”。

L07 给 Agent 划清每次任务的边界

核心问题:Agent 天生有"多做一点"的冲动 → Overreach(过度延伸) → Under-finish(不足完成)

WIP=1 原则(来自 Kanban 方法论):

  • 任何时刻只允许一个任务处于"进行中"状态
  • 当前功能点端到端验证通过后,才能开始下一个
  • 不要在实现功能 A 时"顺便"重构功能 B

量化结果:WIP=1 比无约束策略代码量少 33%,但功能完成率高 133%(87.5% vs 37.5%)。

少做但做完,永远优于多做但做半。

L08 用功能清单约束 Agent 该做什么

功能清单是 Harness 的脊梁骨,其他组件(调度器、验证器、交接器)都依赖它。

三元组结构:每个功能项 = (行为描述, 验证命令, 当前状态)

状态机not_startedactivepassing(通过验证命令执行后才能转移)

{
  "id": "F03",
  "behavior": "POST /cart/items returns 201",
  "verification": "curl -X POST ... | jq .status == 201",
  "state": "passing",
  "evidence": "commit abc123"
}

结构化功能清单 vs 自由备忘录:功能完成率高 45%,零重复实现。

L09 防止 Agent 提前宣告完成

核心问题:AI 系统性地过度自信——代码写满了不代表做对了。

“提前交卷"的滑坡:只跑单元测试 → 跳过集成测试 → “看起来没问题” → 宣告完成

三层终止校验

  1. 语法与静态分析(lint/类型检查)
  2. 运行时行为验证(测试执行、应用启动)
  3. 系统级确认(端到端测试、集成验证)

关键原则:把"干活的人"和"检查的人"分开——让独立 evaluator agent 做验收,不能让 generator 自评。

L10 跑通完整流程才算真正验证

单元测试的系统性盲区

  • 接口不匹配(各自 mock 各自通过,合起来就崩)
  • 状态传播错误(ORM 缓存 + 数据库迁移冲突)
  • 资源生命周期问题(文件句柄、连接泄漏)
  • 环境依赖性(测试环境 mock vs 真实环境差异)

架构边界执行原则

  • 规则从"写在文档里"变成"跑在 CI 里”
  • 错误消息要面向 Agent 设计,包含"怎么修"的具体步骤

L11 让 Agent 的运行过程可观测

双层可观测性

  • 运行时可观测性(系统层):日志、追踪、进程事件、健康检查 → 回答"发生了什么”
  • 过程可观测性(决策层):冲刺合同、评分标准、验收条件 → 回答"为什么这样做”

冲刺合同(Sprint Contract):编码开始前协商的短期协议——明确任务范围、验证标准、排除项。

Anthropic 三 Agent 架构实验数据

角色职责
Planner接收需求→扩展完整产品规格(只做高层设计,不规定技术细节)
Generator按 sprint 逐功能实现,每个 sprint 前签冲刺合同
Evaluator用 Playwright 像用户一样点击测试,按评分标准逐维度打分

有完整可观测性 vs 无可观测性:效率差 3 倍(15分钟 vs 45分钟完成同一任务)。

L12 每次会话结束前都做好交接

核心规律(Lehman 软件演化定律):熵增是默认状态,不主动管理则复杂性必然增加。

会话退出检查清单

- [ ] 构建通过(npm run build)
- [ ] 所有测试通过(npm test)
- [ ] 功能清单已更新
- [ ] 无调试代码残留(console.log, debugger, TODO)
- [ ] 标准启动路径可用

12周演化数据对比

指标无清洁策略(第12周)有清洁策略(第12周)
构建通过率68%97%
测试通过率61%95%
新会话启动时间60+ 分钟9 分钟

质量文档(Quality Document):对每个模块持续评分的活跃工件,让代码库健康可追踪。

定期简化 Harness:随着模型能力提升,移除不再必要的约束。Harness 的有趣组合不是变少了,而是在移动。


四、三大来源的核心洞察对比

来源核心贡献关键结论
Anthropic两 Agent 架构实验(Initializer + Coding Agent)“从人类工程师日常实践中寻找灵感”
OpenAI零手写代码实验(5个月,100万行,3名工程师)“纪律越来越多地体现在脚手架而非代码中”
Thoughtworks控制论框架(必要变异度定律)“没有 Harness 的 Agent 是不可控的”

五、可立即行动的实践清单

今天就能做的(30分钟内)

  1. 建 AGENTS.md:项目概览、运行命令、核心约束、验证命令
  2. 写 PROGRESS.md:当前状态/已完成/进行中/阻塞/下一步
  3. 做冷启动测试:开全新 Agent 会话,看能否回答 5 个基本问题

本周内做的

  1. 拆分过胖的指令文件:AGENTS.md → 50-200行路由文件 + docs/子目录
  2. 加端到端测试:单元测试通过≠完成,必须有集成验证
  3. 建功能清单:用 JSON/Markdown 记录三元组(行为/验证命令/状态)

持续迭代

  1. 每次会话结束前:跑退出检查清单,更新进度文件
  2. 每次失败时:归因到五层防御中的某一层,修那一层
  3. 每月一次:移除不再必要的 Harness 组件

六、一句话精华

2025 年证明了 Agent 能工作,2026 年要解决的是如何让 Agent 可靠地工作。

模型是引擎,Harness 是底盘、方向盘和刹车。没有引擎的车跑不了,但没有刹车的车会杀人。


整理人:hongxinbo | 来源:《Learn Harness Engineering》sanbuphy 著