Harness Engineering 图解教程
图解教程 · 中文版

Harness Engineering
用缰绳驾驭 AI

AI 编程时代的工程方法论 —— 模型是大脑,harness 是手和脚。不替代核心力量,而是让核心力量变得可控、可靠、可用。

18 个章节 20+ 张图解 7 个真实案例 图文为主 · 视频为辅 基于《Harness Engineering》手册整理
大脑 — 推理模型 Model 很聪明,但不知道去哪 Harness · 手和脚(运行环境) 指令 CLAUDE.md 约束 Hooks / 沙箱 反馈 测试 / 眼睛 记忆 知识库 编排 多 Agent 能力 工具 / MCP 读文件 · 改代码 · 跑测试 · 部署 全部发生在 harness 内部
全书一句话:Agent = Model + Harness —— 模型是引擎,harness 是车身、方向盘、刹车和仪表盘。
壹

Part 1 · 起源

Harness 到底是什么?为什么这个词 2026 年突然火起来?

§01 · 起源

Harness 到底是什么

What Exactly Is a Harness? —— 又一个 XX Engineering?这次不一样。
一句话:Harness 就是给 AI 套上的「整套装备」——不是提示词,而是 AI 在其中运行的那个完整环境。
  • 不是 KOL 造的词:2026 年 2 月,OpenAI 发正式博文、Mitchell Hashimoto 写长文、Martin Fowler 团队做分析、LangChain 出技术拆解——互不相关的团队指向了同一个东西,用了同一个词。
  • 词源很古老:「harness」至少可追溯到 1300 年的古法语「harnois」(军队补给品),先指盔甲,后演变为马具;动词「驾驭并利用力量」的比喻义出现在 1690 年代。
  • OpenAI 的工程定义:「A harness is the tool shell that allows an AI agent to affect the real world.」——如果推理模型是大脑,harness 就是手和脚。
  • 不是发明,是终于认识到:航天、工业控制、软件测试早就做过类似的事。AI 圈不是发明了 harness engineering,是终于意识到自己需要几十年前就有的工程纪律。

Reading files, fixing code, running tests, deploying to production: all of it happens inside the harness.

OpenAI 官方博文 · 读文件、改代码、跑测试、部署生产——全发生在 harness 内部

五个领域,五种 harness,同一件事

不替代核心力量,而是让核心力量变得可控、可靠、可用。

Harness 缰绳 · 装备 · 环境 ① 马术 · 缰绳 引导方向 → 约束 + 方向 ② 航天 · 线束 精密传信 → 信息/上下文管道 ③ 软件测试 · 测试线束 隔离+模拟 → 沙盒+反馈循环 ④ 安全 · 安全带 防坠落 → Guardrails/回滚 ⑤ 电气 · 线束 连接一切 → 连接层
五重含义:马术给方向、航天保信号、测试建环境、安全防坠落、电气做连接——合起来就是给 AI 的完整 harness。

词源对照表

领域Harness 形态核心功能对应 AI Agent 中的
马术缰绳 / 马具引导方向和力量约束 + 方向
航天电气线束精密信号传输信息 / 上下文管道
软件测试测试线束隔离 + 模拟环境沙盒 + 反馈循环
安全安全带失败时的保护Guardrails / 回滚
军事(词源)盔甲 / 装备保护 + 赋能Agent 的完整装备
🐎
为什么是「缰绳」这个比喻

没有 harness 的马是一匹乱跑的野马——力气再大,方向不对,拉不了车。缰绳不让马变强,但让马的力量变得有用。AI 模型也一样:强大、快速,但自己不知道该去哪。

§02 · 起源

六十年简史:人和工具的关系

从打孔卡到 CLAUDE.md,每次翻转都有人说「程序员要完了」,但每次真正变的是程序员在做什么。
1968 软件危机 NATO 会议 1970 瀑布模型 一场五十年的误读 1994 设计模式 GoF 23 个模式 2001 敏捷 + TDD Kent Beck 2010 DevOps / IaC 描述要什么,不做步骤 2021 Copilot AI 第一次坐旁边 2024 Agent 时代 Devin / Cursor 2025 Claude Code + Vibe Coding 2026 拐点 Harness Engineering
六十年时间线:每十年,人都在从「执行」向「设计」后退一层——这是贯穿全书的一条暗线。
  • 1968 软件危机:人人都是唯一创造者,工具极其原始;Dijkstra 提出结构化编程。人:写每一行代码。
  • 1970 瀑布模型:史上最讽刺的误读——Royce 从没用过「waterfall」一词,还警告单次顺序通过是「有风险且招致失败的」。
  • 1994 设计模式:第一次把「代码该长什么样」变成可讨论的东西;卖超 50 万册、译成 13 种语言。
  • 2001 敏捷 + TDD:人开始系统化地和自动化工具协作;「验证机制」这个概念登场,后面会反复出现。
  • 2010 DevOps / IaC:写「我要 3 个实例、2GB 内存、跑这个镜像」,工具自己实现——描述意图让系统执行。
  • 2021 Copilot:AI 第一次坐到程序员旁边;你仍是方向盘,AI 只是油门助力。
  • 2024 Agent 时代:Devin 在 SWE-Bench 无辅助解决 13.86%(此前最佳 1.96%);Cursor 16 个月 100 万用户。
  • 2025 Claude Code + Vibe Coding:AI 直接进代码库干活;Karpathy 造词 vibe coding——人只负责「这感觉对不对」。
  • 2026 Harness Engineering:3 名工程师、5 个月、100 万行代码、零行手写——工程师的主要工作变成了设计环境、明确意图、构建反馈循环。

那条暗线:从亲手做,到设计系统

写代码 亲手做(1960s) 设计测试 交给自动化(2001) 描述状态 声明式(2014) 设计环境 让 AI 在里面做(2026)
每一步都是主动后退:时间花在更高层的设计上,总体产出更高。程序员没有被淘汰,只是工作重心又移了一格。
§03 · 起源

三次命名:Prompt → Context → Harness

不是三个独立概念,是同一件事的三次觉醒。每次命名,都让一群人意会到自己工作的重心变了。
Harness Engineering 2026 · 整个运行环境 · 你 = 架构师 Context Engineering 2025 · 给模型看什么 · 你 = 策展人 Prompt Engineering 2022–2024 · 怎么问 · 你 = 提问者 Prompt 管你问什么 Context 管你看什么 Harness 管整个东西怎么运转
包含关系:Prompt ⊂ Context ⊂ Harness。CLAUDE.md 是 Context,hooks 是约束层,CI 测试是反馈层——三者加在一起才是完整的 harness。
  • 第一次觉醒 · Prompt(2022–2024):怎么问才能问到好答案。角色设定、few-shot、chain-of-thought。用马具比喻:这是你对马说的话。局限:一次性的、无上下文、不可复用。
  • 第二次觉醒 · Context(2025):2025 年 6 月 Shopify CEO Tobi Lutke 与 Karpathy 几乎同时命名。不是一句话,而是动态构建整个信息包:文档、历史、工具定义、RAG 结果。用马具比喻:帮马看路的一切。
  • 第三次觉醒 · Harness(2026):2026 年 2 月 5 日 Mitchell Hashimoto 博文、2 月 11 日 OpenAI 正式博文、Martin Fowler 跟进、LangChain 拆解——一个月内从博客术语变成行业共识。
  • 关键公式(LangChain):Agent = Model + Harness。裸模型在被 harness 赋予状态、工具执行、反馈循环和可执行约束后,才成为 agent。
  • 最硬的数据:LangChain 的 coding agent 在 Terminal Bench 2.0 上从 52.8% 涨到 66.5%、Top 30 → Top 5。模型完全没换——只改了系统提示词、工具配置、中间件钩子。同一匹马,换了套缰绳。
维度Prompt EngineeringContext EngineeringHarness Engineering
时期2022–202420252026
核心问题怎么问给什么信息整个系统怎么运转
马具比喻你对马说的话帮马看路的一切缰绳+马鞍+围栏+道路
人的角色提问者策展人架构师
可复用性低(每次重写)中(模板化)高(系统化)
命名者社区自发Karpathy / Tobi LutkeMitchell / OpenAI
💡
命名的真正价值

有没有这些名字,活照样干——但有了名字,事情才能被讨论、被拆解、被教。LangChain 能写《The Anatomy of an Agent Harness》,Fowler 团队能提出三支柱框架。一个概念有了名字,经验才传得开。

贰

Part 2 · 框架

缰绳不是一根绳子,而是五根。但也不是越多越好。

§04 · 框架

Harness 的五个组件

OpenAI 用四个动词、Fowler 拆三块、Anthropic 走多 Agent——看起来各说各话,其实是描述同一头大象的不同部位。
一句话:指令、约束、反馈、记忆、编排——五个组件各司其职,缺一不可。
① 指令 告诉 AI 做什么 CLAUDE.md / 地图 ② 约束 拦住 AI 做错事 Hooks / Linter / 沙箱 ③ 反馈 检查 AI 做对没 测试 / 眼睛 / Evaluator ④ 记忆 不重复犯错 知识库 / auto-memory ⑤ 编排 多 AI 协作 多 Agent 输入端 输入端 过程中 跨时间 跨空间 行动之前就位 执行时质量检查 经验跨会话持久化 多个 Agent 同时协同
五组件的关系:指令和约束是输入端(行动之前就位),反馈在过程中检查质量,记忆跨时间防重复犯错,编排跨空间协调多个 AI。

逐组件拆解

  • ① 指令:最基础的一层。CLAUDE.md / AGENTS.md / .cursorrules,本质一样——用 Markdown 把你的意图编码成 AI 可读的规则。原则:每一行都问「删掉它会导致 Claude 犯错吗?不会就删」。
  • ② 约束:指令是建议,约束是法律——代码不合规就编译不过。OpenAI 概括为两个动词:约束(事前拦截)+ 纠正(事后修复)。Claude Code 用 Hooks 做程序级硬拦截;Codex CLI 走沙箱路线。
  • ③ 反馈:AI 最大的问题不是写错代码,是以为自己写对了。解法是给它「眼睛」:测试、截图、DOM 快照、可观测性日志。Boris Cherny 的第一条建议:给 Claude 验证手段,最终结果质量提升 2–3 倍。
  • ④ 记忆:Agent 没有记忆就是金鱼。静态记忆(CLAUDE.md)→ 动态记忆(auto-memory)→ 结构化笔记(跨上下文窗口的持久笔记)。原则:找到最小的高信号 token 集合。
  • ⑤ 编排:任务足够复杂时需要多 Agent 协作:Subagents(独立上下文+精简摘要)、Agent Teams(互相通信)、Middleware(6 个 hook 点)。
五组件模型OpenAI 四动词Fowler 三块典型实现
指令告知 inform上下文工程CLAUDE.md / AGENTS.md / .cursorrules
约束约束 constrain架构约束Hooks / Linter / Sandbox / CI
反馈验证 verify垃圾回收Evaluator Agent / 测试 / 可观测性
记忆告知 inform上下文工程知识库 / auto-memory / ExecPlan
编排纠正 correct(勉强)—(未覆盖)多 Agent / Pipeline / Middleware
🪜
搭建顺序:不需要五个同时上

一开始只要「指令」(写一个 CLAUDE.md)和基本的「反馈」(让 AI 跑测试)。约束在「被 AI 搞烦了之后」自然会加;记忆在受够了重复解释之后自然会建;编排是最后才需要的。Harness 是长出来的,不是设计出来的。

§05 · 框架

少即是多:Harness 的减法哲学

可能是整本书最反直觉的一节——过度工程化的 harness 比没有 harness 更糟糕。这不是哲学观点,有数据。
  • 上下文焦虑(context anxiety):Sonnet 4.5 是第一个「意识到自身上下文窗口」的模型,会在接近极限时过早收尾、赶工,对剩余 token 的估计「非常精确但是错的」。Anthropic 不得不加入 context reset 机制。直到 Opus 4.5 该行为才自行消失。
  • 上下文有副作用:塞进去的信息越多,模型准确回忆任何单条信息的能力越差。约 100 万 token 处有明显性能天花板——不管技术上支持多大的窗口。
  • 100 行地图,不是 1000 行手册:OpenAI 试过超大 AGENTS.md,「效果很差」。全面的指令文件会挤占任务上下文和相关代码的空间。
  • ETH Zurich 实证(2026.03):系统测试 AGENTS.md 的影响,结论出人意料——某些场景下 AGENTS.md 不仅没帮忙,反而妨碍了表现。建议:只写人类不可推断的信息。用了 React?AI 打开 package.json 就知道;写了「写干净代码」?AI 本来就会。
  • 推理三明治:LangChain 在 Terminal Bench 2.0 上测不同推理预算——全程最高推理反而最低分(53.9%,大量超时),因为资源在不需要的地方被浪费。资源分配比资源总量更重要。
20% 40% 60% 80% 全程 xhigh 最高推理 · 大量任务超时 53.9% 全程 high 稳定但不够好 63.6% 推理三明治 ★ xhigh → high → xhigh 66.5% 规划时用最高推理想清楚方向 实现阶段降档快速执行 验证阶段拉回最高推理
推理三明治:开始 xhigh 做规划 → 中间 high 执行 → 最后 xhigh 验证。全程拉满不是能力不够,是超时了。

什么时候该砍规则(5 个信号)

  • 模型升级后的旧规则:Sonnet 4.5 时代需要 Sprint 分解,换成 Opus 4.6 后 Sprint 机制完全移除——为旧模型弱点写的规则,在新模型上可能变成噪音。
  • AI 读代码就能发现的东西:标准语言惯例、详细 API 文档、教程式长解释、「写干净代码」之类不言自明的实践——写了反而浪费上下文。
  • 频繁变化的信息:版本号、当前 Sprint 任务、今天的会议记录,不该进 CLAUDE.md。
  • 互相矛盾的规则:时间一长前后规则可能打架,agent 遇到矛盾指令行为不可预测——定期做一轮垃圾回收。
  • 没被触发过的「以防万一」:Mitchell 的方法是纯归纳:只在 agent 犯错时加规则。没犯过错,就没有规则。
✅ 应该保留
  • Agent 反复犯的错(验证过的真实问题)
  • 项目特有的架构决策和约定
  • 与默认行为不同的规则
  • 关键的安全和质量红线
  • 指向深层文档的指针
❌ 应该砍掉
  • 为旧模型弱点写的补丁
  • AI 看代码就能发现的惯例
  • 「以防万一」的预防性规则
  • 频繁变化的具体信息
  • 教程性质的长解释
⚖️
加规则容易,砍规则难

砍掉一条规则后出了问题,你会后悔;但保留一条没用的规则,你感知不到它的成本——而每一条多余的规则都在稀释真正重要规则的权重。好的 harness 不是规则最多的那个,是每条规则都在干活的那个。模型变强了,harness 应该变薄。

叁

Part 3 · 案例

七个真实团队,七种 harness。大的、小的、系统的、朴素的。

§06 · 案例 · 团队级

OpenAI Codex:零行手写代码的百万行产品

3 名工程师,5 个月,100 万行代码,零行手写。数据够炸,但数据背后的方法论更值得拆。
3 → 7 人 初始 → 后期团队 加人反而变快(反 Brooks 定律) 5 个月 实验时长 ~1500 个 PR 合并 100 万行 代码规模 应用+基础设施+工具+文档 0 行 人工手写代码 3.5 个 PR / 人 / 天
最反直觉的数据:从 3 人扩到 7 人后人均吞吐量反而增加——因为他们不在写代码,而在设计让 AI 写代码的环境。加人不增加协调成本,只增加 harness 的完善度。

五条原则,逐条拆

  • ① Agent 看不到的等于不存在:把 Google Docs 的规划、Slack 的决策全部迁入代码仓库,并创建 ExecPlans 文档——写到初级工程师也能端到端实现的粒度。仓库必须是唯一真相来源。
  • ② 问缺什么能力,而非为什么失败:agent 卡住时不怪模型、不调参数,而是检查工具箱里少了什么——工具、护栏,还是文档。配套策略:优先使用无聊技术(API 稳定、训练数据高频出现)。
  • ③ 机械化强制优于文档规范:自定义 ESLint 规则、数据边界强制解析、CI 结构化测试——坏模式在静态层面就不可能通过。最妙的是:这些 linter 本身也是 Codex 写的。用 agent 约束 agent。
  • ④ 给 Agent 装上眼睛:集成 Chrome DevTools Protocol 做 DOM 快照和截图;每个 git worktree 配套 Victoria Logs + Metrics 栈,agent 自己查日志查指标。「启动时间低于 800ms」从愿望变成可执行指令——单次任务可跑 6 小时以上。
  • ⑤ 给地图,不给手册:AGENTS.md 约 100 行,只展示项目结构、文件关系和关键约束,用指针指向深层文档。反直觉技巧:用「这里不存在什么」表达架构不变量(不用 ORM、不用 GraphQL)——排除选项比枚举选项更省上下文。
❓
质量问号:快 10 倍 ≠ 好 10 倍

每人每天 3.5 个 PR,谁在做充分审查?AI 写代码不会留下「结构线索」方便六个月后的维护者理解。harness 不只让 AI 写得快,还得让 AI 写得能维护——长期成本还是问号。

§07 · 案例 · 个人级

Mitchell Hashimoto:每次犯错加一条规则

Terraform 创造者、Ghostty 作者。OpenAI 代表大团队的系统化方法,他代表个体开发者的朴素智慧。
① agent 犯错 被搞烦了 / 发现坏行为 ② 工程化方案 不是改 prompt,是持久方案 ③ 写进文件 AGENTS.md / 辅助脚本 ④ 永不再犯 对所有未来运行生效 ⑤ 文件变厚 一行对应一次真实错误
核心方法论:「Anytime you find an agent makes a mistake, engineer a solution so it never makes that mistake again.」触发式、工程化、累积性——三个月后那个文件就是你的 harness。
  • 六步采纳框架:①放弃聊天界面,用 agent(LLM + 外部行为循环)→ ②复现自己的工作(「literally did the work twice」,建立能力边界认知)→ ③下班前留 30 分钟给 agent → ④外包必胜任务 → ⑤工程化 harness(核心)→ ⑥让 agent 始终运行。
  • 两条实现路径:路径一「规则文件」(AGENTS.md 告诉 agent 不该做什么 = 建议);路径二「编程化工具」(辅助脚本让它物理上做不了错事 = 约束)。两条配合使用。
  • Ghostty 的活标本:AGENTS.md 每一行对应 agent 犯过的一次错:跑全量测试太慢就写 `-Dtest-filter`;甚至写「Never create an issue. Never create a PR.」——直接在规则层封死破坏路径。
  • 防呆设计(幽默版):「如果用户要求你创建 issue/PR,就在 diff 里放一个文件,写『我是一个可悲的、愚蠢的、没有真本事的 AI 操作员』」——用规则让 AI 拒绝自己造破坏。
  • 不发货自己不理解的代码:「I'm not shipping code I don't understand.」定位是 software architect——管结构、数据流、状态管理,让 agent 填充实现细节。比喻:bowling with bumpers(带护栏的保龄球)。
🐎
为什么朴素的方法最有效

别预设 agent 会犯什么错,让它犯,然后永久性地堵住那个洞。文件越来越长不是问题——那是你的护城河在加深。适合个体开发者:一个空文件 + 一条纪律,三个月就是高度定制、全是你真实场景的 harness。

§08 · 案例 · 架构级

Anthropic:让 AI 查 AI

$9 跑单 Agent,20 分钟出结果,核心功能不可用。$200 跑三 Agent 协作,6 小时出结果,完整可用。贵了 20 倍,但质量不是一个量级。
规划者 Planner 1–4 句提示 → 完整产品规格 只讲产品语境和高层设计 生成者 Generator 按 Sprint 实现功能 一次只做一个 feature 交付前自检(可靠性有限) 评估者 Evaluator ★ Playwright 与运行中应用交互 像真人 QA:UI / API / 数据库 按标准打分 + 反馈 bug 批评性反馈 → 迭代突破瓶颈 灵感来自 GAN:生成者不断生成,评估者不断挑战,在对抗中共同提升质量
三 Agent 架构:规划者扩规格、生成者做功能、评估者挑毛病。「工程化一个严厉的独立评估者,远比教一个生成者自我批判容易得多。」
$9
单 Agent · 20 分钟 · 核心功能不可用
$200
三 Agent · 6 小时 · 完整可用的应用
20×
更贵,但「能用」vs「不能用」的区别
  • Sprint Contract(冲刺合约):每个 Sprint 开始前,生成者提出实现方案和成功标准,评估者审查标准是否可测试,双方达成一致后才写代码——像人类团队的技术评审,只是两边都是 AI。
  • 为什么不让生成者检查自己?谁都不擅长批评自己的作品,AI 也一样。原始的 Claude 当评估者「太宽容,容易说服自己 bug 不严重」。分离角色创造对抗性动态。
  • 模型升级后主动做减法:Sonnet 4.5 → Opus 4.6 后,Sprint 机制被完全移除,Evaluator 从每 Sprint 评估变为全程结束后一次性评估。模型变强,harness 变薄。
  • Boris Cherny 的补充:CLAUDE.md 只有约 100 行(很多人写 500–1000 行效果更差);同时维持 10–15 个并发会话(git worktree 隔离,shell 别名 za/zb/zc 切换);#1 Tips:给 Claude 一种验证自己工作的手段,质量提升 2–3 倍。
§09 · 案例 · 企业级

Stripe Minions:每周 1300 个 PR 的流水线

发一条 Slack 消息,走开,回来时 PR 已经 ready 等 review。但让这套系统跑起来的首要原因,跟 AI 模型本身几乎无关。
💬 Slack 消息 工程师一句话 触发 Minion 无人值守模式 自动编码 基于魔改 Goose 自动测试 跑完整测试流水线 PR 待 review 人来最终判断 devbox:标准化 AWS EC2,预装完整代码树 + 预热构建缓存 从 warm pool 启动不到 10 秒
基础设施细节才是关键:完整的代码树、成熟的构建系统、全面的测试覆盖——这些是 Stripe 为人类工程师建设了十多年的资产,AI Agent 到来时直接继承。
1300+
每周合并的 AI PR
1370
工程师随时可触发,零额外配置
3000+
Goose 通过 MCP 连接的服务
0
AI 自动 merge —— 人始终在 loop 里
  • 基础设施比模型更重要:Minions 能 work 的首要原因跟 AI 模型几乎无关。如果人类工程师的开发环境都不标准、测试覆盖都不完整,AI Agent 来了也跑不起来。AI 不会修复糟糕的工程实践,只会放大。
  • 把 AI 当新员工:能力强但不了解业务上下文、不熟悉代码库。你不会扔给新来的天才工程师一句「把支付系统重构了」就走人——给上下文、给边界、给验收标准,对 AI 也一样。
  • 质量控制的真相:每个 AI PR 仍然需要人类 review,但依赖自动化信心信号(测试覆盖率、合成端到端测试、蓝绿部署快速回滚)。Review 的重心从「这段代码对不对」变成「这个方案合不合理」。
  • 经验在小组内传播最快:团队群分享的好 prompt 比集中式培训有效得多——小群体传播效率远高于自上而下的培训。
§10 · 案例 · 数据级

LangChain:同一匹马,换套缰绳

模型固定,只改 harness,得分从 52.8% 涨到 66.5%——这可能是目前最硬的一组数据,证明瓶颈不在马,在缰绳。
40% 60% 80% 优化前 默认 prompt + 标准工具 52.8% Top 30 优化后 改三样:提示词/工具/中间件 66.5% Top 5 ↑25 位 使用模型:GPT-5.2-Codex —— 从头到尾完全没换
第三行才是重点:模型完全没动。他们刻意只动三个变量(System Prompt / Tools / Middleware),这样才判断得了哪个改变起了作用。

三个优化变量

  • ① System Prompt → 四阶段工作流:Planning & Discovery(读任务、扫代码库、建验证计划)→ Build(带着测试意识实现)→ Verify(跑测试、对照规格)→ Fix(分析错误、回到需求)。关键:把思考顺序约束住,不再是「你是个优秀助手」的空话。
  • ② Tools → 环境感知 + 完成检查:LocalContextMiddleware 启动时注入工作目录结构、Python 版本、可用命令——解决「agent 浪费大量时间摸索自己在哪」;PreCompletionChecklistMiddleware 在 agent 准备退出时强制对照规格检查。因为最常见的失败模式是:写完重读自己的代码,觉得没问题,就停了。
  • ③ Middleware → 防止 doom loop:LoopDetectionMiddleware 追踪单个文件编辑次数,重复 N 次后注入提示「考虑换个方法」。Doom loop 就是「同一种坏方法的 N 个变体」,越走越远还觉得快到了。
Hook 点触发时机典型用途
before_agent调用开始时执行一次加载记忆、连接资源
before_model每次模型调用前历史裁剪、PII 过滤
wrap_model_call包裹整个模型调用缓存、重试、动态工具可用性
wrap_tool_call包裹工具执行注入上下文、控制工具访问
after_model模型响应后human-in-the-loop 干预
after_agent完成时执行一次保存结果、清理资源
⚠️
LangChain 识别的四大失败模式(用过 coding agent 的人大概率全中过)

自我确认偏差(写完就觉得没问题)→ 用完成检查清单拦住;Doom loops(同一文件迭代 10+ 次坏方法)→ 用循环检测拦住;环境不熟悉(陌生目录里浪费时间)→ 用环境注入解决;时间管理失败(推理太猛导致超时)→ 用推理三明治解决。不是换更聪明的模型,是给同一个模型一个更好的运行环境。

§11 · 案例 · 方法级

Kent Beck:极限编程教父的 CLAUDE.md

30 年软件工程智慧遇上 AI 编程。TDD 不是过时的遗产,是天然的 harness。
Red 红 先写一个失败的测试 Green 绿 写刚好通过的代码 Refactor 重构 让代码更干净 Tidy First 结构变更 ≠ 行为变更
TDD 循环是天然的 harness:约束了工作节奏(先写测试)、提供了反馈机制(红绿信号)、防住了最常见的错误(写了代码但不测试)。1999 年的原则,天然适合 AI。
  • CLAUDE.md 第一行:「你是一个资深软件工程师,遵循 Kent Beck 的 TDD 和 Tidy First 原则。」然后规则围绕两个核心展开:TDD 循环(Red → Green → Refactor)和 Tidy First。
  • Tidy First:永远不在同一个 commit 里混合结构性变更(重排代码、改善命名、提取函数)和行为性变更(加功能、修 bug)。混合变更是所有代码库腐化的起点——分开后每个变更都能独立验证、独立回滚。
  • 前两次尝试失败了:复杂度积累太多,AI 完全卡住。关键教训:必须更积极地介入设计决策,拦住 AI 的提前编码(coding ahead)——AI 收到任务就立刻开写,用代码量掩盖设计缺陷。
  • Augmented Coding vs Vibe Coding:Beck 的立场是两者都有价值,但不能混着来——周末 hackathon 项目可以 vibe coding;服务百万用户的生产系统,最好 augmented coding。
Augmented Coding(增强式)
  • 关心:代码质量、复杂度、测试覆盖
  • 价值观:和手写代码相同,整洁的代码能工作
  • 人的角色:主导设计决策,AI 执行
  • 适用:需要长期维护的生产代码
Vibe Coding(感觉式)
  • 关心:系统行为和最终结果
  • 价值观:能跑就行,有错喂回 AI
  • 人的角色:描述需求,AI 全权负责
  • 适用:原型、一次性脚本、探索项目

Kent Beck and I have both said this is the biggest change to coding we've seen in our 50+ year careers.

Martin Fowler 访谈 · 但 Beck 的反应不是恐慌,是把他最擅长的东西搬过来用
§12 · 案例 · 零基础级

花叔:零代码经验到百万用户

从来没手写过一行代码,所有产品都是 AI 写的。他的 harness 从一个空文件长出来——这证明 harness engineering 不是老程序员的专利。
根 CLAUDE.md(路由器) 不到 8KB · 只判断任务属于哪个工作区 01-公众号写作 选题→调研→写作→配图 02-小红书写作 排版规则独立 03-视频创作 字幕→分析→脚本→审校 09-实验项目 iOS 开发架构规范 路由器核心价值:每次对话只加载相关的规则,不把无关的上下文塞给 AI
空文件是怎么变成路由器的:被 AI 搞烦一次加一条规则 → 三个月后太杂了 → 重构:根文件只做路由,指向对应工作区的子 CLAUDE.md。
  • 生长模式(一直在转的循环):被 AI 搞烦 → 加一条规则 → 规则太多 → 重构 → 新问题 → 再加。空文件→加规则→路由器重构→发现规则不够→加 hooks→hooks 太多→封装 skills→skills 冲突→再重构。
  • 从规则到系统:规则是建议(有时听有时不听),hooks 才是约束(没有商量余地);重复十几遍的痛苦流程封装成 skill(配图、飞书同步、小红书排版、字幕分析……)。
  • 100+ 个 skills:每一个都是从具体需求里长出来的,不是一次性设计的。每个 skill 做且只做一件事,描述写得像给同事的一句话交代。
  • 经验不能跳过:判断力不来自写代码的经验,但来自另一种经验——和 AI 反复较劲的经验。踩坑来自大量重复,大量重复来自时间。没有捷径,换了个赛道而已。
🌱
写给零基础的你

别想那么多,先打开一个空的 CLAUDE.md。什么都不用写,等 AI 犯了第一个让你烦的错,写进去;犯了第二个,再写。三个月后回头看,它已经变成了只属于你的 harness——全是你的场景、你的痛点、你的工作方式。你需要的不是编程经验,是耐心和时间。

肆

Part 4 · 实操

别想着一部到位。一个空文件、一个犯错的 agent、一条新规则。

§13 · 实操 · 起步

从空白开始:你的第一个 Harness

不管你用哪个工具,harness 的起点都一样:一个空的指令文件。
工具文件名位置建议起步长度
Claude CodeCLAUDE.md项目根目录(支持三层继承)20–50 行
Codex CLIAGENTS.md项目根目录(逐层遍历,override 优先)50–100 行
Cursor.cursor/rules/*.mdc.cursor/rules/ 目录(支持 glob)每个 20–30 行
GitHub Copilotcopilot-instructions.md.github/ 目录20–50 行

空文件开始,犯错驱动——10 条规则的演练

假设你刚接手一个 React 项目,前 10 条规则会是什么?每一条背后都是一个具体问题:

  1. 测试跑错了:agent 用 npm test,但项目用 Vitest → 写「运行测试:`pnpm vitest run`」
  2. 错误的包管理器:npm 和 pnpm 的 lock 文件冲突 → 写「只用 pnpm,禁止 npm 和 yarn」
  3. 不知道项目结构:组件放错目录 → 写一段目录地图(components/ features/ lib/ api/)
  4. 用了 TypeScript enum:团队规范用 union type → 写「❌ enum → ✅ literal union type」
  5. 直接 push 到 main:→ 写「永远不要直接 push 到 main,走 feature/ 分支提 PR」
  6. 生成了 500 行的巨大组件:→ 写「单文件 <200 行,超过拆子组件,逻辑用 hook 抽离」
  7. 为小功能引入大依赖:→ 写「先确认现有依赖能否实现;date-fns 已装,别引 moment/dayjs」
  8. 不跑 lint 就提交:→ 写「提交前必须 `pnpm lint && pnpm type-check`」
  9. 错误处理太简陋:到处是空 catch 和 console.log → 写「不允许空 catch,统一用 AppError 类」
  10. API 调用散落各处:→ 写「所有请求走 src/api/ 模块,组件里禁止直接 fetch」
🚀
三条启动建议(不想从零慢慢长?)

① 给地图不给说明书:指令文件像地图:结构、关系、关键约束,不写死每步。② 每次犯错加一条规则:不预设、不猜测,agent 犯一个错加一条。③ 让 AI 查 AI:写完后开新对话把结果贴进去说「找出所有问题」——第二个 AI 能发现第一个漏掉的一堆问题。

§14 · 实操 · 指令层

指令层:给 AI 一张地图,不是说明书

CLAUDE.md、AGENTS.md、.cursor/rules——本质是同一件事。但怎么写,差别很大。
~/.claude/CLAUDE.md 全局指令 · 所有项目生效(通用偏好:pnpm、commit 用英文) 项目根目录/CLAUDE.md 项目级 · check 进 git 与团队共享(项目特有的架构约束) 项目子目录/CLAUDE.md
三层继承:全局 → 项目 → 子目录,后加载的优先级更高。写公众号时不会被 iOS 开发的规则干扰——这就是子目录级的作用。
  • 路由器模式(花叔):根 CLAUDE.md 不写具体规则,只判断任务属于哪个工作区并指向对应文件。为什么要这样?因为 CLAUDE.md 每次会话都会加载进上下文——臃肿的文件会让 Claude 忽略你真正的指令(Boris Cherny 原话)。
  • OpenAI 的目录指针模式:AGENTS.md 约 100 行只做目录+指针,指向 docs/ 下的 ARCHITECTURE.md(代码库地图)、design-docs/、exec-plans/、product-specs/ 等。agent 在小而稳定的入口 + 指向专业知识的结构中表现最好。
  • Cursor 的 glob scoping:不同规则只对特定文件路径生效(如 src/api/**/*.ts)——编辑 API 代码时不会被组件规范干扰。四种激活模式:alwaysApply / glob 匹配 / 手动 @mention / AI 判断。
  • 行业正在标准化:2026 年 3 月 AGENTS.md 被纳入 Linux 基金会旗下 Agentic AI Foundation 管理;Windsurf 自动识别 AGENTS.md;Copilot 的格式也越来越像。你写的内容 80% 在不同工具间通用。
✅ 应该写❌ 不应该写
agent 猜不到的命令(如 pnpm vitest run)agent 读代码就能发现的(如用了 React)
与默认不同的代码风格规则标准语言惯例
测试指令和首选测试运行器详细的 API 文档(给链接即可)
分支命名、PR 惯例频繁变化的信息
项目特定的架构决策教程和长篇解释
常见陷阱和非显而易见的行为「写干净代码」之类不言自明的原则

删掉它会导致 Claude 犯错吗?如果不会,就删掉。

Boris Cherny · 保持指令文件精简的最佳判断标准
§15 · 实操 · 约束层

约束层:建议和约束是两回事

「请不要 push 到 main」是建议;用 hooks 在程序层面拦住它,是约束。这个区别是 harness 从 art 到 engineering 的转折点。
提示建议 口头提醒 规则文件 CLAUDE.md Hooks PreToolUse deny Linter 静态分析 CI 阻断 合不进主分支 Sandbox 物理隔离 性质: 一次性 建议性 强制性 强制性 强制性 物理性 可绕过: 是 是 否 否 否 否 越往右越硬,越硬的约束越可靠,但也越不灵活 好的 harness 是组合:大多数规则用指令文件就够了,少数关键安全线用 hooks / CI / Sandbox 守住
约束谱系:从「建议」到「物理隔离」六档。约束保护的是底线,不是偏好。
❌ 建议(指令文件)

写在 CLAUDE.md 里:
「请不要删除数据库迁移文件」

  • 大概率被遵守,但不保证
  • 上下文太长、任务太复杂时可能被忽略
  • 适合:编码规范、风格偏好、架构指引
✅ 约束(Hooks / CI / Sandbox)

PreToolUse hook 拦截对 migrations/ 目录的删除操作

  • 100% 可靠,不受上下文影响
  • 程序级、确定性、不可绕过
  • 适合:安全红线、生产环境保护、不可逆操作

两个实用的 hooks 示例

示例一 · 编辑文件后自动跑 lint// .claude/settings.json { "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "handler": { "type": "shell", "command": "npx eslint --fix \"$CLAUDE_TOOL_ARG_file_path\" 2>&1 || true" } } ] } }
示例二 · 提交前必须通过测试// 在 agent 执行 git commit 前硬拦截 { "hooks": { "PreToolUse": [ { "matcher": "Bash(git commit*)", "handler": { "type": "shell", "command": "pnpm test --run 2>&1 || echo 'DENY: 测试未通过,禁止提交'" } } ] } }
  • Claude Code 的 Hooks:二十多种生命周期事件,最关键是 PreToolUse——可以返回 deny 信号,从程序层面阻止操作。Anthropic 官方:「CLAUDE.md 的指令是建议性的,hooks 是确定性的,保证动作一定执行。」
  • OpenAI 的硬约束三层:①依赖层架构(Types → Config → Repo → Service → Runtime → UI,只能沿固定方向依赖);②自定义 linter(Codex 自己写的,错误信息带修复指导和文档链接);③CI 强制(物理上合不进主分支)。
  • Codex 的 Sandbox:默认模式只能写工作区文件、网络关闭;.git/ 和 .codex/ 始终受保护。「agent 做不了的事就是做不了」——不是在规则层面告诉它不要做,是在环境层面让它没法做。
  • 一个有意思的细节:你可以让 Claude 自己写 hooks——「Write a hook that runs eslint after every file edit」,agent 给自己套上约束。
⚖️
怎么判断该是建议还是约束?

问自己:agent 违反这条规则,后果是什么?代码风格不一致——恼人但不致命,建议就行;删掉了生产数据库——灾难性后果,必须约束;推到了 main——可以 revert 但很麻烦,约束。约束不限制 AI 的力量,约束让 AI 的力量变得可信。

§16 · 实操 · 能力层与记忆层

能力层与记忆层:agent 的天花板

指令和约束管「知道什么规则」,能力层管「能做什么事」,记忆层管「记住了什么」。
能力层 · 能做什么事 Skills 技能 按需加载,不占 context MCP 协议 连接数据库/API/网页 工具设计(ACI):命名清晰、参数示例、报错说明原因 记忆层 · 记住了什么 auto-memory AI 自动保存观察 MEMORY.md 手动维护的长期记忆 CLAUDE.md 本身 = 项目级记忆(复利工程) 上下文管理:不是越多越好 Compaction 压缩 Context Reset 清空重来 开新会话 总结早期对话继续 结构化交接状态启动新 Agent 任务切换直接开新对话
能力与记忆的配合:能力决定上限,记忆决定下限。两者都在往上下文里塞东西,但上下文有物理极限。
  • Skills:放在 .claude/skills/ 目录,一个 .md 文件定义一个能力。平时不占 context,按需加载。设计原则:每个 skill 做且只做一件事,描述写得像给同事的一句话交代——「帮我把文章发到飞书」比「执行飞书 API 文档创建流程」好。
  • MCP:AI 编程工具的 USB 接口:一个协议连接数据库、API、网页、GitHub、Jira、Slack。Goose 通过 MCP 连接 3000+ 服务;Stripe Minions 深度依赖 MCP 和工具扩展。
  • 工具设计(ACI):在工具文档和测试上花功夫,和在 UI 设计上花功夫一样重要。命名让 AI 理解意图(search_knowledge_base 而非 process_data)、有参数示例、报错告诉 agent 哪里出了问题。
  • 动态记忆只有三个工具有:Claude Code(auto-memory)、Windsurf(Cascade Memories)、Cline(Memory Bank MCP)——其余全靠人工维护指令文件。
  • 上下文腐烂(context rot):token 越多,准确回忆单条信息的能力越差,约 100 万 token 处性能断崖。Claude Code 官方直觉判断:如果修正 Claude 超过两次还是错,清空重来比继续修正好——上下文被失败方案污染后,继续修只会越修越歪。
§17 · 实操 · 编排层

编排层:让十匹马同时跑

一个 agent 解决不了的问题,十个 agent 未必能解决。但如果编排对了,十个 agent 能做到一个 agent 永远做不到的事。
单 Agent 改 bug · 加功能 手动多会话 Boris:10–15 个并发会话 三 Agent(Planner/G/E) 规划 → 实现 → 对抗式评估 平台编排 Stripe Minions 复杂度 → 编排的复杂度应该匹配任务的复杂度 从最简单的开始,真的需要了再升级
为什么需要多 Agent:上下文窗口是物理极限——一个 agent 同时处理前端、后端、数据库、测试、文档,填满之后性能断崖式下降。需要多个 agent 各管一块,关键是「谁来协调」。
  • Boris 的 10–15 并发会话:最朴素的编排——人来当编排器。5 个在终端(shell 别名 za/zb/zc 切换)、5–10 个在浏览器,每个跑在独立 git worktree 上代码不冲突。这是他们团队内部 the single biggest productivity unlock。
  • Anthropic 的三 Agent(GAN 直觉):规划者扩规格、生成者按 Sprint 实现、评估者像真人 QA 一样测试。「工程化一个严厉的独立评估者,远比教一个生成者自我批判容易得多。」
  • 穷人版三 Agent(三个会话窗口就够):①复杂任务先进 Plan Mode 让 AI 定计划(可再开第二个 Claude 以 staff engineer 身份审查计划);②确认后切 Normal Mode 执行;③写完后开全新对话把结果贴进去「找出所有问题」——全新上下文的 AI 没有自我偏见。
  • Writer/Reviewer 并行模式:一个写一个审。批量处理时一个文件一个进程,失败不影响其他文件。
  • Agent Teams:Claude Code 目前唯一支持 agent 间直接通信的方案——一个 session 当 team lead 拆任务、收结果,teammates 之间可以直接沟通。Cursor 2.0 最多 8 个并行但互不通话(八匹马各跑各的,没有缰绳)。
场景推荐模式理由
改个 bug、加个功能单 Agent上下文足够,没有并行需求
重构一个模块单 Agent + Plan Mode需要全局视角,拆开反而丢上下文
同时改 5 个独立模块手动多会话(Boris 模式)任务独立,不需要 agent 间通信
写代码 + 审代码Writer/Reviewer 双会话消除自我审查偏差
复杂全栈应用从零开始Planner/Generator/Evaluator任务跨前后端,需要规划和验证
大规模迁移 / 批量处理Pipeline 脚本编排任务高度重复,可并行
1000+ PR/周的企业规模Stripe Minions 式平台需要专用基础设施
伍

Part 5 · 思考

这一章不给答案。

§18 · 思考

经验工程:谁来设计下一代的缰绳

Martin Fowler 团队的 Kief Morris 画了一张图,把人在 AI 编程中的位置分成三层。
In the loop · 人在环内 你逐行审查 agent 的输出,手动修改不满意的代码。什么都过手。 不满意 → 去改代码 On the loop · 人在环上 ★ 你不看代码本身,而是构建和改进 harness:规格、质量检查、工作流。你管缰绳,不管马腿。 不满意 → 去改 harness Out of the loop · 人在环外 你只说想要什么,agent 自己搞定。Vibe coding。 不满意 → 重说一遍 in 和 on 的区别,在你对结果不满意的时候最明显:一个去改代码,一个去改 harness 让它下次产出更好
Morris 的担忧:如果太早把人移到 on the loop 甚至 out of the loop,将来谁来设计 harness?新人从第一天就不接触代码细节,当 harness 出问题需要有人理解底层时,谁来?
  • 中间层在消失:Shopify 把实习生项目从 25 人扩大到 1000 人(「实习生用 AI 的方式更有趣」);Block 以 AI 提升效率为由裁员 40%。两个方向,同一个问题。
  • Junior 最重要的属性不是产出:Martin Fowler:「Junior developer 最重要的属性不是他们现在能产出什么,而是他们能成长为 senior developer。」如果 AI 替代了 junior 的产出却剥夺了成长路径,那不是效率提升,是透支未来。
  • 设计好 harness 的人都有深厚领域经验:Mitchell 懂终端模拟器的每个细节、OpenAI 那 3 个人知道什么架构会在三个月后爆炸、Kent Beck 花了 30 年理解好代码。问题是这些经验从哪来。
  • 花叔的诚实:「我能设计 harness,不是因为我天生懂系统设计,是因为我在和 AI 协作的上千小时里观察到了它的行为模式。」直觉来自踩坑,踩坑来自大量重复,大量重复来自时间。没有捷径,换了个赛道而已。
  • 痛苦的形状变了,痛苦的总量可能没变:以前的赛道是写代码、调 bug、被线上事故搞到半夜;现在的赛道是写 CLAUDE.md、配 hooks、被 AI 的幻觉搞到半夜。
  • 判断力从哪来?从做了很多次之后知道哪些路走不通来。工程师的核心贡献不是代码,是判断力——判断构建什么、如何验证、何时信任输出、何时反驳。
  • Karpathy 已经在身体力行了:2025 年 12 月起不再手写代码。AutoResearch 项目——630 行代码加一个 markdown prompt——2 天跑了 700 次实验。但那个 prompt 之所以有效,是因为写它的人有几十年的研究直觉。

你在教 AI 怎么做,AI 在学你怎么教。这个循环里,谁在设计缰绳,可能比谁在骑马更重要。这个我也不确定。留给你想。

《Harness Engineering》手册 · §18
附

名词速查

遇到陌生词?这里有一份 15 个高频术语的速查卡。

CLAUDE.md 指令文件

Claude Code 的指令文件,Markdown 格式,每次会话自动加载。原则:100 行左右,像地图不像手册。

AGENTS.md 指令文件

Codex CLI 的指令文件,2026 年 3 月起由 Linux 基金会旗下机构管理,正在成为行业标准。

Hooks 钩子

Claude Code 的生命周期脚本。建议变约束的关键:PreToolUse 可以 deny,程序级硬拦截。

MCP 协议

Model Context Protocol,让 AI 连接数据库、API、网页等外部世界的「USB 接口」。

Skills 技能

一个 .md 文件定义一个能力,按需加载不占上下文。每个 skill 做且只做一件事。

Subagents 子代理

运行在独立上下文中,探索完只返回精简摘要(1000–2000 tokens),不污染主对话。

上下文焦虑 Context Anxiety

模型感知到上下文快满时会提前收尾、赶工。解法:context reset 或直接开新会话。

推理三明治 Reasoning Sandwich

xhigh(规划)→ high(实现)→ xhigh(验证)。全程拉满反而超时,得分最低。

Doom Loop 死循环

agent 锁定一个方向后反复做微小变动——同一种坏方法的 N 个变体。用循环检测中间件提醒它换方法。

Sprint Contract 冲刺合约

生成者和评估者在写代码前对「完成」的定义达成一致——人类团队里的技术评审,双方都是 AI。

ExecPlan 执行计划

OpenAI 的自包含设计文档,写到初级工程师也能端到端实现。不是给人看的笔记,是给 agent 执行的指令。

复利工程 Compounding Eng.

Boris Cherny 的 CLAUDE.md 维护方式:每次 Claude 犯错加一条规则,PR 里用 @.claude 标签更新。

路由器模式 Router

根 CLAUDE.md 只做路由,判断任务属于哪个工作区并指向子文件——每次只加载相关规则。

垃圾回收 GC Agent

Fowler 三支柱之一:专职 agent 只找文档矛盾和架构违规,对抗代码库熵增。

护栏保龄 Bowling w/ Bumpers

Mitchell 的比喻:护栏设好,球怎么扔都不会掉沟里——约束让 AI 的力量变得可信。

附

视频专区(辅助)

本教程以图文为主,视频为辅。想要听人讲一遍?下面是配套视频(B站「AI进化论-花生」)。

🎬
图文为主 · 视频为辅

上面的视频卡片为配套教程位(点击跳转 B站搜索「AI进化论-花生」频道)。建议先看图文图解建立框架,再用视频加深理解——图像负责「看懂」,视频负责「听一遍」。