jixiaxue 知识库
research / Harness-Engineering

Harness Engineering 深度调研

5 个章节 · 3 条产出 · 2 条证据

Harness Engineering 深度调研

状态:🟢 已完成 日期:2026-03-29 驱动问题:Harness Engineering 是什么?为什么现在爆发?它将如何重塑 AI 时代的软件工程实践? 方法论:技术趋势分析 + 深度知识体系构建(Grounded Knowledge Architecture)


结论摘要

  1. Harness Engineering 是 AI 时代的”软件工程基础设施层”——它不是提示词优化技巧,而是一套约束和控制 AI Agent 的工具与实践体系,涵盖上下文工程、架构约束、反馈循环设计、以及技术债清理(“垃圾回收”)。Mitchell Hashimoto 给出了最精炼的操作性定义:“每当发现代理犯错时,花时间工程化解决方案防止再次出现”。

  2. 工业案例已完成从实验到规模化的跨越——OpenAI 3人团队用 Codex 构建百万行代码产品(无一行人工代码,每人每天 3.5 个 PR);Stripe 每周合并超过 1000 个 AI 生成 PR;Cursor 在一周内协调数千个 Agent 完成约 1000 次提交。这些数据证明 Harness Engineering 已从概念变为可交付的工业流水线。

  3. “Big Model vs Big Harness”是当前最关键的技术路线争议——Noam Brown(OpenAI)认为更强的模型将使复杂 Agent 框架过时;Jerry Liu(LlamaIndex)认为获取 AI 价值的最大瓶颈是自身的上下文工程能力,而非模型能力。Cursor 的 $500 亿估值被业界视为 Harness 价值的市场背书。

  4. Benchmark 可信度危机倒逼 Harness 必要性——METR 研究显示,约半数通过 SWE-bench 自动评分的 PR 实际不会被真实维护者合并,自动评分与维护者决策存在约 24 个百分点的系统性偏差。这意味着 Harness 必须包含超出 benchmark 指标的真实验证层。

  5. 架构设计原则正在收敛——跨 OpenAI、Stripe、Cursor、Anthropic 的实践共同指向三条核心原则:(a) 反馈越早越好(左移验证,本地 linting < 5 秒);(b) 约束优于指令(模糊指令会放大不良行为);(c) 最简可行原则(仅在必要时增加复杂性,避免上下文衰减和自我评估偏差)。

详细论证 → findings.md


方法论如何指导本次调研

技术趋势分析 定义了宏观判断维度:

  • 概念起源与演化路径 → 0-概念定义与演化.md
  • 技术成熟度信号(工业案例规模、估值数据、会议专题轨道)→ 2-工业实践案例.md
  • 争议格局与长期走向 → 3-核心争议与辩论.md

深度知识体系构建(Grounded Knowledge Architecture) 指导微观拆解:

  • 核心概念精确边界(区分 harness / scaffold / prompt engineering)→ 0-概念定义与演化.md
  • 技术组成与架构模式(OS 类比、双 Agent、四代演进)→ 1-架构与核心组件.md
  • 与相关概念的关系图谱(与 Skill 编写、Agent 评测的交叉)→ 0-概念定义与演化.md

调研框架

Harness-Engineering/
├── _brief.md                          ← 你在这里
├── 0-概念定义与演化.md                  # 定义、起源、术语关系图谱
├── 1-架构与核心组件.md                  # 技术架构、设计模式、组件分层
├── 2-工业实践案例.md                    # OpenAI/Stripe/Cursor/Anthropic 等实战
├── 3-核心争议与辩论.md                  # Big Model vs Big Harness、评估陷阱
├── 4-开发者采纳指南.md                  # 个人/团队/企业的实践路径
├── findings.md                        # 三轮收敛洞察
├── 产出/
│   ├── Harness-Engineering实践手册.md
│   └── Harness-Engineering深度解读.md   # 可分享长文
└── evidence/
    └── 信息源索引.md

关联调研

调研章节

0 Harness Engineering:概念定义与演化

Harness Engineering:概念定义与演化

📍 位置:Harness Engineering / 概念基础 📌 核心发现:Harness Engineering 是 AI Agent 时代的”操作系统层”工程学科,从 prompt engineering → context engineering → harness engineering 的演化反映了人机协作从”对话”到”系统设计”的范式跃迁 📥 输入:OpenAI(Ryan Lopopolo, 2026-02-11)、Martin Fowler、Philipp Schmid、Mitchell Hashimoto、Latent Space 📤 流向:→ findings.md [概念框架部分]


一、精确定义

1.1 三个原始定义源

理解 Harness Engineering,必须先还原三个最重要的一手定义,再做综合分析。

定义源 A:OpenAI(Ryan Lopopolo,2026年2月11日)

OpenAI 在博文《工程技术:在智能体优先的世界中利用 Codex》中给出了这一概念的工业实践起点:

“当软件工程团队的主要工作不再是编写代码,而是设计环境、明确意图和构建反馈回路,从而使 Codex 智能体能够可靠地工作时,会发生哪些变化。”

这个定义的关键词是三个动词的组合:设计(design)、明确(articulate)、构建(build)。它强调的不是如何写出好的 prompt,而是如何工程化地搭建一套让 Agent 能够持续可靠运作的外部环境。

文章进一步揭示了这种工程的核心特征:

“工程师工作的重点转向了系统、架构和杠杆作用。”

“构建软件仍然需要纪律,但纪律更多地体现在支撑结构上,而不是代码上。保持代码库一致性的工具、抽象和反馈回路变得越发重要。”

定义源 B:Martin Fowler

Martin Fowler 从软件工程传统的角度出发,将 Harness Engineering 定义为:

约束和控制 AI 代理的工具和实践(the tools and practices for constraining and controlling AI agents)”

Fowler 的定义刻意使用了”约束”(constraining)而非”引导”(guiding)。这一措辞选择极具深意:它暗示 Agent 本质上具有不确定性,harness 的作用是在这种不确定性周围建立确定性的边界——就像给烈马套上缰绳,不是阻止它奔跑,而是让它沿着正确的方向奔跑。

定义源 C:Philipp Schmid(HuggingFace 技术总监)

Schmid 从基础设施视角给出了更具操作性的定义:

“围绕 AI 模型的基础设施,用于管理长期运行的任务、对话历史记录,将工具集成到模型中,并将其结构化为 Agent。”

Schmid 的贡献在于将 harness 落地为可枚举的基础设施组件:任务管理、历史管理、工具集成、Agent 结构化。他的定义最接近一个系统工程师的视角。

定义源 D:Mitchell Hashimoto(Ghostty 作者,前 HashiCorp 联合创始人)

Hashimoto 给出了目前最精炼的操作性定义:

“每当发现代理犯错时,花时间工程化解决方案防止再次出现。”

这个定义的力量在于它把 Harness Engineering 描述为一种工程响应模式:不是一次性的架构设计,而是持续迭代的防错工程。每个错误都是一个信号,指向 harness 的一个缺口,需要被工程化地填补。

1.2 综合定义

综合以上四个视角,可以给出如下综合定义:

Harness Engineering 是 AI Agent 时代的系统工程学科,其核心任务是设计和维护围绕 AI 模型的”执行环境”——通过上下文管理、架构约束、反馈回路和自愈机制,使 Agent 能够在大型、长期、复杂的任务中持续可靠地运作。

更精炼地说:Harness Engineering = 让 Agent 可靠工作的一切非模型工作。

这个定义刻意使用”非模型工作”来划定边界:它不关心模型权重、训练方法或推理算法,它关心的是模型之外的那一切——提供给模型的上下文如何组织、模型的输出如何被验证、错误如何被捕捉并转化为系统改进、多个 Agent 如何被协调。

1.3 为什么”harness”这个词被选中

“Harness” 在英语中有两个核心语义:

  1. 马具/缰绳(horse harness):套在马身上的控制装置,允许马的力量被有效利用同时保持方向控制
  2. 线束/安全带(wire harness / safety harness):将多根线缆捆束在一起、防止混乱的工业组件;或登山中防止坠落的保护装置

这两个语义都精确地捕捉了这门学科的本质:

  • 像马具一样驾驭模型的能力(利用 + 控制)
  • 像线束一样组织系统的复杂性(结构 + 防混乱)
  • 像安全带一样保护系统免受失控的伤害(防错 + 容错)

“Scaffolding”曾是描述 Agent 支撑代码的常用词,但它只有建设阶段的含义,暗示最终会被移除。“Harness”则是永久性的工程组件,这更准确地反映了其在 AI Agent 系统中的地位。


二、概念演化时间线

2.1 第一纪元:Prompt Engineering(2022–2023)

核心范式:对话式优化

这一纪元的起点是 GPT-3 的开放 API 访问(2020年)和 ChatGPT 的爆发(2022年11月)。技术社区的主要精力集中在一个问题上:如何通过改写输入文本来获得更好的输出

典型实践:

  • Few-shot prompting:在 prompt 中插入示例
  • Chain-of-thought:要求模型”逐步思考”
  • Role prompting:给模型指定角色(“你是一位资深工程师……”)
  • System prompt 优化:精心设计系统提示词

这一时期的工程思维是单次会话的:每次对话是独立的,优化目标是单个 prompt 的输出质量。“工程”的概念几乎等同于”写作技巧”——它更接近文案创作而非软件工程。

局限性的显现(2023年中): 随着开发者开始尝试构建长期运行的系统,单次 prompt 优化的局限性开始暴露:

  • 长对话中的”遗忘问题”(context window 的限制)
  • 工具调用的可靠性问题(模型不稳定地使用工具)
  • 跨会话状态管理缺失
  • 无法处理需要多步规划的复杂任务

2.2 第二纪元:Context Engineering 兴起(2023–2024)

核心范式:上下文作为工程对象

随着 Agent 概念的兴起(AutoGPT 于 2023年3月开源,迅速达到 10 万 GitHub Stars),技术社区开始意识到:模型能做什么,很大程度上取决于你给它什么上下文

Context Engineering 的核心洞察:

上下文窗口(context window)是 LLM 系统真正的”计算资源”,就像 RAM 一样宝贵且有限。

这一纪元的工程重心转移到:

  • 检索增强生成(RAG):动态选择哪些文档进入上下文
  • 上下文压缩:如何在有限窗口内塞入最多有用信息
  • 记忆管理:如何跨会话保存和检索重要状态
  • 工具描述工程:如何让模型更准确地理解和调用工具

关键技术发展:

  • LangChain(2022年10月)、LlamaIndex(2023年)等框架的兴起,提供了上下文管理的抽象
  • Function Calling 的标准化(OpenAI,2023年6月)
  • 长上下文模型出现(Claude 100K,2023年5月;Gemini 1M tokens,2024年)

这一纪元的局限:Context Engineering 解决了”给模型什么”的问题,但还没有系统性地解决”如何组织整个系统”的问题。框架层出不穷,但工程实践仍然碎片化,大多数”Agent”项目无法在真实生产环境中稳定运行。

2.3 第三纪元:Agentic Coding 爆发(2024–2025)

核心范式:Agent 深入软件开发工作流

这一纪元的标志性产品是:

  • GitHub Copilot(2022年 GA,2024年逐步升级为 Agent 模式)
  • Cursor(2023年兴起,2024年爆发,2025年估值达 $500 亿)
  • Claude Code(Anthropic,2025年)
  • Devin(Cognition AI,2024年3月,号称第一个”AI 软件工程师”)

这一纪元的关键变化:

1. 任务粒度的跨越

早期 AI 编码工具的使用粒度是”行级别”或”函数级别”的自动补全。这一时期,任务粒度跃升到了”PR 级别”——一个 Agent 可以处理一个完整的功能需求,从理解需求到写代码、测试、修复 bug,最终提交 PR。

2. 工具链的成熟

  • MCP(Model Context Protocol,Anthropic 2024年11月)的推出,为 Agent 与外部工具的交互提供了标准化协议
  • 代码执行沙箱(E2B、Daytona、Modal 等)的成熟,使 Agent 可以安全地运行代码
  • Git 集成的深化,使 Agent 可以直接操作代码仓库

3. 真实生产案例的积累

这一时期出现了第一批可信的工业规模案例:

  • Stripe 开始系统性地使用 AI 生成 PR(2024年末公开数据)
  • Cursor 用户数量爆炸式增长
  • 众多初创公司开始构建”完全由 AI 编写”的产品

隐藏的危机:这一时期也是 benchmark 通货膨胀最严重的时期。SWE-bench 等评测分数节节攀升,但 METR 的研究揭示,约 50% 通过自动评分的 PR 实际上不会被真实维护者合并。评估指标与真实价值之间的鸿沟在扩大,促使工程师们思考:到底需要什么样的系统,才能让 Agent 真正可靠?

2.4 概念形成:Harness Engineering 正式命名(2026年2月)

关键事件:OpenAI 博文发布(2026年2月11日)

Ryan Lopopolo 在 OpenAI 官网发表《工程技术:在智能体优先的世界中利用 Codex》,这是 Harness Engineering 概念第一次被系统性地记录并以工程文章形式传播给公众。

文章的背景是 OpenAI 内部一次极端实验:一个 3 人工程师团队,使用 Codex 构建了一个拥有 100 万行代码的产品,没有一行代码是人工编写的,历时五个月,最终产品有日常活跃用户。

这篇文章之所以重要,不仅因为它记录了工程实践,更因为它给这种实践命了名,并提出了一套可传播的框架

  • AGENTS.md 作为”目录而非百科全书”
  • 代码仓库作为”记录系统”
  • “doc-gardening agent”作为”垃圾回收器”
  • 渐进式披露原则

同月(2026年2月4日),OpenAI 还发布了《解锁 Codex 运行框架:我们如何构建 App Server》,进一步补充了技术细节。

2.5 社区辩论与企业实践涌现(2026年2–3月)

辩论的爆发

OpenAI 博文发布后,技术社区的反应分成了几个阵营:

阵营A:Big Model 派 以 Noam Brown(OpenAI 研究员)为代表,认为随着模型能力的快速提升,复杂的 harness 工程终将过时:足够强大的模型不需要精心设计的上下文管理和约束系统,它们会自己搞定。

阵营B:Big Harness 派 以 Jerry Liu(LlamaIndex 联合创始人)为代表,认为:“获取 AI 价值的最大瓶颈是自身的上下文工程能力,而非模型能力。“即使模型再强,糟糕的 harness 仍会导致灾难性的结果。

阵营C:Complementary 派 认为模型能力和 harness 工程是互补的,更强的模型需要更精密的 harness 才能发挥其全部潜力。Cursor 的架构演进(四代演进,每一代都有更复杂的 harness)被引用为这一观点的证据。

Stripe 的公开数据

2026年3月,Stripe 工程团队公开分享了其 harness 工程实践细节:

  • 每周超过 1000 个 AI 生成的 PR 被合并
  • 实现了条件规则系统(按子目录条件应用不同规则)
  • 反馈左移策略:本地 linting 控制在 5 秒内

Cursor 架构文章

Cursor 团队发表文章,披露了其四代编码 Agent 的架构演进,最新一代采用”递归规划者 + 专职工作者”的双 Agent 架构,并明确提出了 Harness Engineering 的概念在其系统设计中的地位。


三、术语关系图谱

3.1 Harness Engineering vs Prompt Engineering

关系:包含关系(Prompt Engineering 是 Harness Engineering 的子集)

┌──────────────────────────────────────────────────────┐
│                  Harness Engineering                  │
│                                                        │
│   ┌─────────────────────┐   ┌──────────────────────┐ │
│   │  Prompt Engineering  │   │   Context Management │ │
│   │  (任务级指令设计)    │   │   (状态/历史/记忆)   │ │
│   └─────────────────────┘   └──────────────────────┘ │
│                                                        │
│   ┌─────────────────────┐   ┌──────────────────────┐ │
│   │ Constraint Systems  │   │   Feedback Loops      │ │
│   │  (架构约束/Linter)  │   │   (测试/验证/CI)      │ │
│   └─────────────────────┘   └──────────────────────┘ │
│                                                        │
│   ┌─────────────────────┐   ┌──────────────────────┐ │
│   │   Orchestration     │   │   Self-Healing        │ │
│   │  (多 Agent 协调)    │   │   (垃圾回收/技术债)   │ │
│   └─────────────────────┘   └──────────────────────┘ │
└──────────────────────────────────────────────────────┘

Prompt Engineering 关注的是单次交互层面的优化——如何措辞一个指令才能让模型按预期输出。Harness Engineering 关注的是系统层面的工程——如何搭建整个运行环境,使得单次 prompt 质量的微小波动不会导致系统级失败。

一个比喻:Prompt Engineering 是”如何问一个好问题”;Harness Engineering 是”如何建造一座图书馆,使得里面的每个人都能问到好问题并得到好答案”。

关键区别

维度Prompt EngineeringHarness Engineering
作用域单次交互整个系统生命周期
主要产物文本(prompt 字符串)系统(代码、配置、工具)
改进方式手工微调措辞工程化编码规则
失效模式单次输出质量低系统级不可靠
可扩展性与人工注意力线性绑定可自动化、可扩展
技能要求语言理解 + 心理模型软件工程 + 系统设计

3.2 Harness Engineering vs Context Engineering

关系:技术手段与工程学科的关系(Context Engineering 是 Harness Engineering 的核心技术手段)

Harness Engineering(工程学科)

         ├── Context Engineering(核心技术手段)
         │         ├── 上下文窗口管理
         │         ├── 信息检索与选择
         │         ├── 渐进式披露
         │         └── 上下文压缩

         ├── Constraint Engineering(约束系统)
         │         ├── 架构约束
         │         └── 自动化验证

         ├── Feedback Engineering(反馈工程)
         │         ├── 左移验证
         │         └── 可观测性

         └── Maintenance Engineering(维护工程)
                   ├── 垃圾回收
                   └── 技术债管理

Context Engineering 是 Harness Engineering 中最基础、研究最深的技术分支——它回答”给 Agent 提供什么信息”的问题。但 Harness Engineering 的边界远不止于此,它还包括约束系统(防止 Agent 产生不好的输出)、反馈回路(让 Agent 自我纠正)以及长期维护机制(防止系统退化)。

一个类比:Context Engineering 之于 Harness Engineering,就像内存管理之于操作系统设计——内存管理极其重要,但操作系统还需要处理进程调度、文件系统、设备驱动等一切其他问题。

3.3 Harness Engineering vs Scaffolding

关系:前者是后者的演化和超集

“Scaffolding”(脚手架)是 Harness Engineering 概念出现之前,技术社区用来描述”围绕 LLM 的支撑代码”的术语。

传统含义(来自建筑业):施工期间搭建的临时支撑结构,工程完成后被移除。在软件工程中,它暗示这些支撑代码是临时的、最终会被移除的。

问题所在:这个隐喻不准确。围绕 AI Agent 的支撑系统不是临时的——它是永久性的基础设施,随着系统的发展不断演进。把它叫做”脚手架”会误导工程师低估其重要性,将其视为可以随时丢弃的临时代码。

新含义(当前使用):在 Harness Engineering 语境中,“scaffolding”有时仍被使用,但其含义已发生偏移,更接近于”agent 运行环境”或”agent 基础设施”,而非”临时支撑”。

关键区别

维度Scaffolding(传统)Harness Engineering
时间属性临时的,最终被移除永久性的,持续演进
重要性认知辅助性的、次要的核心基础设施
工程投入尽量少投入需要大量投入
自动化程度通常是手动脚本需要自动化和可观测性

Philipp Schmid 明确指出了这种认知转变的必要性:把 harness 理解为一次性脚手架,是导致 Agent 系统不可靠的重要原因之一。

3.4 Harness Engineering vs Vibe Coding

关系:对立面(有纪律 vs 无纪律)

“Vibe Coding”是 Andrej Karpathy 在 2025年2月创造的词汇,描述一种放弃对代码的控制感、“顺着感觉”让 AI 自由生成代码的编程方式:

“你完全沉浸其中,甚至忘记代码的存在。你只是看见(and execute)、相信(and accept)。”

Vibe Coding 的特征:

  • 接受 AI 生成的任何内容,即使不完全理解
  • 不建立系统性的约束或验证
  • 以快速原型和实验为目标
  • 适合个人项目、一次性脚本、学习探索

两者的本质对立

维度Vibe CodingHarness Engineering
对 Agent 输出的态度信任接受验证约束
错误处理让 Agent 重试工程化防错
规模适用性个人/小项目团队/大型系统
时间视角短期(快速迭代)长期(可维护性)
代码质量不稳定,高度依赖运气受约束,可预期
可复现性

值得注意的是,这两种范式并非完全互斥。Vibe Coding 在 ideation 阶段、快速原型阶段有其价值。真正的 Harness Engineering 实践者通常是先”vibe”(快速探索)再”harness”(系统工程化)——用无纪律获得速度,用有纪律保证质量。

OpenAI 的团队在文章中的表述也印证了这一点:他们允许 Agent 自由生成代码,但同时通过 linter、架构约束和 doc-gardening 持续回收”AI 残渣”(AI residue),防止系统因 Vibe 而退化。


四、Philipp Schmid 的计算机类比分析

4.1 原始类比

Schmid(HuggingFace 技术总监)提出了一个目前流传最广的 Harness Engineering 类比:

传统计算机            AI Agent 系统
─────────────         ─────────────────
CPU(处理器)    →    Model(大语言模型)
RAM(内存)      →    Context Window(上下文窗口)
OS(操作系统)   →    Harness(执行环境)
App(应用程序)  →    Agent(智能体)

这个类比试图回答一个问题:在 AI Agent 系统中,各个层次的责任边界是什么?

4.2 类比的优势

优势 1:清晰地层次化了责任

这个类比最大的贡献是建立了责任归属框架

  • 模型(CPU):负责实际的推理和生成,是”算力”的来源。模型的好坏决定了系统的上限。
  • 上下文窗口(RAM):是模型的工作空间,有限且宝贵。超出上下文窗口的信息对模型”不存在”——就像超出 RAM 的数据需要换页到磁盘一样,性能会大幅下降。OpenAI 的实践印证了这一点:“从智能体的角度来看,它在运行时无法在情境中访问的任何内容都是不存在的。”
  • Harness(OS):负责资源调度、进程管理、安全隔离、设备驱动——即一切”让应用程序能够运行”的基础设施工作。Harness 的职责与 OS 高度对应:上下文管理(内存管理)、任务调度(进程调度)、工具集成(设备驱动)、安全约束(内核保护)。
  • Agent(App):是最终交付给用户价值的实体。App 的质量取决于 CPU 能力(模型)+ RAM 容量(上下文)+ OS 稳定性(Harness),三者缺一不可。

优势 2:解释了为什么 Harness 不能被忽视

这个类比有力地回答了”为什么我们需要 Harness Engineering 而不是直接调用更强的模型”:

没有操作系统,CPU 再强大也没有用。一台裸金属机器上即使有最快的处理器,如果没有操作系统来管理进程、调度资源、提供文件系统,任何有意义的应用程序都无法运行。同理,即使有了 GPT-5,如果没有精心设计的 harness,Agent 也会在长期、复杂的任务中失控。

优势 3:揭示了 Harness 的演进驱动力

历史上,操作系统随着硬件能力的提升而变得更加复杂——不是更简单。更快的 CPU 催生了多任务操作系统;更大的 RAM 催生了虚拟内存;更多的设备催生了更复杂的驱动框架。

这一历史规律暗示:更强的模型不会让 Harness Engineering 消失,而是会催生更复杂的 Harness——因为更强的能力意味着更复杂的任务,更复杂的任务需要更精密的编排和约束。

4.3 类比的局限

局限 1:OS 是确定性系统,Harness 不是

操作系统的每一个系统调用都有精确规定的行为——给定相同的输入,永远产生相同的输出。但 Harness 面对的模型是概率性的:相同的 prompt,每次运行可能产生不同的输出。

这意味着 Harness Engineering 需要在确定性系统(测试、CI、linter)和概率性系统(LLM 推理)之间建立接口,这是传统 OS 设计完全不需要考虑的问题。Martin Fowler 对此明确指出:“确定性与 LLM 的混合”是 Harness 设计的核心挑战之一。

局限 2:OS 与 App 边界清晰,Harness 与 Agent 边界模糊

在传统计算机中,OS 和 App 的边界极其清晰——系统调用是唯一合法的跨层通信方式。但在 AI Agent 系统中,harness 和 agent 之间的边界是模糊的:agent 会阅读 harness 提供的文档(AGENTS.md)并据此修改自己的行为;harness 的 linter 错误信息也会被注入 agent 的上下文,影响其输出。这种双向影响在 OS/App 模型中是不存在的。

局限 3:RAM 的类比过于机械

上下文窗口和 RAM 确实都是有限的工作空间,但它们的”溢出”机制完全不同。RAM 溢出时,OS 有精确的换页机制;上下文窗口”溢出”时(信息超出窗口大小),模型会出现”遗忘”——但遗忘哪些信息是概率性的,不是确定性的。更重要的是,上下文窗口中信息的位置(开头 vs 中间 vs 结尾)会影响模型对其的”注意力”,这在 RAM 中是不存在的概念。

局限 4:OS 不需要”维护品味”

操作系统不需要向应用程序传递”代码风格偏好”或”设计理念”——这些是人类的关注点,OS 完全不关心。但 Harness 需要:OpenAI 明确描述了如何将人类的”品味”(taste invariants)编码进 harness,使 Agent 生成的代码符合团队的风格偏好。这在 OS 类比中没有对应物。

4.4 类比的修正版本

基于以上分析,可以提出一个更精确的类比修正:

更准确的类比:
模型    ≈ CPU(但输出具有概率性,不是确定性)
上下文  ≈ RAM(但存在位置效应,不是均匀访问)
Harness ≈ OS + 编译器 + 团队规范文档的组合体
Agent   ≈ App(但会主动读取和影响运行环境)

Harness 更接近 OS、编译器和团队规范文档的混合体——它既负责运行时资源管理(OS 的职责),又负责在”构建时”将规范转化为可执行约束(编译器的职责),还负责传递人类的设计理念和品味(团队文档的职责)。


五、为什么是现在?

Harness Engineering 在 2026 年前后成为显学,是多个独立趋势同时收敛的结果。

5.1 模型能力的阈值跨越

关键跃迁:从”完成句子”到”完成任务”

早期的 LLM 主要擅长补全文本——给定开头,预测后续。这种能力对于 Harness Engineering 来说不够用:你无法把”构建一个用户认证系统”这样的任务交给一个只会补全句子的模型。

GPT-4(2023年3月)是第一个让很多开发者开始认真考虑”能不能让它独立完成任务”的模型。但真正的能力跃迁发生在 GPT-5(2025年)和 Claude Opus 4.6(即本文的写作时间点,2026年)的出现。

具体能力指标

能力维度GPT-3.5 时代GPT-4 时代GPT-5/Opus 4.6 时代
单步任务质量一般良好优秀
多步规划一般良好
工具调用可靠性
长上下文处理差(4K)中(128K)优秀(1M+)
代码生成质量中等良好生产级
自我纠错能力基本没有有限显著

当模型能力跨越”可以可靠地完成生产级编码任务”的阈值后,Harness Engineering 从”理论上有意义”变成了”实践中必要”——因为现在你终于可以真的把任务交给 Agent,而它真的可以大部分时候完成,这时如何保证它”总是”完成且”总是”正确就成了关键问题。

数量级的变化

OpenAI 团队的案例是最直接的证据:3 名工程师,5 个月,100 万行代码,1500 个 PR,每人每天 3.5 个 PR。在 GPT-3.5 时代,这是不可能的——模型根本无法可靠地完成 PR 级别的任务。模型能力的跃升使这成为可能,而 Harness Engineering 使这成为可持续的

5.2 Agent 工具链的成熟

MCP 协议的标准化意义

Model Context Protocol(MCP,Anthropic,2024年11月)是 Agent 工具链成熟的重要里程碑。在 MCP 之前,每个 Agent 框架都有自己的工具调用格式,开发者需要为每个平台重写工具集成代码。MCP 的出现相当于建立了”设备驱动接口的标准”——工具开发者只需实现一次 MCP 接口,就可以被所有兼容的 Agent 使用。

这种标准化对 Harness Engineering 的意义在于:Harness 可以假设工具调用层是稳定可靠的,将工程精力集中在更高层次的协调和约束问题上。

代码执行沙箱的成熟

Stripe 的实践中,“隔离 devbox 10 秒启动”是其 Harness 架构的关键组件:每个 Agent 任务在独立的沙箱中运行,完成后立即销毁,包括所有日志和指标。这种能力在 2023 年之前几乎是不可能达到的——容器技术存在,但针对 Agent 使用场景的优化(快速启动、状态隔离、指标自动清理)需要专门的工程投入。

E2B、Daytona、Modal 等专注于 Agent 沙箱的基础设施产品的出现,使得”安全隔离执行”从奢侈品变成了标准配置。

可观测性工具的适配

OpenAI 案例中,他们为 Codex 配备了完整的可观测性堆栈:LogQL 查询日志、PromQL 查询指标、TraceQL 查询链路追踪。这些工具(Victoria Logs、Prometheus、Grafana Tempo)原本是面向人类工程师设计的,将它们适配为 Agent 可以直接查询的接口,需要额外的工程工作。

这种适配工作的积累,使得”给 Agent 完整的可观测性视图”从”黑科技”变成了”最佳实践”——这正是 Harness Engineering 工具链成熟的标志。

5.3 企业规模采纳的信号

工业案例的规模和可信度

以下三个案例共同构成了 Harness Engineering 作为可行工业实践的最强证明:

OpenAI Codex 项目(2026年2月披露):

  • 规模:100 万行代码,1500 PR,5 个月
  • 人力:3 名工程师(后扩展至 7 名)
  • 效率:每人每天 3.5 PR(传统开发约 0.5-1 PR/人/天)
  • 质量:有日常活跃的内部用户和 Alpha 测试者
  • 验证:在整个过程中没有一行人工编写的代码

Stripe(2026年3月披露):

  • 规模:每周超过 1000 个 AI 生成 PR 被合并
  • 技术:条件规则系统、本地 linting < 5 秒
  • 意义:Stripe 是以工程严谨性著称的公司,其采纳代表了行业信任门槛的跨越

Cursor(持续运营中):

  • 规模:估值 $500 亿(截至调研时),该估值被业界普遍理解为对 Harness 价值的市场背书
  • 架构:第四代系统采用递归规划者 + 专职工作者,每周协调数千个 Agent 完成约 1000 次提交
  • 影响:数百万开发者日常使用,成为 Agentic Coding 的事实标准工具之一

从实验到生产的信号转变

这三个案例的共同特征是:它们都是生产环境中的真实用例,不是实验室 benchmark,不是 demo,而是有真实用户、真实 bug、真实交付压力的工业系统。这种信号级别的转变——从”论文中的可能性”到”工厂里的流水线”——是 Harness Engineering 作为工程学科被认真对待的关键原因。

5.4 Benchmark 可信度危机的推动

这是一个经常被忽视的推动力。METR(Model Evaluation & Threat Research)的研究揭示:

约 50% 通过 SWE-bench 自动评分的 PR,实际上不会被真实维护者合并。自动评分与维护者决策存在约 24 个百分点的系统性偏差。

这一发现具有深远的工程含义:如果你信任自动评分 benchmark,你会高估 Agent 的实际能力;如果你把 Agent 部署到生产环境,这种高估会在真实用户面前暴露

这迫使工程师们重新思考”如何验证 Agent 的工作质量”。答案只有一个:构建能够捕捉真实质量的 Harness,包括真实的端到端测试、人类审核机制、以及超越 benchmark 指标的真实验证层。

换句话说,benchmark 的不可信,反而加速了 Harness Engineering 的兴起——因为工程师们发现自己不能依赖现有的评估工具,必须自己建立更严格的验证体系。


六、概念定位的最终总结

Harness Engineering 在 AI 工程学科体系中的位置,可以用以下框架来概括:

AI 工程学科全图

│ 更靠近"模型"                        更靠近"系统" │
│                                                   │
│ Prompt     Context     Harness      MLOps/        │
│ Engin.     Engin.      Engin.       DataEngin.    │
│                                                   │
│ 优化单次   管理输入    设计整个      训练、部署、  │
│ 对话质量   上下文      执行环境      数据管道      │
│                                                   │
│ 技能:     技能:      技能:        技能:        │
│ 语言感知   信息架构    系统设计      ML工程        │
│ 心理模型   RAG设计     约束系统      数据工程      │
│            记忆管理    反馈工程      分布式系统    │

Harness Engineering 处于这个谱系的中间偏右——它比 Prompt Engineering 和 Context Engineering 更靠近系统工程,但又专注于 Agent 执行环境这一特定问题域,有别于更宏观的 MLOps 和数据工程。

它的出现,标志着 AI 应用工程从”如何与模型对话”到”如何为模型建造一座城市”的范式跃迁——在这座城市里,道路(约束系统)、建筑规范(架构 linter)、垃圾处理(doc-gardening)和交通信号灯(反馈回路)的设计,比任何一栋单独的建筑都更重要。

1 Harness Engineering:架构与核心组件

Harness Engineering:架构与核心组件

📍 位置:Harness Engineering / 技术架构 📌 核心发现:一个完整的 harness 由五层组成:上下文管理层、约束执行层、反馈回路层、编排调度层、自愈维护层 📥 输入:OpenAI(Ryan Lopopolo)、Anthropic、Stripe、Cursor、Philipp Schmid、arXiv OPENDEV 📤 流向:→ findings.md [架构模式部分]、→ 4-开发者采纳指南.md


一、五层架构模型总览

在深入每一层的细节之前,先建立整体的架构视图。这个五层模型是从 OpenAI、Stripe、Cursor、Anthropic 四个最具代表性的工业案例中提炼的综合模型——没有任何一家公司完整地发表了这五层,但每家公司的实践都覆盖了其中的核心部分。

┌─────────────────────────────────────────────────────────────────────┐
│                         Layer 5: 自愈维护层                          │
│         doc-gardening agent / 技术债追踪 / 质量评分系统              │
├─────────────────────────────────────────────────────────────────────┤
│                         Layer 4: 编排调度层                          │
│         递归规划者 + 专职工作者 / 隔离沙箱 / 任务路由               │
├─────────────────────────────────────────────────────────────────────┤
│                         Layer 3: 反馈回路层                          │
│         左移验证 / Chrome DevTools MCP / 可观测性堆栈               │
├─────────────────────────────────────────────────────────────────────┤
│                         Layer 2: 约束执行层                          │
│         分层领域架构 / 自定义 Linter / 条件规则系统                 │
├─────────────────────────────────────────────────────────────────────┤
│                         Layer 1: 上下文管理层                        │
│         AGENTS.md 目录 / 渐进式披露 / 代码仓库作为记录系统           │
├─────────────────────────────────────────────────────────────────────┤
│                            [AI 模型]                                 │
│                    GPT-5 / Claude / Codex                            │
└─────────────────────────────────────────────────────────────────────┘

设计哲学:这五层不是孤立的模块,而是形成一个强化回路——上下文层为 Agent 提供知识,约束层将知识转化为可执行规则,反馈层检测规则执行的效果,编排层协调多个 Agent 并行工作,自愈层持续修复整个系统的退化。每层的输出都成为其他层的输入。

为什么需要五层而不是三层或两层

最简单的 harness 只有两个组件:一个 prompt 文件(上下文)+ 一个测试脚本(反馈)。这在小规模、短生命周期的项目中足够了。但随着代码库增大、Agent 数量增多、时间拉长,会依次出现新的失控点:

  • 代码库增大 → 上下文管理变复杂,需要 Layer 1 的精细设计
  • 多 Agent 并行 → 输出质量参差不齐,需要 Layer 2 的约束
  • 任务周期变长 → 反馈延迟导致迭代效率低,需要 Layer 3 的左移设计
  • Agent 数量增多 → 协调成本指数级上升,需要 Layer 4 的编排
  • 时间拉长 → 代码库自然退化,需要 Layer 5 的自愈机制

二、Layer 1:上下文管理层(Context Layer)

2.1 核心挑战:上下文是稀缺资源

上下文窗口是 AI Agent 系统中最稀缺、最容易被低估的资源。OpenAI 团队在 100 万行代码的实践中发现了一个反直觉的规律:

“情境是一种稀缺资源。一个巨大的指令文件会挤掉任务、代码和相关文档——因此智能体要么会错过关键约束条件,要么开始针对错误的约束条件进行优化。“(来源:OpenAI,Ryan Lopopolo)

这揭示了一个”多即是少”的悖论:向 Agent 提供越多信息,Agent 的注意力越分散,真正重要的约束反而被淹没。从计算机科学的角度看,这类似于缓存污染(cache pollution)——把低优先级数据推入缓存,导致高优先级数据被驱逐。

具体的失败模式(来自 OpenAI 实践):

当团队最初尝试”一个大型 AGENTS.md”方法时,观察到了三种系统性失败:

  1. 语义性遗忘:Agent 在模式匹配,而不是有意识地导航。它识别出类似的模式就复现,不会主动查阅规则。
  2. 快速腐烂:单一大文件无法追踪新鲜度,陈旧规则和有效规则混杂,Agent 无法区分。
  3. 可验证性差:单一 blob 不适合进行覆盖率检查、所有权追踪和交叉链接验证。

2.2 AGENTS.md:目录而非百科全书

错误模式(O(n²) 复杂度的文档):

# AGENTS.md(反例)

## 代码风格
- 所有变量必须使用 camelCase
- 函数长度不超过 50 行
- 不得使用魔法数字
- 日志必须使用结构化格式
- ... (500 行各类规则)

## 架构约束
- Services 不得直接访问数据库
- 所有外部 API 调用必须经过 Gateway
- ... (另外 300 行)

## 测试规范
- 单元测试覆盖率不低于 80%
- ... (另外 200 行)

问题:这个文件什么都说了,等于什么都没说。Agent 无法判断哪条规则在当前任务中最重要。

正确模式(O(1) 入口 + O(n) 索引):

# AGENTS.md(来源:OpenAI 实践,约 100 行)

你正在处理一个 [产品名称] 代码库。

## 快速导航
- 架构概述 → ARCHITECTURE.md
- 当前活跃计划 → docs/exec-plans/active/
- 产品规格 → docs/product-specs/index.md
- 设计规范 → docs/references/design-system-reference-llms.txt
- 已知技术债务 → docs/exec-plans/tech-debt-tracker.md

## 核心原则(不可违反)
1. 在边界处解析数据(parse don't validate)
2. 分层架构:Types → Config → Repo → Service → Runtime → UI
3. 所有日志必须结构化

## 工作流程
1. 理解任务前,先阅读相关的产品规格文档
2. 修改架构时,先查阅 ARCHITECTURE.md
3. 完成后,更新 exec-plans 中的进度日志

## 我看不到的内容
- Slack 讨论 → 已提炼为 docs/design-docs/
- 历史决策 → docs/design-docs/core-beliefs.md

为什么这样设计有效

这个模式实现了”渐进式披露”(Progressive Disclosure)原则,这一原则原本是 UX 设计中的概念——只在用户需要时才展示信息,而不是一次性倾倒所有信息。

对 Agent 来说,“渐进式披露”意味着:

  1. AGENTS.md 提供入口点,不提供所有细节
  2. Agent 根据任务类型,主动导航到相关文档
  3. 每次只有与当前任务相关的上下文进入工作窗口

这种设计的效率优势可以量化:假设一个任务需要 20 条相关规则(来自 1000 条总规则),“百科全书”方案会把全部 1000 条都塞进上下文;“目录”方案只会加载相关的 20 条。前者的信噪比是 2%,后者是 100%。

2.3 代码仓库作为记录系统

关键洞察(来源:OpenAI):

“从智能体的角度来看,它在运行时无法在情境中访问的任何内容都是不存在的。存储在 Google Docs、聊天记录或人们头脑中的知识都无法被系统访问。代码仓库本地的、已版本化的工件就是它所能看到的全部。”

这句话建立了一个重要的设计约束:所有 Agent 需要知道的信息,必须以 Markdown 文件的形式存在于代码仓库中

这是 Harness Engineering 中一个看似简单却极其深刻的原则,其影响范围远超技术层面:

组织影响:这意味着所有重要的架构决策、设计理念、团队规范,都必须被文档化并提交到代码仓库。不能口耳相传,不能存在 Confluence,不能停留在 Slack 消息里。这实际上倒逼团队建立了更好的知识管理实践。

版本控制的好处:文档和代码一起版本控制,意味着可以追溯”3 个月前 Agent 在这里做决策时,它能看到什么信息”——这对调试 Agent 行为极其有价值。

OpenAI 的知识仓库结构(实际案例):

docs/
├── design-docs/
│   ├── index.md              # 所有设计文档的索引,含验证状态
│   ├── core-beliefs.md       # 智能体优先的操作原则
│   └── ...
├── exec-plans/
│   ├── active/               # 当前活跃的执行计划(含进度日志)
│   ├── completed/            # 已完成的执行计划(历史记录)
│   └── tech-debt-tracker.md  # 已知技术债务
├── generated/
│   └── db-schema.md          # 自动生成的数据库 schema 文档
├── product-specs/
│   ├── index.md
│   ├── new-user-onboarding.md
│   └── ...
└── references/
    ├── design-system-reference-llms.txt  # 设计系统参考(专为 LLM 优化)
    ├── nixpacks-llms.txt
    └── uv-llms.txt

AGENTS.md         # 顶层目录(约 100 行)
ARCHITECTURE.md   # 架构顶层地图
DESIGN.md         # 设计系统顶层
FRONTEND.md       # 前端规范
PLANS.md          # 计划索引
PRODUCT_SENSE.md  # 产品感知文档
QUALITY_SCORE.md  # 质量评分追踪
RELIABILITY.md    # 可靠性要求
SECURITY.md       # 安全约束

几个值得注意的细节:

  • references/ 下的文件命名为 *-llms.txt,明确标注这些是为 LLM 优化的参考文档(不是给人读的普通文档)
  • exec-plans/ 同时包含活跃计划和已完成计划——已完成计划不删除,作为历史决策记录保留
  • QUALITY_SCORE.md 是一个质量追踪文件,记录每个产品领域和架构层的文档质量评分,随时间追踪差距

2.4 自适应上下文压缩

来源:arXiv OPENDEV(2024-2025 学术研究)

当上下文窗口接近限制时,朴素的处理方法是”截断”——扔掉最旧的内容。但这会导致 Agent 失去重要的早期上下文(例如,任务的最初定义、关键的架构决策)。

更好的方案是自适应上下文压缩(Adaptive Context Compression):

原始上下文(1M tokens)

   内容重要性评分
   ┌──────────────────────────────────┐
   │ 任务定义           → 100%保留     │
   │ 最近的工具调用结果 → 100%保留     │
   │ 中间推理步骤       → 压缩为摘要   │
   │ 已完成的子任务详情 → 只保留结论   │
   │ 背景上下文         → 关键词索引   │
   └──────────────────────────────────┘

   压缩后上下文(200K tokens)

核心思想:不同类型的信息有不同的”衰减速率”。任务定义在整个执行过程中始终重要(零衰减),而中间推理步骤一旦完成就可以压缩为摘要(高衰减)。

OPENDEV 的双代理方案:该研究提出了一个具体的架构:用一个专职的”摘要 Agent”监控主 Agent 的上下文,在接近窗口限制时自动生成摘要并替换细节。这使得理论上无限长的任务成为可能,只是随着时间推移,早期信息被逐步压缩为摘要。

2.5 上下文重置 vs 上下文压缩

来源:Anthropic

Anthropic 提出了一个重要的设计抉择:当上下文累积了大量”污染”信息(错误的尝试、被推翻的方向、过时的中间状态)时,是否应该重置上下文?

上下文压缩的适用场景:任务是连续的,中间状态有价值,压缩损失是可接受的

  • 例:长时间运行的代码重构任务,每次迭代都在前一次基础上改进

上下文重置的适用场景:上下文已经被大量错误信息”污染”,Agent 陷入了错误的局部最优

  • 例:Agent 尝试了多种错误方案后仍未成功,重新开始往往比继续更高效

Anthropic 的建议:将重置设计为一等公民,而不是失败的最后手段。预先定义”重置触发条件”(例如,连续 3 次工具调用失败,或任务执行超过预设时间上限),将其纳入 Harness 的标准流程。

OpenAI 的实践印证:OpenAI 团队的 Codex 任务”在人类睡眠时间持续工作超过六个小时”——这意味着单次任务的上下文可以非常长。但他们同时为每个任务提供独立的 devbox(参见 Layer 4),使得任务结束后的上下文完全销毁,下次任务从干净状态开始,实际上是在”任务级别”做了上下文重置。


三、Layer 2:约束执行层(Constraint Layer)

3.1 设计哲学:强制执行不变量,而非微观管理

OpenAI 对约束执行层给出了最精炼的设计哲学:

“通过强制执行不变量,而非对实施过程进行微观管理,我们令智能体能够快速交付,而且不会削弱基础。”

这句话区分了两种约束策略:

微观管理式约束(反模式):

# 在 AGENTS.md 中
- 所有函数必须使用这个命名模式:[动词][名词],例如 getUserById
- 所有错误必须这样处理:try { ... } catch (e) { logger.error(e); throw e; }
- API 响应必须包含这些字段:{ data, error, metadata }
- 分页必须使用 cursor-based,不允许 offset-based

问题:这类约束无法被机械验证,Agent 只能”尽力遵守”,而”尽力”意味着偶尔遗漏。更深的问题是,这些约束会随着代码库演进而过时,而 Agent 无法判断哪条规则还有效。

不变量式约束(正确模式):

// 在代码仓库的 linter 配置中(由 Codex 生成的自定义 ESLint 规则)

// 规则 1:在边界处解析数据(parse don't validate)
// 触发条件:在 service 层直接使用 any 类型接收外部数据
// 错误信息(专为 Agent 优化):
// "Error: Raw external data used without parsing at boundary.
//  Fix: Use Zod schema to parse at the API boundary.
//  See: docs/references/parse-dont-validate.md"

// 规则 2:分层依赖(层间依赖方向不可逆)
// Config 层不得 import Service 层
// 触发条件:config/* 中有 import from service/*
// 错误信息:
// "Error: Layer violation: Config cannot depend on Service.
//  Allowed dependency direction: Types→Config→Repo→Service→Runtime→UI
//  See: ARCHITECTURE.md#layer-dependencies"

关键差异

  • 不变量约束是机械可验证的:linter 在每次 commit 时运行,100% 覆盖
  • 错误信息面向 Agent设计:不只是”发生了什么错误”,还包括”如何修复”和”为什么有这条规则”
  • 约束编码在代码中,不在文档中:不会过时,因为代码和规则一起演进

3.2 分层领域架构

来源:OpenAI

这是 OpenAI 实践中最具代表性的约束实例,也是理解 Harness 约束设计的最佳案例。

架构图

┌─────────────────────────────────────────────────────┐
│                    Business Domain A                 │
│                                                       │
│  Types → Config → Repo → Service → Runtime → UI     │
│                                                       │
│  ↑ 依赖方向只能向右,不能向左                         │
│                                                       │
│  横切关注点通过唯一入口进入:                          │
│  Utils ──────────────────────┐                       │
│                               ↓                       │
│                           Providers                   │
│                      ┌────────┤                       │
│                      │Authentication                  │
│                      │Connectors                      │
│                      │Telemetry                       │
│                      │Feature Flags                   │
│                      └────────┘                       │
└─────────────────────────────────────────────────────┘

每层的职责

职责示例内容
Types数据类型定义interface User { id: string; email: string; }
Config配置和常量数据库连接参数、功能开关
Repo数据访问(数据库/外部 API)getUserById(id: string): Promise<User>
Service业务逻辑createUser(data: CreateUserInput): Promise<User>
Runtime运行时绑定(HTTP 处理器等)Express route handlers
UI用户界面React 组件

为什么这个设计对 Agent 特别重要(而不只是对人类工程师):

对人类工程师来说,分层架构是一个”好习惯”,人类可以在需要时主动检查是否违反了层间规则。但 Agent 没有这种元认知——它在解决当前任务时不会主动检查是否违反了架构约束,除非约束被编码为自动执行的规则。

“这种架构通常要等到你拥有数百名工程师时才会推迟。对于编码智能体来说,这是一个早期的先决条件:有了约束,速度才不会下降,架构才不会漂移。“(来源:OpenAI)

这句话揭示了一个关键洞察:对人类团队来说是”中期需要”的架构纪律,对 Agent 团队来说是”起步就必须”的基础设施。这是因为 Agent 没有”我好像违反了一个隐性规范,让我检查一下”的直觉——它会在每次任务中独立地做出架构决策,在没有约束的情况下,这些决策会随机漂移。

3.3 条件规则系统

来源:Stripe

Stripe 实践中的一个重要创新是按子目录条件应用规则——不同代码区域有不同的约束集,通过目录结构自动路由。

# .agent-rules.yaml(Stripe 模式,非官方公开规范,基于描述重建)

rules:
  # 全局规则(对所有路径生效)
  global:
    - id: structured-logging
      description: "所有日志调用必须使用结构化格式"
      enforcement: hard  # hard = 违反则 CI 失败;soft = 仅警告

    - id: no-direct-db-access
      description: "Service 层不得直接访问数据库,必须通过 Repo 层"
      enforcement: hard

  # 条件规则(仅对特定路径生效)
  conditional:
    - path: "src/payments/**"
      rules:
        - id: payment-idempotency
          description: "所有支付操作必须有幂等性键"
          enforcement: hard

        - id: pci-compliant-logging
          description: "支付相关日志不得包含原始卡号"
          enforcement: hard

        - id: max-retry-limit
          description: "重试次数不超过 3 次,防止 Stripe API 触发限速"
          enforcement: hard

    - path: "src/webhooks/**"
      rules:
        - id: webhook-signature-validation
          description: "所有入站 webhook 必须验证签名"
          enforcement: hard

        - id: idempotent-handler
          description: "Webhook 处理器必须是幂等的"
          enforcement: soft  # 软约束:提示但不阻塞

    - path: "src/internal/**"
      rules:
        - id: no-external-calls
          description: "内部工具不得直接调用外部 API"
          enforcement: soft

这种设计的深层逻辑

支付系统、用户认证系统、内部工具,它们有不同的安全要求和合规约束。如果用一套全局规则覆盖所有代码,要么过于严格(阻碍非关键代码的开发速度)要么过于宽松(关键代码的安全约束不足)。

条件规则系统允许”最小权限原则”(Principle of Least Constraint)——每个代码区域只应用它实际需要的约束,不多也不少。

对 Agent 来说,这种设计还有一个额外好处:Agent 在处理 src/payments/ 下的任务时,只需要关注支付相关的约束,不需要在全局的 1000 条规则中搜索”哪些规则与支付相关”——规则系统本身承担了这种上下文过滤。

3.4 自定义 Linter 的设计要点

Linter 在 Harness Engineering 中扮演的角色远超”代码风格检查”——它是约束执行层的核心工具。

面向 Agent 设计的错误信息(与面向人类的错误信息的关键区别):

# 面向人类的错误信息(传统 ESLint):
Error: 'import/no-cycle' - Dependency cycle detected.

# 面向 Agent 的错误信息(Harness Engineering 设计):
Error: Layer violation detected in 'src/config/database.ts'
  You're importing from 'src/service/auth.ts' in the Config layer.

  Allowed dependency direction: Types → Config → Repo → Service → Runtime → UI
  Config layer CANNOT depend on Service layer.

  How to fix:
  1. Move the dependency to a higher layer (Service or Runtime)
  2. OR extract the shared logic to Types layer
  3. OR use Providers interface if this is a cross-cutting concern

  See: ARCHITECTURE.md#layer-dependencies for the full rules.
  Context: This rule exists because Config is loaded at app startup,
  and Service depends on Config. A cycle here would cause circular
  initialization errors at runtime.

关键差异:

  • 上下文化:告诉 Agent 为什么这条规则存在(防止循环初始化),而不只是说”你违反了规则”
  • 操作化:提供 2-3 种具体的修复方案,Agent 可以直接选择执行
  • 导航化:提供相关文档的链接(ARCHITECTURE.md#layer-dependencies),Agent 可以获取更多上下文

这种设计将 linter 从”报告问题”转变为”指导修复”——对 Agent 来说,这意味着更少的反复尝试,更高的首次修复成功率。

3.5 Parse Don’t Validate 原则

来源:Lexi Lambda 博客,被 OpenAI 明确采用

这一原则是 Harness 约束层的重要设计思想,值得专门分析。

Validate(验证)模式(不推荐):

function processUser(data: any) {
  if (typeof data.id !== 'string') throw new Error('id must be string');
  if (typeof data.email !== 'string') throw new Error('email must be string');
  if (!isValidEmail(data.email)) throw new Error('email is invalid');

  // 此处 data 仍然是 any 类型,类型系统无法保证后续代码的安全性
  return doSomethingWith(data.id, data.email);
}

Parse(解析)模式(推荐):

import { z } from 'zod';

const UserSchema = z.object({
  id: z.string(),
  email: z.string().email(),
});

function processUser(rawData: unknown): Result<User, ParseError> {
  const parsed = UserSchema.safeParse(rawData);
  if (!parsed.success) return { ok: false, error: parsed.error };

  // parsed.data 的类型是 User,类型系统完全保证后续的安全性
  return { ok: true, data: doSomethingWith(parsed.data.id, parsed.data.email) };
}

为什么这对 Agent 生成的代码特别重要

Agent 在生成代码时,往往倾向于”乐观地”假设数据的结构——它会根据上下文推断”这里应该是字符串”,然后直接使用,不做防御性检查。这在大多数情况下可以工作,但会在边界条件下产生难以调试的运行时错误。

Parse Don’t Validate 原则通过在边界处强制解析,将这类错误从运行时提前到编译时或 API 边界处,使得 Agent 生成的代码即使在乐观假设方面存在问题,也会在边界处被安全地捕获,而不是在系统深处爆炸。

OpenAI 的实践是:要求 Codex 在边界处解析数据形状,但不规定具体实现方式(“模型似乎偏好 Zod,但我们没有指定特定库”)。这正是”强制执行不变量、而非微观管理”原则的体现——约束”做什么”(在边界解析),不约束”怎么做”(用哪个库)。


四、Layer 3:反馈回路层(Feedback Layer)

4.1 核心原则:尽可能将反馈左移

来源:Stripe,在 OpenAI 实践中也有对应

“反馈左移”(Shift Left)是 DevOps 领域的经典原则,在 Harness Engineering 中被极端化执行。

传统反馈链条(从右到左,延迟递增):

代码生成 → 本地测试 → CI → 代码审查 → 集成测试 → 部署到测试环境 → 人工QA → 上线
  ↑             ↑          ↑       ↑           ↑             ↑            ↑       ↑
 立即         分钟        分钟    小时          小时          天           天     周

左移后的反馈链条(Stripe 实践):

代码生成 → 本地 Linting → 本地测试 → CI(最多两轮)→ 智能体审查 → 合并
  ↑              ↑              ↑           ↑               ↑          ↑
 立即          <5秒           分钟         分钟             分钟       分钟

Stripe 的关键约束:最多两轮 CI。如果一个 PR 在两轮 CI 后仍未通过,这被视为需要人工介入的信号,而不是让 Agent 无限重试。这个约束防止了 Agent 陷入”针对 CI 指标优化而非解决真实问题”的陷阱。

为什么反馈速度对 Agent 特别重要

对人类工程师来说,等待 30 分钟的 CI 是恼人的,但可以利用这段时间做其他事。对 Agent 来说,等待期间的上下文可能已经老化,模型可能已经”忘记”了之前的某些决策细节。更重要的是,在高吞吐量的场景(Stripe 每周 1000+ PR),如果每个 PR 的反馈周期很长,整个系统的吞吐量会被严重限制。

左移的具体实现技术

# 在 Agent 工作流中,本地 pre-check 脚本(<5秒目标)
#!/bin/bash

echo "Running local harness checks..."

# 1. 类型检查(最快,约 1-2 秒)
npx tsc --noEmit --incremental

# 2. 层间依赖检查(自定义 linter,约 0.5 秒)
npx eslint src --rule 'layer-dependencies: error' --cache

# 3. 关键路径单元测试(约 2 秒)
npx jest --testPathPattern='src/(types|repo)' --bail

echo "Local checks passed in ${SECONDS}s"

目标:在代码提交前,本地完成 80% 的关键检查,CI 仅作为最后防线。

4.2 Chrome DevTools MCP:UI 反馈层

来源:OpenAI

这是 OpenAI 实践中最有创意的 Harness 组件之一:将 Chrome DevTools 接入 Agent 运行时,使 Codex 可以像人类工程师一样通过浏览器验证 UI。

系统架构

Codex Agent

     │ 通过 MCP(Model Context Protocol)

Chrome DevTools MCP Server

     ├── take_snapshot()          # DOM 快照
     ├── take_screenshot()        # 视觉截图
     ├── navigate_page(url)       # 页面导航
     ├── evaluate_script(js)      # 执行 JS
     ├── list_network_requests()  # 网络请求
     └── get_console_messages()   # 控制台日志


运行在 git worktree 上的应用实例
(每个 Codex 任务有独立的应用实例)

具体工作流程(来自 OpenAI 博文描述):

1. Codex 接收任务:"修复用户头像上传后页面不刷新的 bug"

2. 通过 Chrome DevTools MCP:
   a. 导航到头像上传页面
   b. 触发上传操作
   c. 在触发前后分别获取 DOM 快照
   d. 观察 console 错误和网络请求

3. 根据观察结果定位问题(例如:上传成功但 state 未更新)

4. 实施修复

5. 重新运行应用,再次通过 Chrome DevTools 验证:
   a. 触发上传
   b. 验证 DOM 是否正确更新
   c. 检查无新增 console 错误

6. 只有验证通过,才打开 PR

这为什么重要

在没有 Chrome DevTools 集成之前,UI 验证是 Agent 的盲区——Agent 可以看代码,可以运行测试,但无法”看到”真实的界面效果。这意味着 UI bug 只能在人工 QA 阶段被发现。

Chrome DevTools MCP 将 UI 验证从”人工 QA”转移到了”Agent 自验证”,完成了反馈回路的最后一块拼图。

4.3 可观测性堆栈:让 Agent 看到运行时状态

来源:OpenAI

OpenAI 为 Codex 配备了完整的可观测性堆栈:

应用实例

    ├── 日志 ──────────────→ Vector(日志路由)──→ Victoria Logs
    ├── 指标 ──────────────→ Vector ──────────→ Victoria Metrics
    └── 链路追踪 ──────────→ Vector ──────────→ Victoria Traces

                                              Codex 可以查询:
                                              ├── LogQL 查日志
                                              ├── PromQL 查指标
                                              └── TraceQL 查链路

隔离性设计:每个 Agent 任务运行在独立的 devbox 上,该 devbox 有自己独立的可观测性实例。任务完成后,devbox 和所有遥测数据一起销毁。

这种设计解决了一个重要问题:Agent 的诊断不能依赖全局状态。如果多个 Agent 共享一个日志系统,Agent A 很难区分哪些日志是自己任务产生的,哪些是 Agent B 同时产生的。独立的可观测性实例消除了这种干扰。

可观测性使能的新型提示范式

有了可观测性,可以给 Agent 更精确的性能约束:

"确保服务启动在 800ms 内完成"
"这四个关键用户旅程中的任何 span 都不得超过两秒"

这些约束在没有可观测性的情况下是无法验证的——Agent 只能猜测性能是否达标。有了 PromQL/TraceQL 查询能力,Agent 可以精确测量并迭代优化。

4.4 GAN 式生成-评估分离

来源:Anthropic

这是 Anthropic 提出的一种反馈架构,借鉴了 GAN(生成对抗网络)的对抗性设计思想:

┌─────────────────┐     提交代码     ┌─────────────────┐
│  Generator      │ ──────────────→ │  Discriminator  │
│  Agent          │                  │  Agent          │
│                 │ ←────────────── │                 │
└─────────────────┘     拒绝/改进建议 └─────────────────┘

   任务提示 + 上下文

Generator Agent:负责生成代码变更,目标是实现功能

Discriminator Agent:独立评审代码变更,从以下角度评估:

  • 是否符合架构约束?
  • 是否有安全问题?
  • 是否引入了回归?
  • 代码质量是否达标?

两个 Agent 使用相同的基础模型,但上下文是分离的——Discriminator 不知道 Generator 的生成过程,只看最终的代码 diff。这种信息隔离防止了”自我评估偏差”(self-evaluation bias)——知道自己如何生成某段代码的 Generator,在评审时会无意识地偏向认为这段代码是正确的。

与 OpenAI 实践的对应

OpenAI 的实践中,人类审查 + 智能体审查是并行的,而且”随着时间推移,我们已将几乎所有的审核工作调整为用智能体对智能体的方式来处理”。这与 GAN 式架构高度一致——最终形成了由专职 Discriminator Agent 负责代码审查的流程。

4.5 Playwright 自动化测试的集成

来源:行业通用实践,OpenAI 案例中有端到端 UI 测试的描述

在 Harness Engineering 语境中,Playwright 的角色不只是”自动化测试工具”,而是反馈回路的最后一道防线

// Agent 生成的 Playwright 测试(面向 Agent 可读的结构)
// 注意:测试描述精确到 "为什么" 而非仅有 "是什么"

import { test, expect } from '@playwright/test';

test.describe('用户头像上传', () => {
  test('上传后应立即在 UI 中反映,无需刷新页面', async ({ page }) => {
    // 背景:此测试验证 ticket #1234 的修复
    // 失败原因追溯:Agent 之前的版本在上传后不更新 state

    await page.goto('/settings/profile');

    const initialAvatarSrc = await page.locator('[data-testid="user-avatar"]').getAttribute('src');

    // 模拟文件上传
    await page.locator('[data-testid="avatar-upload-input"]').setInputFiles('test-fixtures/avatar.jpg');

    // 验证:不刷新页面,头像应在 2 秒内更新
    await expect(page.locator('[data-testid="user-avatar"]')).not.toHaveAttribute('src', initialAvatarSrc, { timeout: 2000 });

    // 验证:没有 console 错误
    const errors = await page.evaluate(() => window.__consoleErrors || []);
    expect(errors).toHaveLength(0);
  });
});

关键设计思路:在 Harness Engineering 中,测试文件本身也是上下文的一部分——测试中的注释(// 失败原因追溯:Agent 之前的版本在上传后不更新 state)会被未来的 Agent 读取,帮助其理解为什么要保留这个测试,而不是在修改相关代码时删除它。


五、Layer 4:编排调度层(Orchestration Layer)

5.1 Cursor 的四代架构演进

来源:Cursor 技术团队(2026年3月)

Cursor 的架构演进是 Orchestration 层设计思想最清晰的展示:

第一代:单 Agent,工具调用

用户 → Agent → [工具: 读文件/写文件/运行测试] → 结果

问题:Agent 需要同时处理”理解任务”和”执行操作”,上下文快速被执行细节淹没

第二代:子任务分解

用户 → Planner Agent → 子任务列表 → [多次工具调用] → 结果

改进:引入了规划层,但规划和执行仍由同一个 Agent 完成

第三代:并行工作者

用户 → Orchestrator → [Worker 1] [Worker 2] [Worker 3] → 结果汇总

改进:引入并行,但 Orchestrator 容易成为瓶颈,且 Worker 间的依赖关系处理复杂

第四代(当前):递归规划者 + 专职工作者

用户

Recursive Planner(递归规划者)
  │ 分解任务
  ├── Plan A: [子计划 A1, A2]
  │    ├── A1 → Specialist Worker(专职工作者:前端变更)
  │    └── A2 → Specialist Worker(专职工作者:测试更新)
  └── Plan B: [子计划 B1]
       └── B1 → Specialist Worker(专职工作者:文档更新)

反馈回路(Workers 完成后回报)

重新规划或完成

关键创新

  1. 递归规划:复杂任务可以递归地分解为子计划,每个子计划又可以进一步分解,直到达到可由单个 Worker 完成的粒度
  2. 专职化 Workers:不同的 Worker 针对不同类型的工作进行优化(前端、后端、测试、文档),而不是使用同质化的通用 Agent
  3. 反脆弱性:任何单个 Worker 失败不会导致整个任务失败,Planner 可以重新规划

Cursor 用这套架构在一周内协调数千个 Agent,完成约 1000 次提交。

5.2 OPENDEV 的规划-执行分离架构

来源:arXiv OPENDEV(2024-2025)

OPENDEV 提出了一个与 Cursor 相似但更学术化的双代理架构:

规划代理(Planning Agent)         执行代理(Execution Agent)
─────────────────────────         ─────────────────────────
读取高层需求                        接收具体操作指令
分解为操作序列                       执行代码变更
生成执行计划                         报告执行结果
处理约束冲突                         不做规划决策

         ← 通过结构化消息通信 →

分离规划与执行的理由

从认知负荷的角度:规划需要宏观视角(“哪个顺序最优?”、“有没有依赖约束?”),执行需要微观精度(“这个函数签名是否正确?”)。同一个 Agent 同时承担两种任务,会导致两种任务都做得不够好。

从上下文管理的角度:执行过程产生大量细节性上下文(工具调用结果、中间状态),这些细节对规划决策几乎没有价值,却会占用大量上下文窗口。分离后,规划代理的上下文保持干净,执行代理的上下文可以更自由地扩展。

与 Cursor 方案的比较:OPENDEV 的方案是”水平分离”(规划 vs 执行),Cursor 的方案是”垂直分层”(递归规划者 + 专职工作者)。实践中,两种方案都有效,区别在于任务的复杂度结构——OPENDEV 方案更适合明确的顺序任务,Cursor 方案更适合有递归分解需求的复杂任务。

5.3 隔离沙箱:Stripe 的 10 秒 devbox

来源:Stripe

Stripe 的实践中,每个 Agent 任务运行在一个独立的隔离 devbox(开发环境容器)中,启动时间约 10 秒。

为什么要隔离

没有隔离的情况:
─────────────────
Agent A 正在修改 auth.ts
Agent B 正在修改 auth.ts(另一个任务)

文件系统冲突、git 状态混乱、测试结果相互干扰
有隔离的情况:
─────────────────
Agent A → devbox-a(独立的代码仓库副本)→ 修改 auth.ts
Agent B → devbox-b(另一个独立副本)→ 修改 auth.ts

两个任务完全独立,最终通过 git merge 合并

技术实现要点

10 秒的启动目标是一个严格的工程约束。传统 VM 启动需要分钟级别,Docker 容器可以做到秒级,但需要仔细优化:

  • 预构建基础镜像(避免在每次启动时安装依赖)
  • 使用 overlay filesystem(写时复制,快速 fork 代码仓库状态)
  • 增量同步(只同步当前任务需要的代码,而不是整个 repo)
  • 内存映射(对大型代码仓库,使用内存映射文件加速访问)

Stripe 的”10 秒”目标意味着:即使每天运行数千个 Agent 任务,总启动开销也控制在可接受范围内。

OpenAI 的对应实践:OpenAI 使用 git worktree 实现轻量级隔离——每个 Codex 任务在一个独立的 worktree 上工作,共享底层的 git 对象存储,但有独立的工作目录和应用实例。这比 Stripe 的 devbox 方案更轻量,适合在同一台机器上并发运行多个任务。

5.4 工作负载特化模型路由

在 Orchestration 层,当系统涉及多个专职 Worker 时,可以引入模型路由(Model Routing)——根据任务类型选择最合适的模型。

# 模型路由示例(概念性代码)
def route_to_model(task: Task) -> ModelConfig:
    if task.type == "code_generation":
        return ModelConfig(
            model="gpt-5-3-codex",  # 专为代码优化
            temperature=0.1,        # 低温度,追求确定性
            context_budget=200_000  # 大上下文
        )
    elif task.type == "documentation":
        return ModelConfig(
            model="gpt-5",          # 通用强模型
            temperature=0.3,        # 稍高温度,允许创意
            context_budget=50_000
        )
    elif task.type == "code_review":
        return ModelConfig(
            model="claude-opus-4",  # 擅长分析
            temperature=0.0,        # 零温度,追求一致性
            context_budget=100_000
        )
    elif task.type == "test_generation":
        return ModelConfig(
            model="gpt-5-3-codex",
            temperature=0.2,
            context_budget=150_000,
            system_prompt=SPECIALIZED_TEST_PROMPT
        )

为什么不总是用最强的模型

  1. 成本:强模型的 API 成本通常是弱模型的 10-100 倍,文档生成任务不需要最强的代码模型
  2. 延迟:强模型通常也更慢,简单任务用快速模型可以提高吞吐量
  3. 专业性:某些任务(如安全审查)可能有专门训练的模型表现更好

六、Layer 5:自愈维护层(Self-Healing Layer)

6.1 “垃圾回收”:doc-gardening Agent

来源:OpenAI

这是 Harness Engineering 中最富创意的概念之一:把软件工程中的垃圾回收(GC)隐喻应用于文档和代码质量管理。

背景问题:随着 Agent 持续生成代码,代码库会自然地积累”AI 残渣”(AI residue)——不一致的模式、过时的文档、次优的实现。OpenAI 的经验是:

“Codex 会复现代码仓库中已存在的模式——甚至包括那些不均衡或不够理想的模式。随着时间的推移,这不可避免地导致漂移。”

不可扩展的初始方案:OpenAI 团队曾经每周花费工作时间的 20%(每周五)人工清理这些”AI 残渣”。这显然无法扩展——当 Agent 吞吐量翻倍时,清理工作量也会翻倍,人工维护很快变成瓶颈。

可扩展的解决方案:doc-gardening Agent

┌─────────────────────────────────────────────────────┐
│              doc-gardening Agent(定期运行)          │
│                                                      │
│  扫描任务:                                           │
│  1. 文档新鲜度检查                                    │
│     - 最后修改时间 vs 对应代码的最后修改时间           │
│     - 代码行为是否与文档描述一致?                     │
│     - 文档引用的 API 是否仍存在?                      │
│                                                      │
│  2. 质量评分更新                                      │
│     - 每个模块的测试覆盖率                            │
│     - 每个文档页面的完整性评分                        │
│     - 架构约束的遵循率                                │
│                                                      │
│  3. 漂移检测                                          │
│     - 识别不符合"黄金原则"的代码模式                  │
│     - 检测重复实现(应使用共享工具但却自行实现)        │
│     - 发现违反 parse don't validate 的新代码          │
│                                                      │
│  产出:针对性重构 PR(大多数 < 1 分钟审查,自动合并)  │
└─────────────────────────────────────────────────────┘

技术债像高息贷款的隐喻(来源:OpenAI):

“技术债就像一笔高息贷款:不断地以小额贷款的方式偿还债务,总比让债务不断累积,再痛苦地一次解决要好得多。”

这个比喻精确地描述了 doc-gardening Agent 的工作方式:每天自动产出大量小型重构 PR,每个 PR 的范围小到”大多数可以在一分钟内完成审查并自动合并”,而不是积累到需要重大重构的程度。

6.2 质量评分追踪系统

来源:OpenAI(QUALITY_SCORE.md)

OpenAI 维护了一个明确的质量评分文件,追踪代码库各个部分的质量状态:

# QUALITY_SCORE.md(概念性示例,基于 OpenAI 描述重建)

## 当前质量快照(2026-03-15 自动更新)

### 产品领域质量
| 领域 | 测试覆盖率 | 文档完整度 | 架构合规率 | 总分 |
|------|-----------|-----------|-----------|------|
| 用户认证 | 89% | A | 97% | 🟢 |
| 支付处理 | 93% | A+ | 99% | 🟢 |
| 通知系统 | 67% | B | 88% | 🟡 |
| 内部工具 | 45% | C | 76% | 🔴 |

### 架构层质量
| 层 | 约束遵循率 | 最近违规数 | 状态 |
|----|-----------|-----------|------|
| Types | 100% | 0 | 🟢 |
| Service | 98% | 2 | 🟢 |
| Runtime | 91% | 8 | 🟡 |
| UI | 87% | 15 | 🟡 |

### 已知差距(doc-gardening Agent 待处理)
1. 通知系统文档落后代码 6 周 → 计划:2026-03-20 前修复
2. 内部工具测试覆盖率低 → 计划:2026-04 Q 修复

这个文件的作用

  1. 对 Agent 的价值:Agent 在处理某个领域的任务时,可以查看该领域的质量分,了解当前状态的”基线”,并有意识地改善而不只是维持
  2. 对人类的价值:提供一个持续更新的质量仪表板,无需人工检查就能了解系统健康状态
  3. 对 doc-gardening Agent 的价值:作为优先级排序依据,分数低的区域优先处理

6.3 “黄金原则”编码

来源:OpenAI

“黄金原则”(Golden Rules)是 OpenAI 团队对”我们希望代码库始终保持的不可妥协属性”的称呼。与 Layer 2 中的架构约束不同,黄金原则更关注于代码库的长期健康而非即时正确性。

OpenAI 公开的两个黄金原则案例:

原则 1:使用共享工具,而非自行实现

问题描述:Agent 在解决新问题时,往往倾向于就地实现一个辅助函数,
而不去查找是否已有共享工具可以使用。这导致同一功能在代码库中
出现多个实现版本,维护成本倍增。

黄金原则:我们更倾向于使用共享的实用程序包,而不是手工编写的辅助工具,
以便将不变式集中管理。

检测方式:doc-gardening Agent 定期扫描
- 是否有与现有工具功能相似的新实现?
- 是否有内联 helper 函数应该被提取到共享包?

处理方式:生成 PR,将孤立实现替换为共享工具的调用

原则 2:不使用 YOLO 式探测数据

问题描述:Agent 在不确定外部 API 响应结构时,会猜测性地访问
字段(如 response.data?.user?.id),形成"YOLO 式"的数据探测。
这些代码在大多数情况下工作,但在边界情况下会出现难以调试的问题。

黄金原则:我们不会使用"YOLO 式"探测数据——我们会验证边界,
或依赖类型化的 SDK。

检测方式:识别代码中的可选链式访问(?.)和非空断言(!.)模式,
区分"合理的防御性编程"和"掩盖类型不确定性的探测"

处理方式:生成 PR,添加 Zod 解析或将探测替换为类型化的访问

6.4 自愈层的工程实现:系统性 vs 一次性

自愈层有两种截然不同的实现方式,理解其区别对设计有重要意义:

一次性补丁(反模式):

问题:Agent 错误地使用了 response.user.id(没有解析)
修复:找到所有这种用法,手动替换为 UserSchema.parse(response).id
结果:这次修好了,但下次 Agent 仍会生成同样的错误用法

系统性防护(正确模式):

问题:Agent 错误地使用了 response.user.id(没有解析)

步骤 1:分析为什么 Agent 会产生这种模式
→ 因为类似的旧代码在训练时被看到过
→ 因为 AGENTS.md 没有明确说明边界解析要求

步骤 2:系统性解决
→ 在 linter 中添加规则:检测 response.* 模式(外部响应直接访问)
→ 更新 AGENTS.md:明确"所有外部响应必须先经过 Zod 解析"
→ 添加一个示例到 docs/references/:如何正确解析外部 API 响应

步骤 3:验证解决
→ 运行 linter,确认所有现有违规被标记
→ 生成修复 PR(由 doc-gardening Agent 处理)
→ 测试:给 Agent 一个涉及外部 API 的新任务,验证它会主动使用 Zod 解析

Mitchell Hashimoto 的操作定义——“每当发现代理犯错时,花时间工程化解决方案防止再次出现”——正是描述了这种系统性思维方式。每个错误都不只是需要修复的 bug,而是 harness 中需要填补的漏洞。


七、设计原则总结

7.1 确定性与 LLM 的混合

来源:Martin Fowler

这是 Harness Engineering 最基础的设计原则之一:系统不应该是”纯 LLM 驱动”的,而应该是确定性组件和概率性 LLM 的混合体

系统的确定性层次(由高到低):

100% 确定性:
- Linter 规则(代码是否违反约束)
- 单元测试(函数是否返回预期结果)
- 类型检查(接口是否匹配)

高度确定性:
- 集成测试(功能是否端到端工作)
- 性能基准(响应时间是否在阈值内)

概率性:
- LLM 代码生成
- LLM 代码审查
- LLM 文档生成

设计原则:
- 用确定性层验证概率性层的输出
- 越接近"用户可见"的层次,确定性要求越高
- 概率性层的错误应被确定性层捕获,而不是传递给用户

在实践中,这意味着:

  • 不要让 LLM 判断”这段代码是否遵循了架构约束”——用确定性的 linter 来判断
  • 不要让 LLM 判断”这个 PR 是否引入了性能回归”——用确定性的 benchmark 来判断
  • LLM 负责生成,确定性系统负责验证

7.2 约束优于指令

来源:Cursor 技术文章

这一原则区分了两种控制 Agent 行为的方式:

指令(Instructions)

# 在 AGENTS.md 中
- 请不要在 Config 层 import Service 层的内容
- 记住使用结构化日志
- 在写数据库操作时要考虑事务安全

约束(Constraints)

// 在代码中自动执行
// rule: no-layer-violation
// 触发时:自动报错并阻止 commit
if (currentLayer === 'Config' && importedLayer === 'Service') {
  throw new LintError('Layer violation: Config cannot depend on Service');
}

为什么约束优于指令

维度指令约束
执行可靠性Agent”尽力遵守”(约 80-90%)100% 强制执行
覆盖范围只影响读过指令的 Agent影响所有通过 CI 的代码
随时间退化文档过时后指令失效代码约束持续有效
可测试性无法自动测试遵循率可以精确测量遵循率
认知负担增加 Agent 的上下文负担无需 Agent 记忆,自动执行

这并不意味着指令没有用——在无法用代码表达的情况下,指令是必要的(例如产品决策原则、设计美学偏好)。但每当一条指令可以被转化为约束时,应该果断地转化。

7.3 最小可行 Harness,按需增加复杂性

来源:Anthropic

Anthropic 的建议是反对”过度工程化”的:不要在项目开始时就建造全部五层,而是从最小可行 harness 开始,按需增加复杂性。

最小可行 Harness(MVP 阶段)

├── AGENTS.md(50 行,基本导航)
├── .lintrc(5 条关键规则)
└── 一套基础测试

中期 Harness(团队阶段)

├── AGENTS.md(100 行,完整导航)
├── docs/(结构化文档体系)
├── 自定义 linter(20+ 规则)
├── 分层架构约束
└── CI with feedback shift

完整 Harness(规模阶段)

├── 完整的上下文管理层
├── 条件约束系统
├── Chrome DevTools MCP
├── 完整可观测性堆栈
├── 双代理编排
├── doc-gardening Agent
└── 质量评分追踪

增加复杂性的触发条件

触发信号应添加的 Harness 组件
Agent 频繁违反同一类错误添加对应的 linter 规则
上下文窗口经常溢出实施渐进式披露和文档结构化
UI bug 在人工 QA 才被发现添加 Chrome DevTools MCP
多个 Agent 工作互相冲突添加隔离沙箱
代码库出现大量重复实现添加 doc-gardening Agent
文档频繁过时添加文档新鲜度 linter

7.4 模块化以应对模型更替

来源:Philipp Schmid

这一原则反映了 AI 领域的一个独特挑战:底层模型会不断被更新和替换,而 harness 需要能够跨模型版本保持有效。

不可移植的 Harness(反模式):
# AGENTS.md
"你是 GPT-5,你的能力包括 200K context window 和 function calling v3..."
"使用 GPT-5 特有的 system prompt 格式..."
"当你遇到代码问题,使用 GPT-5 的 reasoning token 功能..."

这类 harness 在模型升级(或降级)时需要大规模重写。

可移植的 Harness(正确模式):

上下文管理层:不依赖特定模型的 context window 大小,用渐进式披露适配任何大小
约束执行层:用代码(linter)而非 prompt 实现约束,完全模型无关
反馈回路层:测试和 CI 脚本是模型无关的
编排调度层:接口化设计,模型切换只需更改配置

# model-config.yaml(模型配置集中管理)
default_model: claude-opus-4
fallback_model: gpt-5
code_specialist: gpt-5-3-codex
review_specialist: claude-opus-4

实际效益:Cursor 在其四代架构演进中,每次更换或升级底层模型时,harness 层基本无需改动——因为 harness 的核心组件(上下文管理、约束系统、反馈回路)都是模型无关的。

7.5 反脆弱性:容忍单个 Agent 失败

来源:Cursor

在高吞吐量的 Agent 系统中,部分任务失败是不可避免的。脆弱的系统设计是:任何 Agent 失败都会阻塞整个流水线。反脆弱的设计是:单个 Agent 的失败是正常事件,系统有内建的恢复机制。

脆弱设计(串行依赖):
Task A → Task B → Task C → Task D → 完成

               Task C 失败 → 整个流程停止

反脆弱设计(并行 + 容错):
Task A ─┬→ Task B1 → ···
        ├→ Task B2 → ··· → 汇总 → 完成
        └→ Task B3 → ···

          Task B2 失败 → 重新分配给备用 Agent,或降级处理,其他任务继续

Cursor 实践中,递归规划者(Recursive Planner)负责监控各个 Worker 的状态,当某个 Worker 失败时,Planner 有几种处理策略:

  1. 重试:重新创建一个相同的 Worker 任务
  2. 重规划:如果重试也失败,修改计划,绕过该子任务
  3. 上报:如果任务是关键路径,通知人类介入
  4. 降级:采用简化版本的实现,在后续 PR 中完善

八、核心权衡分析

8.1 过度约束 vs 欠约束

这是 Harness Engineering 中最常见的失衡问题。

欠约束的症状

  • Agent 频繁产生架构违规
  • 代码库风格不一致(每个 Agent 有自己的”风格”)
  • 文档快速过时
  • 小错误在代码库中传播并被复现

过度约束的症状(来源:OpenAI 的明确警告):

  • Agent 的”有效自由度”接近零,创造性解决方案被阻塞
  • 大量时间花在修复 lint 错误而非解决实际问题
  • 边缘情况频繁触发规则误报
  • “围绕规则优化”而非”解决问题”

OpenAI 提供了一个有效的校准标准:

“我们明确指出了哪些地方需要限制,哪些地方不需要限制。这类似于领导一个大型工程平台组织:在中央层面强制执行边界,在本地层面允许自主权。”

实践中的校准方法

将代码库关注点分为两类:

  • 必须强制执行:安全边界、架构层间依赖、数据类型解析——这些一旦违反,影响是系统性的
  • 允许 Agent 自由决策:函数命名(只要语义清晰)、注释风格、算法实现细节——这些即使”不理想”,影响也是局部的

对”必须强制执行”的点,用 linter + CI 硬约束;对”允许自由”的点,用文档建议而非规则强制。

8.2 速度 vs 可靠性

来源:Stripe(最多两轮 CI 的约束)

在高吞吐量系统中,速度和可靠性之间存在基本张力:

追求极致可靠性的代价

  • 更多的测试层次 → 更长的反馈周期
  • 更多的人工审核 → 人力成本增加、成为瓶颈
  • 更严格的约束 → Agent 的自由度降低、速度下降

追求极致速度的代价

  • 更少的验证 → 更高的错误率进入主干
  • 自动合并 → 问题传播更快
  • 宽松的约束 → 代码质量退化

Stripe 的”最多两轮 CI”约束是一个在速度和可靠性之间找到平衡点的具体例子:

  • 一轮 CI:可能存在测试不稳定(flaky tests)导致的误报,值得重试
  • 两轮 CI:如果两次都失败,很可能是真实问题,需要 Agent 修改或人工介入
  • 超过两轮:收益递减,且占用 CI 资源,影响其他 PR 的速度

OpenAI 对此有一个更宏观的观察:

“在一个智能体吞吐量远超人类注意力的系统中,纠错成本低,而等待成本高。”

这句话是整个速度/可靠性权衡的指导原则:系统吞吐量越高,等待(慢反馈、多审核层次)的相对成本越高,因为等待期间 Agent 是空闲的。

8.3 通用 Harness vs 定制 Harness

来源:Martin Fowler,Philipp Schmid

通用 Harness 指可以跨多个项目或团队复用的 harness 组件(例如 LangChain、LlamaIndex 等框架)

定制 Harness 指针对特定代码库、特定领域设计的 harness 组件(例如 OpenAI 为其 Codex 项目设计的一套)

通用 Harness 的优势

  • 快速上手,已经解决了常见问题
  • 社区支持,有文档和示例
  • 不需要维护

通用 Harness 的劣势(来源:OpenAI 的经验):

“在某些情况下,让智能体重新实现部分功能子集比绕过公共库中不透明的上游行为更便宜。”

OpenAI 的具体案例:他们没有使用 p-limit 这样的通用并发控制包,而是实现了自己的带并发的 map 辅助函数,原因是:

  1. 与 OpenTelemetry 仪表的紧密集成(通用包无法做到)
  2. 100% 的测试覆盖率(通用包的行为有不确定性)
  3. 完全符合运行时预期(不受上游版本升级影响)

实践中的判断标准

使用通用 Harness使用定制 Harness
标准问题(RAG、记忆管理等)领域特定约束(支付合规、安全要求等)
早期阶段,快速验证成熟阶段,追求极致可靠性
团队 AI/ML 经验有限团队有深入的 Harness 工程能力
代码库规模小(<10 万行)代码库规模大(>100 万行)

8.4 人工审核 vs 全自动

来源:OpenAI

OpenAI 团队的实践记录了从”大量人工审核”到”基本全自动”的演进路径:

初期:每个 PR 都需要人工审查,确保质量

  • 优点:质量控制严格,可以捕获细微问题
  • 缺点:成为吞吐量的瓶颈,人类注意力是稀缺资源

中期:建立 Agent 审核系统,逐步替代人工审核

  • 实现:Discriminator Agent 负责代码审查
  • 标准:只有涉及”判断性决策”(而非技术正确性)时才交给人类

成熟期(OpenAI 当前状态):

“我们已将几乎所有的审核工作调整为用智能体对智能体的方式来处理。” “人类可以审核 Pull Request,但并非必须这样做。”

什么情况下人工审核是不可替代的

  1. 价值判断:这个功能是否值得构建?是否符合产品方向?
  2. 安全敏感:涉及认证、权限、数据隐私的重大变更
  3. 架构决策:影响整个系统结构的设计选择
  4. 边界情况:Agent 自己标记为”不确定如何处理”的情况

METR 研究的警示

METR 发现 SWE-bench 自动评分存在 24 个百分点的系统性偏差,这提醒我们: 即使系统完全自动化,也需要定期对自动化验证机制本身进行人工校准——检查 Discriminator Agent 是否存在系统性偏差,检查 linter 规则是否误报,检查测试是否测的是”真正重要的事情”。

“全自动”不意味着”人类完全退出”,而意味着人类的工作从”逐个审核”转变为”设计和校准自动化系统”。


九、架构实现的完整示例

以一个中等规模的 Web 应用(约 10 万行代码,5 名工程师)为例,展示五层架构的具体实现:

project/
├── AGENTS.md                     # Layer 1: 上下文入口(100 行)
├── ARCHITECTURE.md               # Layer 1: 架构地图

├── docs/
│   ├── design-docs/              # Layer 1: 设计文档
│   ├── exec-plans/               # Layer 1: 执行计划
│   │   ├── active/
│   │   ├── completed/
│   │   └── tech-debt-tracker.md
│   └── references/              # Layer 1: LLM 专用参考文档
│       ├── architecture-llms.txt
│       └── api-conventions-llms.txt

├── .eslintrc.js                  # Layer 2: 标准 + 自定义规则
├── eslint-rules/                 # Layer 2: 自定义层间约束 linter
│   ├── layer-dependencies.js
│   ├── parse-at-boundary.js
│   └── structured-logging.js
├── .agent-rules.yaml             # Layer 2: 条件规则系统

├── scripts/
│   ├── local-check.sh            # Layer 3: 本地快速验证(<5秒)
│   ├── playwright/               # Layer 3: E2E 测试
│   └── observability/           # Layer 3: 本地可观测性堆栈配置
│       ├── vector.yaml
│       └── grafana-datasources.yaml

├── .devcontainer/               # Layer 4: 隔离沙箱配置
│   └── devcontainer.json        # 10秒启动目标
├── agents/
│   ├── planner.yaml             # Layer 4: 递归规划者配置
│   └── workers/
│       ├── frontend-worker.yaml # Layer 4: 专职前端 Worker
│       ├── backend-worker.yaml  # Layer 4: 专职后端 Worker
│       └── test-worker.yaml     # Layer 4: 专职测试 Worker

├── maintenance/
│   ├── doc-gardening-agent.yaml # Layer 5: 文档维护 Agent
│   ├── golden-rules.md          # Layer 5: 黄金原则
│   └── QUALITY_SCORE.md         # Layer 5: 质量评分(自动更新)

└── .github/
    └── workflows/
        ├── ci.yaml              # Layer 3: CI(最多两轮)
        └── maintenance.yaml     # Layer 5: 定期维护任务

这个结构是上述五层架构的直接映射,每一层都有明确的文件和目录对应。在实际实施中,建议按照”从 Layer 1 开始,逐层添加”的顺序推进,而不是一次性建立全部五层。

2 Harness Engineering:工业实践案例

Harness Engineering:工业实践案例

📍 位置:Harness Engineering / 工业实践 📌 核心发现:头部公司的 harness 实践已从实验走向规模化生产,但路径和架构选择差异巨大——这恰恰说明这是一个尚未收敛的领域 📥 输入:OpenAI, Stripe, Cursor, Anthropic, Mitchell Hashimoto 📤 流向:→ findings.md [实践成熟度部分], → 4-开发者采纳指南.md


案例概览

本文梳理五个已公开披露细节的 harness engineering 实践案例。选取标准:公开分享了架构细节(而非只说”我们在用 AI”)、有量化数据或可验证的工程决策、覆盖不同规模和场景。

这五个案例不是最佳实践的排行榜,而是不同约束条件下的工程选择快照——读完后应该能回答的问题不是”谁做得最好”,而是”在我的约束条件下,哪些决策适合借鉴”。


案例 1: OpenAI — 从零开始构建 Agent-First 百万行代码库

背景与规模

这是迄今为止公开细节最丰富的 harness engineering 案例。团队在 5 个月内用 Codex 从空 repo 构建出一个百万行量级的完整产品,整个过程遵循一条极端原则:零人工代码——工程师不手动编写任何代码,所有代码均由 AI 生成。

团队规模从最初 3 名工程师扩展至 7 名。扩张后,吞吐量不仅没有下降,反而持续提升——每人每天合并 3.5 个 PR,这个数字在传统开发模式下几乎不可能持续实现。单次 Codex 运行时间超过 6 小时,说明任务规模远超普通代码补全。

审核流程也发生了结构性转变:早期以人工审核为主,随着时间推移逐步演化为 agent-to-agent 审核,人类工程师的角色从逐行审查代码转向监督和设计 harness 本身。

Harness 架构

AGENTS.md(约100行目录导航)
    ↓ 指向
docs/
├── design-docs/           # 设计决策记录
├── exec-plans/            # 执行计划
├── generated/             # 自动生成文档
├── product-specs/         # 产品规格
├── references/            # 外部参考
├── DESIGN.md
├── FRONTEND.md
├── PLANS.md
├── PRODUCT_SENSE.md
├── QUALITY_SCORE.md
├── RELIABILITY.md
└── SECURITY.md

代码库本身采用分层领域架构,层级严格单向依赖:

Types → Config → Repo → Service → Runtime → UI

                               Providers(横切关注点)

每一层只能依赖比它更底层的模块,不允许跨层或反向依赖。Providers 层处理日志、追踪、认证等横切关注点,与业务逻辑严格分离。

可观测性堆栈:Vector(日志聚合)→ Victoria Logs / Victoria Metrics / Victoria Traces。完整的结构化日志和追踪是必须的,不是可选项——Agent 出错时没有可观测性就等于黑盒调试。

Chrome DevTools MCP 集成允许 Agent 直接操作浏览器,进行端到端的 UI 验证。

关键技术决策

决策一:AGENTS.md 是”目录”而非”百科全书”

这是整个 harness 设计中最值得注意的元决策。AGENTS.md 保持约 100 行,只做一件事:告诉 Agent 在 docs/ 的哪个子目录下能找到什么类型的信息。

为什么不把所有规则都塞进 AGENTS.md?两个原因:首先,一个庞大的 AGENTS.md 会消耗大量上下文窗口,每次任务都带着全量知识是浪费;其次,分散在 docs/ 各处的专项文档(SECURITY.mdQUALITY_SCORE.md)可以被独立维护、独立版本控制,不会因为一个修改导致整个 AGENTS.md 失效。

这个决策体现了”知识组织即 harness 设计”的思维——如何组织文档,直接影响 Agent 能否高效检索到正确上下文。

决策二:自定义 linter 强制执行架构约束

分层架构如果只写在文档里,Agent 在压力下(上下文快满时、任务复杂时)会绕过它。解决方案是把架构约束编码进自定义 linter:违反分层依赖的代码在 lint 阶段直接报错,而且错误信息中注入了修复指令。

这是”约束优于指令”原则的具体实现。与其反复在 AGENTS.md 里写”不要跨层依赖”,不如让违规行为不可能通过 CI。更关键的是,linter 错误信息中内嵌修复建议,Agent 不需要去查文档就能自我修正。

决策三:doc-gardening agent 处理文档熵增

大型 AI 驱动代码库面临一个独特问题:AI 生成代码的速度远快于文档更新速度,过时文档比没有文档更危险(会误导后续 Agent)。解决方案是部署专职的 doc-gardening agent,定期扫描代码变更,识别需要更新的文档并执行清理。

这把文档维护从人工驱动变成了 agent 自驱动闭环。

性能数据

  • 代码库规模:百万行量级
  • 团队规模:3 → 7 名工程师,5 个月
  • 单人日均 PR:3.5 个
  • 单次 Codex 运行时长:超过 6 小时
  • 人工代码量:零(团队核心理念)

独特洞见

这个案例的最独特价值在于规模化零人工代码的可行性验证。在此之前,“AI 生成所有代码”被许多工程师认为是 demo 噱头,不适用于真实生产系统。OpenAI 的案例用百万行规模和 5 个月时间线打破了这个预设。

但更深层的洞见是:这条路之所以走通,不是因为 AI 变强了,而是因为工程师把更多精力放在了架构设计和 harness 构建上。分层领域架构、自定义 linter、doc-gardening agent——这些都是为了让 AI 在清晰约束下工作,而不是让 AI 在混乱中凭运气产出好代码。

工程师角色从”写代码”转变为”设计 AI 能正确执行代码的系统”。这是一个深刻的职业转型信号。

局限与未解问题

  • 6 小时单次运行意味着极高的失败成本。文档中没有披露失败率和回滚策略。
  • “零人工代码”原则在紧急修复场景下如何执行?人工代码和 AI 代码的边界如何维护?
  • agent-to-agent 审核如何防止两个 agent 在错误上形成”共识”(群体性盲点)?
  • 整个系统的测试策略未披露——百万行代码的测试覆盖率和测试策略是什么?

案例 2: Stripe Minions — 企业级 Agent 基础设施

背景与规模

Stripe 的 Minions 项目代表了另一种路径:不是从零开始构建 agent-first 系统,而是把 Agent 能力嫁接到数亿行存量代码库上。这是大多数企业面临的真实处境,因此 Stripe 的方案具有更广泛的借鉴价值。

规模数据:每周合并超过 1000 个 AI 生成 PR,全部经过人类审查后才合并。这个节奏相当于每个工作日 200 个 AI PR,是目前工业界公开的最高吞吐量之一。

Stripe 选择基于 Block 公司开源的 goose 项目进行定制开发,而不是从零自研,也不是直接使用商业产品。这个选择本身就是一个值得分析的工程决策。

Harness 架构

隔离 devbox(10秒启动)
    ├── 预装 Stripe 代码和服务
    └── 连接 →
            MCP 协议

        Toolshed 中央服务器
            └── 400+ 内部工具

Minion 任务流水线

  1. 工程师触发任务(可多个并行)
  2. Minion 在隔离 devbox 中执行
  3. 本地 linting(< 5 秒反馈)
  4. 最多两轮 CI 验证
  5. 人类审查
  6. 合并

代理规则按子目录条件应用:不同代码目录有不同的规则集,而非全局统一规则。Ruby 模块的约束和 Go 服务的约束是独立维护的。

关键技术决策

决策一:隔离 devbox + 10 秒启动

这个设计选择的动机是安全性和可复现性。在共享环境中运行 Agent 有两个风险:Agent 的副作用会污染其他任务的环境;一个出错的 Agent 可能影响生产系统。

10 秒启动时间是这个架构的关键约束——如果每次启动需要 5 分钟,并行运行多个 Minion 的成本会急剧上升。预装 Stripe 代码和服务意味着 devbox 镜像需要持续维护,这是额外运维成本,但这个成本被快速启动带来的并行能力所抵消。

决策二:MCP 协议 + 中央 Toolshed

400+ 内部工具通过 MCP 协议统一暴露,这个架构决策的核心是工具管理的集中化。好处是 Agent 不需要了解每个工具的实现细节,也不需要在代码中硬编码工具调用;坏处是 Toolshed 成为单点故障,且 400+ 工具的描述如何让 Agent 高效检索是一个尚未完全解决的问题。

这个架构选择也透露了 Stripe 的一个判断:Agent 访问工具的标准化协议(MCP)比工具本身更有价值,因为它解耦了 Agent 版本升级和工具迭代。

决策三:反馈左移——本地 linting < 5 秒

“将代理循环和确定性代码交错进行”是 Stripe 工程师对这套流程的描述。核心思想是:AI 生成的代码不应该等到 CI 才知道是否符合规范,本地 linting 必须在秒级给出反馈,否则 Agent 的调试循环会被 CI 等待时间拉长到不可接受的程度。

CI 作为最后防线,但限制在最多两轮——强制 Agent 在本地验证充分后再提交,而不是用 CI 作为调试工具反复试错。

决策四:为什么自研而不是用商业产品

Stripe 披露的原因非常具体:数亿行代码(规模上不允许重新构建)、独特的 Ruby + Sorbet 技术栈、大量专有内部库。任何通用的 Agent 框架都无法理解 Stripe 的类型系统和代码约定,必须定制化。

这个理由揭示了一个重要规律:代码库的特殊性越高,通用 Agent 框架的适配成本越高,自研 harness 的回报率越高

性能数据

  • 每周 AI 生成并合并 PR:> 1000 个
  • devbox 启动时间:10 秒
  • 内部工具数量:400+
  • 反馈延迟目标:本地 linting < 5 秒
  • CI 轮次上限:最多两轮

独特洞见

Stripe 案例最独特的价值是存量代码库的 Agent 接入方案。与 OpenAI 从零开始不同,Stripe 必须在数亿行历史代码上叠加 Agent 能力,这要求 harness 必须理解现有代码的约定,而不是强制代码库适应 Agent。

另一个独特洞见是MCP 作为企业级工具标准化层的价值。400+ 工具通过统一协议暴露,背后的意义是:企业的知识(工具、API、流程)可以和 Agent 版本解耦。今天用的 Agent 替换成明天更强的 Agent,工具层不需要重写。这是一种面向未来的架构投资。

局限与未解问题

  • 每周 1000 个 AI PR 全部经过人类审查,这是否会成为瓶颈?人类审查员如何避免”橡皮图章”效应?
  • 400+ 工具的 Toolshed 如何管理工具质量?差的工具描述会让 Agent 频繁选错工具。
  • 代理规则按子目录条件应用,规则之间的冲突如何处理?
  • goose 定制化深度未披露,未来上游更新如何 merge?

案例 3: Cursor — 自驱动代码库的四代架构演进

背景与规模

Cursor 的案例是公开案例中架构演进过程最详细的。他们不只分享了”做了什么”,还分享了”为什么前三代失败了”,这使得这个案例具有极高的工程学习价值。

规模:数千个 AI 智能体协调,一周约 1000 次提交,全部运行在单台高配 Linux VM 上,使用 Rust 编写的多智能体编排系统。Cursor 本身以 $500 亿估值被视为 harness engineering 商业价值的最强佐证——这家公司的核心竞争力本质上就是对 AI 代码生成的 harness 能力。

四代架构演进

第一代:平等角色自协调(失败)

架构:所有 Agent 地位平等,通过协商决定谁执行什么任务。

失败原因:锁竞争严重。当多个 Agent 试图修改同一文件时,大量时间消耗在等待锁释放上,而不是实际工作。平等协商本身也产生了大量无效通信开销。

根本问题:这个设计把人类团队的”扁平协作”模式直接移植到 Agent 系统,忽略了 Agent 在处理冲突时缺乏隐性社交协调能力(人类可以通过一句话快速协商,Agent 需要完整的协议交换)。

第二代:规划 / 执行 / 工作者三层(失败)

架构:明确分工——规划者负责拆解任务,执行者负责调度,工作者负责执行。

失败原因:架构过于僵化。当任务需要在运行时动态调整计划时,三层之间的协调成本极高——工作者发现情况和预期不符,需要逐层上报,规划者重新规划,再逐层下发,整个循环延迟无法接受。

根本问题:瀑布式分工假设任务是完全可预测的。但代码任务的本质是发现式的——执行过程中会不断发现新信息,这要求规划和执行之间有极低延迟的反馈循环,而不是层级汇报。

第三代:连续执行器(失败)

架构:单个高能力 Agent 连续执行所有任务,减少协调开销。

失败原因:角色过载。一个 Agent 既要理解全局上下文,又要处理低层实现细节,上下文窗口很快被填满,任务质量随任务长度线性下降。

根本问题:把”减少协调”等同于”合并角色”是错误的直觉。协调成本和角色专化是两个独立维度——可以通过更好的协调协议减少协调成本,同时保留角色专化的上下文优势。

第四代:递归规划者 + 专职工作者(成功)

架构

递归规划者(全局视角,持续运行)
    ├── 分解任务
    ├── 分配给专职工作者
    └── 递归拆分复杂子任务

专职工作者(局部上下文,独立执行)
    ├── 接收明确定义的任务
    ├── 执行并返回结果
    └── 失败时不影响其他工作者

为什么成功:递归规划解决了三层架构的僵化问题(规划者可以在运行时重新规划,不需要跨层协商);专职工作者解决了连续执行器的上下文过载问题(每个工作者只持有必要的局部上下文);递归结构使得复杂任务可以自然分解,不需要预先完全规划。

关键技术决策

决策一:反脆弱性设计——容忍单个智能体失败

第四代架构的核心安全属性是:任何单个工作者的失败不会级联到其他工作者。这要求任务分解时每个子任务必须有清晰的输入/输出边界,避免工作者之间的隐性依赖。

反脆弱性不是消除失败,而是让系统在局部失败时继续工作。这和 Erlang “Let It Crash” 哲学有异曲同工之处。

决策二:“绿色分支”策略

接受小错误率,由后续任务修复,而不是要求每个 Agent 输出完美结果。这个决策的背后是一个成本权衡:要求每次输出完美需要大量验证时间,接受一定错误率并用专职修复 Agent 处理,整体吞吐量更高。

这个策略要求 harness 具备错误检测和追踪能力——如果不能快速识别哪些输出需要修复,“绿色分支”会演变成债务积累。

决策三:约束而非指令,数值范围而非模糊量词

Cursor 工程师明确指出:模糊指令会放大不良行为。当 Agent 数量达到数千时,一个模糊指令产生的偏差会在规模效应下被放大数千倍。

具体实践:不说”避免太长的函数”,而说”函数长度不超过 50 行”;不说”适当添加注释”,而说”每个公共接口必须有 JSDoc 注释”。约束要可以被机器验证,而不只是人类可以理解。

性能数据

  • 并发智能体数量:数千个
  • 周提交量:约 1000 次
  • 运行环境:单台高配 Linux VM
  • 编排系统语言:Rust
  • 公司估值(作为 harness 价值的市场背书):$500 亿

独特洞见

Cursor 案例的最大价值是失败案例的工程教训。大多数公开分享都只展示成功,隐藏失败。Cursor 公开了三代失败和失败原因,这使得其他团队可以直接跳过同样的坑。

三代失败揭示的深层规律:Agent 系统的架构演化方向是”减少协调成本”和”保护上下文专注度”的双目标优化,而不是追求某种单一的简洁性。每一代失败都是在其中一个目标上走向极端:第一代牺牲了专注度,第二代牺牲了灵活性,第三代牺牲了专注度,第四代找到了平衡点。

局限与未解问题

  • 单台高配 Linux VM 的硬件上限是多少?水平扩展策略未披露。
  • “绿色分支”的错误率阈值是多少?超过阈值时如何切换模式?
  • 递归规划者本身如果出错(例如错误地分解了任务),如何恢复?
  • 数千个并发 Agent 的调度算法细节未披露。

案例 4: Anthropic — GAN 启发的多 Agent 长任务架构

背景与规模

Anthropic 的案例来源于其工程团队在构建 Claude 相关产品时的内部实践。与前三个案例不同,这个案例不以吞吐量或代码规模为核心指标,而是聚焦于解决长任务质量退化这个根本问题。

这个视角更偏向架构原理研究,而非工程规模展示。Anthropic 披露的失败模式和设计原则,对理解 harness engineering 的理论基础有重要价值。

Harness 架构

GAN(生成对抗网络)启发的多 Agent 架构:

规划者(Planner)
    ↓ 任务定义
生成者(Generator)
    ↓ 代码/内容输出
评估者(Evaluator)
    ↓ 独立批判
规划者(更新计划)
    ↓ 迭代

关键创新是评估与生成的严格分离。评估者不是生成者的”自我审查”——它是独立运行的 Agent,没有看过生成者的推理过程,只看最终输出。

Agent 间通信通过文件系统而非内存传递。这个选择不是性能优化,而是有意为之的解耦设计——文件系统提供天然的版本控制和审计痕迹,也避免了内存共享带来的状态污染。

两大失败模式与解决方案

失败模式一:上下文衰减(Context Decay)

现象:在长任务中,模型在上下文窗口接近上限时开始产生质量下降的输出——草率结束、跳过验证步骤、重复早期已解决的问题。Anthropic 将这种现象命名为”上下文焦虑”(context anxiety):模型感知到窗口快满了,行为模式像一个快要下班的工人在赶工。

解决方案:上下文重置(Context Reset),而非上下文压缩(Context Compression)。

这个选择值得仔细分析。为什么不压缩?因为压缩本身是一个有损操作——模型决定什么信息”重要”,但这个判断可能和任务实际需要不一致。上下文重置意味着 Agent 重新读取文件系统中的状态,用持久化存储替代内存作为真相来源(source of truth),这要求文件系统状态随时处于可读的完整状态。

失败模式二:自我评估偏差(Self-Evaluation Bias)

现象:要求同一个 Agent 既生成内容又评估自己的输出,评估质量显著低于独立评估者的评估质量。模型倾向于为自己的输出寻找辩护理由,而不是寻找错误。

解决方案:GAN 式架构中评估者与生成者的严格隔离——评估者甚至不知道是哪个生成者产生了这段代码,只看代码本身。这消除了”维护自我一致性”的心理偏差,让评估者可以纯粹地批判输出。

关键技术决策

决策一:“冲刺合约”(Sprint Contract)

在每个生成任务开始前,要求 Agent 明确写出”完成”的定义,包括:具体的验收标准、将要修改哪些文件、不会触碰哪些文件、预期输出格式。

这个机制解决了一个隐蔽的失败模式:Agent 完成了任务但不符合预期,因为”完成”的定义从未被明确化。“冲刺合约”把隐性预期变成显性合约,评估者可以对照合约而非主观印象来评分。

决策二:最简可行原则(Minimum Viable Agent)

Anthropic 工程师强调:不要预先设计复杂架构,从最简单的单 Agent 开始,仅在遇到具体瓶颈时增加复杂性

这个原则背后是一个关键洞察:每个架构组件都编码了对当前模型能力的假设。随着模型能力提升,某些架构组件可能变得不必要。如果一开始构建了复杂架构,当模型能力提升时,会面临”无法判断哪些组件还有必要”的问题。最简原则保持了架构的可演进性。

决策三:随模型能力持续演进

Anthropic 明确表示,其 harness 架构会随 Claude 的能力提升而调整。某些在 Claude 2 时代需要的 harness 组件,在 Claude 3 时代变得不必要。这意味着harness 不是一次性投资,而是需要持续重评估的动态配置

性能数据

Anthropic 案例没有披露具体吞吐量数据,聚焦于质量维度而非数量维度。可量化的信号:

  • 评估者对比自我评估的质量提升:显著(具体数字未公开)
  • 上下文重置 vs 压缩的任务完成质量:上下文重置更高(具体数字未公开)

独特洞见

Anthropic 案例的独特价值是对失败模式的精确命名。“上下文焦虑”和”自我评估偏差”这两个概念,让工程师有了描述问题的语言——没有名字的问题很难在团队内有效沟通和系统性解决。

GAN 式架构的深层洞见是:对抗性设计比合作性设计更能发现错误。让两个 Agent 互相配合产出更好的结果,不如让一个 Agent 专门寻找另一个 Agent 的错误——前者倾向于相互掩护,后者倾向于暴露真实问题。

“冲刺合约”机制也有广泛借鉴价值,远超 AI 场景:任何复杂任务在开始前明确”完成”定义,是避免预期错位的通用工程实践。

局限与未解问题

  • 评估者本身如何评估其评估质量?评估者也可能产生系统性偏差(例如过于保守或过于宽松)。
  • 上下文重置的触发时机如何决定?在什么上下文填充比例时重置是最优策略?
  • 文件系统通信在高并发场景下的性能瓶颈未讨论。
  • “随模型能力持续演进”意味着 harness 架构需要持续投入,这对小团队是否可行?

案例 5: Mitchell Hashimoto — 个人开发者的 Harness 进化路径

背景与规模

Mitchell Hashimoto 是 HashiCorp 创始人(Terraform、Vagrant、Vault 等工具的创造者),作为独立开发者拥有极深的系统工程背景。他的案例代表了与前四个案例完全不同的维度:一个有扎实工程基础的个人开发者,如何系统化地采纳 AI Agent 并构建个人 harness

这个案例之所以重要,不只是因为 Hashimoto 的个人影响力,而是因为他提供了一个完整的采纳路径——从第一次尝试 AI 聊天到最终构建持续运行的 harness,每个阶段的心理状态、遇到的阻力和突破点都有详细描述。

六阶段采纳模型

阶段 1: 聊天(Chat)

像普通用户一样使用 AI 聊天界面提问,没有集成到工作流。产出:对 AI 能力的基本认知,理解它能做什么、不能做什么。

阶段 2: Agent(探索自主性)

开始让 AI 执行有实际效果的任务,而不只是回答问题。发现:AI 在有清晰边界的任务上表现好,在开放式任务上容易偏轨。

阶段 3: 重复自己的工作(Replicate Own Work)

让 AI 执行自己已经会做的任务,用来校准 AI 的能力边界。关键洞见:在不理解自己如何做这件事的情况下,无法有效评估 AI 是否做对了。这个阶段让他意识到,自己的专业判断力是有效使用 AI 的前提,而不是可以被 AI 替代的东西。

阶段 4: 委托(Delegation)

开始把常规任务委托给 AI,自己聚焦在更高层决策。这个阶段出现了第一批 harness 需求:AI 犯了哪类错误?如何让它不再犯同类错误?

阶段 5: 工程化(Engineering)

Hashimoto 的核心定义在这个阶段被提炼出来:

“Harness = 每当发现代理犯错,花时间工程化解决方案防止再次出现。”

具体实践:

  • 写 AGENTS.md,记录任务执行约定
  • 写自动验证脚本,让 AI 可以自我检查输出
  • 把经常用到的上下文提取为可重用模块

这个阶段的特征是”把 debug 经验沉淀为系统”,而不是每次遇到问题临时修复。

阶段 6: 持续运行(Always On)

harness 成熟到可以让 AI 在后台持续工作,不需要逐步监督。这个阶段的 harness 需要足够鲁棒,能处理 AI 在无人监督时可能产生的各类偏差。

关键技术决策

决策一:AGENTS.md + 自动验证脚本的组合

Hashimoto 的个人 harness 核心是两件事:

  1. AGENTS.md:记录”做这类任务时应该遵守的约定”——不是 AI 百科全书,而是约定手册
  2. 自动验证脚本:输出验证逻辑,让 AI 在提交结果前可以运行脚本检查

这个组合的关键是验证脚本把人类判断转化为机器可执行逻辑。Hashimoto 发现某类错误后,不是在 AGENTS.md 里写”不要犯这种错误”,而是写一个脚本检测这种错误,然后在 AGENTS.md 里写”执行完成后运行 ./validate.sh”。

决策二:理解何时不该使用 Agent

Hashimoto 在采纳路径中明确描述了他选择用 Agent 的场景:安全关键系统的核心逻辑、他尚未完全理解的新领域、需要快速试错的早期探索阶段(此时 AI 的输出会干扰他对问题本质的理解)。

这个判断来自阶段 3(重复自己的工作)的洞见:AI 是放大器,放大你已有的判断力;在你判断力不足的地方,AI 只会加速犯错

决策三:对初级开发者的担忧

Hashimoto 明确表达了对缺乏扎实工程基础的开发者使用 AI Agent 的担忧:他们缺乏判断 AI 输出质量的能力,会在 AI 犯错时无法识别,更无法构建 harness 来防止再次犯错。

这个担忧触及了 harness engineering 的一个结构性张力:构建 harness 需要工程专业知识,但 harness 本身又被宣传为让开发变得更简单。对于没有工程背景的人,harness 门槛可能高于它宣称能降低的门槛。

性能数据

个人开发者视角的性能数据主要是定性的:

  • 阶段 5 后:常规任务的时间消耗下降约 60-70%(估算)
  • AGENTS.md 长度:保持在 50-200 行(避免臃肿)
  • 验证脚本覆盖的错误类型:随时间增长,作为”错误库”积累

独特洞见

Hashimoto 案例的最独特价值是六阶段采纳模型的操作性。它不是抽象的成熟度框架,而是每个阶段都有具体的触发条件和可观测特征。开发者可以用这个框架定位自己在哪个阶段,以及下一步应该做什么。

另一个独特洞见是Harness 的个人知识产权属性。一个人积累的 AGENTS.md 和验证脚本库,是他和 AI 协作经验的沉淀,不可转移、不可复制。这暗示了一个竞争力来源:同样使用 Claude,有多年 harness 积累的工程师和刚开始使用的工程师之间,会存在可量化的效率差距。

局限与未解问题

  • 个人 harness 如何迁移?当从一个项目转到另一个项目时,多少 harness 是可复用的?
  • 个人 harness 的维护成本如何随复杂度增长?是否存在过度工程化的风险?
  • 阶段 3(重复自己的工作)要求的工程专业度,是所有人都应该经历的门槛,还是可以被更好的工具降低?

跨案例对比分析

对比表格

维度OpenAIStripeCursorAnthropicHashimoto
团队规模3→7 人未披露(企业级)未披露(产品公司)工程团队个人
代码规模百万行(新建)数亿行(存量)产品代码库内部产品个人项目
周吞吐量~245 PR / 周> 1000 PR / 周~1000 次提交未公开未量化
架构类型单层 + 严格分层架构多 Agent 并行递归规划者 + 专职工作者GAN 式规划/生成/评估单 Agent + 验证脚本
人类参与度逐步向 agent-to-agent 转移全部 PR 人工审查监督性参与架构设计级参与全流程监督
核心 harness 组件AGENTS.md + 自定义 linter + doc-gardeningdevbox + Toolshed + MCPRust 编排系统 + 绿色分支策略冲刺合约 + 上下文重置 + 独立评估者AGENTS.md + 验证脚本
独特创新零人工代码 + doc-gardeningMCP 工具标准化 + 反馈左移四代架构演进 + 反脆弱性设计评估/生成分离 + 上下文焦虑应对六阶段采纳模型
代表的采纳阶段全面 Agent-First企业级 AI 增强产品级 AI 原生架构原理研究个人采纳路径

为什么不同公司选择了不同路径

路径分叉的根本原因:约束条件不同

五个案例的架构差异,本质上是不同约束条件下的理性选择,而不是孰优孰劣的问题。

代码库年龄是最关键的分叉点。OpenAI 从空 repo 开始,可以自由设计 agent-first 架构;Stripe 有数亿行历史代码,任何 harness 方案都必须与现有代码约定兼容。这两种约束几乎必然产生不同架构。

团队对风险的容忍度产生了第二条分叉线。OpenAI 的”零人工代码”原则和 Cursor 的”绿色分支”策略,都接受了一定程度的错误率以换取吞吐量;Stripe 要求所有 AI PR 经过人工审查,选择了更保守的质量保障。这不是谁对谁错,而是不同业务场景下不同的合理权衡——Stripe 处理支付系统,任何代码缺陷的成本极高。

模型能力假设产生了第三条分叉线。Anthropic 的架构刻意设计为可随模型能力演进而调整;Cursor 的四代演进说明他们每次架构重建都是因为模型能力发生了变化,旧架构的假设不再成立。OpenAI 的零人工代码原则,在两年前几乎不可能——模型能力的阈值决定了哪种 harness 架构是可行的。

收敛信号:三条跨案例共识

尽管路径差异巨大,五个案例在以下三点上有明确共识:

  1. 反馈越早越好:Stripe 的本地 linting < 5 秒、OpenAI 的自定义 linter 内嵌修复指令、Hashimoto 的验证脚本——都在把反馈推向执行管道的最前端,避免错误扩散到后续环节。

  2. 约束优于指令:Cursor 明确说”约束优于指令,数值范围优于模糊量词”;OpenAI 的自定义 linter 把架构约束编码为机器可执行规则;Anthropic 的”冲刺合约”把完成标准明确化。所有案例都在把人类的判断转化为机器可验证的约束,而不是依赖 AI 正确解读模糊指令。

  3. 最简可行,按需增复杂度:Anthropic 明确提倡,Hashimoto 的六阶段模型体现,Cursor 的四代演进印证(每次增加复杂度都是因为当前架构遇到了具体瓶颈,而非预先设计)。

行业意味着什么

架构没有收敛,说明这是一个窗口期。五个最前沿的团队用了截然不同的架构,没有哪个方案被普遍采纳。这意味着两件事:第一,现在是建立竞争优势的时机,差异化的 harness 可以产生差异化的工程效率;第二,过早锁定某种架构可能是错的,需要保持架构的可演进性。

工具标准化是下一个竞争点。Stripe 的 MCP + Toolshed 架构,以及 400+ 工具的统一暴露,预示了企业 harness 工具层的标准化趋势。谁能建立这一层的标准,谁就能在 AI Agent 基础设施上占据类似 AWS 的位置。

Harness 将成为工程师的核心竞争力。Hashimoto 的采纳模型揭示了一个长期趋势:harness 积累是可以时间加权的竞争优势——早期投入越多,积累越深,和后来者的差距越大。AGENTS.md 和验证脚本库就是这种竞争优势的具体形态。对于个人开发者,这意味着”我的 harness”将和”我的技术栈”一样成为简历的核心内容;对于公司,这意味着 harness 知识产权的保护和传承将成为工程文化的重要议题。

人类角色在向设计端移动。OpenAI 从逐行审查代码转向 agent-to-agent 审核,Anthropic 的架构把人类放在”设计评估者架构”而非”执行评估”的位置。这个趋势在五个案例中都有体现——人类参与的具体内容从执行转向设计,从审查输出转向设计审查系统。这要求工程师具备的核心技能从”如何写好代码”转向”如何设计让 AI 写出好代码的系统”。

3 Harness Engineering:核心争议与辩论

Harness Engineering:核心争议与辩论

📍 位置:Harness Engineering / 争议分析 📌 核心发现:Big Model vs Big Harness 不是非此即彼,而是在不同时间尺度上都正确——短期 harness 创造显著价值,长期模型进步可能使部分 harness 过时,但”系统设计”这一元技能永远不会过时 📥 输入:Latent Space, METR, Cursor, Anthropic, Mitchell Hashimoto 📤 流向:→ findings.md [争议与判断部分]


前言:为什么这些争议至关重要

Harness Engineering 是一个还在剧烈形成中的概念。它的边界、价值和长期走向,目前行业内并无共识。这种不确定性恰好是理解它的入口——真正重要的概念往往会引发真正的分歧,而不是让所有人点头称是。

本文梳理五个核心争议维度,每个维度都呈现真实的多方声音,最后给出综合判断。读完这篇文章,你应当形成的不是”谁说得对”的结论,而是”在什么条件下哪个判断更有效”的判断框架。


一、Big Model vs Big Harness:这是 AI 时代最重要的技术路线之争

这是整个 Harness Engineering 讨论的核心分歧。它的本质是:获取 AI 价值的主要瓶颈在哪里?

一边说:瓶颈在模型能力,强大的模型会让复杂的 harness 变得多余。 另一边说:瓶颈在你自己,是你整合和驾驭 AI 的能力制约了你获得的价值。

这不是学术辩论。它直接决定了你应该把工程时间投在哪里。

1.1 Big Model 派:模型为王

Noam Brown(OpenAI,推理研究负责人)的核心立场

Noam Brown 是目前 Big Model 派最有分量的声音之一,他的立场来自推理模型的实际研究经验。他的核心论断是:随着推理时计算(test-time compute)的出现,AI 系统能够在任务执行时进行动态思考和规划,而这将使许多精心设计的 agentic scaffolding 变得多余。

在他的叙事框架里,当前那些精巧的多 Agent 协调框架、复杂的上下文管理逻辑、以及各种 harness 技巧,很大程度上是在用工程手段补偿模型能力的不足。一旦模型能力跨越某个阈值,这些补偿措施就会成为累赘而非优势。他的类比是:你不会为一台足够强大的 GPS 导航仪再额外设计一套路径优化 harness——直接信任设备就好。

METR 的实证数据

METR(模型评估与威胁研究机构)的研究在这场辩论中投下了一个有利于 Big Model 派的数据点:Claude Code 与简单的基础 scaffold 相比,在 SWE-bench 上的性能差异并不显著。

这个发现颇为刺眼,因为 Claude Code 是 Anthropic 花费大量工程投入打磨的成熟 harness 产品,而”基础 scaffold”只是一个最小化封装。如果两者性能差不多,那么 harness 的增量价值从何而来?

Scale AI SWE-Atlas 的数据

Scale AI 的 SWE-Atlas 数据集提供了另一个有意思的角度。在他们的评测体系里,Opus 4.6 在 Claude Code 中仅领先裸模型约 2.5 个百分点;而 GPT 某版本的数据甚至出现了 harness 反向拉低性能的情况。这暗示:harness 对某些模型的增益可能在统计误差范围之内,而不是系统性的稳健优势。

Claude Code 团队的”模型第一”哲学

有一个鲜为人知但极具说服力的事实:Claude Code 团队自己持有的工程哲学是”秘密全在模型中”。他们有意识地最小化 harness 的复杂度,将工程资源优先投入到让模型本身更好地理解和执行任务上。这不是反对 Harness Engineering,而是一种关于优先级的判断——如果每 1 单位的工程时间可以选择投入模型改进或 harness 改进,他们选择前者。

Bitter Lesson 的幽灵

Richard Sutton 的 Bitter Lesson 是 Big Model 派最强大的历史性论证:过去几十年,人类工程师耗费巨大心血设计的”聪明”算法,几乎无一例外地输给了”愚蠢但 scalable”的大规模计算方法。

知识表示系统输给了神经网络。符号规划器输给了端到端学习。精心设计的特征工程输给了让模型自己学特征。如果历史规律成立,那么今天我们精心设计的 harness,也终将在足够强大的模型面前变得多余。

1.2 Big Harness 派:工程为王

Jerry Liu(LlamaIndex 创始人)的核心立场

Jerry Liu 是目前 Big Harness 派最清晰的代言人,他的论断简洁而尖锐:“模型 Harness 就是一切。”

他的逻辑起点与 Noam Brown 完全不同:他不关心模型理论上能做什么,而关心你实际上能从模型中提取出多少价值。在他的框架里,获取 AI 价值的最大障碍从来不是模型能力的上限,而是你自己整合 AI 的能力——你的上下文工程水平、你的约束设计能力、你的反馈回路质量。

这个视角下,即便模型能力翻倍,如果你不知道如何构建有效的 harness,你实际获得的价值可能只会增加 20%。反之,即便模型保持不变,一个优秀的 harness 工程师可能将价值提取效率提升 5 倍。

一项关键研究的发现

有一项研究(具体来源在 Latent Space 的分析中引用)提供了 Big Harness 派最有力的实证支持:仅改进 harness 设计,就能让 15 个来自不同厂商的 LLM 显著提升在同类任务上的性能。

注意这个研究设计的巧妙之处:15 个不同的模型,控制住模型变量,只改变 harness——结果是全面提升。这意味着 harness 的改进效果是模型无关的,它是一种独立于模型能力的价值来源。

Cursor 500 亿估值的隐含含义

Cursor 的 500 亿美元估值是整个 Harness Engineering 讨论中最常被引用的市场信号。Cursor 本身不是一个模型公司——它不训练基础模型,它只是将现有模型(包括 Anthropic、OpenAI 的模型)封装在一个精心设计的开发者 harness 里。

500 亿的估值意味着什么?意味着市场认为,在相同的底层模型能力之上,Cursor 创造的那层 harness 本身就值几百亿美元。这是市场对”harness 作为护城河”这一命题最直接的投票。

对 Big Model 派的反驳是:如果模型最终会变得足够强大,Cursor 的护城河不就消失了吗?Cursor 自己的回答体现在他们一周内协调数千个 Agent 完成约 1000 次提交的工程实践中——他们在不断加深 harness 的壁垒,而不是等待模型来替代它。

OpenAI 的自我矛盾

OpenAI 的案例极具讽刺意味地支持了 Big Harness 派。这家最坚定持有”模型第一”立场的公司,自己花了 5 个月专门投入 harness 基础设施建设——而不是等待更强的模型来解决问题。

Ryan Lopopolo 的工程博客详细记录了他们如何设计 AGENTS.md 约束系统、如何建立自定义 linter、如何做”垃圾回收”。这些都是典型的 harness 工程实践。OpenAI 的口号是”模型第一”,但他们的工程实践是”harness 保证工程价值落地”。

Stripe 的务实理由

Stripe 选择自研 harness(而不是使用市场上的通用工具)给出了一个非常具体的理由:通用工具在他们的规模和合规要求下根本不够用。每周 1000 个 AI 生成 PR 的流水线,需要的是定制的隔离 devbox、定制的 MCP 工具连接层、定制的验证规则——这些都无法从通用产品里直接获得。

这说明了一件事:随着 AI 集成深入到企业核心业务,harness 需求的定制化程度会不断上升,通用解决方案的适用边界会越来越有限,而自研 harness 能力就越来越有价值。

1.3 辩证分析:谁说得更对?

“人的价值 vs 位置的价值”类比

有一个有趣的类比可以帮助我们理解这场争论的本质。在量化交易领域,有一个经典问题:一名顶级交易员创造的超额收益,有多少来自他本人的技能,又有多少来自他所在机构的信息优势、资本优势、系统优势?

类似地,在 AI 系统中,性能提升有多少来自模型(相当于”个人技能”),有多少来自 harness(相当于”机构位置”)?

这个类比的意义不在于给出答案,而在于揭示这个问题本身是伪问题。最优秀的交易员在最好的机构工作——个人技能与机构优势是相乘关系,而不是替代关系。同样,最好的 harness 配合最好的模型,效果才是最大化的。

时间尺度上的分歧

如果把 Big Model 派和 Big Harness 派的分歧放在时间轴上,它们就不再是矛盾的了:

  • 短期(1-3年):harness 创造显著且可量化的价值。模型能力的提升不均匀,对特定任务类型(尤其是需要深度上下文理解和长任务维持的场景)仍然有明显上限。在这个时间窗口内,harness 工程是真实的竞争优势。

  • 中期(3-7年):模型能力的提升会使当前一些精巧的 harness 技巧变得多余,就像当年的特征工程被端到端学习取代一样。但这不会消灭 harness,而是会把 harness 的重心从”补偿模型弱点”转移到”放大模型优势”。

  • 长期(7年以上):harness 的形态可能与今天截然不同,但”如何设计系统让 AI 在约束下可靠工作”这个元问题不会消失。这是一个关于系统设计的问题,而系统设计是人类工程实践中最持久的问题。

可能的综合观点

Big Model 派说的是:不要把工程赌注全押在今天的 harness 技巧上,因为它们有变成历史遗迹的风险。 Big Harness 派说的是:不要等待一个完美的模型,因为现在就有实际问题需要解决,而 harness 是解决它们的工具。

两者都是对的,只是在回答不同的问题。真正危险的是把这场争论变成一种宗教信仰——要么固执地投入大量工程资源构建注定被模型进步淘汰的复杂 harness,要么因为担心 harness 被淘汰而不投入任何工程实践。

最稳健的策略或许是:投资那些即使在更强模型出现后仍然有价值的 harness 设计——主要是评估层、可观测性层、和安全约束层,而不是那些只是在补偿当前模型弱点的 workaround。


二、评估陷阱:我们真的知道 Agent 有多好吗?

如果说 Big Model vs Big Harness 是战略层面的争议,那么”benchmark 可信度”问题就是战术层面最不容忽视的炸弹。

2.1 METR 的重磅发现

METR 做了一件听起来简单但结果令人不安的事:他们不只看 SWE-bench 的自动评分,还把那些”通过”的 PR 拿给真实的代码库维护者看,问他们:这个 PR 你会合并吗?

结果是:约半数通过 SWE-bench 自动评分的 PR,不会被真实维护者合并。

具体数据令人印象深刻:

  • Claude Sonnet 4.5 的 SWE-bench 自动评分:约 70%
  • 同一批 PR 经维护者实际审查的合并率:约 50%
  • 差距:约 20 个百分点的系统性偏差
  • 参照基准:人类工程师提交的 PR 被合并率:约 68%

这意味着什么?意味着当一个 AI Agent 告诉你”我通过了测试”,它有相当大的概率是通过了一个不能代表真实质量的测试。

为什么会出现这个偏差?

METR 的分析指向几个核心原因:

第一,benchmark 测试关注”功能正确性”,但维护者还关注代码质量、可读性、与现有代码风格的一致性、以及对未来维护的影响。一个”能跑过测试”的 PR 和一个”值得进入代码库”的 PR 是两件不同的事。

第二,AI Agent 有时会通过”黑魔法”通过测试——针对测试用例的特定行为,而不是真正解决底层问题。这在人类代码审查中很容易被发现,但在自动评分中可能被忽略。

第三,自动评分系统本身也是用 LLM 或启发式规则写的,它和被评分的 Agent 使用相同的语言,有相同的盲点。这是一种评估系统性风险,而不只是随机误差。

2.2 对 Harness Engineering 的深层含义

这个发现对 harness 设计有三个直接含义:

含义一:如果 benchmark 不可靠,那么以 benchmark 为目标优化的 harness 是在优化错误的目标。

这是一个深刻的困境。许多 harness 的迭代逻辑是:运行 benchmark → 发现失败案例 → 调整 harness → benchmark 分数提升 → 宣布改进。如果 benchmark 本身存在系统性偏差,这个循环就是在原地打转,甚至可能在往错误方向跑。

含义二:harness 的验证层必须超越 benchmark,包含真实质量评估维度。

这是 METR 报告对 harness 设计者最直接的处方。评估 AI 代码质量不能只看”测试通过了多少”,还需要看代码的可读性(可以用静态分析工具量化)、与代码库风格的一致性(可以用 linter 规则约束)、以及架构边界的遵守程度(可以用结构测试检验)。

含义三:需要新的评估范式,而构建这个范式本身就是 harness engineering 的核心任务之一。

既然自动化评估存在系统性偏差,那么解决方案之一是将人类判断引入评估回路——但不是让人审查每一个 PR(这无法规模化),而是让人设计出能捕捉真实质量信号的评估规则,然后用这些规则自动化评估。

这正是 harness 工程师应该做的事:不是执行具体的代码审查,而是设计一套能在无人干预下持续捕捉质量信号的评估系统。

2.3 代码质量 vs 功能正确性的鸿沟

这个争议背后隐藏着软件工程领域的一个老问题:我们如何定义”好代码”?

功能正确性是最容易量化的维度:代码跑通了吗?测试过了吗?这也是 AI Agent 最容易优化的维度——它就是被设计来完成任务的,而”任务完成”等同于”功能正确”。

但真实软件工程关心的远不止于此:

  • 这段代码六个月后还能被理解和修改吗?
  • 它在边缘情况下的行为是可预测的吗?
  • 它引入了哪些隐性依赖或性能风险?
  • 它遵守了这个团队约定的架构原则吗?

AI Agent 在功能正确性上的进步速度令人叹为观止,但在代码”可维护性”这个更软性的维度上,进步要缓慢得多。这恰好是 harness 能够发挥最大作用的地方:通过明确的规则、linter 约束、结构测试,把那些软性质量标准转化为可被机器验证的硬性约束。


三、Anthropic 揭示的 Agent 固有弱点:模型问题还是 Harness 问题?

Anthropic 在他们的 harness 设计工程博客中直接点名了长任务 Agent 的两大根本失败模式。这两个失败模式引发了一个棘手的争议:它们是需要 harness 来解决的工程问题,还是需要更好模型来解决的模型问题?

3.1 两大失败模式的具体表现

失败模式一:上下文衰减(Context Decay)

随着任务的推进,上下文窗口不断累积信息,模型的行为会逐渐”漂移”。早期的指令和约束慢慢被压入”远端上下文”,模型对它们的注意力权重下降,导致任务后期的行为偏离初始设定。

具体症状包括:

  • 任务执行到后半段时忘记了前面建立的约定
  • 对早期确立的架构约束的遵守越来越松散
  • 在长任务结尾时产出质量明显低于任务开始时

失败模式二:自我评估偏差(Self-Evaluation Bias)

模型在评估自己的输出时,倾向于给出过于乐观的判断。在长任务场景中,这个问题被放大了:模型不仅会对自己的代码质量过于自信,还会在被要求”再检查一遍”时,倾向于认为之前的工作已经足够好,无需修改。

这种偏差与人类的”作者偏见”类似——你很难客观评估自己写的东西,因为你理解自己的意图,而你的意图填补了实际输出中的漏洞。模型也有类似的机制。

额外症状:“上下文焦虑”

除了 Anthropic 正式命名的两个失败模式,实践中还发现了一个有趣的现象:当上下文窗口接近限制时,Agent 会出现”上下文焦虑”——开始仓促地试图”收尾”,提前结束任务、跳过某些步骤,或者做出非常保守的选择。

这种行为模式类似于人类在截止日期压力下的表现:不是最优决策,而是”够快完成”的决策。

3.2 这是模型问题还是 Harness 问题?

这里产生了一个真正的分歧。

认为这是模型问题的观点:

上下文衰减和自我评估偏差归根结底是注意力机制的局限,是 Transformer 架构的内在特性。随着模型能力的提升,这些问题会自然减轻——更长的有效上下文窗口、更好的位置编码、更强的自我校正能力,都在朝这个方向改进。过多投入 harness 来解决这些问题,等于在为一个临时问题构建永久解决方案。

认为这是 Harness 问题的观点:

即便未来的模型能更好地处理上下文衰减,在那一天到来之前,你仍然需要可工作的系统。Anthropic 自己的解决方案——上下文重置(非压缩)——是一个 harness 层面的方案:在关键节点完全清空上下文并重新加载结构化状态,而不是试图压缩保留所有历史。这个方案有效,可以现在就部署。

更重要的是,即便模型能更好地处理长任务,“系统应该在什么时候重置状态?以什么方式重置?保留哪些状态?“这些仍然是需要 harness 设计的系统级决策,而不是可以完全交给模型自主判断的问题。

综合判断:

这些失败模式的根本原因在模型,但当前最有效的缓解措施在 harness。这是一个典型的”短期 harness,长期 model”的情形——你可以用 harness 买时间,同时等待模型能力的提升逐步接管这些工作。

关键是不要过度投资那些只是”填模型的坑”的 harness 设计——因为坑会被填满,但那些 harness 会留下来成为技术债。更值得投资的是那些即便在模型大幅改进后仍然有意义的 harness 设计,比如状态管理机制、角色分离架构、和验证层设计。


四、初级开发者困境:Harness Engineering 加剧了技能分化吗?

这是一个可能对整个行业产生深远影响但目前讨论得不够深入的争议。

4.1 Mitchell Hashimoto 的担忧

Mitchell Hashimoto 是 Harness Engineering 最具影响力的实践者和传播者之一。但他在自己的 AI 采纳历程博客中,提出了一个让人不安的担忧:

如果你没有扎实的技术基础,你将无法有效地使用 AI——即便 AI 可以帮你写代码。

他的逻辑是:你不能审查你不理解的代码。

AI Agent 会产出大量代码,但这些代码的质量参差不齐,需要工程师进行判断和审核。这个审核能力本质上要求审核者有足够的技术深度——否则,他们只能做表面审核(能跑就行),而这正是 METR 发现的那种”通过自动评分但不会被维护者合并”的代码得以大量进入代码库的原因。

换句话说:Harness Engineering 提高了有技术深度的工程师的生产力,但对于缺乏基础的工程师,它可能创造一个危险的幻觉——你看起来在交付代码,但你实际上不知道自己在交付什么。

4.2 “无法审查你不理解的代码”的深层含义

这个观察的射程比初看起来要宽得多。

它不只适用于代码审查。在 Harness Engineering 的语境中:

  • 你无法设计有效的 linter 规则,除非你知道什么样的代码模式是有问题的
  • 你无法写出有用的 AGENTS.md 约束,除非你知道 Agent 在你的代码库里会产生什么样的典型错误
  • 你无法判断 benchmark 结果是否可信,除非你能独立评估代码质量
  • 你无法做”垃圾回收”,除非你能识别什么是 AI 产生的技术债

这意味着 Harness Engineering 实际上对工程师的技术基础提出了更高要求,而不是更低要求。它是一种放大器,而不是替代物。

4.3 技能分化的可能路径

如果 Mitchell Hashimoto 的担忧成立,那么 Harness Engineering 的普及可能产生以下技能分化效应:

顶层:有深厚技术基础的工程师,通过 harness 显著放大自己的产能,成为 10x 甚至 100x 工程师。

中层:有基本技术能力的工程师,能够做基本的 harness 管理和代码审核,生产力适度提升,但无法充分发挥 harness 的潜力。

底层风险:技术基础薄弱的工程师,通过 harness 表面上产出了大量代码,但代码质量低下、技术债累积,长期看可能产生负价值。

这种分化在今天已经可以观察到。AI coding 工具的普及确实降低了产出代码的门槛,但也使”能写代码”和”能写好代码”之间的差距更加明显。

4.4 反面论点:Harness Engineering 本身就是一种新技能

Mitchell Hashimoto 的担忧有其合理之处,但也有重要的反驳:

第一,Harness Engineering 本身正在成为一种独立的工程专业方向。

就像测试工程、DevOps、SRE 都是从”每个开发者都应该会的基础技能”演化成独立专业方向一样,Harness Engineering 也可能走相同的路径。你不需要是全栈专家才能成为一名优秀的 harness 工程师——你需要的是对 AI 行为、系统设计和约束理论有深入理解。

第二,AI 工具本身在降低技术学习的门槛。

矛盾的是,AI coding 助手也在帮助初学者更快地建立技术基础——通过即时解释、错误修复和代码示例。一个初级开发者通过与 AI 结对编程,可能在短得多的时间内理解复杂的代码模式,而不是孤独地对着报错信息发呆。

第三,历史先例说明担忧通常是过度的。

每一波生产力工具的普及都会引发类似担忧:高级语言会让程序员不再理解底层;IDE 会让程序员丧失写裸代码的能力;Stack Overflow 会让开发者无法独立解决问题。这些担忧都有一定道理,但都没有导致行业整体技能崩溃。

综合判断:

担忧是有意义的,但不应该变成阻止使用 harness 工具的理由。正确的应对方式是:在使用 harness 工具的同时,有意识地保持对底层的理解——定期在没有 AI 的情况下独立完成任务,就像飞行员需要定期做手动飞行训练一样。

Mitchell Hashimoto 自己的第二阶段(“重复自己的工作”)就是这个原则的体现:先手动完成任务,再用 Agent 复现。这既建立了基础能力,又熟悉了 Agent 行为,是防止技能退化的有效实践。


五、概念炒作 vs 真实创新:“这只是换了名字的 DevOps”?

任何新概念都会面临一个质疑:这到底是真正的创新,还是给旧酒装新瓶?Harness Engineering 也不例外。

5.1 批评者的核心论点

“这只是换了名字的 DevOps/SRE”

最强的批评来自这个角度:Harness Engineering 的核心实践——自动化测试、约束执行、反馈回路、监控可观测性——这些在 DevOps 和 SRE 运动中都有充分的讨论,而且已经有成熟的工具链支持。

AGENTS.md?那只是一个 AI 专用的 README。 自定义 linter?那只是稍微调整的 ESLint/SonarQube。 反馈回路?那只是 CI/CD pipeline 的 AI 版本。 “垃圾回收”?那就是技术债管理,这个词已经用了几十年了。

从这个角度看,Harness Engineering 的出现不是因为出现了全新的工程问题,而是因为出现了新的工程角色(AI Agent)需要被管理。它是现有工程实践向新领域的延伸,而不是范式性的突破。

“炒作信号”论

AIE Europe 2026 专门设立了 Harness Engineering 专题轨道。批评者认为这是一个炒作信号,而不是行业认可信号——真正重要的技术概念通常在成为会议专题之前就已经有深厚的实践积累,而 Harness Engineering 的命名和概念化时间线相对来说还很短。

5.2 确实新的部分是什么?

公平地说,Harness Engineering 确实有几个在 DevOps/SRE 框架下没有先例的新问题:

第一,不确定性的来源变了。

传统 DevOps 管理的系统是确定性的——相同的输入永远产生相同的输出,失败有明确的原因,可以通过日志追踪和复现。AI Agent 引入的是概率性和涌现性:相同的提示在不同运行中可能产生完全不同的代码,失败的原因可能是上下文顺序、随机 seed、或者难以解释的模型内部状态。这要求新的调试和验证方法。

第二,“生产者”变成了黑盒。

在传统工程中,工程师是代码的作者,他们了解自己写的代码的意图。CI/CD pipeline 是在验证人类作者的工作。在 AI Agent 工程中,“作者”是一个对其意图和决策过程缺乏透明度的黑盒,这从根本上改变了审查和验证的性质。

第三,规模和速度的改变带来了质变。

Stripe 每周 1000 个 AI PR,OpenAI 每人每天 3.5 个 PR——这些数字使得传统的基于人工审核的质量管理根本无法规模化。这不只是量的变化,它要求对质量管理体系进行根本性重设计,这是 DevOps 时代没有面对过的挑战。

第四,“垃圾回收”的性质不同。

AI 产生的技术债与人类产生的技术债有不同的特征:它更难被发现(AI 代码可能表面上看起来很整洁),它可能有系统性的模式(来自 AI 训练数据的偏见),它累积的速度更快(高吞吐量下)。这要求专门的识别和清理方法。

AIE Europe 专题轨道:信号分析

关于 AIE Europe 专题轨道,更有说服力的解读可能是:概念已经足够成熟,足以成为一个独立的培训和讨论主题,同时又足够新鲜,还有大量需要讨论和探索的空间。这个时机正是一个技术概念从”早期采纳者博客讨论”进入”行业标准化”过程的特征阶段,而不是炒作信号。

真正的炒作信号通常伴随着大量基金涌入、估值泡沫、和完全没有实践验证的宣称。Harness Engineering 的讨论主要来自有丰富实践经验的工程师(OpenAI、Stripe、Cursor),而不是市场营销人员——这是一个相对积极的信号。

5.3 综合判断

Harness Engineering 与 DevOps/SRE 的关系,最准确的描述可能是:继承性创新(Sustaining Innovation)而非颠覆性创新(Disruptive Innovation)

它继承了 DevOps 的核心思想(自动化、约束、反馈、监控),但把这些思想应用到了一个具有根本不同特性的新型生产角色(AI Agent)上,并且在这个过程中需要发展出新的方法论和工具。

这种继承性创新通常比颠覆性创新得到的关注要少,但在工程实践上同样重要,甚至更加实用——因为它不要求你抛弃已有的知识体系,而是在此基础上延伸。


综合判断:争议的地图与导航建议

梳理完这五个争议维度,我们可以画出一张争议地图:

哪些争议已有倾向性答案

benchmark 可信度问题是争议中共识最强的一个:自动评分与真实质量之间存在系统性偏差,这一点已经有 METR 的实证数据支持,且多个从业者的经验与之吻合。结论明确:harness 必须包含超越 benchmark 的验证层。

Agent 固有弱点的解决路径也有较强共识:现在用 harness 缓解,长期靠模型改进。上下文重置、角色分离、GAN 启发的多 Agent 架构,是目前实践中效果最稳定的方案。

哪些争议仍然开放

Big Model vs Big Harness 本质上是一个时间尺度问题,在 3-5 年的预测窗口内,没有人有足够数据给出确定性答案。最稳健的策略是构建那些在模型能力大幅提升后仍然有价值的 harness 组件。

初级开发者困境是一个需要更多时间来观察的社会性问题。行业技能分化的趋势是真实的,但历史先例显示这通常不会导致整体技能崩溃,而是会带来新的技能需求和职业路径。

穿越争议的实践原则

无论你站在哪个阵营,以下几个实践原则都是争议较小的:

  1. 不要为了 harness 而 harness。只在解决真实问题时引入复杂度,而不是因为”harness 是趋势”就过度工程化。
  2. 评估层要超越 benchmark。任何只依赖自动评分的质量管理体系都是不完整的。
  3. 保持 harness 的可替换性。如果你今天的 harness 在模型能力提升后需要大幅修改,修改它的成本应该是可控的。
  4. 技术基础不可跳过。harness 是放大器,在没有足够技术理解的基础上使用它,放大的是风险而不是价值。
  5. 从实际问题出发,而不是从框架出发。每当 Agent 犯错,才投入 harness 建设来防止它再犯——而不是提前设计一个”完美的” harness 等待问题出现。

这五条原则,无论 Big Model 派还是 Big Harness 派的预言最终成真,都会让你站在正确的一侧。


输入文件:evidence/信息源索引.md(Latent Space, METR, Anthropic, Cursor, Mitchell Hashimoto) 流向:→ findings.md [争议与判断部分]

4 Harness Engineering:开发者采纳指南

Harness Engineering:开发者采纳指南

📍 位置:Harness Engineering / 实践路径 📌 核心发现:采纳 Harness Engineering 有三条路径——个人开发者的渐进式(Mitchell Hashimoto 6阶段)、团队级的增量式、企业级的基础设施式——关键不是选哪条路径,而是从”修复 agent 犯的错”开始积累 📥 输入:Mitchell Hashimoto, OpenAI, Stripe, Martin Fowler, Philipp Schmid 📤 流向:→ findings.md [行动建议部分], → 产出/实践手册


前言:为什么需要分层采纳路径

Harness Engineering 不是一个可以一次性安装的软件包,也不是一套可以从零开始照抄的最佳实践清单。它是一种工程能力的积累过程——每次 Agent 犯错并被你工程化地修复,你的 harness 就成熟一点。

这个性质决定了采纳路径必须是渐进式的,而不是革命式的。OpenAI 的 3 人团队花了 5 个月;Stripe 的规模化流水线背后是数年的基础设施投资;Mitchell Hashimoto 的 6 阶段路径描述的是一个历时数月甚至数年的个人演化过程。

但这不意味着你必须等很久才能看到价值。恰恰相反,Harness Engineering 的一个核心特点是:从第一天就可以开始,而且每一步都有即时的收益。

本文按三个规模维度组织:个人开发者路径、团队路径、企业路径。这不是三个互斥的选择,而是嵌套的层次——团队路径建立在个人路径的基础上,企业路径建立在团队路径的基础上。


一、个人开发者路径:Mitchell Hashimoto 的 6 阶段模型

Mitchell Hashimoto(HashiCorp 联合创始人,Ghostty 终端作者)的 AI 采纳历程博客,是迄今为止最具操作性的个人 Harness Engineering 路径描述。他的 6 阶段模型不是理论框架,而是他本人亲身经历的演化轨迹,每个阶段都来自真实的切换时刻和具体的工具改变。

阶段一:从聊天到 Agent

核心转变:放弃纯聊天,切换到具备真实能力的 Agent

这是一个被大多数教程忽略的基础步骤。大量开发者对 AI 的使用停留在”聊天模式”——把问题贴进去,把答案复制出来,然后自己手动整合到代码里。这种模式的问题不是效率低(它确实有效),而是它没有建立任何可复用的工作方式,每次都是一次性的。

从聊天切换到 Agent,意味着你使用的 AI 能够:

  • 直接读取和写入文件
  • 在终端执行命令
  • 发起 HTTP 请求
  • 访问代码库的整体上下文

这个切换看起来简单,但在心理层面有一个重要的变化:你不再是在”使用 AI 辅助”,而是在”委托 Agent 完成任务”。这种认知转变是后续所有阶段的前提。

进入信号:你发现自己花大量时间手动把 AI 的建议整合进代码,而不是描述任务让 AI 自己去做。

具体做法

  • 选择一个具备文件系统访问和命令执行能力的 Agent(Claude Code、Codex CLI、Cursor Agent 模式等)
  • 从一个小型、有明确边界的真实任务开始委托(不要从最重要的任务开始)
  • 观察 Agent 的实际行为,注意它犯了什么错,以及你如何发现这些错误

常见踩坑

  • 过早委托核心业务逻辑或安全敏感的代码
  • 因为 Agent 犯了几次错就放弃,回到聊天模式
  • 没有给 Agent 足够的上下文,然后对它的输出质量感到失望

预期效果:在几周内,你会开始建立对”什么样的任务适合委托”的直觉,这个直觉是后续阶段的基础。


阶段二:重复自己的工作

核心转变:手动完成任务后,强制用 Agent 复现

这是整个 6 阶段中最反直觉的一步,也是最重要的一步。你刚刚手动完成了一个任务——然后你要求 Agent 把它重新做一遍。

这听起来是在浪费时间。实际上它在做两件事:

第一,建立参照基准。你知道这个任务的正确结果是什么,因为你刚刚做出来了。这让你可以对 Agent 的输出做出精确的质量判断,而不是猜测。

第二,发现 Agent 的错误模式。Agent 重现你的工作时会犯什么错?这些错误有没有规律?这些规律就是你的第一批 harness 建设线索。

进入信号:你已经开始用 Agent 完成一些任务,但还不确定它的输出是否可靠,以及在什么情况下可靠。

具体做法

  • 选择你最近手动完成的一个中等难度任务(不要太简单,否则学不到东西;不要太复杂,否则很难判断错在哪)
  • 为 Agent 写一份任务描述,尽量还原你当时的思路和背景,而不只是描述结果
  • 比较 Agent 的输出和你的手动输出,逐行检查差异
  • 记录 Agent 犯错的每一个具体位置,以及错误的类型

常见踩坑

  • 把任务描述写得太模糊,然后对 Agent 的不同输出感到困惑
  • 只比较最终输出,没有检查中间步骤
  • 发现错误后直接修复,没有记录下来形成系统

预期效果:经过 3-5 次这样的重复实验,你会开始看到 Agent 错误的模式——它在什么类型的任务上、什么类型的代码约定上,会系统性地犯同类错误。


阶段三:利用碎片时间启动深度工作

核心转变:工作日末尾启动深度研究或平行探索,由 Agent 在你不在时完成

到了阶段三,你已经对 Agent 的能力边界有了基本了解。现在是开始利用 Agent 最独特优势的时候:它不需要休息,可以在你工作之外的时间持续运作。

Mitchell Hashimoto 的实践是:在每个工作日结束时,给 Agent 启动一个”深度任务”——可以是对某个技术问题的全面调研、可以是某个功能的多个实现方案的平行探索、可以是代码库的健康检查。

第二天早上,你到桌前时,Agent 已经完成了这些工作。你的第一件事是审查 Agent 的产出,而不是从零开始工作。

进入信号:你对 Agent 的能力边界已经有基本感知,知道什么样的任务它可以在无监督状态下完成。

具体做法

  • 选择一个有明确完成标准的探索性任务(“分析这个代码库中所有超过 200 行的函数,给出重构建议”)
  • 确保任务的失败不会造成不可逆的影响(探索和研究类任务是最安全的起点)
  • 为任务写一份结构化的输出要求,让 Agent 知道什么样的产出格式是有用的
  • 第二天审查时,重点看 Agent 的思路是否合理,而不只是结论是否正确

常见踩坑

  • 启动任务前没有限制 Agent 的操作权限(Agent 在无人监督时的操作应该比有监督时更保守)
  • 任务定义不够具体,导致 Agent 产出大量但价值低的内容
  • 没有建立习惯性的审查流程,任务的产出没有真正被消化和利用

预期效果:你开始有”并行工作流”的感觉——你在做 A 的时候,Agent 在做 B。有效利用碎片时间使你的实际工作时间超过 8 小时,但不需要你真正工作更长时间。


阶段四:委托高确定性任务,专注创意工作

核心转变:把有明确规范的重复性任务完全委托给 Agent,自己专注于需要判断力的工作

这一步要求你对自己的工作进行精确的分类:哪些任务是”高确定性”的——有明确的输入输出规范、有客观的正确标准、不需要大量上下文判断?哪些任务是”低确定性”的——需要权衡和取舍、需要对业务或用户意图的深刻理解、结果没有唯一正确答案?

高确定性任务是委托的最佳候选:写测试、生成 API 文档、添加错误处理、格式化和重构不影响逻辑的代码、迁移代码库配置、添加日志和监控。

低确定性任务仍然应该由你主导:产品功能设计、架构决策、安全相关判断、用户体验权衡。

进入信号:你已经积累了足够多的 Agent 使用经验,对它的可靠性有分任务类型的具体感知。

具体做法

  • 花 30 分钟列出你日常工作中的任务清单,按”确定性”高低分类
  • 从最高确定性的任务开始,建立完整的委托 SOP:任务描述模板 + 输出格式要求 + 验证检查表
  • 建立”完成信号”——当 Agent 完成委托任务时,你知道要做什么检查来确认质量

常见踩坑

  • 把”看起来简单”的任务误判为”高确定性”(简单不等于确定性高,很多产品细节决策看起来简单但实际上有复杂的权衡)
  • 委托了任务但没有建立清晰的验证流程,结果 Agent 产出堆积但无法使用
  • 没有告诉 Agent 何时应该”暂停并问你”,导致它在遇到不确定时自行决策

预期效果:你的工时分配发生了结构性变化。你花在”执行”上的时间减少,花在”决策和判断”上的时间增加。这不仅是效率的提升,也是工作性质的提升。


阶段五:工程化——每次犯错就建一个防护措施

核心转变:不只是修复 Agent 的具体错误,而是设计系统让同类错误不再发生

这是 Harness Engineering 的核心阶段。Mitchell Hashimoto 对这个阶段的定义是整个调研中最精炼的一句话:

“每当发现代理犯错时,花时间工程化解决方案防止再次出现。”

注意这里的关键词是”工程化”,而不是”修复”。修复是在一个具体错误上打补丁;工程化是设计一个机制,使得整类错误不再发生。

工程化的三个层次

层次一:文档化(最简单) 把这类错误的避免方法写进 AGENTS.md 或相关配置文件。这是最轻量的 harness,但只靠语言约束的效果有限。

例:Agent 总是把工具函数放在错误的目录。 解决方案:在 AGENTS.md 里明确说明目录结构约定。

层次二:自动化验证 写一个可以重复运行的脚本或测试,检测这类错误的发生。当 Agent 犯同类错误时,验证失败,Agent 或工程师立即得到反馈。

例:Agent 写的函数经常缺少错误处理。 解决方案:写一个 ESLint 规则,检测特定模式的函数是否有错误处理逻辑。

层次三:约束执行 把错误的来源从 Agent 的可操作范围内移除,或者让产生错误的行为在结构上不可能发生。

例:Agent 在不应该修改配置文件的任务中修改了配置文件。 解决方案:在 Agent 的工作环境中,把配置文件设为只读,或者在 Agent 的工具链中移除对配置文件的写权限。

进入信号:你发现某类错误不止出现过一次,或者你修复了某个错误后不久又遇到了类似的错误。

具体做法

  • 建立一个错误日志(可以是简单的 markdown 文件),记录 Agent 犯的每一类有代表性的错误
  • 每次遇到错误,先问自己:“如果要让这类错误永远不再发生,我应该改变什么?“然后从三个层次中选择最合适的
  • 每隔一段时间(比如每周末),回顾错误日志,找出高频错误,优先工程化
  • 把工程化的防护措施纳入版本控制,让它随着代码库一起演化

常见踩坑

  • 只在层次一(文档化)停留,没有真正建立自动化验证
  • 过度工程化——为了一个出现过一次的低影响错误花几小时写复杂的防护,成本收益不划算
  • 防护措施写了但没有测试,当 Agent 行为变化时防护失效了却不知道

预期效果:随着时间推移,Agent 在你的代码库中犯的”新类型”错误越来越少。遇到新错误时,修复速度越来越快。你的 harness(AGENTS.md + linter 规则 + 结构测试)成为了一个越来越有价值的代码库资产。


阶段六:持续运行——Agent 全天候工作

核心转变:Agent 不需要等你”启动”,而是在合适的触发条件下自主开始工作

到了这个阶段,你已经建立了足够可靠的 harness,让 Agent 在一定程度上可以在无监督状态下安全运作。持续运行不是”Agent 随时随地做任何事”,而是”在特定触发条件下,Agent 自主完成有明确范围的工作,并在完成后通知你审查”。

持续运行的典型场景:

  • 每次有新的 issue 被创建时,Agent 自动尝试复现问题并生成调试报告
  • 每次主分支有新提交时,Agent 自动检查是否有已知的反模式或潜在问题
  • 定时运行代码库健康检查,生成每周报告
  • 监控 CI 失败,Agent 自动尝试定位失败原因

进入信号:你的 harness 已经稳定,Agent 在阶段五的约束下持续工作且错误率已经降到可接受的水平。你发现有些重复触发的工作可以自动化启动。

具体做法

  • 从最低风险的触发场景开始——只读操作(分析、报告)比写操作(代码修改)更适合持续运行的早期尝试
  • 为每个持续运行的工作流定义明确的通知机制:Agent 完成了什么、发现了什么问题、需要你做什么决策
  • 建立监控层:持续运行的 Agent 工作流本身需要被监控——它在做什么?它用了多少 token?它有没有进入死循环?

常见踩坑

  • 在 harness 还不够稳定时急于进入持续运行,导致 Agent 在无监督状态下系统性地犯错
  • 没有设置合理的速率限制和资源上限,导致 token 成本失控
  • 持续运行的通知太频繁或信噪比太低,变成另一个需要管理的噪音源

预期效果:你的代码库开始有”自我维护”的特性。不是 Agent 完全替代工程师,而是 Agent 持续处理那些有清晰判断标准的工作,工程师专注于需要人类判断的决策。


二、团队级路径:增量式建设

团队路径不是从零开始建立一个全新系统,而是在现有工程实践的基础上增量引入 harness 组件。基于 OpenAI、Martin Fowler 和 Stripe 的实践,这个路径可以分为五步。

Step 1:审视并盘点现有约束系统

核心问题:你已经有的 harness 是什么?

很多团队在没意识到的情况下已经有了 harness 的雏形:

  • pre-commit hooks 阻止提交不符合规范的代码
  • ESLint/SonarQube 等静态分析工具执行代码质量标准
  • CI/CD pipeline 提供自动化测试和部署约束
  • 架构决策记录(ADR) 记录了哪些技术决策以及为什么

在引入任何新组件之前,先做一次盘点:

盘点维度:

  • 哪些约束是自动化执行的(代码不符合就无法合并)?
  • 哪些约束是文档化但手动执行的(有文档但靠人来检查)?
  • 哪些约束是隐性的(老工程师知道但没有写下来)?

第三类约束对 AI Agent 来说是最危险的——Agent 不会从老工程师那里继承隐性知识。引入 AI Agent 的第一步就是把隐性约束显性化。

实践建议:

  • 开一个团队 workshop,把每个人知道的”不成文规定”收集起来
  • 把这些隐性知识转化为可执行的 linter 规则或测试
  • 把无法自动化的约束写进 AGENTS.md,至少让 Agent 知道它的存在

Step 2:建立 AGENTS.md——充当目录而非百科全书

核心原则:AGENTS.md 是导航文件,不是知识库

OpenAI 的工程实践给了一个非常清晰的 AGENTS.md 定义:它应该充当”目录”而非”百科全书”。上下文窗口是稀缺资源,一个几千行的 AGENTS.md 不仅消耗大量 token,还会稀释真正重要的信息的权重。

有效 AGENTS.md 的结构:

# AGENTS.md

## 快速入口
- 代码风格规范 → docs/code-style.md
- 架构约束说明 → docs/architecture-decisions.md
- 测试规范 → docs/testing-guide.md
- 禁止修改的文件 → .agentsignore(见文件列表)

## 核心约束(Agent 必须遵守)
1. 所有公共 API 函数必须有 JSDoc 注释
2. 修改 services/ 目录时必须同时更新对应测试
3. 不修改 migrations/ 下已提交的文件
4. 新建文件必须遵循 src/templates/ 中的模板

## 常见错误提示
- 如果 lint 失败,先看 .eslintrc.js 中的规则说明
- 如果测试失败,先检查是否有相关的 mock 数据需要更新
- 如果不确定架构放置位置,参考 docs/architecture-decisions.md 第 3 条

注意这个结构的特点:简短、有层级、以”导航”为主,具体内容在别的文档里。

常见错误:

  • 把所有约束都直接写在 AGENTS.md 里,导致文件几千行
  • 写的是”What”(代码风格是 X)而不是”Where”(完整的代码风格规范在 Y 文件里)
  • 更新了规范文档但没有更新 AGENTS.md 的链接,导致导航失效

Step 3:引入结构测试——验证架构边界

核心问题:如何确保 AI Agent 遵守架构约束,而不只是功能测试?

单元测试和集成测试验证代码的功能行为,但它们不验证代码是否遵守了你的架构约束。一个函数可以正确运行,同时违反了你的分层架构——把数据库访问逻辑放进了 UI 层,或者在不应该依赖的模块之间创建了循环依赖。

结构测试(Structural Tests)是专门验证架构边界的测试类型:

类型一:依赖测试 检查模块之间的依赖关系是否符合架构规定。

// 示例:验证 UI 层不直接导入 DB 层
test('UI layer should not import from DB layer', () => {
  const uiFiles = glob.sync('src/ui/**/*.js');
  uiFiles.forEach(file => {
    const content = fs.readFileSync(file, 'utf-8');
    expect(content).not.toMatch(/require.*src\/db\//);
    expect(content).not.toMatch(/import.*from.*src\/db\//);
  });
});

类型二:命名约定测试 检查文件和函数命名是否符合约定。

// 示例:验证所有服务类都以 Service 结尾
test('service files should export a class ending in Service', () => {
  const serviceFiles = glob.sync('src/services/**/*.js');
  serviceFiles.forEach(file => {
    const exports = require(file);
    const className = Object.keys(exports)[0];
    expect(className).toMatch(/Service$/);
  });
});

类型三:大小约束测试 检查函数或文件的复杂度是否超过阈值(防止 Agent 产出过长的函数)。

OpenAI 的实践是使用自定义 linter 而不是测试来执行这类约束,因为 linter 在编写代码时实时反馈,而测试只在提交后运行。两者结合是最好的选择。


Step 4:建立双层反馈回路

核心原则:反馈越早越快越好

Stripe 给出了量化的反馈速度目标:本地 linting 应在 5 秒内完成,最多允许两轮 CI 往返。这不只是用户体验建议——它直接影响 Agent 的工作效率和行为质量。

反馈太慢的后果是:Agent 开始下一个步骤时,还没有收到上一步的反馈,于是它在可能错误的基础上继续构建。当反馈最终到达时,需要回滚更大量的工作。

第一层:本地反馈(秒级)

目标:让 Agent 在每次文件修改后立即得到反馈。

实现方式:

  • file watcher + linter:每次保存后自动运行 ESLint/其他静态分析
  • pre-commit hook:在提交前运行快速检查(注意控制时间,超过 30 秒的 hook 会显著影响体验)
  • 即时测试运行:使用 Jest 的 watch mode,在相关文件修改后自动运行相关测试

第二层:CI 反馈(分钟级)

目标:完整的验证套件在合理时间内完成。

实现方式:

  • 拆分测试套件:快速测试(<1 分钟)和慢速测试(>1 分钟)分开运行
  • 并行化测试:利用 CI 的并行 job 特性,同时运行多个测试组
  • 缓存优化:缓存依赖安装和构建产物,减少重复工作

两层反馈的衔接:

Agent 在本地完成任务后,应该能够得到一个”绿灯”信号,表示本地检查通过,可以提交。提交后 CI 运行完整验证套件,再次提供反馈。这两层反馈的衔接点是 pre-commit hook——它是本地验证和 CI 验证之间的桥梁。


Step 5:建立 Agent 审核流程——从人工到 Agent-to-Agent

核心问题:谁来审核 AI 生成的代码?

这是一个过渡性设计问题:在 AI 生成大量代码的环境中,如何保证代码质量而不依赖无限的人工审核能力?

阶段一:人工审核(初期)

最开始,所有 AI 生成的代码都应该经过人工审核。目的不只是质量把关,更重要的是:

  • 建立对 Agent 行为模式的了解
  • 发现系统性错误,为 harness 建设提供素材
  • 训练团队成员的 AI 代码审查能力

阶段二:有针对性的人工审核(成熟期)

随着 harness 的成熟,某些类型的代码可以减少人工审核频率:

  • 已经有完整自动化验证覆盖的代码路径
  • Agent 历史错误率极低的任务类型
  • 不影响核心业务逻辑的纯辅助性代码

同时保持或加强对以下类型代码的人工审核:

  • 安全相关的逻辑(认证、授权、数据验证)
  • 核心业务流程
  • 数据库 schema 变更
  • 任何 Agent 没有类似历史记录的新领域

阶段三:Agent-to-Agent 审核(高级)

Anthropic 描述了 GAN 启发的多 Agent 架构:Generator(生成代码)+ Evaluator(评估代码)。这是 agent-to-agent 审核的一种实现。

在团队场景中,一个更实用的 agent-to-agent 审核方式是:

  • Generator Agent 生成代码变更
  • Reviewer Agent 检查变更是否符合 AGENTS.md 约束和代码风格规范
  • Reviewer Agent 的反馈直接返回给 Generator Agent 进行修正
  • 经过几轮内部迭代后,才将结果推送给人工审核

这种模式减少了进入人工审核队列的低质量 PR 数量,让人工审核更高效。


三、企业级路径:基础设施优先

企业级路径的核心特点是:不是逐步积累单个工具,而是先建立可以支撑规模化的基础设施,然后在这个基础设施上运行所有 AI 工作流。Stripe 的 Minions 系统是目前最完整的企业级 harness 案例。

基础设施投资:三个核心组件

组件一:隔离执行环境

Stripe 的核心设计选择是给每个 Agent 任务提供独立的 devbox(10 秒内启动),而不是让多个 Agent 共享同一个开发环境。

这个选择的意义:

  • 安全隔离:一个 Agent 的错误操作不会影响其他 Agent 的工作环境
  • 状态一致性:每个任务从干净的状态开始,避免历史任务的残留状态影响当前任务
  • 可重现性:任何失败都可以在相同的环境中精确重现和调试
  • 规模化能力:独立环境可以水平扩展,支持同时运行更多 Agent

实现这种隔离通常需要容器化技术(Docker、Nix、devcontainer),以及快速启动脚本(10 秒目标意味着不能在启动时做繁重的依赖安装,所有依赖应该预缓存)。

组件二:统一工具接口层(MCP)

Stripe 使用 MCP(Model Context Protocol)连接 400+ 内部工具。这个设计选择解决了一个关键问题:Agent 需要调用大量公司内部系统(代码审查、监控、部署、文档),而每个系统都有不同的接口。

MCP 提供了一个标准化的接口层,让 Agent 只需要学习一种调用方式,而不是学习 400 种不同的系统接口。这大幅降低了 Agent 的工具使用错误率,同时也让新工具的接入变得标准化。

对于不一定需要 400 个工具集成的团队,MCP 的核心价值是:

  • 标准化内部工具的 Agent 接口,避免每个 Agent 应用都有自己的工具调用方式
  • 为工具调用建立统一的日志和监控层,方便追踪 Agent 的行为
  • 支持工具版本管理,当内部系统接口变化时,只需要更新 MCP 层,而不是修改所有使用这个工具的 Agent

组件三:度量与可观测性堆栈

在规模化之前,你需要先能够测量。没有度量,你无法知道 harness 是否在发挥作用,也无法发现系统性问题。

核心度量指标:

指标含义目标
PR 合并率AI 生成 PR 中最终被合并的比例参考人类基准(~68%)应达到接近或相当的水平
CI 首次通过率AI PR 第一次推送就通过 CI 的比例越高越好,低于 50% 说明反馈回路需要优化
人工干预率需要工程师手动修改才能合并的 AI PR 比例随着 harness 成熟应该持续下降
平均修复轮次Agent 完成任务平均需要多少轮 CI 修复Stripe 目标是不超过两轮
上下文使用率任务平均消耗多少上下文窗口监控是否接近限制,提前触发上下文管理策略

规则系统的企业级设计

企业规模的代码库通常有多个子系统,每个子系统有不同的约束和规范。一个扁平的全局 AGENTS.md 无法满足这种复杂性。

条件化规则:根据 Agent 当前操作的上下文,应用不同的规则集。

# AGENTS.md(根目录)

## 通用约束
[适用于所有子系统的约束]

## 子系统路由
如果你在修改 src/payments/,请阅读 src/payments/AGENTS.md
如果你在修改 src/auth/,请阅读 src/auth/AGENTS.md
如果你在修改 infrastructure/,请阅读 infrastructure/AGENTS.md
# src/payments/AGENTS.md

## 安全约束(高优先级)
- 所有支付金额必须以分(整数)为单位存储,禁止浮点数
- 任何金额计算必须使用 BigDecimal,禁止普通加法运算
- 支付状态变更必须写入审计日志

## 外部依赖约束
- 禁止直接调用 Stripe API,必须通过 src/payments/clients/stripe-client.js
- 所有支付相关的外部调用必须有重试逻辑

这种分层结构让每个子系统的规则精确适用于相关的上下文,避免全局规则的过度约束或不足覆盖。

组织变革:新角色与新流程

企业级 Harness Engineering 最终会催生一些组织层面的变化:

Harness Engineer 角色(可能出现的新职能)

类似于 DevOps 工程师从开发者中分化出来,未来可能出现专职的 Harness Engineer,负责:

  • 设计和维护 AGENTS.md 体系
  • 建立和优化结构测试和 linter 规则
  • 监控 AI Agent 的行为度量
  • 识别和清理 AI 产生的技术债(“垃圾回收”)

目前这些职能通常由有兴趣的资深工程师兼任,但随着 AI 代码比例的上升,专职化是可能的趋势。

新的代码审查流程

传统的代码审查假设:每个 PR 都是一个工程师花了一定时间深思熟虑写出来的,审查重点是逻辑和设计。

AI 代码的审查需要额外关注:

  • 代码是否使用了正确的内部抽象(而不是重新实现已有的功能)
  • 代码风格是否与代码库的整体风格一致(AI 容易混入来自训练数据的不同风格)
  • 有没有过度工程化的迹象(AI 倾向于”完整解决”问题,即便简单方案更合适)
  • 是否存在 harness 没有覆盖的新型错误模式(发现后立即加入 harness)

四、通用 Anti-Patterns:从所有案例提炼的常见错误

跨越个人、团队和企业三条路径,以下错误在多个案例中反复出现,值得特别注意。

Anti-Pattern 1:AGENTS.md 百科全书化

症状: AGENTS.md 超过 500 行,包含大量”背景知识”和”最佳实践”解释。

为什么危险: 过长的 AGENTS.md 消耗大量上下文 token,稀释了真正约束性指令的权重。Agent 在处理一个具体任务时,真正需要的约束可能只有 5-10 条,但它必须处理整个几千字的文档。

正确做法: AGENTS.md 是目录,不是内容。把具体内容放在独立文档中,AGENTS.md 只保留指针和最核心的即时约束。


Anti-Pattern 2:过度约束导致创造力冻结

症状: Agent 在执行任务时表现得非常保守,产出的代码千篇一律,没有利用新的语言特性或设计模式。

为什么危险: 过度约束不只是效率问题,它可能使 Agent 无法提供真正的工程价值。你引入 Agent 是为了让它帮你更好地解决问题,而不是让它机械地按照一个固定模板写代码。

正确做法: 只约束真正需要约束的事情——安全边界、架构边界、团队约定。给 Agent 在这些边界内的充分自由。一个好的约束是”不能在 UI 层调用数据库”,而不是”所有函数必须按照这个格式写”。


Anti-Pattern 3:没有反馈回路,依靠人工审核扩展

症状: 随着 AI 代码产量上升,代码审查成为瓶颈,工程师花大量时间审查 AI PR。

为什么危险: 人工审核是线性扩展的,而 AI 代码产出可以指数级增长。如果 harness 没有自动化验证层,规模化等于直接等比增加审查负担。

正确做法: 每次为一类新错误建立自动化验证,把人工审核从”发现错误”转变为”处理例外情况”。人工审核应该是例外处理机制,而不是质量保障的主要机制。


Anti-Pattern 4:Benchmark 优化而非真实质量优化

症状: 使用 SWE-bench 等 benchmark 来衡量 harness 的改进效果,驱动 harness 的迭代方向。

为什么危险: METR 的研究已经证明,自动评分与真实代码质量之间存在约 24 个百分点的系统性偏差。以 benchmark 优化为目标的 harness 可能在优化错误的指标,导致代码”在测试中好看”但”在生产中不可维护”。

正确做法: 用真实的质量指标驱动 harness 迭代——PR 合并率、生产 bug 率、代码审查返工率。这些指标更难优化,但它们代表真实价值。


Anti-Pattern 5:忽略”垃圾回收”导致技术债累积

症状: AI 代码产量高,但代码库的质量随时间下降——重复代码增多、抽象层级混乱、命名不一致。

为什么危险: AI 以极高的速度产出代码,技术债积累的速度也是传统开发的数倍。OpenAI 用”高息贷款”来描述 AI 技术债的特性:它产生很快,但利息(维护成本)也收得很快。

正确做法: 把”垃圾回收”作为常规工程工作,定期安排时间专门清理 AI 代码库——合并重复代码、优化过度设计的部分、统一命名约定。不能等到债务危机再来处理。


Anti-Pattern 6:模糊指令的放大效应

症状: 给 Agent 的任务描述很模糊(“优化这段代码”、“让这个功能更好”),然后对 Agent 的各种意外行为感到困惑。

为什么危险: Cursor 的工程博客明确指出:“约束优于指令”,以及”模糊指令会放大不良行为”。一个模糊的指令不只是导致错误的输出,它会让 Agent 在不确定的情况下做出各种难以预测的决策,而这些决策的后果可能远超你的预期。

正确做法: 养成写精确任务描述的习惯。一个好的 Agent 任务描述应该包含:清晰的目标(做什么)、明确的范围(不要做什么)、完成标准(怎么判断任务完成)。


五、工具链推荐:当前生态中可用的选项

Agent 框架

工具定位适合场景
Claude Code终端原生 Agent,最小化 harness 哲学个人开发者,重视模型直接能力
Codex CLIOpenAI 开源终端 Agent个人开发者,习惯 OpenAI 生态
CursorIDE 集成,四代架构演进最成熟团队协作,代码库规模中到大
gooseStripe 使用的 Agent 框架,定制化强企业级,需要深度定制 harness
aider开源代码编辑 Agent,支持多模型个人开发者,开源优先

选择框架的核心考量:不是哪个框架最强大,而是哪个框架在你的约束条件下可以构建最有效的 harness。Stripe 选择 goose 的原因不是它性能最优,而是它可以被定制化到满足企业合规需求。

上下文管理

工具/方法用途
AGENTS.md全局和子系统级约束的声明式文档
CLAUDE.mdClaude Code 专用的项目级上下文配置
.cursorrulesCursor 专用的规则文件
OpenAI AGENTS.md 规范跨工具的通用格式(OpenAI 推广)
上下文重置机制Anthropic 推荐:在关键节点清空并重新加载结构化状态

约束执行

工具用途
ESLint + 自定义规则JavaScript/TypeScript 代码约束
RuffPython 代码质量和风格约束
自定义 linterOpenAI 和 Stripe 都推荐,用于执行 ESLint 无法覆盖的架构约束
结构测试(Jest/Pytest)验证模块依赖、命名约定、复杂度约束
ArchUnit(Java)Java 专用架构约束测试框架
pre-commit hooks提交前的快速本地验证层

反馈回路工具

工具用途
MCP(Model Context Protocol)Agent 与工具之间的标准化接口层
Playwright前端 Agent 的 UI 验证反馈
vitest / jest —watch实时运行相关测试的文件监听模式
Chrome DevTools MCP浏览器自动化验证,适合前端 harness
GitHub ActionsCI 层的验证套件,支持并行运行

编排与多 Agent 框架

工具用途
LangGraph有状态多 Agent 编排,适合复杂工作流
CrewAI角色化多 Agent 协作
自定义 supervisorCursor 和 OpenAI 都使用自定义 supervisor 而非现成框架
Anthropic multi-agent API原生支持 orchestrator + subagent 模式

注意:对于大多数团队,从自定义 supervisor 开始比引入完整的多 Agent 框架更合适。框架会增加学习成本和调试难度,而自定义 supervisor 更容易理解和修改。

监控与可观测性

工具用途
LangfuseLLM 调用的追踪和分析
Weights & Biases实验追踪,适合评估 harness 版本的性能差异
自定义 JSON 日志Stripe 使用的轻量方案:把 Agent 轨迹以结构化格式记录
Prometheus + Grafana度量指标的收集和可视化

Philipp Schmid 指出:Agent 执行轨迹将成为公司的核心竞争优势——它既是调试工具,也是未来训练数据。这意味着从第一天就应该记录轨迹,即使你暂时不知道如何使用它们。


结语:从哪里开始

不论你是个人开发者还是在企业团队工作,这里有一个最小化的起点建议:

第一步(今天就可以做):选择一个你已经在使用的 AI coding 工具,启用 Agent 模式,完成一个具体的小任务。观察它犯了什么错,记录下来。

第二步(本周):为这个错误建立第一个防护措施——可以是一条 linter 规则,可以是一个测试断言,可以是 AGENTS.md 里的一条约束。

第三步(本月):重复第一步和第二步 5-10 次。你会发现自己开始有了对”这个 Agent 在这个代码库里的行为模式”的直觉。

第四步(本季度):根据你积累的错误模式,设计一套系统化的验证流程。这时候 AGENTS.md、结构测试、和自动化 linter 规则会开始形成一个有机的整体。

Harness Engineering 没有”完成”的状态。它是一个持续演化的过程,随着 Agent 行为的变化和代码库的成长而不断调整。但每一步都是有价值的——每一个你工程化掉的 Agent 错误,都是一个你再也不需要手动修复的错误。


输入文件:evidence/信息源索引.md(Mitchell Hashimoto, OpenAI, Stripe, Martin Fowler, Philipp Schmid) 流向:→ findings.md [行动建议部分], → 产出/实践手册

调研发现

Harness Engineering — 调研发现

收敛自:0-概念定义与演化.md, 1-架构与核心组件.md, 2-工业实践案例.md, 3-核心争议与辩论.md, 4-开发者采纳指南.md, evidence/信息源索引.md(共 24 个信息源,含 5 篇 P0 官方文档、3 篇 P1 顶级工程师博客、2 篇 P2 独立研究机构报告)


Key Findings

  1. Harness Engineering 的最精炼定义来自实践而非理论:Hashimoto 的”每当发现 Agent 犯错,就工程化解决方案防止再次发生”——这比任何学术定义都更有操作性,因为它把 harness 描述为持续迭代的防错工程,而非一次性架构设计。(来源:Mitchell Hashimoto, P1)

  2. 工业规模已真实可达,但路径依赖极强:OpenAI 3人团队 5 个月 100 万行零人工代码,Stripe 每周 1000+ AI PR,Cursor 数千 Agent 并发——这三个案例证明了规模化的可行性,但三者走了完全不同的 harness 路径,说明没有通用最优解,只有约束条件下的最优解。(来源:OpenAI P0、Stripe P0、Cursor P0)

  3. Benchmark 可信度危机是 harness 设计的隐形地雷:METR 发现约半数通过 SWE-bench 的 PR 不会被真实维护者合并,Claude Sonnet 4.5 的评分-合并差距约 20 个百分点。以 benchmark 为目标优化的 harness,有很高概率是在往错误方向跑。(来源:METR, P2)

  4. “上下文是稀缺资源”是 harness 架构的第一原理:Transformer n² 注意力机制决定了上下文窗口的质量随填充量下降——不是线性下降,而是接近幂律下降。一个 100 行的 AGENTS.md 目录比一个 1000 行的百科全书,在信噪比上有 10 倍以上的差距。(来源:OpenAI P0、Anthropic P0,≥4 个源交叉验证)

  5. 约束优于指令——这是工业实践的最强共识:Cursor、OpenAI、Stripe 都独立得出了相同结论:把规则编码进 linter 和结构测试,比在 prompt 里反复强调效果强十倍以上,且不会随上下文衰减而失效。(来源:Cursor P0、OpenAI P0、Stripe P0,3个独立源一致)

  6. Big Model vs Big Harness 是伪二元对立:时间轴揭开了这场争论的本质——短期(1-3年)harness 创造真实可量化价值,中期(3-7年)模型能力进步将使”补偿模型弱点”型的 harness 过时,但”放大模型优势”型的 harness(评估层、可观测性、安全约束)无论模型多强都有价值。最危险的是把这场争论变成宗教。(来源:Latent Space P2、3-核心争议综合分析)

  7. 上下文重置优于上下文压缩:Anthropic 工程博客给出的长任务处理方案是反直觉的——在关键节点完全清空上下文并重新加载结构化状态,而不是试图压缩保留历史。压缩保留了噪音,重置保留了信号。这是目前工业实践中最有共识的长任务 harness 设计决策。(来源:Anthropic P0)

  8. Greenfield 友好,brownfield 仍是未解问题:公开的所有成功案例(OpenAI 百万行从零、Cursor 自驱动新代码库)几乎全是 greenfield 场景。Stripe 的 brownfield 接入是迄今最复杂的案例,但其核心解法(隔离 devbox + MCP 工具层解耦)的成本极高,不是大多数团队能复制的。(来源:2-工业实践案例综合分析)

  9. Agent 执行轨迹将成为公司级竞争壁垒:Philipp Schmid 的判断:harness 捕获的 Agent 执行轨迹既是调试工具,也是未来微调训练数据——“在正确的约束下,轨迹就是知识”。先积累轨迹的公司在未来的模型微调竞争中有先手优势。(来源:Philipp Schmid P1;属于”1-2 个源提到但密度极高”的信号)

  10. HumanLayer 实验提供了 harness ROI 的最强数据点:仅改进 harness 设计,Opus 4.6 在某评测中从第 33 名跃升至第 5 名,跨越了 28 个位次。这意味着:在模型能力固定的前提下,harness 的优化空间可能远大于直觉上的预期。(来源:3-核心争议综合素材)


一、共识(多源交叉验证的高置信结论)

1.1 上下文管理的”目录原则”(≥4 个独立源)

OpenAI、Anthropic、Stripe、Cursor 均独立得出了同一个操作结论:AGENTS.md 应该是导航工具,不是知识仓库。具体表现为:

  • AGENTS.md 保持在 ~100 行(OpenAI 实测数据)
  • 核心规则保持在 3-5 条,指向专项文档的链接不设上限
  • 渐进式披露:Agent 按任务类型主动检索相关上下文,而不是初始化时加载全量知识

这个结论的底层逻辑一致:上下文窗口是有效的”注意力资源”,而非无限容量的存储器。信噪比比信息量更重要。

1.2 约束的确定性优于指令的柔性(≥3 个独立源)

Cursor(“约束优于指令”),OpenAI(自定义 linter 注入修复指令),Stripe(本地 linting 5 秒反馈目标),三者从不同角度得出了相同的架构原则:

把规则从语言层面(prompt 里写”不要这样做”)下沉到代码层面(linter 报错让你不能这样做)。

更进一步:OpenAI 在 linter 错误信息中直接注入修复指令,使约束反馈同时成为修复路径,消除了”知道错了但不知道怎么改”的中间状态。

1.3 角色分离是多 Agent 系统的稳定架构基础(≥3 个独立源)

Cursor(递归规划者 + 专职工作者)、Anthropic(Planner + Generator + Evaluator GAN 架构)、arXiv OPENDEV(规划/执行双 Agent 分离),三者从不同场景独立收敛到”角色分离”这一架构决策。

Cursor 的四代演进提供了最强的反面论证:前三代失败的核心原因,都是在某个维度上未能有效分离角色(第一代:平等协商导致锁竞争;第三代:连续执行器导致上下文过载)。第四代的成功,正是在”减少协调成本”和”保护上下文专注度”两个目标之间找到了平衡。

1.4 “垃圾回收”是 harness 的必要维护工序,不是可选项(≥3 个独立源)

Martin Fowler(“垃圾回收”作为三层框架之一),OpenAI(doc-gardening agent 作为标准配置),Stripe(CI 轮次上限约束避免债务积累),三者对同一问题的认知完全一致:

AI 以超越人类的速度生成代码,也以超越人类的速度生成技术债。 不主动清理,harness 本身会腐烂。OpenAI 将文档熵增管理自动化(专职 doc-gardening agent),Stripe 通过 CI 轮次上限强制 Agent 本地验证充分——两者都是把”清理”编入了流程,而非依赖人工发起。


二、矛盾(不同源说法冲突的关键分歧)

2.1 Harness 的边际价值到底有多大?

冲突表述:

  • METR:Claude Code 与基础 scaffold 的 SWE-bench 性能差异不显著(支持 Big Model 派)
  • HumanLayer 数据:仅改进 harness,Opus 4.6 从第 33 跃升至第 5(支持 Big Harness 派)
  • Scale AI SWE-Atlas:某版本 GPT 出现 harness 反向拉低性能的情况(挑战 harness 有效性的基本假设)

我的判断:这三个数据来自不同的评估维度,冲突是真实的,但不是矛盾的。

METR 测量的是”harness 能否提升 benchmark 通过率”——这个维度上的差距小,可能恰恰证明了 METR 自己的另一个发现:benchmark 本身不可靠。用一个有系统性偏差的评估工具测出来的”差距小”,可能只是”偏差的方向相同,所以抵消了”。

HumanLayer 数据测量的是”排行榜相对排名”,这是一个更复杂的评估体系,包含了更多真实质量维度。在这个维度上 harness 价值显著,与 METR 结论并不矛盾。

Scale AI 的”反向拉低”最值得警惕,但目前只有一个数据点,且未公布方法论细节——应当存疑,等待复现。

结论:harness 对 benchmark 分数的增益可能确实有限;但 benchmark 分数本身就不是好的评估目标。以 harness 对真实质量维度的影响来看,证据更倾向于支持 Big Harness 派。

2.2 模型会”过度拟合其 harness”吗?

冲突表述:

  • 实践中发现的现象:经过精心 harness 优化的模型,在被迁移到不同环境或使用不同 harness 时,性能反而不如预期(“过度拟合”假说)
  • 反驳:这不是过度拟合,而是评估体系的锚定效应——你用 harness A 的指标评估模型,模型在 harness B 下”表现差”只是评估指标迁移的问题,不是能力的下降

我的判断:这个分歧目前证据不足,两种解释都缺乏严格验证。

“过度拟合 harness”如果成立,对 harness 工程师有重要含义:你优化的 harness 可能成为平台依赖的形式,未来模型升级时反而需要重写大量 harness。但目前这只是一个观察到的现象,缺乏系统性实验验证。

建议:对这个假说保持警觉,定期用不同的评估方式(包括”裸测”)检验 harness 的实际效果,而不只看优化后的指标。

2.3 上下文压缩 vs 上下文重置:哪个更优?

冲突表述:

  • Anthropic:上下文重置优于压缩,在关键节点完全清空比尝试保留压缩历史更有效
  • LangChain 的四策略(Write/Select/Compress/Isolate)中,Compress 作为独立策略存在,暗示压缩在某些场景下有价值
  • arXiv OPENDEV:提出”自适应上下文压缩 + 自动化记忆系统”的组合,与纯重置方案不同

我的判断:重置和压缩是针对不同失败模式的解法,而非对立选择。

上下文衰减(随时间的渐进漂移)——适合重置:用干净的结构化状态替换被噪音污染的长上下文。

知识丢失(重置后信息无法找回)——适合压缩/记忆系统:用自动化记忆提炼保留高价值状态。

Anthropic 的立场之所以更强,是因为它解决了更常见、更根本的失败模式(衰减);OPENDEV 的方案更完整但也更复杂,适合对长任务有强需求的场景。

结论:首选重置,当发现重置导致信息损耗影响任务质量时,引入压缩/记忆系统作为补充。


三、信号(仅 1-2 个源提到但信息密度极高的趋势)

3.1 Agent 执行轨迹 = 公司级知识资产(来源:Philipp Schmid)

Schmid 的这个判断目前只有他一个人明确表达,但其隐含的逻辑链极强:

轨迹 → 调试数据 → 训练数据 → 微调模型 → 竞争壁垒

今天在 harness 中认真记录执行轨迹的公司,正在积累的不只是调试日志,而是可以用来微调专用模型的高质量标注数据。这些数据的价值在未来 3-5 年内将被重新定价。

之所以认为这是信号而非噪音:它与 Stripe 的 MCP + Toolshed 架构高度吻合——标准化工具接口使轨迹记录自动结构化,而结构化轨迹正是微调数据的理想形式。两个独立的设计决策指向同一个战略价值。

3.2 “Harness 工程师”作为独立职能正在出现(来源:AIE Europe 2026 + Martin Fowler)

AIE Europe 2026 专设 Harness Engineering 专题轨道,与 Martin Fowler 的系统性定义同时出现,暗示这个职能方向已经足够成熟,正在从”有经验的工程师兼做”向”专职岗位”演化。

历史先例:SRE 从 DevOps 中分化(Google 2003 年命名,2010 年代普及);Platform Engineering 作为独立职能(2020 年代初兴起)。

如果这个信号成立,3-5 年内招聘市场上将出现”Harness Engineer”职位描述,而早期积累 harness 系统设计经验的工程师将享有稀缺性溢价。

3.3 “仅修复 Agent 犯的错”作为入门点,其积累效应被严重低估(来源:Hashimoto + OpenAI)

Hashimoto 的阶段五(“工程化”)描述的是从单次错误到系统性防护的飞轮:每次工程化响应都使 harness 成熟一点,而 harness 成熟后 Agent 犯新类型错误的频率降低,每次错误的修复成本下降。

这个飞轮在 OpenAI 案例中有具体体现:5 个月后,agent-to-agent 审核替代了人工审核——这不是一开始设计的目标,而是 harness 积累的自然结果。

为什么这是被低估的信号:大多数 harness 讨论集中在”如何设计一个好的 harness”,但最强的 harness 不是设计出来的,而是在响应 Agent 错误的过程中生长出来的。从”修复错误”开始,比从”设计架构”开始,更容易建立起真实有用的 harness。


四、空白(调研意图需要但所有源未覆盖的盲区)

4.1 大型存量代码库(Brownfield)的 Harness 接入方案

空白程度:严重

所有主要案例(OpenAI 百万行 greenfield、Cursor 自驱代码库)都是从零构建的。Stripe 是唯一的 brownfield 案例,但其方案(10 秒隔离 devbox + 400+ 工具 MCP 层)需要专职基础设施团队,多数企业根本不具备复制的条件。

对决策的影响:对于已有大型代码库的中小型团队,缺乏可参考的接入路径。“从哪里开始”、“如何避免 harness 与现有系统的冲突”、“如何渐进式改造而非大规模重写”——这些关键问题在现有文献中几乎没有系统性回答。

建议:在实践中,可将 Hashimoto 的 6 阶段模型作为个人级起点,Stripe 方案作为终态参考,中间的路径需要团队自行探索和记录。

4.2 Harness 本身的测试与验证

空白程度:中等

如何测试 harness 本身的正确性?现有文献大量讨论”用 harness 来测试 Agent 的输出”,但几乎没有讨论”如何测试 harness 本身是否有效”。

具体问题:

  • 一个新加的 AGENTS.md 规则是否真的改变了 Agent 的行为?还是 Agent 根本没有读它?
  • 一个 linter 规则是否捕捉了真实的错误模式,还是在制造虚假的安全感?
  • harness 版本升级后,如何快速验证新版本没有引入新的失效点?

对决策的影响:没有 harness 的测试框架,“工程化防止同类错误”就没有闭环的验证手段,只能靠再次观察到错误才知道防护失效了。

4.3 Token 成本与 Harness 复杂度的收益曲线

空白程度:中等

所有案例都假设 token 成本在可接受范围内,但没有任何源给出”harness 设计的成本-收益分析框架”。

随着 harness 复杂度上升,系统每次调用的 token 消耗也上升(更多上下文、更多评估 Agent、更多验证步骤)。存在一个最优点,超过这个点,增加 harness 复杂度带来的质量提升不足以覆盖成本增加。

对决策的影响:个人开发者和小团队在设计 harness 时,缺乏量化的复杂度上限参考。

4.4 长期 Harness 维护的人力成本

空白程度:较严重

现有文献假设 harness 一旦建立就相对稳定,但实际上:

  • 模型升级后,原有 harness 的效果可能发生漂移
  • 代码库演化后,某些约束可能过时或产生冲突
  • doc-gardening agent 能清理 AI 生成的文档熵增,但 harness 本身的”文档熵增”由谁清理?

OpenAI 案例中有”垃圾回收”的概念,但它针对的是 AI 生成代码的债务,而非 harness 架构本身的债务。这是一个被忽略的维护维度。


五、行动建议

立即可做(本周内)

1. 盘点现有的隐性约束

召集团队,把那些”老工程师都知道但没有写下来”的规则收集成一份清单。这些是最危险的盲点——Agent 不会从老工程师那里继承口传知识。

具体操作:开一个 1 小时 workshop,问一个问题:“如果一个刚加入的工程师(人类)在没有任何指导的情况下提交了一个 PR,什么样的常见错误会被拒绝?“答案就是你的第一批 AGENTS.md 内容。

2. 从一个具体的 Agent 错误开始,完整走一遍”工程化响应”流程

不要从”设计 harness 架构”开始,从”上周 Agent 犯的一个具体错误”开始:

  • 这个错误属于哪一类?(架构违反、命名不一致、边界条件遗漏?)
  • 能否用 linter 规则在提交前捕捉到它?
  • 如果不能,能否写一个结构测试?
  • 如果不能,至少把它写进 AGENTS.md 的”常见错误”部分

这个循环完整走一遍,比读任何文档都有效。

3. 把 AGENTS.md 的长度控制在 100 行以内

如果你已经有 AGENTS.md,检查它的长度。超过 100 行的,大概率违反了”目录原则”——把具体内容移到专项文档,AGENTS.md 只保留导航链接和 3-5 条最重要的不可违反原则。

中期投资(1-3 个月)

4. 建立双层反馈机制

  • 第一层(秒级):pre-commit hook 或 file watcher + linter,覆盖最常见的架构约束
  • 第二层(分钟级):结构测试,验证依赖关系、命名约定、文件大小约束

遵循 Stripe 的量化目标:本地 linting 5 秒内完成,CI 最多两轮往返。

5. 建立 Agent 错误日志

一个 markdown 文件,记录每次 Agent 犯的有代表性的错误:

  • 错误类型
  • 是否工程化解决了?用了哪种层次(文档化/自动化验证/约束执行)?
  • 防护措施是否有效(下次遇到同类错误时验证)

这个日志在 3 个月后会成为最有价值的 harness 优化工具——比任何外部方法论都更贴近你的具体代码库。

6. 开始认真记录 Agent 执行轨迹

基于 Schmid 的”轨迹即知识资产”信号:在 harness 中增加对 Agent 关键决策节点的结构化记录。不需要记录所有内容,重点记录:

  • Agent 选择了什么工具,结果如何
  • Agent 遇到什么约束,如何响应
  • 任务完成/失败的关键路径

这些记录现在是调试工具,未来是微调数据。

长期关注(3-12 个月)

7. 选择性投资”模型无关”型 harness

基于 Big Model vs Big Harness 的时间轴分析,优先投资那些即便模型能力大幅提升后仍有价值的 harness 组件:

  • 评估层(真实质量验证,而非 benchmark 分数)
  • 可观测性层(理解 Agent 行为的能力,任何时候都需要)
  • 安全约束层(不可逆操作的确认机制)

避免过度投资”补偿模型弱点”型的 harness——它会随着模型进步成为技术债。

8. 周期性地用”裸测”检验 harness 的实际效果

定期让 Agent 在没有你的 harness 的情况下(或用最简 harness)完成相同任务,比较结果差异。这不是在浪费时间,而是防止两类风险:

  • harness 已经无效但你没有发现
  • harness 过度拟合了某个评估维度,产生了虚假的安全感

六、元反思:这次调研本身的局限

信息源的时效偏差

24 个信息源中,核心工业案例(OpenAI、Stripe、Cursor)集中在 2026 年 2-3 月,大量内容来自概念形成的早期阶段。Harness Engineering 作为一个正式命名的概念,诞生时间还不超过 3 个月(以 OpenAI 2026 年 2 月博文为起点)。

这意味着:调研捕捉的是概念形成期的”第一波共识”,很多结论是从极少量案例中归纳的。3 个月后,随着更多公司分享实践,今天的”共识”可能被更丰富的数据修正。

特别需要注意:五层架构模型是从 4 个案例提炼的综合模型,没有任何单一来源完整地验证了它——它是调研者的归纳,而非工业界的共识。

可见性偏差(survivorship bias)

所有公开案例都是成功案例——OpenAI 成功了,才会发博文;Stripe 每周 1000 PR 了,才值得分享;Cursor 做到数千并发才有估值。

失败的 harness 工程实践在哪里?没有公开数据。Cursor 案例提供了三代失败案例,是目前少有的反面数据,但这些失败是 Cursor 自己披露的,用来衬托第四代的成功——仍然是胜利者叙事框架下的失败。

影响:行动建议中的”中期投资”部分,主要基于成功案例的提炼,对失败的中间状态如何处理,指导价值有限。

中国企业实践缺席

24 个信息源全部来自美国英语圈(OpenAI、Stripe、Cursor、Anthropic、Martin Fowler、Mitchell Hashimoto)。中国字节跳动、阿里、百度、美团等大型技术公司是否在进行类似的 harness 工程实践?他们的路径是否与美国案例有结构性差异?完全没有数据。

这对中国工程师团队的借鉴价值是一个真实的盲区——美国案例的背景假设(主要使用 Claude/GPT、英文代码库、特定工具链)未必完全适用于中文技术生态。

“共识”背后的循环引用风险

Martin Fowler 的文章引用了 OpenAI 案例;Latent Space 综合了 Fowler 和 OpenAI;后续的讨论大量引用了 Latent Space——这形成了一个引用链,使得”多源共识”的表面现象背后,实际上可能只有 1-2 个原始观察。

在”约束优于指令”这个判断上,这个风险最高:Cursor、Stripe 的实践细节是一手数据;OpenAI 的表述有原始博文;但 Fowler 和 Schmid 的相关表述在多大程度上是独立观察,在多大程度上是对 OpenAI 案例的二次提炼,并不完全清晰。

影响:应将”三个独立源确认”的标准调整为”三个独立实践来源确认”,理论分析者对同一观点的呼应不等同于独立的实践验证。

关键缺失:成本数据

所有案例都没有披露 token 成本、基础设施成本、和工程时间投入的详细数据。OpenAI 3人5个月的案例,云计算成本是多少?Stripe 每周 1000 AI PR 的运营成本是多少?

没有成本数据,就无法做 ROI 分析,行动建议中的”优先级”判断只能基于质量维度而非经济维度。这是当前公开文献的系统性缺失,可能是故意保密(竞争敏感)也可能是早期实践者尚未系统追踪。

证据原始数据 (2 条)
信息源索引
/Users/eamanc/Documents/pe/jixiaxuegong/research/Harness-Engineering/evidence/信息源索引.md
Claude Code 源码泄漏 — 核心技术要点
/Users/eamanc/Documents/pe/jixiaxuegong/research/Harness-Engineering/evidence/源码泄漏解析/核心技术要点.md