一、全书概览

花叔的橙皮书系列出到第四本,这本是整个系列的"方法论天花板"。

整本书围绕一个核心问题展开:AI 能写代码之后,人的核心能力是什么?

答案是:Harness Engineering——给 AI 造缰绳的工程方法论。

书的开头就用一个炸裂的数据开场:OpenAI 的 Codex 团队,7 个人,5 个月,零行手写代码,交付了一个 100 万行的产品。模型没换,换的是套在模型外面的那层东西。这层东西叫 Harness。

Harness 的英文原意是马具、缰绳。AI 模型是马,力气再大,没有缰绳就是一匹乱跑的野马。这个比喻贯穿全书,简单粗暴但极其精准。

全书结构清晰,五个部分层层递进:

  1. 起源篇(第 1-3 章):从马具到航天线束到 AI 编程,追溯这个词的演变,梳理软件工程六十年简史
  2. 框架篇(第 4-5 章):拆解 Harness 的五个组件,以及一个反直觉的核心原则——Harness 不是越多越好
  3. 案例篇(第 6-12 章):全书最厚部分,7 个深度案例拆解
  4. 实操篇(第 13-17 章):以 Claude Code 为核心,从空白项目开始逐层构建完整 Harness
  5. 思考篇(第 18 章):在没人写代码的时代,谁来设计下一代的缰绳

这本书不是 AI 工具使用手册,而是工程方法论。花叔自己也说得很明白——适合已经在用 AI 编程工具、想从"对话式使用"升级到"系统化协作"的人。


二、逐章要点

第 1 章:Harness 到底是什么

开篇定义了全书的坐标系:Agent = Model + Harness。你不是模型,那你就是 Harness。

这个公式把 AI 编程领域分成了两个阵营:做模型的人和做 Harness 的人。绝大多数开发者和团队,属于后者。模型决定上限,Harness 决定底线。

书中给出的定义是:Harness 就是模型之外的一切——系统提示词、工具调用、文件系统、沙箱环境、编排逻辑、钩子中间件、反馈回路、约束机制。模型本身只是能力的来源,只有通过 Harness 把状态、工具、反馈和约束串起来,它才真正变成一个可用的 Agent。

第 2 章:六十年简史——人和工具的关系

从 1960 年代 Fortran 到 2026 年的 Claude Code,软件工程六十年的核心矛盾一直是:人要做什么,工具要做什么

书里梳理了一条清晰的时间线:

  • 1960s-1970s:手写汇编和 Fortran,人做一切
  • 1980s-1990s:IDE 和编译器出现,工具开始辅助
  • 2000s:敏捷运动,强调人的协作
  • 2009-2014:DevOps——描述你要什么,而不是怎么做
  • 2024-2026:AI Agent——描述你要什么,AI 直接做

每一轮变迁都在把人的工作往上推一层。从"手写代码"到"描述需求",这个趋势不可逆。

第 3 章:三次命名

书中追溯了 Harness 这个词三次被赋予工程含义的过程:

  1. 马具——原意,控制马匹的装备
  2. 航天线束——NASA 用来描述连接各子系统的线缆总成
  3. AI 编程 Harness——Mitchell Hashimoto 在博客中首次使用这个说法("我不知道业界有没有公认的术语,我自己管这叫 harness engineering"),之后 OpenAI、Anthropic 纷纷跟进

这个词从"控制"到"连接"再到"赋能"的语义变迁,本身就反映了人机关系的演变。

第 4 章:Harness 的五个组件

这是全书的骨架章节。花叔从"模型做不到什么"出发,推导出 Harness 要补什么:

| 模型做不到的 | Harness 怎么补 | 核心组件 | |---|---|---| | 记住多轮对话历史 | 每次请求时拼进上下文 | 记忆系统 | | 执行代码、跑命令 | 提供 Bash + 代码执行环境 | 执行能力 | | 获取实时信息 | Web Search、MCP 工具 | 外部知识 | | 操作文件和环境 | 文件系统抽象 + Git | 工具系统 | | 知道自己做对了没有 | 沙箱 + 测试 + 浏览器自动化 | 反馈机制 | | 在长任务中保持连贯 | 上下文压缩、进度追踪 | 编排逻辑 |

花叔把这套东西浓缩为五个字:指令、约束、反馈、记忆、编排

第 5 章:少即是多——减法哲学

这是全书最反直觉的一章。

很多人的第一反应是:既然 Harness 这么重要,那就做得越厚越好、规则越多越好、约束越严格越好。花叔用大量案例反驳了这种想法:

  • AGENTS.md 写成千页手册?Agent 上下文窗口被撑爆,反而更蠢
  • 每一步都加校验?Agent 被"保护"到寸步难行
  • 规则越加越多?维护成本指数增长,最后没人看得懂

Harness 不是越多越好,而是越精准越好。 每一条规则都应该对应一个真实发生过的失败案例。没有失败案例支撑的规则,就是噪音。

Anthropic 自己也验证了这一点:模型越强,之前必要的保护机制可能已经冗余了。需要定期"压力测试"你的 Harness,把不再需要的组件砍掉。

第 6 章:OpenAI Codex——零行手写代码的百万行产品

全书最炸裂的案例。数据再列一遍:

  • 3 名工程师(后扩至 7 人)
  • 5 个月(2025 年 8 月起)
  • 约 100 万行代码
  • 手写代码:0 行(设计约束)
  • 约 1,500 个合并 PR
  • 日均 PR/人 3.5 个
  • 效率提升约 10 倍

他们总结出五大方法论:

  1. 地图式文档:AGENTS.md 只有约 100 行,当目录用,指向更深层的设计文档。渐进式披露,需要什么加载什么
  2. 机械化约束:自定义 Linter,报错消息里直接告诉 Agent 怎么改。原话:"If it cannot be enforced mechanically, agents will deviate"
  3. 可观测性接入:Chrome DevTools Protocol 接入 Agent 运行时,Agent 能自己抓 DOM 快照、截图
  4. 熵管理:后台 Agent 定期扫描,自动提交清理 PR。生成速度和清理速度必须匹配
  5. 仓库即事实源:写在 Slack 里的知识对 Agent 来说等于不存在

第 7 章:Mitchell Hashimoto——每次犯错加一条规则

Vagrant、Terraform、Ghostty 的作者,走的是完全不同的路线——坚持单 Agent,一个人深度参与。

他的六步进阶路线:

  1. 放弃聊天模式:让 Agent 在能读文件、跑程序、发 HTTP 请求的环境里直接干活
  2. 复现自己的工作:每件事做两次——一次自己做,一次让 Agent 做,他形容"痛苦至极"
  3. 下班前启动 Agent:每天最后 30 分钟给 Agent 布置任务:深度调研、模糊探索
  4. 外包确定性任务:挑出 Agent 几乎一定能做好的任务后台跑

他的核心信念:每犯一次错,就在 AGENTS.md 里加一条规则。 这个文件就是他个人工程经验的结晶,每一行都对应一个真实的失败案例。

第 8 章:Anthropic——让 AI 查 AI

Anthropic 提出了一个受 GAN(生成对抗网络)启发的三智能体架构:

Planner(规划者)→ Generator(执行者)⇄ Evaluator(评估者)

  • Planner:拿到 1-4 句话的产品描述,扩展成完整产品规格
  • Generator:按功能一个一个做 Sprint
  • Evaluator:用 Playwright MCP 实际点击运行中的应用,多维度打分

关键设计:生成和评估交给两个独立的 Agent。因为 Agent 自评会"自信满满地夸自己做得好,实际质量一般"。这个拆分解决了 AI 编程中最大的信任问题。

第 9 章:Stripe Minions——每周 1300 个 PR 的流水线

Stripe 代表了高度自动化的无人值守模式。开发者发一条 Slack 消息,Agent 从写代码到跑 CI 到提 PR 全部搞定,人只在最后审查。

架构亮点:

  • Devbox:AWS EC2 预装源码和服务,预热池分配,启动约 10 秒。"牲口不是宠物"
  • 混合编排状态机:该确定的地方确定(跑 lint、推送),该灵活的地方灵活(实现功能、修 CI)
  • Toolshed MCP:近 500 个工具的集中式服务,每个 Minion 获得筛选子集
  • 反馈回路:Pre-push hook 秒级修 lint;推送后最多 2 轮 CI(300 万+ 测试)

核心理念:"What's good for humans is good for agents."——Agent 应该跟人类工程师用同一套基础设施,只是从一开始就被当作一等公民来设计。

第 10 章:LangChain——同一匹马,换套缰绳

这个案例直接证明了"瓶颈不在模型"。

同一模型,只换了工具调用格式(Harness),编码基准分数从 6.7% 跳到 68.3%。模型没变,变了的是外围系统。

LangChain 在 Terminal Bench 2.0 上优化了 Agent 运行环境后,从全球第 30 名升到第 5 名,得分从 52.8% 提升到 66.5%。模型没换,Harness 换了。

但这里有个坑值得注意:model-harness 耦合问题。Claude Code 等工具是模型和 Harness 一起训练的,换工具逻辑后模型表现会变差。Opus 在 Claude Code 中的 Harness 下得分,远低于它在其他 Harness 中的得分。

第 11 章:Kent Beck——极限编程教父的 CLAUDE.md

Kent Beck,XP(极限编程)的发明者,30 年软件工程智慧的集大成者。他把这些东西浓缩进了一个 CLAUDE.md 文件。

这个案例的价值在于:好的 Harness 不是发明出来的,是从经验中长出来的。 Beck 的每一行配置背后都是几十年的工程实践沉淀。

第 12 章:花叔——零代码经验到百万用户

作者自己的故事。没有编程背景,靠 AI 编程做出了百万用户产品。

这个案例的价值不在技术细节,而在视角转换:当 Harness 做得足够好,"会不会写代码"这个前提条件就被消解了。 这对产品经理、设计师、创业者来说,是一个巨大的信号。

第 13-17 章:实操篇——从空白开始构建 Harness

以 Claude Code 为核心(兼顾 Codex 和 Cursor),五步走:

  • 第 13 章:从空白项目开始,搭建第一个 Harness 骨架
  • 第 14 章:指令层——给 AI 一张地图,不是一本千页手册
  • 第 15 章:约束层——建议和约束是两回事。约束必须机械化执行
  • 第 16 章:能力层与记忆层——让 AI 能做事、能记住事
  • 第 17 章:编排层——让十匹马同时跑,多 Agent 协作

实操篇的核心原则:渐进式构建,不要试图一步到位。 先搭骨架,再根据实际使用中的问题逐层补齐。

第 18 章:经验工程——谁来设计下一代的缰绳

全书收尾提出一个开放问题:在没人写代码的时代,"工程经验"的定义会发生什么变化?

如果代码都是 AI 写的,那理解系统架构、设计 Harness、做技术决策的能力,就变成了新的"核心工程能力"。花叔称之为"经验工程"——把人的经验变成可复用、可迁移的系统。


三、关键概念速查

1. Harness(缰绳)

模型之外的一切工程系统。包括系统提示词、工具调用、文件系统、沙箱环境、编排逻辑、反馈回路、约束机制。公式:Agent = Model + Harness

2. 上下文焦虑(Context Anxiety)

模型在上下文窗口快填满时表现急剧下降的现象。Anthropic 发现 Sonnet 4.5 在上下文快满时会变得犹豫,倾向于提前收工。经验法则:上下文利用率控制在 40% 以内

3. Context Resets(上下文重置)

Anthropic 的解决方案:不压缩上下文,而是启动一个全新的"干净"Agent,通过结构化交接文档恢复状态。类比:程序内存泄漏时直接重启进程,而不是手动释放每个内存块。

4. 渐进式披露(Progressive Disclosure)

给 Agent 信息的策略:先给最关键的信息(地图),需要时再加载细节(具体页码)。AGENTS.md 约 100 行当目录用,详细规则按需加载。不要把所有东西塞进一个文件。

5. 熵管理(Entropy Management)

AI 生成代码的"腐烂速度"远快于人类写的代码。必须主动对抗——定期扫描、自动清理、提交修复 PR。生成速度和清理速度必须匹配,否则技术债会快速积累到不可控。

6. Model-Harness 耦合

当前 Agent 产品是模型和 Harness 一起训练的,导致过拟合:换了工具逻辑后模型表现会变差。选择 Harness 时,不要被模型的默认 Harness 束缚。

7. GAN 式三智能体架构

Anthropic 借鉴 GAN 思路的设计:Planner(规划)→ Generator(执行)⇄ Evaluator(评估)。核心价值是把"生成"和"验证"拆给两个独立的 Agent,解决自我评价偏差。


四、核心框架/模型

Harness 五组件模型

花叔提炼的五个核心组件,构成了 Harness 的最小完整集合:

指令(Directive)    → 告诉 AI 做什么、怎么做
约束(Constraint)   → 告诉 AI 不能做什么,必须机械化执行
反馈(Feedback)     → 让 AI 知道自己做对了还是做错了
记忆(Memory)       → 让 AI 记住之前发生过什么
编排(Orchestration)→ 让多个 AI 协同工作

六层架构体系

从系统设计角度,成熟的 Harness 有六个层次:

| 层级 | 名称 | 解决什么问题 | 类比 | |---|---|---|---| | L1 | 信息边界层 | Agent 该知道什么 | 岗位说明书 | | L2 | 工具系统层 | 怎么跟外部交互 | 办公工具 | | L3 | 执行编排层 | 多步骤怎么串起来 | SOP 标准流程 | | L4 | 记忆与状态层 | 中间结果怎么管 | 项目管理系统 | | L5 | 评估与观测层 | 怎么知道做对了 | 质检流程 | | L6 | 约束校验恢复层 | 出错了怎么办 | 红线规则+应急预案 |

优先级建议:先做 L1(信息边界)和 L6(约束与恢复),这两层投入产出比最高。中间层次随项目复杂度逐步补齐。

Harness 成熟度模型

| 阶段 | 特征 | 工程师角色 | |---|---|---| | Level 0 | 无 Harness,直接给 prompt | 手动写代码 + 偶尔用 AI | | Level 1 | AGENTS.md + 基础 Linter | 主要写代码,AI 辅助 | | Level 2 | CI/CD + 自动化测试 + 反馈回路 | 规划 + 审查为主 | | Level 3 | 多 Agent 分工 + 分层上下文 | 环境设计 + 管理 | | Level 4 | 无人值守 + 自动熵管理 + 自修复 | 架构师 + 质量把关 |

三层工程方法嵌套关系

Prompt Engineering、Context Engineering、Harness Engineering 不是并列关系,而是嵌套关系:

  • Prompt Engineering(表达层):怎么写好指令,让模型听懂意图
  • Context Engineering(信息层):给 Agent 看什么,确保拿到正确信息
  • Harness Engineering(执行层):整个系统怎么防崩、怎么持续运转

简单任务里提示词最重要;依赖外部知识的任务里上下文很关键;在长链路、可执行、低容错的真实商业场景里,Harness 才是决定成败的东西。


五、金句摘录

  1. "模型决定上限,Harness 决定底线。" —— 全书最核心的一句话。与其纠结选哪个模型,不如先把 Harness 搭好。

  2. "If it cannot be enforced mechanically, agents will deviate." —— OpenAI Codex 团队的原话。文档里写约束不够,必须靠工具强制执行。

  3. "我必须不断提醒自己,我是在为 Claude 写这个测试框架,不是为自己写。" —— Carlini 用 16 个 Agent 写 C 编译器后的感悟。Harness 的设计目标是让 Agent 高效工作,不是为了人类方便。

  4. "What's good for humans is good for agents." —— Stripe Minions 的设计哲学。Agent 应该用跟人类工程师同一套基础设施。

  5. "Every component in a harness encodes an assumption about what the model can't do on its own, and those assumptions are worth stress testing." —— Anthropic。Harness 中的每个组件都编码了一个"模型做不到"的假设,这些假设值得定期压力测试。

  6. "The space of interesting harness combinations doesn't shrink as models improve. Instead, it moves." —— Anthropic。模型越强,不是不需要 Harness 了,而是 Harness 的设计空间转移到了新的位置。

  7. "写在 Slack 里的知识,对 Agent 来说等于不存在。" —— OpenAI。所有团队知识都必须作为版本控制的制品放在仓库中。


六、行动清单

每天

  • [ ] 维护 AGENTS.md:每次 Agent 犯错,加一条对应规则。确保每条规则都有真实失败案例支撑,没有案例的规则就是噪音
  • [ ] 检查上下文利用率:如果超过 40%,触发压缩或 context reset。不要等到 Agent 开始变蠢再处理
  • [ ] 代码审查时问自己:这个错误是模型能力问题还是 Harness 设计问题?80% 的情况是后者

每周

  • [ ] 审查 AGENTS.md:删掉不再需要的规则。模型在进化,去年必要的约束今天可能已经冗余
  • [ ] 熵管理检查:扫描 AI 生成物中的低质量代码、文档不一致、冗余实现。生成速度和清理速度必须匹配
  • [ ] 测试 Harness 假设:挑一个 Harness 组件,临时移除它,看 Agent 表现是否变差。如果没变差,这个组件就是多余的
  • [ ] 更新知识仓库:把 Slack 讨论中的重要决策、架构变更写进仓库文档。Slack 里的知识对 Agent 等于不存在

每月

  • [ ] 评估 Harness 成熟度:对照 Level 0-4 模型,判断当前阶段,规划下一步
  • [ ] 尝试减少一层约束:Anthropic 的经验——模型越强,Harness 应该越薄。定期做减法
  • [ ] 复盘 Agent 协作模式:单 Agent 够用还是需要多 Agent 分工?参考 Hashimoto(单 Agent)vs Carlini(16 个 Agent)的两种极端
  • [ ] 更新团队知识仓库化进度:确保所有关键知识都在仓库中,而不是散落在 Wiki、Slack、Notion 各处

七、一句话总结

承认模型有边界,然后把边界之外的需求一个个工程化地补上——这就是 Harness Engineering 的全部。


八、读者热议

1. "棕地项目怎么办?"

这是目前被讨论最多的问题。书中所有成功案例——OpenAI、Anthropic、Stripe、Hashimoto——全部是在全新项目上从零搭 Harness。但现实中绝大多数团队面对的是跑了多年的代码库,有历史架构、技术债、遗留逻辑。怎么把 Harness 引入一个十年历史的项目?目前没有任何公开方法论。

Martin Fowler 团队的 Birgitta Böckeler 把这比作"在从没用过静态分析的代码库上跑静态分析"。她提出了"Ambient Affordances"概念:环境本身的结构特性(类型系统、模块边界、框架抽象)决定了 Harness 能做多好。这意味着,在一个架构混乱的项目上,Harness 的效果天花板天然就低。

2. "AI 生成代码的长期可维护性呢?"

LLM 生成的代码经常重新实现已有功能(Carlini 在编译器项目中专门安排了一个"去重 Agent"来处理这个问题)。Greg Brockman 提出过这个问题,至今无人回答。一个月后代码是否还能看懂?半年后能否安全修改?三年后技术债会不会压垮整个项目?

这些问题的答案,需要时间来验证。但有一个共识正在形成:如果没有熵管理机制(定期清理、自动去重、架构守卫),AI 生成代码的腐烂速度会远快于人类写的代码。

3. "Agent 写的代码用 Agent 的测试来验证,这靠谱吗?"

Böckeler 直接批评了这个做法:"用 AI 生成的测试来验证 AI 生成的代码,本质上是'用同一双眼睛检查自己的作业'——that's not good enough yet。"

Anthropic 的解决方案是把生成和评估拆给两个独立的 Agent(GAN 式架构),这是一个进步,但并没有从根本上解决问题。两个基于同一个模型的 Agent,共享同样的盲区。

Stripe 的方案更务实:最终审查环节还是人来做。每周 1300 个 PR 全程无人值守,但最后一步——合并前的审查——人还是在的。这可能是目前最务实的平衡点。

4. "单 Agent 还是多 Agent?"

Hashimoto 坚持单 Agent,认为"多 Agent 增加了不必要的复杂性"。Carlini 用 16 个并行 Agent 写了个 C 编译器。Stripe 用数百个 Minion 并行处理 PR。

花叔没有给出非此即彼的答案,但提供了一个判断标准:规模决定。小项目单 Agent 够用,大项目几乎必然需要专业化分工。关键是找到你自己项目规模对应的平衡点。


笔记生成:2026-04-28 by 喵喵 🐈


相关笔记

同作者: 同主题: