jixiaxue 知识库
research / Harness-Engineering

Harness Engineering 深度调研

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

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 [行动建议部分], → 产出/实践手册

5 谁在做得好:Harness Engineering 深度解剖

谁在做得好:Harness Engineering 深度解剖

核心发现:读完 6 篇工业博客全文 + 3 篇论文 + 7 个 GitHub 项目源码后,浅层叙事(“Ramp 30% PR""Stripe 1300 PR/周”)背后有一套被忽视的深层模式——人类角色从”写代码”转向”定义什么是对的”,验证经济学发生倒转,agent 产出的代码”能编译但不能用”正在成为常态,harness 本身是临时的。 信息源:Datadog/Ramp/Coinbase/Harvey/Anthropic/LangChain 博客全文 + arXiv 2603.28052、2603.25723、2603.03329 + GitHub 42 个项目(7 个源码级)


一、跨所有案例的深层模式

模式 1:人类角色正在从”做”变成”定义什么是对的”

这是读完所有原文后最强的信号,但没有一篇文章明确说出来。

公司人类做什么不再做什么
Datadog写 ADR → 推导 TLA+ 不变量读/审查 agent 的代码
Harvey写评分 rubric指导法律 agent 的执行细节
Anthropic定义 sprint contract 的完成标准写代码、做 QA
Coinbase做架构级决策(如选演员模型)写实现代码
Ramp选择要解决的问题在 IDE 里编码

Datadog 说得最直白:代码审查已被降级为”布隆过滤器”——不再是正确性的来源,只是一个 fast gate。正确性完全由形式化方法(TLA+、确定性仿真测试、Kani bounded proofs)承担。他们的论点:当 agent 产出代码的速度远超人类审查速度时,验证经济学发生了倒转——以前形式化方法昂贵而 review 便宜,现在 review 成本相对升高(人类成为瓶颈),形式化方法相对便宜(可以自动跑在每次迭代中)。

Harvey 的表述:“当 rubric 质量高时,agent 可以 hill-climb 到惊人的高度。“——人类的核心贡献是写好评分标准,而非指导执行细节。评分标准的质量直接决定了 agent 的优化上限。

模式 2:Agent 产出”能编译但不能用”的代码

传统 CI(编译 + 单元测试)作为质量门禁已经不够了。

Datadog redis-rust:agent 的第一个编译成功的实现就有隐蔽的语义 bug——硬编码 512×8KB 缓冲区预分配(4MB),导致内存消耗是 Redis 的 8 倍。这个 bug 不会在任何 code review 中被发现——只有生产遥测反馈给 agent 后,agent 才自行实现了 3 个优化,内存降低 87%。

Anthropic solo run:20 分钟 $9,代码编译通过,核心功能断裂——实体出现在屏幕上但不响应输入,因为实体定义和游戏运行时之间的连线断了。对比 harness 版:6 小时 $200,完全可玩。这不是”更好一点”,而是能用 vs 不能用的区别,成本差 22 倍。

推论:需要超越编译/测试的验证层——形式化方法(Datadog)、LLM Judge(Harvey)、视觉 DOM 验证(Ramp)、evaluator agent(Anthropic)。

模式 3:Harness 是临时的,每个组件编码一个关于模型缺陷的假设

Anthropic 说得最明确:“Every component in a harness encodes an assumption about what the model can’t do independently.”

实例:Anthropic 为 Claude Sonnet 4.5 设计了 sprint 分解(因为模型自己规划不好)+ context reset(因为 context anxiety——模型感觉上下文窗口快满时会提前收工)。Opus 4.6 发布后,作者的第一反应是删掉 harness 组件——sprint 分解完全移除,evaluator 从每 sprint 评估变成末尾单次评估。

没人讨论的问题:Datadog 花大量精力建的 TLA+/DST 验证金字塔,如果模型未来能直接写正确代码,这些投资会贬值。没有人讨论 harness 投资的 ROI 时间窗口。这是整个领域的一个盲区。

模式 4:沙箱 + 快照 + 热替换正在成为标准基础设施

公司机制细节
RampModal 快照每 30 分钟 Cron 克隆仓库 + 安装依赖 + 构建 + 存为 diff。新 session 从最新快照秒级启动
DatadogWASM 热替换RwLock<HashMap<(OrgId, AggConfig), WasmModule>>,每 5 分钟轮询新版本。当前批次在旧代码完成,新批次用新版本。零停机
Open SWE可插拔沙箱Modal/Daytona/本地 Docker,统一 SandboxClient 接口
RampDurable Objects每个 session 独立 SQLite 数据库,避免并发性能退化

二、工业案例深度解剖

Datadog — 验证金字塔 + 全自主进化

已知数字:harness-first agents 方法论。 读完全文才知道的

验证金字塔的速度分层极其具体

  1. 符号层(TLA+):2 分钟可读懂规约
  2. 主验证层(确定性仿真测试 DST):~5 秒跑完
  3. 穷举模型检查(Stateright):30-60 秒
  4. Bounded proofs(Kani):~60 秒
  5. 经验层(遥测/基准测试):秒到分钟

Agent 每次修改代码后,5 秒内就能得到主要的通过/失败信号。这是”左移验证”的极致。

ADR 是整个验证链的起点:TLA+ 规范不是凭空写的,而是从 ADR(架构决策记录)推导出来的。ADR → TLA+ spec → 不变量 → 同一组不变量复用于所有验证层(Stateright、DST、Kani、staging 遥测)。这确保所有验证层检查的是同一组性质。

演员模型架构是人类决策,不是 agent 决策。文章明确说 “The shift to an actor-based design was a human decision”——一天后 agent 就把吞吐量做到了峰值磁盘吞吐的 93%。人类做架构决策,agent 在架构内优化实现。

Part 2 更惊人——LLM 发现了传统 JIT/PGO 无法发现的算法级优化:基线代码对每个数据点遍历所有过滤表达式(O(N)),LLM 进化出了初始化时构建 HashMap、每个数据点 O(1) 查找的方案。这是算法结构重组——PGO 和 JIT 做不到。

Specialization 贡献了 44.5% 的性能提升,而它做的只是把运行时变量变成编译时常量——Rust 编译器自动做死分支消除、常量内联、循环展开、哈希预计算。让 LLM 做算法创新之前,先让编译器干它擅长的事,效果惊人。

16KB 文件大小限制是血泪教训。目标文件超过 ~16KB 时,LLM 生成的代码频繁出现未闭合的分隔符或截断的函数。有一次 30 个优化尝试全部编译失败,直到把测试函数移到独立文件才解决。

全自主的前提条件极其严格:“Full autonomy is possible here because the aggregation function is constrained enough that every property we care about is machine-checkable.” 这不是通用自主——只有当问题域足够受限、所有关心的性质都可以机器验证时才行。

Helix 的生产数据:produce 延迟 p50 为 22.2ms,对比 Kafka 的 116ms——快 5 倍,维持 Kafka 语义兼容。这不是玩具项目。

Ramp — 自指循环 + 多入口

已知数字:30% 工程 PR。 读完全文才知道的

PR 占比从 30% 迅速攀升到 50%+,而且 Inspect 本身 80% 以上的代码也是 Inspect 写的。这是自指循环——agent 在构建自己。Ramp 博客说 “within months” 达到的,有机采纳(organic adoption),没有强制推行。

选 OpenCode 而非 Claude Code 或 Cursor 作为 agent 运行时,原因是 OpenCode 是”server first,TUI 和桌面应用只是客户端”。这种服务器优先架构让 Ramp 可以在 Slack/Web/Chrome 扩展等多客户端上接入同一个 agent session。这个选型理由在所有总结中被忽略。

Chrome 扩展利用 React internals 而非图像 token 来选择 UI 元素。非工程师(PM、设计师)用 Chrome 扩展直接在页面上选择要修改的 UI 元素,扩展读取的是 React 组件树而非截图像素——比视觉方案精确得多。

沙箱里运行的不只是代码,而是完整的全栈环境:Postgres、Redis、Temporal、RabbitMQ,加上 VS Code server、VNC stack + Chromium。Agent 可以在真实浏览器中导航应用、截取前后对比截图来视觉验证前端改动。所有这些都在一个沙箱里,没有网络跳转。

设计目标:“session speed should only be limited by model-provider time-to-first-token”——基础设施延迟趋近于零,唯一瓶颈应该是 LLM 响应时间。

Multiplayer sessions:任何数量的协作者可以同时在一个 session 中工作,改动归属到各自用户。

Coinbase — 强制文化重置 + 为 Agent 设计

已知数字:PR 审查 150h→15h。 读完全文才知道的

CTO 要求全体工程师删除 IDE、两周内不写一行代码。2026-01,Chintan Turakhia 让整个工程组织暂停编码,重新想象 agent 优先的工作方式。这不是渐进式采纳,而是强制性的认知重置。几周后工作流面目全非。

“我不再为人类设计,我为 agent 设计。” Turakhia 说他的系统设计目标用户是 agent 而非人类——Linear 作为单一结构化信息源,是为 agent 的结构化消费而设计的。

code-first graph 的核心驱动力是监管合规,不是技术优越性。金融监管要求每个 tool call、retrieval、decision、output 都被追踪。选择 LangGraph code-first 而非 no-code/chat 模式,是因为合规要求可审计性。

“Speedrun” 演示:每周 500+ PR 在 15 分钟内生成,把 GitHub 搞崩了 4-5 次。这不是问题报告而是自豪——AI 的生产力瓶颈正从 agent 能力转移到基础设施承载力。

工程师的日常节奏变了:早上审查 agent 夜间生成的 PR → 白天启动 10-15 个 agent → 自己处理高复杂度问题 → 晚上审查并启动新一批 agent 过夜运行。开发变成 24 小时连续的。

衡量 agent 成熟度的关键指标:agent 能无人干预运行多少分钟。Turakhia 持续跟踪这个数字。

确定性节点 + 概率节点分离:graph 中的 data-fetch 和 transform 步骤是确定性的、可单元测试的;LLM 步骤跑 evaluation harness + 策展数据集。第二个 LLM 作为 judge 做抽检和置信度打分。

Anthropic — Claude 自己人说 Claude 不擅长 QA

已知数字:三 Agent 架构,6h/$200 构建游戏。 读完全文才知道的

“Out of the box, Claude is a poor QA agent。” 这句话出自 Anthropic 自己的工程博客。需要多轮开发循环才能让 evaluator 的评分与人类判断一致。这是模型公司对自家产品不足的坦诚。

“museum quality” 这种提示词会导致视觉收敛。使用 “the best designs are museum quality” 会让所有输出都朝博物馆美学靠拢。语言不只是指令,还是审美引导。

Context anxiety 是真实的模型行为。Sonnet 4.5 在感觉上下文窗口快满时会提前结束工作——不是 bug 而是行为模式。Compaction(原地总结历史对话)不足以解决,需要 context reset(完全清空 + 结构化交接)。Opus 4.5 “largely removed” 这个行为。

Sprint contract 协商机制:generator 和 evaluator 在每个 sprint 前协商完成定义——generator 提出要构建什么和成功标准,evaluator 审查确保方向正确,双方迭代达成一致后才开始编码。例如 Sprint 3 有 “27 criteria covering the level editor”。

迭代 10 的创造性突破:博物馆网站前 9 次迭代都是”干净的深色主题着陆页”,迭代 10 agent 完全推翻方案,重新设计为”3D 空间体验:CSS 透视渲染的棋盘地板房间,用门道导航”。作者说这是”我从未在单次生成中见过的创造性飞跃”。

DAW 的精确成本分解:Planner 4.7min/$0.46 → Build R1 2h7min/$71.08 → QA R1 8.8min/$3.24 → Build R2 1h2min/$36.89 → QA R2 6.8min/$3.09 → Build R3 10.9min/$5.88 → QA R3 9.6min/$4.06 → 总计 3h50min/$124.70。Build 成本占绝对主导,QA 只占约 8%。

Harvey — 法律领域:Agent 自己发明了 Stop Hook

已知数字:40.8%→87.7% 成功率。 读完全文才知道的

Stop hooks(预运行验证钩子)是 agent 自己发明的。不是人类设计了这个组件——agent 在自学习循环中自主发现”先验证前置条件再执行”这个元认知策略,并将其工程化。

LLM judge 的反馈不仅打分,还写详细文字反馈:“what the agent got right, what it missed, and where its reasoning was incorrect”。Coding agent 读这些反馈 → 聚类失败模式 → 形成假设 → 修改 harness 组件 → 重跑任务。完整的自我改进闭环。

“这是小规模实验”——这句限定语在所有总结中被省略。 Harvey 自己说 “This is a small-scale experiment. It does not generalise to all of legal work.” 法律 AI 的生产部署远比 coding agent 慎重,律所客户对精确性要求极高。

Niko Grupen 的背景:Google Brain RL + 多智能体系统研究者,Cornell CS PhD——他把强化学习的”环境塑造 agent 行为”思想带到了法律 AI 中。

架构收敛:Open SWE + 关键差异

Stripe(Minions)、Ramp(Inspect)、Coinbase(Cloudbot)独立开发却趋同,LangChain 提炼为 Open SWE。

但读完原文后,差异比共性更值得关注

决策点一方另一方各自理由
验证策略Datadog:形式化验证(TLA+/Kani)Ramp:视觉 DOM 验证;Harvey:LLM JudgeDatadog 做基础设施(正确性不可妥协);Ramp 做前端(视觉更直接);Harvey 做法律(rubric + LLM 打分更符合领域)
自主程度Datadog Part 2:完全去掉人类Coinbase/Harvey:保留人类审查Datadog 的聚合函数域足够受限且可机器验证;金融/法律监管要求人类在环
采纳策略Coinbase:强制”删 IDE 两周”Ramp:有机采纳 “let the product speak”Coinbase 需要文化转型;Ramp 产品足够好到自然扩散
Harness 构建Coinbase:从零构建Ramp:组合 OpenCode;Stripe:fork GooseCoinbase 需与 Linear 深度集成 + 金融合规定制
工具数量Stripe:~500 个策展工具Open SWE:~15 个Stripe 规模大场景多需广覆盖;Open SWE 做最小集

三、论文深度解剖

Meta-Harness(Stanford/MIT)—— 名副其实还是名不副实?

论文本身值得认真对待,但需要区分论文描述的方法论和开源 artifact 的实际内容。

Proposer 的实际行为:不是简单的 prompt → response。Proposer 是一个完整的 coding agent(Claude Code + Opus 4.6),拥有文件系统访问权限。每次迭代平均读取 82 个文件,引用 20+ 个此前候选方案。文件类型分布(TerminalBench-2):harness 源码 41%,execution traces 40%,分数文件 6%。

规模差异惊人:单次评估可产生高达 10,000,000 tokens 的诊断信息——比此前所有方法高三个数量级(OPRO 0.002M,TextGrad 0.015M,AlphaEvolve 0.022M)。

但 6x 性能差距不是 Meta-Harness 自己的实验结果——论文在 Introduction 中引用参考文献 [46] 的结论作为 motivating claim。很多二手总结把这个数字归因给了 Meta-Harness。

文本分类 4x 更少 token 的具体机制:Meta-Harness 发现的最优 harness(Label-Primed Query)使用 45.5K context tokens vs ACE baseline 的 203K → 约 4.5x 更少,准确率同时从 40.9% 升到 48.6%。做法:先列所有合法标签 → 每个标签选一个与 query 最相关的例子 → 配对高度相似但标签不同的例子暴露决策边界。用更少 token 传递更高密度的决策信号。

跨模型泛化确实有效:在 GPT-OSS-20B 上搜索的 harness,无需重新训练直接用在 GPT-5.4-nano、GPT-5.4-mini、Gemini-3.1-Flash-Lite、Gemini-3-Flash 上。跨厂商(OpenAI→Google)、跨规模都有效,5 个模型平均 +4.7 点。

源码级发现(github-deep-dive agent 报告):开源 artifact 的 agent.py 实际上只做了两件事——环境预引导(省 2-5 轮探索)和 marker-based 命令轮询(省等待时间)。论文描述的”proposer 参考 20+ 历史尝试”的 meta-learning 逻辑不在这个 artifact 中。artifact 是搜索结果(发现的最优 harness),不是搜索过程本身。

局限性

  1. 不可复现——Proposer 是 Claude Code 商业产品,“最小 skill”的具体文本未公开
  2. 成本黑箱——20 迭代 × 2 候选 = 40 次评估,每次 10M token trace + proposer 读 82 文件,保守估计单次搜索数百到数千美元
  3. 搜索空间偏置——用 coding model 做 proposer,天然偏向代码可表达的策略

Natural-Language Agent Harnesses (NLAH) —— 概念强但实例缺

核心命题:将 harness 的控制逻辑从 Python/YAML 代码中提取为自然语言编写的可移植产物。让 harness 成为可进化的科学对象:外化 → 对比 → 消融 → 优化。

论文最大的遗憾是没有给出任何 NLAH 的具体文本示例。只有抽象的 6 类组件描述(contracts、roles、stage structure、adapters、state semantics、failure taxonomy),没有实际的 harness 文件内容。这是最大的可复现性问题——读完论文不知道 NLAH 长什么样。

反直觉的实验结果

  • 从 code harness 迁移到 NLAH 后,OSWorld 成功率从 30.4% 升到 47.2%(+16.8 点)。但 LLM calls 从 1200 大幅降到 34,runtime 从 361 分钟减半到 141 分钟。更好且更便宜。
  • Verifier 和 Multi-Candidate Search 在两个 benchmark 上都降低性能。更多显式结构不自动等于更好的任务性能。Self-Evolution 是最稳定有效的模块。
  • SWE-bench 上 Full IHR(74.4%)反而比 baseline(75.2%)低。论文淡化了这个结果。

与 AGENTS.md/CLAUDE.md 的本质区别:论文明确说 “AGENTS.md 和 skill bundles 证明了可复用控制知识的可行性…但它们不会将 harness 范围的 contracts、role boundaries、state semantics、failure handling 和 runtime-facing adapters 作为一等公民统一执行。” AGENTS.md = 局部指令/约定,无执行语义;NLAH = 完整可执行的编排对象。

两篇论文的互补关系:NLAH 定义了”harness 应该长什么样”(表示层),Meta-Harness 回答了”怎么找到好的 harness”(搜索层)。一个是格式标准,一个是优化引擎。NLAH 论文在 Future Direction 中明确提到可以对 NLAH 做自动搜索和优化——这就是 Meta-Harness + NLAH 的组合方向。


四、开源项目源码级评估

详细分析见 6-开源项目源码解剖.md,此处只给结论。

工程深度分级

等级项目判断依据
A 级Archon20 个完整 YAML workflow 可验证,条件分支 + 5 路并行 review + 模型分层(haiku/sonnet/opus 按节点分配)
A 级Open SWE中间件架构精巧——check_message_queue_before_model 实现运行中追加指令,open_pr_if_needed 确定性兜底
A 级harness-kit/Odin三种 plan 模式、multi-agent CLI 适配器、DAG 编排、mock 模式——唯一把工程纪律当核心的项目
B 级revfactory/harness6 种架构模式分类 + Phase 0-7 流程——方法论价值高但无运行时代码
B 级agnixRust workspace 结构合理,但 399 条规则的质量无法独立验证
C 级Stanford Meta-Harness artifact核心创新仅约 200 行——“meta” 名不副实,repo 中无 meta-learning 逻辑
C 级AgentSyssrc/ 返回 404,“47 agent + 19 plugin + 40 skill” 无法通过源码验证

关键设计选择对比

选择点ArchonOpen SWEharness-kit/Odin
Workflow 定义YAML DAGPython 代码 + 中间件CLI 命令编排
确定性 vs 概率显式混合节点类型中间件隔离TDD 强制确定性
并行执行worktree 隔离子 Agent 隔离mock 模式 + DAG
适用场景团队标准化企业内部 agent重品味的小团队

五、非编码领域的 Harness 迁移

Harvey 是最强信号,但要注意限定词

Harvey 证明了 harness engineering 的核心范式(约束 + 反馈回路 + 技能积累)可以迁移到法律领域。但 Harvey 自己强调这是小规模实验,不能泛化到所有法律工作。

迁移条件框架

从编码和法律的成功案例反推:

条件编码领域法律领域下一批候选
可评估的交付物代码能跑、测试通过文档质量可打分数据分析报告、合规审查、技术文档
可自动化的反馈CI/CD、linterLLM Judge + rubric规则引擎、回归测试
可积累的领域技能编码模式、API 用法审查剧本、法条引用行业知识库、SOP
可定义的约束代码规范、安全规则法律条款、合规要求财务准则、医疗协议
Datadog 的额外条件✅ 所有性质可机器验证🟡 部分可越受限越适合全自主

Datadog Part 2 的启示

全自主的前提是”所有关心的性质都可以机器验证”。这意味着:

  • 编码中的聚合函数 → 可全自主
  • 法律文档审查 → 需要 LLM Judge + 人类抽检
  • 开放性创意任务 → 人类仍需深度参与

六、对研发部门的启示

你们 Q2 目标的架构选型建议

如果从零开始:Open SWE——提炼了 Stripe/Ramp/Coinbase 共性,中间件架构灵活,可以运行中追加指令。

如果要团队标准化:Archon——YAML 定义 workflow,条件分支 + 并行 review,按节点分配不同模型,非工程师也能理解。

如果重品味和工程纪律:harness-kit/Odin——TDD 强制、“No slop”原则、测试 agent 与实现 agent 隔离。

必须做的 3 件事(来自原文深层洞察)

  1. 建验证层而非审查层(Datadog 教训):投资自动化验证(哪怕从简单的 DST/property-based testing 开始),不要指望 code review 能 cover agent 产出的代码量。验证经济学已经倒转。

  2. 定义”什么是对的”而非”怎么做”(Harvey + Anthropic 教训):写好 rubric/评分标准/sprint contract 的完成定义。人类的核心产出从代码变成了标准。

  3. 设计 harness 时记录每个组件的假设(Anthropic 教训):每个 harness 组件应标注”它补偿的是模型的什么缺陷”。模型升级后,第一件事是检查哪些组件可以移除。

孵化 Harness 的 Harness

方案深度阅读后的评估
Stanford Meta-Harness论文方法论值得学习,但开源 artifact 只是搜索结果不是搜索引擎。实际复现需要自建 proposer + evaluation pipeline。成本数百到数千美元/次
Harvey 模式最适合你们的验收环节——LLM Judge + rubric 做自学习 harness。成本低、落地快、Harvey 已验证有效
Datadog 进化搜索适合性能优化类任务(如特化数据管线)。需要 WASM 隔离 + shadow evaluation 基础设施
revfactory/harness100 个模板可直接用其 meta-skill 为你们的领域生成 agent 团队配置。方法论 B 级但实操价值高

所有文章都没讨论的盲区

  1. Agent 产出代码的可维护性:agent 写 50% PR、跑到 87.7% 法律任务正确率——但谁来维护这些代码?风格是否一致?注释是否充分?所有文章回避了这个问题。
  2. Harness 投资的 ROI 时间窗口:模型每隔几个月就显著升级,harness 组件会贬值。花 3 个月建的验证金字塔,如果下一代模型直接写正确代码,这些投资就废了。
  3. Agent 的过度工程化倾向:Datadog 提到 agent “had a tendency to over-engineer abstractions that we later simplified”。Agent 不是不够好,而是”太好了”——会创造不必要的抽象层。

信息源

核心参考(全文阅读)

论文(全文阅读)

GitHub 项目(源码级分析,详见 6-开源项目源码解剖.md)

X/Twitter 关键声音

  • @levie(Box CEO)— agent harness 力乘数
  • @dotey(宝玉)— 中文 harness 概念传播
  • @omarsar0 — Meta-Harness 解读
  • @gabepereyra(Harvey CEO)— 法律 auto-research
  • @bcherny(Anthropic)— Claude Code custom agents
  • @daniel_mac8 — Natural-Language Agent Harnesses
  • @GenAI_is_real — “新瓶装旧酒”质疑
6 开源 Harness 项目源码解剖

开源 Harness 项目源码解剖

核心发现:7 个项目中只有 3 个(Archon、Open SWE、harness-kit/Odin)有真正的工程深度;Stanford Meta-Harness 的 “meta” 名不副实——实际只是环境预引导 + marker 轮询优化;AgentSys/agnix 代码结构不可验证,README 先于代码。 信息源:GitHub 源码直读(agent.py / YAML / SKILL.md / CLAUDE.md)、README 全文


1. Stanford Meta-Harness

仓库stanford-iris-lab/meta-harness-tbench2-artifact

实际架构(源码 agent.py 逐行分析)

agent.py 只有一个类 AgentHarness,继承自 Harbor 框架的 Terminus2。整体结构极其精简:

三个工具定义

  • execute_commands:接收 analysis + plan + command 数组
  • task_complete:标记完成
  • image_read:用 base64 编码读图后多模态分析

Agent Loop(_run_agent_loop

  1. 首轮注入环境快照(_gather_env_snapshot() 执行复合 shell 命令收集工作目录、文件列表、可用语言/工具/包管理器、内存信息)
  2. 每轮检查 tmux session 存活 → 可选的 proactive summarization → 调 LLM → 路由到命令执行或图片分析
  3. task_complete 使用双确认机制:第一次设 _pending_completion = True 并展示 checklist,第二次才真正完成

Marker-Based 命令轮询

  • 每条命令后发 unique echo marker
  • 0.5 秒间隔轮询 marker 出现
  • 命令提前完成时立即返回,节省等待时间(如 1 秒超时的命令 0.2 秒完成,省 0.8 秒)

Prompt 模板:terminus-kira.txt 只有三个约束——完全自主(不期望人类帮助)、无感官(用程序化工具理解多媒体)、最小状态变更验证(完成前检查只修改了必要文件)。

核心设计决策

选择原生 tool calling 而非 JSON/XML 解析。原因:直接用 Anthropic API 的 tools 参数,省去了 Terminus-KIRA 原版的解析逻辑,减少了输出格式错误导致的失败。

环境预引导。这是整个项目的核心创新——实验证明省掉 2-5 轮 ls/which python3 的探索迭代。但实现只有一个 shell 命令:

echo "=== Working Dir ===" && pwd && echo "=== Files ===" && ls -la && \
echo "=== Languages ===" && which python3 ruby node go java rustc 2>/dev/null && \
echo "=== Package Managers ===" && which pip apt-get 2>/dev/null && \
echo "=== Memory ===" && free -h 2>/dev/null

Anthropic Prompt Caching。通过 add_anthropic_caching() 包装消息,复用之前的 prompt prefix,降低 token 成本。

值得借鉴的具体实现

  • marker-based 命令轮询:简单但有效的优化,解决了”命令执行时间不确定”的问题,比固定等待或盲轮询都高效
  • 双确认 task_complete:防止 agent 过早声明完成,强制它展示 checklist 再确认
  • 上下文溢出优雅降级:检测到 context length exceeded 后触发 fallback summarization,释放 4000 token 空间后重试

局限/缺陷

  • “Meta” 名不副实。代码中没有任何 meta-learning、harness 自修改、proposer 读历史的逻辑。论文描述的 “agentic proposer 参考 20+ 历史尝试提出改进” 不在这个 artifact 中——这个 repo 只是最终冻结的 harness 实现,不是优化过程的代码
  • 环境快照采集无容错_gather_env_snapshot() 的 shell 命令如果在非 Linux 环境(如 macOS)跑会静默失败(free -h 不存在),但因为有 try-except 不会崩溃,只是丢失信息
  • 整体创新量极小。去掉框架继承的部分,真正原创的代码约 200 行。核心贡献是实验方法论(自动搜索 harness 空间),不是这份代码本身

2. Archon(YAML Harness Builder)

仓库coleam00/Archon

实际架构(YAML workflow 逆向)

分层架构:Platform Adapters(Web/CLI/Telegram/Slack/Discord/GitHub)→ Orchestrator(消息路由 + 上下文管理)→ Executors → Database(SQLite/PostgreSQL,7 张表)

YAML Workflow 是真正的 DAG。以 archon-fix-github-issue.yaml 为例,22 个节点分 10 个 phase:

Phase 1: 提取 issue → 获取详情(bash: gh issue view)→ 分类(haiku 判断 bug/feature/...)
Phase 2: Web 研究
Phase 3: 根据分类条件分支——bug → investigate,非 bug → plan
Phase 4: 实现(升级到 opus)
Phase 5: 验证
Phase 6: 创建 Draft PR
Phase 7: 5 个并行 review agent(code/error-handling/test-coverage/comment-quality/docs-impact)
Phase 8: 综合 + 自修复
Phase 9: 简化
Phase 10: 报告

节点类型混合

  • prompt:AI 驱动,指定模型(默认 sonnet,可升级 opus/降级 haiku)
  • bash:确定性 shell 命令
  • command:调用预定义的子 workflow
  • loop:带终止条件的迭代
  • interactive:人类审批门禁

条件分支classify.output.issue_type == 'bug' 控制走 investigate 还是 plan 路径。

并行聚合trigger_rule: one_success 让 synthesize 节点只需等待任一 review agent 完成即可启动(不是 all_success),容忍部分 review 失败。

核心设计决策

选择 YAML 而非代码定义 workflow。好处是非工程师可读可改,团队可版本控制 .archon/workflows/。代价是表达力受限——复杂逻辑只能拆成多个子 command 或用条件分支模拟。

每个 workflow run 独立 git worktree。这解决了并行执行的核心问题——多个 workflow 不会在同一个 git 工作区互相冲突。

context: fresh 每个节点默认清空上下文。节点间只通过文件系统(artifacts)传递数据,不共享 LLM 对话历史。这意味着每个节点是独立的 LLM 调用,节点间解耦。

模型按节点灵活分配。分类用 haiku(便宜快速),实现用 opus(质量优先),默认 sonnet。这体现了 “cheapest capable agent” 原则。

值得借鉴的具体实现

  • 20 个默认 workflow 作为模板库:覆盖从 idea-to-pr、fix-issue、pr-review 到 conflict-resolution 的完整开发生命周期,团队可 copy-paste 后定制
  • 条件分支 + 并行 review 的组合:Phase 7 的 5 路并行 review 是 “fan-out + selective merge” 的教科书实现
  • 模型分层用法:haiku 做分类、sonnet 做默认、opus 做实现,成本优化的同时保证关键路径质量
  • 跨平台适配器:同一个 workflow 可在 CLI/Web/Slack/Telegram 运行,降低了 harness 的使用门槛

局限/缺陷

  • YAML 编排的表达力天花板。一旦需要在节点间做复杂的数据变换、条件判断嵌套、动态节点生成,YAML 就不够用了。Archon 用 command 节点(调子 workflow)来绕过这个限制,但这导致了调试困难——出错时需要跨多个 YAML 文件追踪
  • 节点间数据传递依赖约定。没有显式的输入/输出 schema 验证——classify.output.issue_type 是字符串级引用,打错字不会在解析阶段报错
  • 缺乏运行时状态可视化。虽然有 Web UI,但 YAML DAG 的实际执行路径(哪些条件分支被触发、哪些节点被跳过)不容易在事后审查
  • 子 workflow 嵌套可能导致 token 膨胀。每个 command 节点启动新的 LLM session,如果链很深,总 token 消耗会远超单个 long-context agent

3. Open SWE(LangChain)

仓库langchain-ai/open-swe

实际架构(agent/ 目录结构 + README 技术细节)

代码结构agent/ 下分 4 个子目录——integrations/(Slack/Linear/GitHub 接入)、middleware/(LLM 调用前后的钩子)、tools/(约 15 个工具)、utils/(工具函数),加上 prompt.py(系统提示构建)、server.pywebapp.py

构建在 Deep Agents 框架上,不是 fork。核心 agent 构建:

create_deep_agent(
    model="anthropic:claude-opus-4-6",
    system_prompt=construct_system_prompt(...),
    tools=[http_request, fetch_url, list_repos, get_branch_name,
           commit_and_open_pr, linear_comment, slack_thread_reply],
    backend=sandbox_backend,
    middleware=[ToolErrorMiddleware(), check_message_queue_before_model, ...],
)

沙箱设计

  • 每个任务在独立云沙箱中执行(支持 Modal/Daytona/Runloop/LangSmith 四种后端)
  • 线程级持久化——同一线程的后续消息复用同一个沙箱
  • 不可达时自动重建
  • 并行任务不排队

工具策展:约 15 个工具,刻意精简。对比 Stripe 的 ~500 工具,Open SWE 的设计哲学是 “少而精”:

  • execute(shell)、fetch_urlhttp_request 是基础能力
  • commit_and_open_prlinear_commentslack_thread_reply 是工作流集成
  • Deep Agents 内置的文件操作/grep/task spawning 不计在内

中间件层(关键创新)

  • check_message_queue_before_model:每次 LLM 调用前检查是否有人类中途插入了新消息,实现 “运行中追加指令”
  • open_pr_if_needed:安全网——如果 agent 完成了代码修改但忘了创建 PR,中间件自动补上
  • ToolErrorMiddleware:优雅处理工具调用错误

上下文工程

  • AGENTS.md 编码仓库级规则(代码规范、测试要求、架构决策)
  • Source context 在执行前组装完整的 issue/thread 历史

核心设计决策

组合优于 fork。Open SWE 构建在 Deep Agents 之上而非 fork 某个现有 agent——这意味着可以 pull upstream improvements 而不需要维护 fork。Ramp 对 OpenCode 做了同样的选择。

“隔离优先,边界内全权限”。沙箱内 agent 有完全的 shell 访问权限,但沙箱本身是隔离的。这比”精细权限控制”更实用——不用猜测 agent 需要什么权限。

中间件而非硬编码。质量保障逻辑(如 open_pr_if_needed)作为中间件注入,不写在 agent 核心逻辑中。这意味着不同团队可以用不同的中间件组合来适配自己的工作流。

多入口统一 agent。Slack/Linear/GitHub 三个触发面共享同一个 agent 构建逻辑,差异只在入口层。

值得借鉴的具体实现

  • check_message_queue_before_model 中间件:这是 “人在回路” 最优雅的实现——不需要暂停 agent 等人类输入,而是在下一次 LLM 调用前自然地注入新信息
  • open_pr_if_needed 安全网:确定性兜底——无论 LLM 行为如何不确定,关键动作(PR 创建)一定会发生
  • 沙箱线程持久化:同一对话的后续消息复用沙箱,既省资源又保持上下文
  • Deep Agents 的 task 工具:原生支持子 agent spawning,复杂任务可分拆并行

局限/缺陷

  • Deep Agents 框架依赖。Open SWE 的核心编排逻辑实际在 Deep Agents 中,读 Open SWE 源码看不到完整图景。如果 Deep Agents 有 breaking change,Open SWE 被动受影响
  • Stripe/Ramp/Coinbase “共性提炼” 的营销色彩。Open SWE 说它提炼了这三家的共性,但三家的实际实现差异很大(Stripe 500 工具 vs Open SWE 15 工具;Stripe EC2 vs Open SWE Modal/Daytona;Coinbase agent councils vs Open SWE 单 agent + 子 agent)。Open SWE 更像是 LangChain 团队基于公开信息的重新实现,不是真正的共性提炼
  • 缺乏质量门禁。没有 Archon 那样的 “review → self-fix → simplify” 流程。验证逻辑依赖 agent 自己跑 linter/test,没有结构化的多阶段审查
  • 工具策展太激进。15 个工具对简单任务够用,但对需要数据库查询、监控面板检查、复杂 git 操作的企业场景可能不够

4. AgentSys

仓库agent-sh/agentsys

实际架构(README 分析,源码不可直接验证)

src/ 目录返回 404——代码结构无法通过 GitHub Web 直接查看。以下分析完全基于 README 描述。

三层组织

  • 47 个 Agent:每个有单一职责和指定模型(Opus 做规划/实现、Sonnet 做发现/CI 修复、Haiku 做分类)
  • 40 个 Skill:可复用能力单元,分 5 类——Workflow(discover-tasks/prepare-delivery)、Enhancement(enhance-agent-prompts/enhance-docs)、Performance(baseline/benchmark/profile)、Analysis(drift-analysis/repo-intel)、Cleanup(deslop/sync-docs)
  • 19 个 Plugin:独立仓库,通过 npm 分发,包含 commands + agents + skills

Phase Gate:Pipeline 强制顺序执行——Exploration → Planning(需人类审批)→ Implementation → Review → Quality Gate → Ship。

关键命令

  • /next-task:任务到生产的全自动化(发现 → 实现 → 审查循环 → 部署)
  • /deslop:三阶段 AI 产物检测——Regex(HIGH 置信度)→ 多遍分析器(MEDIUM)→ CLI 工具(LOW)
  • /agnix:385 条规则验证 agent 配置
  • /skillers:观察 agent 行为模式 → 自动提取为可复用 skill 定义
  • /repo-intel:统一静态分析(git 历史 + AST 符号提取 + 项目元数据)

设计哲学:“Code does code work. AI does AI work.”——检测用 regex/AST/静态分析(确定性、省 token),判断用 LLM。README 声称这比纯 multi-agent 方案省 77% token。

核心设计决策

Certainty Level 分级。所有发现分三档——HIGH(自动修复)、MEDIUM(需上下文判断)、LOW(人类决策)。这比二值的 “auto-fix / manual” 更实用。

Plugin 市场化。每个 plugin 是独立仓库,独立版本,通过 npm 安装。这意味着社区可以贡献 plugin 而不用 fork 主仓库。

Sonnet + AgentSys vs 原始 Opus。README 声称结构化 pipeline 让 Sonnet 达到 Opus 质量,成本降 40%。如果数据可信,说明 harness 工程可以部分替代模型能力。

值得借鉴的具体实现

  • /deslop 三阶段检测:regex 做快筛(console.log/TODO/debug),多遍分析器做深检(doc-to-code ratio/verbosity),CLI 做兜底——按成本递增排列
  • /skillers 行为观察 → skill 提取:这是 meta-harness 的轻量版——不是搜索 harness 空间,而是从已有 agent 行为中沉淀可复用模式
  • Phase gate 强制人类审批点:Planning 阶段必须人类确认后才进入 Implementation,避免 agent 跑偏后浪费大量 token

局限/缺陷

  • 代码不可验证src/ 返回 404,无法确认 47 agent、40 skill、19 plugin 的实际实现质量。README 中的数字可能反映的是目标而非现状
  • 数字驱动的 README。“47 agent + 19 plugin + 40 skill + 3,583 测试” 的表述方式更像营销而非工程文档
  • 复杂度风险。47 个 agent 的协调、19 个 plugin 的版本兼容、40 个 skill 的触发重叠——这些组合爆炸风险在 README 中没有讨论
  • Sonnet vs Opus 对比缺乏控制变量。“同一任务同一 prompt” 不够——需要知道有多少个不同任务、分布是什么、Opus 是否也用了同样的 pipeline

5. agnix(Harness Linter)

仓库agent-sh/agnix

实际架构(Rust workspace 结构)

6 个 crate

  • agnix-core:验证引擎库
  • agnix-cli:命令行二进制
  • agnix-lsp:Language Server Protocol 实现
  • agnix-mcp:MCP server 二进制
  • agnix-rules:规则引擎组件
  • agnix-wasm:浏览器/运行时 WebAssembly 绑定

385 条规则按工具前缀组织

前缀数量目标
CC-*53Claude Code
KIRO-/KR-51Kiro
AS-/CC-SK-31Agent Skills
CUR-*16Cursor
MCP-*12Model Context Protocol
AGM-/XP-13AGENTS.md
GM-*9Gemini CLI
COP-*6GitHub Copilot
CLN-*4Cline

规则来源:官方规范文档 + 学术研究(agent 有效性)+ 生产环境失败模式的经验提取。

三级修复置信度

  • --fix:HIGH + MEDIUM 置信度自动修复
  • --fix-safe:仅 HIGH 置信度
  • --dry-run --show-fixes:预览变更

核心设计决策

选择 Rust。性能关键路径(LSP 实时诊断)需要低延迟。Rust workspace 结构也让 CLI/LSP/WASM 共享核心逻辑。

LSP 优先。不只是 CLI 工具——通过 LSP 集成到 VS Code/JetBrains/Neovim/Zed,在编辑器中实时显示诊断。这比 “保存后跑 linter” 的体验好一个量级。

跨工具覆盖。不只针对 Claude Code——覆盖 9 种 agent 工具/IDE。这使得 agnix 成为 “agent 配置质量” 的通用基础设施。

值得借鉴的具体实现

  • 规则前缀命名约定CC-SK-001 一眼就能看出是 Claude Code + Skills 相关的第 1 条规则,便于筛选和分类
  • WASM 绑定:意味着可以在浏览器中运行 lint,无需安装——降低采纳门槛
  • MCP server 模式:agent 可以在运行时调用 agnix 验证自己的配置——实现 “自检”

局限/缺陷

  • 规则的实际质量无法验证。看不到 agnix-rules crate 的源码,不知道 385 条规则中有多少是 trivial 的 schema 检查 vs 有意义的语义验证
  • 与 AgentSys 的强耦合。两个项目来自同一个组织(agent-sh),agnix 的 /agnix 命令直接内置在 AgentSys 中。独立使用时的文档和体验可能次于集成使用
  • 规则来源的 “学术研究” 引用不透明。README 提到 “academic research on agent effectiveness” 但没有列出具体论文

6. revfactory/harness(Meta-Skill)

仓库revfactory/harness

实际架构(SKILL.md 完整分析)

这不是运行时代码,是 Claude Code 的 skill 定义。整个项目的核心是一个 SKILL.md 文件 + references/ 目录,通过 Claude Code 的 skill 系统在对话中激活。

6 种架构模式的具体区别

模式核心特征适用场景协调开销
Pipeline顺序依赖,输出→输入阶段间有明确先后关系
Fan-out/Fan-in并行独立 → 聚合子任务互不依赖中(聚合复杂)
Expert Pool按上下文选择专家问题类型多变中(路由逻辑)
Producer-Reviewer生成+质检需要质量保障
Supervisor中央调度,动态分配任务不可预测
Hierarchical Delegation递归向下分解多层级复杂系统最高

Progressive Disclosure 三级加载

  1. Metadata(总在上下文中):~100 词,skill 的激活条件和基本描述
  2. SKILL.md body(激活时加载):<500 行,完整的工作流指令
  3. references/(按需加载):无限大,领域特定参考材料。>300 行的文件需要目录头

Phase 0-7 完整工作流

  • Phase 0:现状审计——扫描 .claude/agents/ + .claude/skills/ + CLAUDE.md,检测与实际代码库的 drift
  • Phase 1:领域分析——任务类型、用户水平、技术栈
  • Phase 2:架构选择——team-first 默认,按 4 轴(专业化/并行性/上下文/复用性)评估 agent 拆分
  • Phase 3:Agent 定义生成——每个 agent 的角色/原则/IO 协议/错误处理/协作机制
  • Phase 4:Skill 生成——description 必须”激进”(包含显式触发词),因为 Claude 解释保守
  • Phase 5:集成编排——team 模式用 TeamCreate/TaskCreate/SendMessage API,subagent 模式用 Agent + run_in_background
  • Phase 6:验证——结构检查 + skill 触发测试(should-trigger / should-NOT-trigger 各 8-10 条)+ dry-run
  • Phase 7:持续演化——反馈收集、迭代优化、CLAUDE.md 变更记录

核心设计决策

skill 定义纯文本化。没有代码、没有 YAML、没有配置文件——全部是 markdown 中的自然语言指令。Claude 的 skill 系统将这些文本注入到 system prompt 中。这意味着 “编程” harness 的方式就是写文档。

Phase 0 的现状审计。不是从零开始设计,而是先扫描已有配置、检测 drift。这个设计承认了现实——大多数项目不是 greenfield,已有的 agent 配置可能和代码库实际状态不一致。

对照实验设计

  • With-Skill vs Without-Skill 对比:两个并行 agent 执行相同 prompt
  • Near-Miss 触发测试:should-trigger 和 should-NOT-trigger 各 8-10 条查询
  • 触发重叠检测:识别新 skill 是否与已有 skill 冲突

值得借鉴的具体实现

  • Phase 0 drift 检测:大多数 harness 工具假设从零开始,但 revfactory/harness 先做审计——这在真实项目中价值巨大
  • Skill description 激进原则:Claude 对 skill 触发的解释倾向保守,所以 description 必须包含显式触发场景和关键词
  • 8-10 条 should-NOT-trigger 测试:不只测正面匹配,还测边界——“从 Excel 提取 PNG 图表” 是否会误触发图像处理 skill?
  • 三种执行模式:Team(通信协作)、Subagent(隔离执行)、Hybrid(按阶段混合)

局限/缺陷

  • 纯方法论,无运行时。所有逻辑依赖 Claude 的 skill 执行能力——如果 Claude 对某条指令理解偏差,没有代码层兜底
  • 质量分 49.5→79.3 的实验细节不透明。15 个任务是什么?评分标准是什么?谁打的分?是否有对照组的多次重复?README 给了数字但没给可复现的实验 protocol
  • 100 个 harness 模板(harness-100) 的质量参差。1,808 个 markdown 文件跨 10 个领域——量大但没有公开的质量评估
  • 与 Claude Code 强绑定。Phase 5 的 TeamCreate/TaskCreate/SendMessage 是 Claude Code 专有 API,不能在其他 agent 框架中使用

7. harness-kit / Odin

仓库deepklarity/harness-kit

实际架构(odin/ 目录结构 + CLAUDE.md 分析)

三个组件

  • odin/:多 agent CLI 编排(plan → assign → execute → reflect)
  • taskit/:任务面板 UI + Django API(看板、DAG、时间线、分析)
  • harness_usage_status/:provider quota 监控

Odin 核心流程

odin plan [--auto|--quiet]  →  任务分解(支持交互/一键/CI 三种模式)
odin assign <task_id> <agent>  →  手动覆盖或确认 agent 分配
odin exec [<task_id>] [--mock] [--fg]  →  执行任务(后台/前台/mock 模式)
odin status / logs -f / show / watch  →  监控

Agent 集成:通过 harnesses/ 目录下的 CLI 适配器对接不同 agent(Claude/Gemini/Qwen/Codex/Kilo/OpenCode)。每个适配器实现 BaseHarness 契约——execute() + execute_streaming() 两个代码路径。

状态管理:“No run.json” 原则——所有状态在 spec 归档和 task 文件中,spec status 从 task 状态纯函数推导。.odin/specs/ 管理归档,.odin/logs/mcp_<task_id>.json 存 per-task MCP 配置。

MCP 集成:Claude Code 支持 --mcp-config 标志,Odin 为每个 task 生成独立的 MCP 配置。其他 CLI(Gemini/Qwen 等)使用项目本地自动发现。

核心设计决策

“No Slop” 原则的落地方式

  1. Red/Green TDD:测试 agent 只拿到行为需求,看不到实现——这是架构级隔离,不是建议级规范
  2. Slop Audit:自动化扫描 AI 产出的 console.log、dead code、misplaced files、安全问题
  3. Knowledge Compounding:解决的问题自动沉淀为可搜索文档
  4. Loop Audit:识别 debugging gap 在恶化前介入

Cost-Aware Delegation:默认分配最便宜的 capable agent。系统评估 quota 余量和能力匹配(Claude vs Codex 等),但允许人类 override。

DAG 编排:任务分解为依赖图,独立任务并行、依赖任务串行。失败的任务阻塞其下游——不浪费 token 在注定失败的路径上。

Proof of Work:每个 task 附带证据——agent 输出、评论、耗时、成本。任务面板是永久审计记录。“Undocumented work didn’t happen”。

值得借鉴的具体实现

  • 测试 agent 与实现 agent 的架构级隔离:测试 agent 拿不到实现代码,只有行为 spec——这确保测试不会”看着答案出题”
  • 三种 plan 模式:Interactive(tmux 对话)、Auto(一键分解)、Quiet(CI 用)——适配不同使用场景
  • odin exec --mock:跳过所有后端写入(状态更新/评论/成本追踪)但仍执行 harness——纯测试模式
  • Multi-agent CLI 适配器模式BaseHarness 抽象让新增 agent 后端只需实现两个方法
  • Suggestive, not prescriptive:任务分配是建议,不是强制——人类保持最终控制权

局限/缺陷

  • odin plan 无法嵌套在 Claude Code session 中。因为它自己启动 Claude Code 子进程——两层 Claude Code 不能嵌套。这在工作流中是个严重约束
  • Django + Celery 技术栈较重。taskit 的依赖链(Django + Celery + 前端 SPA)对轻量级场景是 overkill
  • 多 agent CLI 的版本兼容性。不同 agent CLI 的 MCP 配置格式不同,每次 CLI 更新都可能破坏适配器
  • 缺少 agent 产出的自动化质量评估。Proof of Work 是记录,不是验证——记录了 agent 做了什么,但没有自动判断做得好不好

跨项目对比分析

一、关键设计点的不同选择

设计点Meta-HarnessArchonOpen SWEAgentSysagnixrevfactoryharness-kit
Workflow 定义代码(Python 继承)YAML DAG代码(Python + middleware)Plugin + CommandN/A(Linter)自然语言(SKILL.md)代码(Python CLI)
Agent 数量单 agent单 agent,多节点单 agent + 子 agent47 agentN/A按需生成多 agent
质量门禁双确认 task_completePhase gate + 5 路并行 review中间件兜底Phase gate + /deslop385 条静态规则Phase 6 验证Red/Green TDD + Slop Audit
并行策略YAML depends_on 控制Deep Agents task 工具Plugin 间并行N/AFan-out 模式DAG 依赖图
隔离机制tmux sessiongit worktree云沙箱(Modal 等)不明确N/Aagent 定义文件隔离测试/实现 agent 隔离
模型策略固定(Opus/Haiku)按节点分配固定(Opus)按 agent 分配N/A无运行时最便宜 capable agent
人在回路interactive 节点中间件消息队列Planning 阶段审批N/APhase 2 确认odin assign 覆盖

二、工程深度分级

级别项目判断依据
A 级:有真正工程深度Archon20 个完整 YAML workflow 可读可验证,条件分支+并行 review+模型分层都在代码中可见
Open SWE中间件架构设计精巧,代码结构清晰(agent/integrations/middleware/tools),沙箱多后端支持
harness-kit/Odin三种 plan 模式、multi-agent CLI 适配器、DAG 执行、mock 模式——工程考量全面
B 级:有方法论价值revfactory/harness6 种架构模式分类 + Phase 0-7 流程 + 对照实验设计,虽无运行时但指导性强
agnixRust workspace 结构合理,LSP + WASM + MCP 多端覆盖,但规则质量不可验证
C 级:有限价值Stanford Meta-Harness核心创新仅约 200 行原创代码。作为学术 artifact 有参考价值,但工程可复用性极低
AgentSys源码不可访问,数字驱动的 README,工程深度无法独立验证

三、核心分歧:YAML vs 代码 vs 自然语言

YAML 定义 workflow(Archon)

  • 优势:非工程师可读、版本控制友好、节点级重用
  • 代价:表达力受限、调试困难(跨文件追踪)、缺乏类型安全

代码定义编排(Open SWE、Odin)

  • 优势:完全表达力、IDE 支持、类型检查
  • 代价:非工程师不可读、修改需要编程能力

自然语言定义(revfactory/harness)

  • 优势:最低门槛、最灵活
  • 代价:执行依赖 LLM 理解能力、不可测试、不可 debug

判断:对于需要确定性保障的生产环境,YAML 和代码是更好的选择;自然语言适合快速原型和方法论探索。Archon 的 YAML 是在”可读性”和”确定性”之间的平衡点。

四、研发团队的起点建议

团队情况建议起点原因
想快速搭建内部 coding agentOpen SWEMIT 许可,10 分钟可跑,LangChain 生态,沙箱开箱即用
想标准化团队 AI 工作流ArchonYAML 定义便于团队共享和版本控制,20 个模板覆盖常见场景
重工程纪律,品味驱动harness-kit/Odin”No slop” 原则、测试/实现隔离、DAG 编排、cost-aware
想设计 agent 团队架构revfactory/harness6 种模式分类 + Phase 0-7 流程是最系统的方法论参考
需要 agent 配置质量保障agnix385 条规则 + LSP 实时反馈,跨 9 种工具
学术研究 / harness 空间搜索Stanford Meta-Harness论文价值 > 代码价值,环境预引导是可复用的 trick

信息源

核心参考(源码直读)

补充参考

调研发现

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 分析,行动建议中的”优先级”判断只能基于质量维度而非经济维度。这是当前公开文献的系统性缺失,可能是故意保密(竞争敏感)也可能是早期实践者尚未系统追踪。

产出

100 Harness Engineering:当 AI 写了 100% 的代码,人类还在做什么?

Harness Engineering:当 AI 写了 100% 的代码,人类还在做什么?


2026 年 2 月,一篇工程博客在技术社区引发了不亚于 ChatGPT 发布时的骚动。

OpenAI 的工程师 Ryan Lopopolo 写道:他们用 3 名工程师,花了 5 个月时间,构建了一个百万行量级的完整产品。这不是什么罕见的生产力数字——真正让人震惊的是另一个细节:整个项目中,没有一行代码是人工编写的。

所有代码均由 AI(Codex)生成。工程师的工作,是让 AI 能够正确地工作。

这一句话值得停下来反复读。它翻转了我们关于软件工程的一切直觉:工程师的核心价值,不再来自于”我能写出什么代码”,而来自于”我能设计出什么系统,让 AI 写出正确的代码”。

这个转变有一个名字:Harness Engineering


一、从”写好提示词”到”设计系统”——一场没有发布会的革命

理解 Harness Engineering,必须先搞清楚它从哪里来。

2022 年底,ChatGPT 横空出世。整个技术社区的注意力集中在一件事上:如何通过改写输入文本,从模型那里获得更好的输出。这就是所谓的”Prompt Engineering”——写一段话,换个写法,多试几次,找到最有效的表达方式。在这个阶段,“工程”几乎等同于”写作技巧”,更像文案创作而非系统设计。

这条路走了大约一年,局限性开始暴露。当开发者试图构建真正长期运行的系统时——不是单次问答,而是能持续工作几十分钟、处理上百个文件、自主完成一个完整功能的 Agent——他们发现,优化提示词远远不够。Agent 会忘事,会偏轨,会在复杂任务中途崩溃,会生产出通过了测试但实际上根本不应该进入代码库的代码。

2023 到 2024 年间,“Context Engineering”成了新的关键词。Andrej Karpathy 在 2025 年 6 月给出了他的精炼表述:“填充上下文窗口以包含恰当信息的精妙艺术”。这是向前迈了一步——从优化单个提示词,到设计 Agent 整个运行期间接收到的信息流。但它仍然主要是一个关于”输入”的问题。

真正的范式转移发生在更广的维度上。工程师们开始意识到,让 Agent 可靠工作,需要的不只是精心组织的上下文,还需要:让 Agent 知道自己不知道什么时该去查文档的架构;当 Agent 产出违反规范的代码时立即报错并给出修复指引的自定义 linter;负责在 Agent 工作几个月后清理掉那些因快速生成而产生的文档技术债的”垃圾回收 Agent”;以及在 Agent 偷偷犯错时能够及时发现的可观测性体系。

这一套东西加在一起,就是 Harness Engineering。

Martin Fowler 给出了一个最简练的定义:“约束和控制 AI 代理的工具和实践”。注意他用的词是”约束”(constraining),而不是”引导”(guiding)。这个措辞选择意味深长——Agent 本质上是不确定的,harness 的作用是在这种不确定性周围建立确定性的边界。

“Harness”这个词本身就是一个精准的隐喻。它的英文语义包含两层:一是马具——套在马身上的控制装置,让马的力量可以被有效利用,同时保持方向控制;二是线束/安全带——将复杂系统中的多个部件有序组织起来,防止混乱,提供保护。AI Agent 就是那匹马,harness 就是那套允许你驾驭它的系统。

而 Mitchell Hashimoto(HashiCorp 联合创始人,Ghostty 终端作者)给出的可能是整个领域最有操作性的定义,只有一句话:

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

这句话把 Harness Engineering 描述为一种工程响应模式,而不是一次性的架构设计。每个错误都是一个信号,指向 harness 的一个缺口,需要被填补。harness 不是一个你在项目开始时设计好的系统,而是一个随着 Agent 不断犯错、不断被修复而持续生长的活体结构。


二、一个 Harness 到底长什么样

如果要用一句话描述 harness 的本质,HuggingFace 技术总监 Philipp Schmid 的类比是迄今为止我看到的最清晰的:

模型是 CPU,上下文是 RAM,Harness 是操作系统。

这个类比的妙处在于它揭示了一种层次关系:CPU 的性能固然重要,但没有操作系统,CPU 什么都干不了。操作系统负责调度、内存管理、设备驱动、进程隔离——这些都不是 CPU 的事,但没有它们,CPU 就只是一块发热的硅片。

从实际的工程案例中,一个完整的 harness 可以解析为五层结构:

第一层是上下文管理层。 这是最基础的一层,也是最容易被误解的一层。很多人以为”给 Agent 更多信息”是更好的,实际上恰好相反。OpenAI 的工程师在百万行代码的实践中发现了一个反直觉的规律:上下文是稀缺资源,一个巨大的指令文件会挤掉任务、代码和相关文档,导致 Agent 要么错过关键约束,要么针对错误的约束优化。

他们的解决方案是把 AGENTS.md(Agent 读取的核心指导文件)保持在约 100 行,只做一件事:告诉 Agent 在 docs/ 的哪个子目录能找到什么类型的信息。这个文件是目录,不是百科全书。全量知识分散在各个专项文档里(SECURITY.mdQUALITY_SCORE.mdRELIABILITY.md……),Agent 只在需要时按需加载,不是每次任务都把所有知识塞进上下文。

第二层是约束执行层。 把架构规则写在文档里没有用——Agent 在压力下(上下文快满时、任务复杂时)会绕过它。有效的约束必须是机器可执行的:违反分层依赖的代码,在 lint 阶段直接报错,且错误信息中内嵌修复建议,Agent 不需要查文档就能自我修正。OpenAI 为此专门开发了自定义 linter,把整个代码库的层级依赖规则(Types → Config → Repo → Service → Runtime → UI,严格单向,不得跨层或反向)编码成无法绕过的硬约束。

第三层是反馈回路层。 核心原则是”左移”——让 Agent 越早知道自己错了越好。Stripe 的 Minions 项目要求本地 linting 必须在 5 秒内返回结果;CI 验证最多允许两轮,强制 Agent 在本地充分验证后再提交,不能把 CI 当调试工具反复试错。这背后的工程直觉是:反馈延迟越长,Agent 在错误路径上走的距离越远,修复成本越高。

第四层是编排调度层。 当 Agent 数量从一个扩展到几十个、几百个,协调成本开始支配系统行为。Cursor 用四代架构的失败和成功告诉我们:平等协调(所有 Agent 地位平等)会产生锁竞争;瀑布式分工(规划者-执行者-工作者三层分离)无法应对任务执行中的实时变化;而”递归规划者 + 专职工作者”的架构才是当前的有效解——规划者持续运行并递归拆解任务,工作者接收明确定义的子任务独立执行,任何单个工作者失败不影响其他人。

第五层是自愈维护层。 这是最容易被忽略的一层,但在长周期项目中可能是最关键的。AI 生成代码的速度远快于文档更新的速度,三个月后,你的文档已经成了一个布满错误导航的地图,会误导后续 Agent 走向错误的方向。OpenAI 的解决方案是部署专职的 doc-gardening agent,定期扫描代码变更,识别需要更新的文档并执行清理。这把文档维护从人工驱动变成了 Agent 自驱动的闭环。

五层加在一起,构成了一个持续运作的强化回路:上下文层为 Agent 提供知识,约束层把知识转化为可执行规则,反馈层检测规则的执行效果,编排层协调多个 Agent 并行工作,自愈层持续修复整个系统的退化。


三、硅谷的 Harness 竞赛

理解 Harness Engineering 最好的方式,是看真实的案例。不是”我们在探索 AI”的 PR 稿,而是有具体数字和具体工程决策的实践。

OpenAI:极端实验

OpenAI 的案例是目前公开细节最丰富的。

他们选择了一条极端路径:从空 repo 开始,零人工代码,完全由 AI 生成一切。这个原则不是口号——是一条每天都要执行、每次 commit 都要遵守的操作规程。工程师的工作,是把时间从”写代码”完全转移到”设计 AI 能正确执行代码的系统”。

5 个月,3 名工程师(后来扩展至 7 名),百万行代码,每人每天合并 3.5 个 PR。这最后这个数字在传统开发模式下几乎不可能持续——3.5 个 PR/人/天,意味着即便 Agent 在跑 6 小时以上的长任务,工程师的审核和验收流程也被压缩到了极致。

值得注意的是,扩展到 7 人后,吞吐量没有下降反而持续提升。这违反了软件工程中著名的 Brooks 定律(“向延误的项目增加人力只会使它更加延误”),原因恰恰在于 harness 的存在——新工程师接入的不是需要反复沟通隐性知识的人类团队,而是一套有明确文档、可执行约束和自动化验证的 harness 系统。

Stripe Minions:工业流水线

Stripe 面临的是一个更接近大多数企业现实的挑战:数亿行存量代码,不可能从零重建,需要把 Agent 能力嫁接在一个有复杂历史的代码库上。

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

为了支撑这个速度,Stripe 构建了一套精密的基础设施:10 秒启动的隔离 devbox(保证 Agent 的每次执行在干净环境中进行)、通过 MCP 协议统一暴露的 400+ 内部工具(企业知识与 Agent 执行解耦)、以及严格的反馈左移——本地 linting 必须 5 秒内返回,CI 最多两轮。

他们选择在 Block 公司开源的 goose 项目基础上定制开发,而不是从零自研或使用通用商业产品。原因非常具体:Ruby + Sorbet 技术栈 + 大量专有内部库,任何通用框架都无法理解他们的类型系统和代码约定。代码库的特殊性越高,自研 harness 的回报率越高。

Cursor:四代演化的工程教训

Cursor 的案例是公开案例中最有工程学习价值的,不是因为它成功,而是因为它记录了三代失败。

第一代:所有 Agent 平等协作,通过协商分配任务。失败原因:大量时间消耗在锁竞争上,平等协商产生了无法接受的通信开销。

第二代:规划者-执行者-工作者三层分离。失败原因:架构太僵化,当任务需要运行时动态调整时,三层之间的协调延迟无法接受。

第三代:单个高能力 Agent 连续执行所有任务,减少协调开销。失败原因:上下文过载,一个 Agent 同时持有全局视角和实现细节,窗口很快填满,任务质量随时间线性衰减。

第四代:递归规划者 + 专职工作者。规划者持续运行并递归拆解任务,工作者接收明确边界的子任务独立执行,失败不级联。成功。

Cursor 目前每周协调数千个 Agent 完成约 1000 次提交,全部运行在单台高配 Linux VM 上,编排系统用 Rust 编写。公司估值 500 亿美元——而 Cursor 本身不训练模型,它的核心竞争力就是这套 harness 系统。

Cursor 工程师还明确指出了一条反直觉的教训:模糊指令会放大不良行为。 当 Agent 数量达到数千时,一个模糊指令产生的偏差会被规模效应放大数千倍。不说”避免太长的函数”,说”函数长度不超过 50 行”;不说”适当添加注释”,说”每个公共接口必须有 JSDoc 注释”。约束要可以被机器验证,而不只是人类可以理解。

Anthropic:GAN 式的质量博弈

Anthropic 的案例聚焦在一个其他三家没有正面讨论的问题上:长任务中的质量退化

他们发现了两种系统性失败模式。一种叫上下文衰减:随着任务推进,上下文窗口不断累积信息,模型的行为逐渐”漂移”——早期的指令被压入远端上下文,注意力权重下降,任务后期的行为开始偏离初始设定。另一种叫自我评估偏差:模型在评估自己的输出时倾向于过度乐观,被要求”再检查一遍”时,往往认为之前的工作已经足够好。这和人类的”作者偏见”本质上是同一种机制。

Anthropic 的解决方案借鉴了生成对抗网络(GAN)的思想:三角色架构——规划者(Planner)负责任务设计和上下文管理,生成者(Generator)专注执行和代码生成,评估者(Evaluator)独立评审生成者的产出。三者相互制衡,评估者扮演那个不会被自我偏见影响的”外部视角”。

另一个关键发现:当上下文窗口快满时,上下文重置(清空并重新加载结构化状态)优于上下文压缩(试图把历史信息压缩进去)。压缩保留的是信息的摘要,不是信息本身;而经过结构化的状态重置,可以让 Agent 以干净的上下文重新接受明确的任务定义,避免历史噪音的干扰。

一个人的军队

最后一个案例更个人,但数字同样令人震惊。

Charlie Guo(OpenAI 研究员)在 X 上分享了一个叫”OpenClaw”的项目:单人,月产 6600+ commits。这不是打字打出来的,而是一个人设计和维护一套 harness,让 Agent 持续输出代码,自己专注于设计和审查。

这是 harness engineering 价值最直接的个人层面体现:一个有足够 harness 构建能力的人,可以一个人做过去需要一个团队才能完成的工作量。


四、Big Model vs Big Harness——一场关于 AI 未来的核心辩论

如果说以上这些案例让你对 Harness Engineering 感到振奋,那么下面这场辩论会让你的思绪变得复杂一些。

这是当前 AI 工程界最根本的分歧,没有之一。它的核心问题是:获取 AI 价值的主要瓶颈在哪里?

Noam Brown 的立场

OpenAI 推理研究负责人 Noam Brown 是”Big Model 派”最有分量的声音。他的核心论断是:随着推理时计算(test-time compute)的成熟,AI 系统能够在执行任务时进行动态思考和规划,这将使许多精心设计的 Agent 框架变得多余。

他的历史论据是 Richard Sutton 的 Bitter Lesson:过去几十年,工程师耗费巨大心血设计的”聪明”算法,无一例外地输给了”笨但可扩展”的大规模计算方法——知识表示系统输给了神经网络,符号规划器输给了端到端学习,精心设计的特征工程输给了让模型自己学特征。如果历史规律成立,我们今天精心设计的 harness,终将在足够强大的模型面前变得多余。

这不是空洞的预言。数据在支持它:METR 的研究发现,Claude Code(Anthropic 花了大量工程投入打磨的成熟 harness 产品)与简单的基础 scaffold 相比,在 SWE-bench 上的性能差异并不显著。Scale AI 的数据甚至显示,某些模型在加了 harness 之后性能反而下降了。

Jerry Liu 的立场

LlamaIndex 创始人 Jerry Liu 的起点完全不同。他不关心模型理论上能做什么,他关心的是你实际上能从模型中提取出多少价值。

他的论断是:“获取 AI 价值的最大瓶颈从来不是模型能力的上限,而是你自己整合 AI 的能力。“即便模型能力翻倍,如果你不知道如何构建有效的 harness,你实际获得的价值可能只增加 20%。反之,即便模型保持不变,一个优秀的 harness 工程师可能将价值提取效率提升 5 倍。

支持这个立场的实证研究令人印象深刻:仅改进 harness 设计,就能让 15 个来自不同厂商的 LLM 在同类任务上显著提升性能——控制住模型变量,只改变 harness,全面提升。这意味着 harness 的改进效果是模型无关的,是一种独立于模型能力的价值来源。

而 Cursor 500 亿美元的估值是市场对这个命题最直接的投票。这家公司不训练任何基础模型,它的核心就是在现有模型之上的 harness 工程能力——市场愿意为此支付数百亿美元。

METR 投下的一颗炸弹

在这场辩论最激烈的地方,METR(模型评估与威胁研究机构)的研究投下了一颗重磅炸弹,但炸的不是任何一派,而是整个评估体系。

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

结果是:约半数通过 SWE-bench 自动评分的 PR,不会被真实维护者合并。 具体数字:Claude Sonnet 4.5 的 SWE-bench 自动评分约 70%,同一批 PR 经维护者审查的合并率约 50%,差距约 20 个百分点——而人类工程师提交的 PR 被合并率约 68%。

这意味着什么?意味着当一个 AI Agent 告诉你”我通过了测试”,它有相当大的概率是通过了一个不能代表真实质量的测试。AI 代码通过了测试,但代码的可读性、与现有风格的一致性、架构边界的遵守、以及对未来维护的影响——这些维度 benchmark 根本不测。

METR 的发现和 Harness Engineering 的关系是深刻的:它说明 harness 的验证层必须超越 benchmark,包含真实质量评估维度。那些只是让 Agent 通过自动评分的 harness,不如那些让 Agent 产出真正值得合并的代码的 harness。

HumanLayer 的反直觉发现

还有一项研究让”Big Harness 派”的论据更加有力:HumanLayer 发现,仅通过改变 harness 配置(而不是更换模型),Claude Opus 4.6 在某评测中的排名可以从 33 名跳升到 5 名。

这个数字的含义是惊人的:同一个模型,因为 harness 不同,可以在排行榜上相差 28 个名次。这说明一个模型的”能力”,在很大程度上是相对于特定 harness 的能力,而不是一个客观固定的属性。

我的判断:两派都对,也都错

把这场争论放在时间轴上,矛盾就消失了:

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

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

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

真正危险的是把这场争论变成一种宗教——要么固执地投入大量工程资源构建注定被模型进步淘汰的复杂 harness,要么因为担心 harness 被淘汰而什么都不做。

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


五、房间里的大象:Brownfield 困境

读到这里,你可能已经有了一种冲动:明天就去构建自己的 harness。

但请先注意一个我们一直没有正面讨论的事实:几乎所有成功的 harness 案例都是从零开始的(greenfield)。

OpenAI 的百万行代码?从空 repo 开始。Cursor 的多 Agent 系统?重新设计的新代码库。个人开发者的 6600 commits?同样是他自己设计的新项目。

这些案例之所以成功,很大程度上是因为它们不需要处理遗留代码的复杂性。一个干净的 repo,可以按 harness 的要求设计分层架构、规划文档结构、从第一天起建立自定义 linter。

但大多数工程师面对的现实是:存量代码库(brownfield)。一个已经运行了五年的系统,没有完整的测试覆盖,架构设计决策来自三任 CTO 的不同哲学,文档里有一半是过时的,代码里有大量隐性知识存在于资深工程师的大脑里而不是任何文件中。

Charlie Guo 在 OpenAI 直接指出:brownfield 仍然是一个未解问题。没有人公开了在大型存量代码库上规模化使用 Agent 的可行方案。Stripe 算是最接近的,但他们有一个其他公司很难复现的条件:数年的基础设施投资、数百名工程师维护的 Toolshed、以及强大到足以定制自己工具链的工程能力。

这对大多数团队意味着什么?

意味着”今天就开始”是正确的,但”从小处开始”是必要的。不要试图一次性把整个代码库翻新成 agent-friendly 的状态——那会是一个无法完成的项目。而是按照 Mitchell Hashimoto 的思路:每次 Agent 犯一个错,就工程化地解决这一个错。 一次修复一个漏洞,harness 会逐渐生长出来,同时代码库也会逐渐变得更 agent-friendly。

这比宏大的重构计划更可靠,也更符合 Harness Engineering 的本质——它本来就是一个持续迭代的过程,不是一次性的架构设计。


六、如果你明天就想开始

Mitchell Hashimoto 把个人的 Harness Engineering 采纳路径归纳为 6 个阶段。这里是精炼版——不是理论框架,而是他本人亲身走过的路。

阶段一:从聊天切换到 Agent。 停止把 AI 当做一个可以复制粘贴答案的对话框,开始把任务委托给一个能直接读写文件、执行命令的 Agent。这个切换在技术上只需要换个工具,但在认知上要求一个真正的转变:你不再是”使用 AI 辅助”,你是在”委托 Agent 完成任务”。

阶段二:用 Agent 重复你刚做完的工作。 手动完成一个任务后,让 Agent 重新做一遍,然后比对差异。这步的目的不是验证 Agent 的能力,而是发现它的错误模式——它在什么类型的任务上系统性地犯同类错误?这些模式,就是你第一批 harness 的建设线索。

阶段三:睡前启动深度任务。 在工作日结束时给 Agent 启动一个探索性任务,第二天早上审查产出。这开始建立”并行工作流”的感觉,也是开始信任 Agent 在无监督状态下运作的练习。

阶段四:把高确定性任务完全委托出去。 把你的工作按”确定性”分类:有明确输入输出规范、有客观正确标准的任务(写测试、生成文档、添加日志)委托出去;需要复杂判断的任务(架构决策、产品权衡)自己来。

阶段五:工程化每一个错误。 这是核心阶段。不只是修复 Agent 犯的具体错误,而是设计系统让同类错误不再发生。三个层次:写进文档(最轻量,但只靠语言约束效果有限);写自动化验证脚本(可重复运行的 linter 规则或测试);约束执行(把产生错误的行为从 Agent 的可操作范围内移除,让违规在结构上不可能发生)。

阶段六:持续运行。 当你的 harness 已经足够可靠,设置触发条件让 Agent 自主开始特定的工作——每次新 issue 被创建时自动生成调试报告,每次主分支有新提交时自动检查潜在问题,定时运行代码库健康检查。

还有三个最常见的陷阱,值得单独警示:

陷阱一:把 AGENTS.md 写成一个几千行的知识百科。 这会消耗大量上下文窗口,同时稀释真正重要信息的权重。AGENTS.md 应该是导航文件,不是知识库。

陷阱二:只停在”文档化”层次。 把约束写在文档里,Agent 在压力下会绕过它。有效的约束必须是机器可执行的——能报错的 linter,能失败的测试,而不只是文字说明。

陷阱三:在 harness 还不稳定时急于进入”持续运行”模式。 没有足够约束的 Agent 在无监督状态下运行,是一台快速制造技术债的机器,不是你的助手。先把阶段五做扎实,再进入阶段六。


七、软件工程的下一个十年

2006 年,如果你是一名优秀的软件工程师,你的核心竞争力来自于你能写出什么样的代码:算法设计、系统架构、代码质量。

2016 年,价值开始迁移。DevOps、CI/CD、Infrastructure as Code 的兴起意味着”能让系统持续可靠运行”变得和”能写出系统”同等重要。

2026 年,另一次迁移正在发生。写代码这个动作,正在逐渐成为一个工程师应该委托出去的工作。真正的竞争力,来自于你能设计出什么样的系统,让 AI 在正确的约束下持续可靠地写出好代码。

这不是软件工程师被淘汰的故事。这是软件工程师的职业内容正在发生一次深刻的质变——从”写代码的人”到”设计能让 AI 写好代码的系统的人”。

这个转变对技术能力的要求非但没有降低,反而更高。你不能设计有效的 linter 规则,除非你知道什么样的代码模式是有问题的。你不能写出有用的 AGENTS.md 约束,除非你知道 Agent 在你的代码库里会产生什么样的典型错误。你不能判断 benchmark 结果是否可信,除非你能独立评估代码质量。Harness Engineering 是一种放大器,而不是替代物——它让有技术深度的工程师变得更强大,而不是让没有基础的人凭空产出高质量代码。

当然,Harness Engineering 不会是终点。如果 Bitter Lesson 的规律继续成立,也许在某个时间点,一个足够强大的模型会开始自己设计 harness、自己构建约束、自己管理多 Agent 的协调。到那时,工程师的价值可能又会迁移到我们今天还无法预见的维度。

但这不是明天的问题。明天的问题是:你的代码库有没有一个 AGENTS.md?你的 Agent 犯的错有没有被工程化地解决?你的约束是写在文档里的文字,还是嵌在 linter 里的规则?

这些,是今天就能开始做的事。


一个问题留给读者:当 Agent 已经能够设计 harness 本身,谁来设计 Agent?

这个问题没有标准答案。但我相信,能够回答这个问题的人,将是下一个十年最有价值的工程师。

100 Harness Engineering 实践手册

Harness Engineering 实践手册

基于 OpenAI、Stripe、Cursor、Anthropic 等头部公司的一线实践提炼 版本:v1.0 | 日期:2026-03-29


目录

  1. 什么是 Harness Engineering(1页速览)
  2. 评估你的起点
  3. 最小可行 Harness(30分钟上手)
  4. 进阶 Harness 组件
  5. 常见陷阱与解决方案
  6. 工具链速查
  7. 度量与演进
  8. 附录

第一章:什么是 Harness Engineering

一句话定义

Harness Engineering 是设计和维护让 AI Agent 在你的代码库中可靠工作的工程系统——包括上下文管理、约束执行、反馈回路、编排调度和自愈机制。

不是 prompt 技巧,不是选什么 AI 工具,而是为 AI 搭建一套”脚手架”,让它在你的具体系统里持续产出高质量代码。

为什么你现在需要关心这个

OpenAI 的 7 名工程师用 5 个月构建了一个百万行代码库,每人每天合并 3.5 个 PR,所有代码由 AI 生成。

这个数字在传统开发模式下不可能维持。他们之所以做到,不是因为用了更强的模型,而是因为花大量工程时间设计了约束和反馈系统——也就是 harness。

如果你今天在用 AI 辅助开发,但还没有系统性地思考 harness,你正在把大量潜在价值留在桌上。

与其他概念的关系

┌─────────────────────────────────────────────────────────────┐
│                      Harness Engineering                     │
│                                                             │
│  ┌──────────────────┐   ┌────────────────────────────────┐  │
│  │ Prompt Engineering│   │    Context Engineering         │  │
│  │  如何写指令       │   │  如何管理上下文窗口内的信息    │  │
│  └──────────────────┘   └────────────────────────────────┘  │
│                                                             │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                 约束执行层                            │   │
│  │  linter / 结构测试 / 架构约束                        │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                 反馈回路层                            │   │
│  │  本地验证 / CI / Agent 审核                          │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                 编排与自愈层                          │   │
│  │  多 Agent 协作 / 技术债追踪 / 垃圾回收               │   │
│  └──────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

核心区别:Prompt Engineering 是一次性指令优化;Context Engineering 是单个对话中的信息管理;Harness Engineering 是持久的工程系统,随时间积累价值。

本手册的使用方式

  • 如果你刚开始:读第二章确认自己的位置,直接跳到第三章动手
  • 如果你已在用 Claude Code/Cursor:从第四章选择你当前缺失的组件
  • 如果你遇到具体问题:查第五章的陷阱列表,对号入座
  • 如果你在团队推广:重点看第七章的度量指标

第二章:评估你的起点

自评清单:你现在处于哪个阶段?

打勾选出符合你当前状态的描述:

Level 0:手动使用 ChatGPT/Claude

  • 在网页界面手动复制粘贴代码
  • 没有给 AI 持续的代码库上下文
  • 每次对话都需要重新解释项目背景
  • AI 输出需要大量人工整合

典型特征:AI 是”高级搜索引擎”,每次都是一次性交互。

痛点:效率提升有限,无法委托复杂任务,无法积累。

升级方向:安装 Claude Code 或 Cursor,开始让 AI 直接读取你的文件。


Level 1:使用 Cursor/Copilot 内联补全

  • 使用 IDE 内置 AI 进行代码补全
  • 主要是行级或函数级辅助
  • AI 看到当前文件,但不了解全局架构
  • 你还是在”逐行控制”代码写作

典型特征:AI 是”高级自动补全”,你还是主要的代码作者。

痛点:无法委托完整任务,Agent 不了解架构约束,容易引入不一致。

升级方向:开始使用 Agent 模式,委托完整的小型任务。


Level 2:使用 Claude Code/Codex CLI 做整任务

  • 可以给 Agent 描述一个完整的小任务并让它执行
  • Agent 会读取多个文件,做出跨文件修改
  • 你在审查 diff,而不是逐行写代码
  • 但 Agent 偶尔会做出违反你期望的决策

典型特征:AI 是”初级工程师”,可以委托,但需要密切监督。

痛点:Agent 不了解你的架构约定和代码风格,错误需要人工发现和修复。

升级方向:创建第一个 AGENTS.md / CLAUDE.md 文件。


Level 3:有 AGENTS.md 和基本约束

  • 代码库根目录有 AGENTS.md 或 CLAUDE.md
  • 文件中记录了核心架构约束和代码规范
  • Agent 在遵守这些约束后,错误率明显下降
  • 有基本的 lint 和测试,Agent 完成后会运行

典型特征:AI 是”了解项目的工程师”,错误率降低但仍需监督。

痛点:反馈依赖手动触发,新类型错误还是会出现,文档开始过时。

升级方向:建立本地自动验证脚本,让反馈在 5 秒内可得。


Level 4:有反馈回路和自动验证

  • 有本地预检脚本,Agent 完成后自动运行
  • CI 流水线会自动验证 Agent 提交的代码
  • 常见错误类型已被 linter 规则覆盖
  • 每次发现新类型错误,会工程化解决而非只打补丁

典型特征:AI 是”有约束的工程师”,错误可以被系统性检测和预防。

痛点:单 Agent 串行执行,大型任务耗时长,文档维护仍靠人工。

升级方向:引入 Sub-Agent 并行处理,考虑自愈维护机制。


Level 5:多 Agent 编排 + 自愈系统

  • 可以派多个 Agent 并行处理不同子任务
  • 有专职的文档维护 / 垃圾回收 Agent
  • QUALITY_SCORE.md 或类似机制追踪技术债
  • Agent 审核 Agent 的输出,人类监督而非人工审查

典型特征:AI 是”工程团队”,人类工程师的角色是系统设计和监督。

痛点:系统复杂度高,调试多 Agent 行为有挑战,模型升级需要适配。

升级方向:精炼评估框架,为模型升级设计模块化架构。


各 Level 升级路径总结

Level 0 → Level 1
  安装 Claude Code 或 Cursor,完成第一次完整任务委托

Level 1 → Level 2
  用 Agent 模式重现一个你刚刚手动完成的任务,观察差异

Level 2 → Level 3
  写第一个 AGENTS.md(用第三章的模板,30分钟内完成)

Level 3 → Level 4
  写 pre-check.sh,加入自定义 linter 规则,建立 CI 流水线

Level 4 → Level 5
  引入 Sub-Agent 架构,部署 doc-gardening agent

第三章:最小可行 Harness

目标:30分钟内让你的代码库达到 Level 3

Step 1:写一个有效的 AGENTS.md / CLAUDE.md

好的示例(约 80 行,目录式)

# AGENTS.md

你正在处理 [项目名称] —— [一句话描述项目是什么]。

## 快速导航

在开始任务前,先根据任务类型找到对应的参考文档:

- 架构概述 → docs/ARCHITECTURE.md
- API 规范 → docs/API.md
- 数据模型 → docs/DATA_MODEL.md
- 已知技术债务 → docs/TECH_DEBT.md
- 当前活跃任务 → docs/tasks/active/

## 不可违反的核心原则

1. **分层架构**:依赖方向只能向下,不允许跨层或反向依赖
   Types → Config → Repository → Service → Controller → UI

2. **错误处理**:所有外部调用(HTTP、数据库、文件系统)必须有显式错误处理

3. **日志规范**:日志必须结构化(JSON 格式),包含 request_id 字段

4. **测试覆盖**:新增的业务逻辑必须有对应的单元测试

## 工作流程

1. 理解任务前,先阅读 docs/tasks/active/ 中相关的任务描述
2. 修改架构相关代码前,先查阅 docs/ARCHITECTURE.md
3. 完成任务后,运行 ./pre-check.sh 确认通过
4. 如果遇到架构决策,不要自行决定,在任务描述中标注并暂停

## 目录结构

src/ ├── types/ # 共享类型定义(无外部依赖) ├── config/ # 配置加载(只依赖 types/) ├── repository/ # 数据访问层(只依赖 types/ 和 config/) ├── service/ # 业务逻辑层(可依赖 repository/) ├── controller/ # 请求处理层(可依赖 service/) └── ui/ # 前端组件(只依赖 controller/ 的接口)


## 我无法访问的内容

- 设计讨论历史 → 已提炼到 docs/ARCHITECTURE.md 的 "Design Decisions" 章节
- 需求背景 → docs/tasks/ 中的任务描述

坏的示例(百科全书式)

# AGENTS.md(反例 —— 不要这样写)

## 代码风格
- 所有变量使用 camelCase
- 函数命名必须是动词开头
- 不得使用魔法数字,必须定义常量
- 字符串拼接使用模板字符串而非 +
- 注释使用中文
- 文件头必须有作者和日期
- ... (持续300行)

## 架构约束
- Services 不得直接访问数据库
- 所有外部 API 调用必须经过 Gateway
- 不允许在 Controller 层写业务逻辑
- ... (持续200行)

## 测试规范
- 单元测试必须 mock 所有外部依赖
- 测试描述使用 BDD 风格(given/when/then)
- ... (持续150行)

问题:650 行的文件消耗大量上下文窗口,Agent 无法判断哪条规则最重要,遇到任务时只会模式匹配而非有意识地遵守。

核心原则

原则做法原因
简洁控制在 60-100 行上下文是稀缺资源,越多越不被注意
可发现规则放在 docs/ 下,AGENTS.md 只做目录Agent 按需加载,减少噪音
渐进式披露核心约束写在 AGENTS.md,细节放子文档信噪比决定遵守率
不可违反的规则单独一节,不超过 5 条太多”不可违反”等于全都不重要

Step 2:建立本地验证脚本(5秒反馈)

创建 pre-check.sh,放在项目根目录:

#!/bin/bash
# pre-check.sh —— Agent 完成任务后必须运行这个脚本
# 目标:5 秒内给出通过/失败的明确反馈

set -e  # 任何步骤失败就停止

echo "=== 开始预检 ==="

# 1. 类型检查(如果使用 TypeScript)
echo "[1/4] 类型检查..."
npx tsc --noEmit 2>&1 | head -20
echo "  ✓ 类型检查通过"

# 2. Linting
echo "[2/4] 代码规范检查..."
npx eslint src/ --max-warnings 0 2>&1 | head -20
echo "  ✓ 代码规范通过"

# 3. 快速单元测试(只跑 unit tests,跳过集成测试)
echo "[3/4] 单元测试..."
npx jest --testPathPattern='unit' --passWithNoTests 2>&1 | tail -5
echo "  ✓ 单元测试通过"

# 4. 架构约束检查(自定义脚本,见下方)
echo "[4/4] 架构约束检查..."
node scripts/check-architecture.js 2>&1
echo "  ✓ 架构约束通过"

echo ""
echo "=== 预检通过,可以提交 ==="

AGENTS.md 中明确写明:

## 完成任务后必须执行

运行 `./pre-check.sh`,所有检查必须通过才可以提交。
如果失败,根据错误信息修改代码,不要修改预检脚本来绕过检查。

关键原则:脚本必须在 5 秒内完成(跳过慢速集成测试),否则 Agent 会倾向于不运行它。


Step 3:设置基本约束规则

文件大小限制

在 ESLint 或自定义脚本中加入:

// scripts/check-architecture.js
const fs = require('fs');
const path = require('path');
const glob = require('glob');

const MAX_FILE_LINES = 300;  // 超过这个大小的文件需要拆分
const MAX_FUNCTION_LINES = 50;

// 检查文件大小
const files = glob.sync('src/**/*.{ts,js}');
const violations = [];

files.forEach(file => {
  const content = fs.readFileSync(file, 'utf8');
  const lines = content.split('\n').length;
  if (lines > MAX_FILE_LINES) {
    violations.push(`${file}: ${lines} 行(超过限制 ${MAX_FILE_LINES} 行)`);
  }
});

if (violations.length > 0) {
  console.error('架构约束违反:');
  violations.forEach(v => console.error(`  ✗ ${v}`));
  console.error('');
  console.error('修复方法:将超大文件按职责拆分为多个小文件。');
  console.error('参考:docs/ARCHITECTURE.md#file-organization');
  process.exit(1);
}

console.log('架构约束检查通过');

目录结构约束

// 在 check-architecture.js 中增加
const FORBIDDEN_IMPORTS = [
  // 禁止 UI 层直接导入 Repository 层
  { from: 'src/ui/**', to: 'src/repository/**', reason: 'UI 层不能直接访问数据库,必须经过 Service 层' },
  // 禁止 Repository 层导入 Service 层(防止循环依赖)
  { from: 'src/repository/**', to: 'src/service/**', reason: 'Repository 层不能依赖 Service 层' },
];

// 检查各文件的 import 语句
// ... 实现省略,根据项目技术栈自行实现

面向 Agent 的错误信息格式

关键原则:错误信息必须包含修复建议。Agent 看到错误后,不需要查文档就能自我修正。

// 好的错误信息格式
console.error(`
✗ 架构违反:src/ui/UserProfile.tsx 直接导入了 src/repository/UserRepo.ts

根因:UI 层不允许直接访问数据库层。
修复方法:
  1. 在 src/service/ 下创建 UserService.ts
  2. 把数据库访问逻辑移到 UserService.ts
  3. 在 UserProfile.tsx 中改为导入 UserService.ts

参考:docs/ARCHITECTURE.md#layered-architecture
`);

30分钟后你应该有什么

完成以上三步后,你的项目应该有:

项目根目录/
├── AGENTS.md (或 CLAUDE.md)     # 60-100 行,目录式
├── pre-check.sh                  # 可执行,5 秒内返回结果
├── scripts/
│   └── check-architecture.js    # 自定义架构约束检查
└── docs/
    ├── ARCHITECTURE.md           # 架构文档(AGENTS.md 指向这里)
    └── TECH_DEBT.md              # 已知技术债务记录

验证:运行 ./pre-check.sh,确认它能在 5 秒内通过。然后故意引入一个架构违反(比如在 UI 层 import Repository),确认脚本能捕获并输出有用的错误信息。


第四章:进阶 Harness 组件

4.1 上下文管理

代码仓库作为记录系统

核心原则(来自 OpenAI):

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

行动清单

  • 架构决策记录(ADR)必须在代码库中,不在 Confluence
  • 团队规范必须在 docs/ 下,不在 Slack 固定消息
  • 重要的 PR 讨论结论必须在相关文档中更新
  • 已知技术债务必须在 TECH_DEBT.md 中列出

docs/ 目录结构设计(参考 OpenAI)

docs/
├── ARCHITECTURE.md           # 整体架构,分层规则,模块边界
├── DESIGN.md                 # 设计原则,代码风格决策
├── SECURITY.md               # 安全约束,不可违反的安全规则
├── QUALITY_SCORE.md          # 当前质量评分,技术债目标
├── TECH_DEBT.md              # 已知技术债务,优先级,负责人

├── design-docs/              # 具体功能的设计文档
│   ├── index.md              # 所有设计文档的索引
│   └── [feature]-design.md

├── product-specs/            # 产品规格(Agent 需要了解"为什么"时参考)
│   └── index.md

├── tasks/                    # 任务管理
│   ├── active/               # 当前活跃任务
│   └── completed/            # 已完成任务(含产出)

└── references/               # 技术参考
    └── design-system.md      # 设计系统参考(Agent 生成 UI 时用)

渐进式披露的实现

每个文档应该有”摘要先行 + 详情在后”的结构:

# 架构文档

## TL;DR(Agent 必读,30秒了解架构核心)

本项目使用 6 层架构,依赖方向严格单向向下:
Types → Config → Repository → Service → Controller → UI

禁止跨层依赖,违反会导致 pre-check.sh 失败。

---

## 详细架构说明(需要时再读)

### 为什么选择 6 层架构
...(详细解释)

### 各层职责
...(详细说明)

### 边界案例处理
...(复杂情况指导)

4.2 约束执行

自定义 Linter 编写指南

自定义 linter 的价值在于:把文档中的约束变成可自动验证的代码。一条写在 AGENTS.md 里的规则,Agent 在压力下(上下文快满时)会忘记;一条 linter 规则,Agent 永远无法绕过。

从已知错误反推 linter 规则

每次 Agent 犯了一个重复性错误,问自己:“能不能写一个检测这类错误的脚本?“

// 示例:检测 console.log 残留(Agent 调试后经常忘记清除)
// .eslintrc.js
module.exports = {
  rules: {
    'no-console': ['error', { allow: ['warn', 'error'] }],
    // 自定义规则:检测调试代码残留
  }
};

// 示例:自定义 ESLint 规则,检测 TODO 注释没有对应的 TECH_DEBT.md 条目
// (高级用法,按需实现)

面向 Agent 的 Lint 错误信息格式

标准格式:

✗ [规则名称]: [问题描述]

  位置: [文件路径]:[行号]

  问题: [Agent 做了什么错误的事情]

  修复方法:
    1. [具体步骤]
    2. [具体步骤]

  参考: [相关文档链接]

  示例(正确):
    [正确的代码示例]

  示例(错误):
    [错误的代码示例](当前代码的问题所在)

包含这些信息的原因:Agent 在修复错误时,不需要离开当前上下文去查文档,直接按提示修复即可。这是”反馈左移”的微观实现。

分层架构 + 结构测试

用测试文件而非文档来强制架构约束:

// tests/architecture/layered-architecture.test.ts
import { analyzeImports } from './import-analyzer';

describe('分层架构约束', () => {
  it('UI 层不能直接导入 Repository 层', () => {
    const violations = analyzeImports({
      from: 'src/ui/**',
      forbidden: ['src/repository/**'],
    });

    expect(violations).toEqual([]);
  });

  it('Repository 层不能导入 Service 层', () => {
    const violations = analyzeImports({
      from: 'src/repository/**',
      forbidden: ['src/service/**'],
    });

    expect(violations).toEqual([]);
  });

  it('Types 层不能有外部依赖', () => {
    const violations = analyzeImports({
      from: 'src/types/**',
      forbidden: ['src/config/**', 'src/repository/**', 'src/service/**'],
    });

    expect(violations).toEqual([]);
  });
});

架构测试的优势:它们作为测试套件的一部分自动运行,失败时的错误信息会指向具体的违反位置,且不需要单独维护检查脚本。

条件规则系统(按目录/模块应用不同规则)

// eslint.config.js(新版 flat config 格式)
export default [
  // 全局规则
  {
    rules: {
      'no-console': 'error',
    }
  },
  // 仅对 API 层应用的规则
  {
    files: ['src/controller/**'],
    rules: {
      // API 层必须有请求验证
      'custom/require-request-validation': 'error',
      // API 层必须有错误处理中间件
      'custom/require-error-handler': 'error',
    }
  },
  // 仅对 Repository 层应用的规则
  {
    files: ['src/repository/**'],
    rules: {
      // Repository 层不允许原始 SQL 字符串拼接(防止注入)
      'custom/no-raw-sql-concat': 'error',
    }
  },
  // 测试文件放宽部分规则
  {
    files: ['**/*.test.ts', '**/*.spec.ts'],
    rules: {
      'no-console': 'off',  // 测试中允许 console.log
    }
  }
];

4.3 反馈回路

三层反馈架构

本地反馈(<5秒)
  └── pre-check.sh: lint + type check + unit tests
  └── 目标:Agent 完成任务后立即运行,立即知道通过/失败
  └── 失败时:Agent 自行修复,不需要人介入

CI 反馈(<5分钟)
  └── 集成测试 + E2E 测试 + 安全扫描
  └── 目标:人类审查前自动过滤低质量提交
  └── 失败时:在 PR 上标注,Agent 可以根据 CI 日志修复

Agent 审核(异步)
  └── 专职审核 Agent 检查代码质量和一致性
  └── 目标:减少人类逐行审查负担
  └── 触发:CI 通过后自动触发审核 Agent

Stripe 的实践:最多允许两轮 CI,如果第二轮还是失败,升级为人类介入。这个规则防止 Agent 陷入无效的修复循环。

在 AGENTS.md 中明确这个规则:

## CI 失败处理规则

- 第一次失败:根据 CI 日志自行修复,重新提交
- 第二次失败:停止尝试自动修复,在任务描述中标注 "需要人工介入:[问题描述]"
- 不要无限循环修复同一个失败

MCP 工具集成

MCP(Model Context Protocol)允许 Agent 访问外部工具,而不需要把工具输出复制到上下文中。

关键 MCP 工具分类:

# 本地开发工具
- 文件系统访问(内置)
- Shell 命令执行(内置)
- 数据库查询(需要配置 MCP server)

# 验证工具
- Playwright(浏览器自动化,E2E 验证)
- Chrome DevTools(直接操作浏览器,UI 验证)

# 代码质量工具
- 自定义 lint 运行(通过 shell 访问)
- 测试运行器(通过 shell 访问)

# 知识检索工具
- 代码搜索(通过 grep/ripgrep)
- 文档检索(通过文件系统)

Chrome DevTools 自动化验证

Claude Code 支持通过 Chrome DevTools MCP 让 Agent 直接验证 UI 行为:

# 在 AGENTS.md 中添加 UI 验证指令

## UI 变更验证流程

完成 UI 相关变更后:
1. 运行 `npm run dev` 启动本地开发服务器
2. 使用 Chrome DevTools MCP 导航到相关页面
3. 截图并检查以下内容:
   - 布局是否符合 docs/references/design-system.md 中的规范
   - 响应式断点是否正常(检查 768px 和 375px)
   - 控制台是否有错误
4. 如果发现问题,根据问题类型修复后重新验证

4.4 编排调度

单 Agent vs 多 Agent 决策树

任务是否可以并行执行?
├── 否(有顺序依赖)→ 使用单 Agent 串行执行
└── 是(独立子任务)→ 继续判断

    任务的上下文需求是否互相干扰?
    ├── 否(每个子任务上下文独立)→ 使用并行 Sub-Agents
    └── 是(需要共享状态)→ 使用单 Agent + 分步执行

        子任务是否有不同的专业领域?
        ├── 是(如:安全审查 + 功能实现)→ 专职 Sub-Agent 更合适
        └── 否 → 单 Agent + 明确的分步指令

Sub-Agent 作为”上下文防火墙”

Sub-Agent 的核心价值不只是并行,而是隔离上下文:每个 Sub-Agent 只看到它任务相关的上下文,不会被其他任务的信息干扰。

主 Agent(规划者)
  ├── 接收整体任务
  ├── 拆解为独立子任务
  └── 派发给 Sub-Agents

      ├── Sub-Agent 1:实现功能 A(只给 A 相关的上下文)
      ├── Sub-Agent 2:写功能 A 的测试(只给接口定义)
      └── Sub-Agent 3:更新 A 相关的文档(只给变更摘要)

任务描述模板(给 Sub-Agent 的指令):

## 任务:[简短描述]

**背景**(只包含本任务必须的上下文):
[1-3句话,不要塞入不相关的信息]

**输入**
- [文件/数据 1]
- [文件/数据 2]

**要求**
1. [具体要求 1]
2. [具体要求 2]

**完成标准**
- [ ] [可验证的完成条件 1]
- [ ] [可验证的完成条件 2]

**禁止操作**
- 不要修改 [文件 X](由另一个 Agent 负责)
- 不要改动现有测试(除非它们在你的任务范围内)

**完成后**
1. 运行 ./pre-check.sh
2. 如果发现需要修改任务范围外的内容,停止并在输出中说明

隔离沙箱环境搭建

参考 Stripe 的 devbox 方案,为多 Agent 并行提供隔离环境:

# docker-compose.agent.yml
# 用于 Agent 的隔离执行环境

services:
  agent-sandbox:
    image: node:20-alpine
    volumes:
      # 只挂载代码,不挂载 .env 和配置文件
      - ./src:/workspace/src:rw
      - ./docs:/workspace/docs:ro  # 只读挂载
      - ./package.json:/workspace/package.json:ro
    environment:
      # Agent 专用的环境变量(连接测试数据库,不是生产数据库)
      DATABASE_URL: postgresql://test:test@test-db:5432/testdb
    working_dir: /workspace
    command: sh -c "npm install && tail -f /dev/null"

启动命令:

# 为每个并行 Agent 任务创建独立容器
docker-compose -f docker-compose.agent.yml up -d --scale agent-sandbox=3

注意事项

  • Agent 沙箱只连接测试数据库,不允许访问生产数据库
  • 代码变更挂载为 rw(可读写),配置文件挂载为 ro(只读)
  • 每次任务完成后检查沙箱的文件变更,而不是信任 Agent 的汇报

4.5 自愈维护

”垃圾回收” Agent 的实现

代码库在 AI 驱动开发下会以更快的速度累积混乱:TODO 注释、过时文档、未使用的代码。定期运行一个专职的清理 Agent:

# tasks/recurring/garbage-collection.md

## 任务:代码库垃圾回收

**频率**:每两周运行一次

**清理范围**

### 1. TODO/FIXME 审查
- 搜索所有 TODO 和 FIXME 注释
- 判断每个注释是否仍然有效(相关代码是否还存在)
- 对于超过 30 天未处理的,在 TECH_DEBT.md 中创建条目
- 对于相关代码已删除的注释,直接移除

### 2. 文档新鲜度检查
- 比较 docs/ 中每个文件的最后修改时间与相关代码的最后修改时间
- 如果代码变更但文档 30 天内未更新,标注为"需要更新"
- 对明显过时的内容(引用了不存在的文件/函数),直接修正或删除

### 3. 未使用代码检测
- 运行 `npx ts-prune` 检测未使用的导出
- 对于未使用的代码,创建 PR 删除(不要直接删除,需要人工确认)

### 4. 依赖清理
- 检查 package.json 中的依赖是否都被实际使用
- 报告可以移除的依赖(不要直接修改 package.json,需要人工确认)

**输出**
- 修改后直接提交的变更(注释清理、文档修正)
- 需要人工确认的变更列表(未使用代码、依赖清理)
- 更新后的 TECH_DEBT.md

技术债追踪(QUALITY_SCORE.md)

# QUALITY_SCORE.md

> 最后更新:2026-03-29
> 更新者:doc-gardening-agent

## 当前分数:78/100

### 评分维度

| 维度 | 分数 | 目标 | 主要问题 |
|------|------|------|----------|
| 代码复杂度 | 7/10 | 8/10 | 3个文件超过300行 |
| 测试覆盖率 | 8/10 | 9/10 | Service 层覆盖率 72% |
| 文档新鲜度 | 6/10 | 8/10 | API.md 已 45 天未更新 |
| 技术债数量 | 7/10 | 9/10 | 有 12 个已知技术债 |
| 依赖健康度 | 9/10 | 9/10 | 无重大安全漏洞 |

## 技术债清单

| ID | 描述 | 优先级 | 预估工时 | 创建日期 |
|----|------|--------|----------|----------|
| TD-001 | UserService.ts 超过 400 行,需要拆分 | 高 | 2h | 2026-02-15 |
| TD-002 | 3个 API 端点缺少请求验证 | 高 | 1h | 2026-03-01 |
| TD-003 | 认证逻辑散落在多个文件 | 中 | 4h | 2026-02-20 |

## 历史趋势

| 日期 | 分数 | 备注 |
|------|------|------|
| 2026-01-01 | 65 | 项目初期 |
| 2026-02-01 | 72 | 引入自定义 linter 后 |
| 2026-03-01 | 75 | 完成 TD-005, TD-006 |
| 2026-03-29 | 78 | 完成文档清理 |

第五章:常见陷阱与解决方案

陷阱 1: AGENTS.md 百科全书

症状:AGENTS.md 超过 300 行,包含代码风格、架构约束、测试规范、命名约定、安全规则……

根因:直觉上觉得”给 Agent 越多信息越好”。实际上,上下文窗口里的信息太多会导致注意力分散,Agent 会做模式匹配而不是有意识地遵守规则。

解决方案

  1. 把详细规则移到 docs/ 的专项文档中
  2. AGENTS.md 只保留:快速导航目录、5 条以内的不可违反原则、工作流程(何时看哪个文档)
  3. 控制在 60-100 行

预防:在 AGENTS.md 顶部添加注释:# 目标:60-100行,是目录,不是百科全书。每次添加内容时问自己:这个内容是必须在 Agent 每次启动时都加载的吗?


陷阱 2: 过度约束窒息 Agent 创造性

症状:Agent 的输出越来越模板化,每次都在规避约束而不是解决问题;给 Agent 新任务时它开始频繁停下来”请求确认”。

根因:约束规则太多、太细,Agent 陷入”每一步都可能违规”的焦虑状态,开始过度保守。

解决方案

  1. 审查你的约束规则,区分”架构层面的约束”(必须严格执行)和”风格偏好”(可以灵活处理)
  2. 删除或降级风格偏好类的规则
  3. 在 AGENTS.md 中明确说明:哪些是不可违反的,哪些是参考建议
## 约束级别说明

**必须遵守(violation = CI 失败)**
- 分层架构依赖方向
- 错误处理规范
- 安全相关规则

**建议遵守(violation = 警告,不阻塞)**
- 函数命名风格
- 注释语言
- 文件组织方式

**可以自行判断**
- 具体的实现方式
- 优化策略
- 临时性解决方案(需标注 TODO)

预防:每隔一个月检查你的 linter 规则,统计每类规则的触发频率。触发频率超过 20% 的规则说明 Agent 频繁违反,可能需要简化或降级。


陷阱 3: 忽略反馈回路靠人工审核扩展

症状:随着 Agent 任务增多,代码审查时间越来越长;你成为了瓶颈,Agent 产出堆积等待你审查。

根因:没有自动化验证,所有质量保证依赖人工审查,无法扩展。

解决方案

  1. 立即建立 pre-check.sh(参考第三章)
  2. 在 CI 中添加自动化测试
  3. 部署 Agent 审核 Agent,让 AI 做第一轮审查,人类只审查高优先级内容

具体:在 CI 完成后,自动触发一个审核 Agent:

# .github/workflows/agent-review.yml
name: Agent Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  agent-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run Agent Review
        run: |
          # 运行你的 agent review 脚本
          # 脚本输出结果作为 PR 评论
          ./scripts/agent-review.sh ${{ github.event.pull_request.number }}

预防:把”代码审查时间”作为关键指标跟踪。如果 PR 平均等待审查时间超过 2 小时,说明反馈回路出了问题。


陷阱 4: 优化 Benchmark 而非真实质量

症状:Agent 的测试通过率持续上升,但代码审查中发现的问题并没有减少;合并后的 bug 数量没有下降。

根因:METR 的研究发现,约半数通过自动评分的 PR 不会被真实维护者合并。Agent 会优化可测量的指标,而不是真实质量。

解决方案

  1. 在自动化测试之外,定期做”真实质量抽查”:随机抽取最近 10 个 Agent 生成的 PR,评估它们是否达到你的真实质量标准
  2. 记录抽查结果,追踪趋势
  3. 对于质量问题,工程化修复(添加 linter 规则),而不只是在 PR 里反馈
# docs/quality-audit-log.md

## 2026-03-抽查

| PR | 自动测试 | 真实评估 | 问题 |
|----|----------|----------|------|
| #123 | ✓ | 可合并 | 无 |
| #124 | ✓ | 需修改 | 错误处理过于宽泛 |
| #125 | ✓ | 可合并 | 无 |
| #126 | ✓ | 需修改 | 没有考虑并发场景 |

真实质量率:8/10 = 80%(目标:>90%)

行动:为并发场景添加 checklist 到 Agent 任务模板

预防:永远不要只看自动化测试通过率。把”抽查合格率”作为 harness 质量的核心指标。


陷阱 5: 忽略垃圾回收导致技术债累积

症状:代码库里的 TODO 注释越来越多,docs/ 里有很多过时文档,Agent 开始基于错误的上下文做出决策。

根因:AI 生成代码的速度远快于文档和注释的清理速度,代码库的”信息噪音”会以比人工开发更快的速度增长。

解决方案

  1. 建立定期运行的垃圾回收 Agent(参考 4.5 节)
  2. 在 CI 中加入”技术债增量检测”:如果这次 PR 新增了超过 2 个 TODO,需要先处理已有的 TODO
# scripts/check-tech-debt.sh
MAX_NEW_TODOS=2
CURRENT_TODOS=$(grep -r "TODO\|FIXME" src/ | wc -l)
BASELINE_TODOS=$(cat .tech-debt-baseline 2>/dev/null || echo "0")

NEW_TODOS=$((CURRENT_TODOS - BASELINE_TODOS))

if [ $NEW_TODOS -gt $MAX_NEW_TODOS ]; then
  echo "✗ 本次 PR 新增了 $NEW_TODOS 个 TODO(限制:$MAX_NEW_TODOS)"
  echo "  请先处理已有的技术债务,或更新 TECH_DEBT.md 中的优先级"
  exit 1
fi

预防:把 QUALITY_SCORE.md 中的技术债数量作为团队 OKR 的一部分。技术债超过某个阈值时,暂停新功能开发,先做清理冲刺。


陷阱 6: 模糊指令放大不良行为

症状:你告诉 Agent “优化这段代码的性能”,它把整个文件重写了;你说”修复这个 bug”,它顺带重构了几个不相关的函数。

根因:Cursor 工程团队的发现:“模糊指令会放大 Agent 的不良行为,而约束会塑造 Agent 的行为。” 模糊的指令等于在告诉 Agent 可以自由发挥。

解决方案

  1. 用约束而非指令:不要写”优化性能”,而是写”只修改 calculateTotal() 函数,不要修改其他函数,目标是把执行时间从 200ms 降到 50ms 以内”
  2. 在 AGENTS.md 中明确说明”最小变更原则”
## 最小变更原则(必须遵守)

完成任务时,只修改任务明确要求修改的代码。

✓ 可以:
- 修改任务描述中指定的文件
- 添加任务要求的新文件
- 修改直接被任务影响的测试

✗ 不可以(除非任务明确要求):
- "顺便"重构任务范围外的代码
- "顺便"修复不相关的 bug
- 改变不相关文件的格式

如果发现任务范围外的问题:
- 在输出中标注发现的问题
- 创建 TECH_DEBT.md 条目
- 不要直接修改

预防:在任务模板中标准化”禁止操作”字段(参考 4.4 节的任务描述模板)。


陷阱 7: 一个大上下文窗口塞满所有信息

症状:每次给 Agent 任务时都把所有文档、所有相关代码一起给它;Agent 的输出质量不稳定,在相似的任务上有时好有时差。

根因:研究表明 LLM 对上下文中间部分的关注度显著低于开头和结尾(“lost in the middle” 问题)。把所有信息塞进一个长上下文,不等于 Agent 会等权使用这些信息。

解决方案

  1. 实践渐进式披露:给 Agent 任务时,只提供最核心的上下文,让它按需读取其他文档
  2. 重要约束放在任务描述的最前面和最后面,而不是中间
  3. 用目录式 AGENTS.md,让 Agent 主动检索需要的信息,而不是被动接收全量信息
## 任务格式(重要规则在开头和结尾)

### 最重要的约束(在最前面)
- 只修改 X 文件
- 不允许修改数据库 schema

### 任务描述
[中间部分]

### 完成前必须检查
- [ ] pre-check.sh 通过
- [ ] 没有修改任务范围外的文件
- [ ] AGENTS.md 中的不可违反原则都没有违反

预防:定期测试 Agent 是否真的在遵守上下文中间部分的约束。如果发现某条规则被频繁遗忘,把它移到 AGENTS.md 最前面,或者编码为 linter 规则。


陷阱 8: 忽视 Brownfield 的特殊性

症状:在一个已有大量历史代码的项目中,Agent 不断做出与现有代码风格不一致的决策;修改一个地方,破坏了另外几个不相关的地方。

根因:Charlie Guo 的研究指出:“Brownfield(存量代码库)的 AI 适配是目前 Harness Engineering 领域最大的未解问题。” 存量代码有大量”隐性约定”,它们没有被写在任何文档里,只存在于团队的集体记忆中。

解决方案

  1. 首先做隐性约定挖掘:要求 Agent 读取整个代码库,提炼它观察到的隐性约定,生成 docs/IMPLICIT_CONVENTIONS.md
  2. 建立 Brownfield 保护规则:不允许 Agent 在没有明确理由的情况下改变现有的代码模式,即使它认为有更好的方式
# docs/IMPLICIT_CONVENTIONS.md
# 由 Agent 分析代码库后生成,人工审核确认

## 发现的隐性约定

### 错误处理模式
- 项目统一使用 Result<T, E> 模式,而不是抛出异常(见 src/types/result.ts)
- 错误信息使用 `CODE_DESCRIPTION` 格式(如 `AUTH_TOKEN_EXPIRED`

### 日志模式
- 所有日志都通过 `logger.ts` 的 createLogger() 工厂创建
- 日志级别:error(异常)、warn(可恢复问题)、info(业务事件)、debug(调试信息)

### 命名约定
- Repository 函数:动词+名词(findUserById, createOrder)
- Service 函数:直接描述业务操作(authenticateUser, placeOrder)

### 未经记录的已知问题
- src/legacy/ 目录下的代码不要修改,这是遗留代码等待迁移
- config/ 目录的文件结构不符合现有规范,历史遗留,正在迁移

预防:在接手存量项目时,第一件事是让 Agent 做一次全面的代码库分析,将隐性约定显式化。这项投入会在后续所有任务中持续回报。


第六章:工具链速查

按场景推荐工具组合

场景Agent 框架上下文管理约束反馈编排
个人项目Claude CodeCLAUDE.mdESLintpre-check.sh
小团队(<10人)Claude Code / CursorAGENTS.md + docs/自定义 linterMCP + CI (GitHub Actions)Sub-agents(按任务)
中型团队(10-50人)Claude Code + 自定义封装分模块 AGENTS.md + 知识库结构测试 + 自定义 linter全 CI/CD + Agent 审核多 Agent 编排
企业(>50人)自研 / Codex API知识仓库 + MCP 知识工具结构测试 + 合规扫描全栈可观测性专职编排框架

Agent 框架对比

工具优势劣势适用场景
Claude Code深度代码理解、长上下文、Sub-agent 支持需要 Anthropic API主力开发 Agent
CursorIDE 集成、实时补全、团队共享规则主要是单文件操作代码编写辅助
Codex CLIOpenAI 生态、可自定义需要自建 harnessOpenAI 用户
goose(Block)开源、可自定义工具集需要自行维护企业自研基础

约束工具对比

工具适用语言定制难度错误信息质量
ESLintJS/TS中(插件系统)高(可自定义)
RuffPython低(配置即可)
自定义脚本任意高(需要写)取决于你写的质量
架构测试(ArchUnit 等)Java/多语言

可观测性工具(生产 Agent 系统必备)

日志聚合:Vector → Victoria Logs(OpenAI 的实际选择)
指标:Victoria Metrics / Prometheus
追踪:Victoria Traces / OpenTelemetry
可视化:Grafana

最低配置(个人/小团队):
- 结构化日志(JSON 格式)+ 本地文件
- 定期运行质量检查脚本
- QUALITY_SCORE.md 追踪趋势

第七章:度量与演进

核心指标

这些指标告诉你 harness 的健康状况。选择 2-3 个开始追踪,不要一开始就追踪全部。

指标公式目标意义
PR 合并率成功合并的 Agent PR / 提交的 Agent PR>85%harness 质量的综合体现
人工干预率需要人工修改的 Agent PR / 总 Agent PR<20%Agent 自主完成任务的能力
首次通过率首次运行 pre-check.sh 就通过的比例>70%约束规则的清晰度
Agent 任务完成时间任务提交到可合并的平均时间看趋势反馈效率的综合体现
技术债增长速度每周新增技术债条目数负增长自愈机制是否有效
抽查合格率随机抽查中真实可合并的比例>90%真实质量(非 benchmark 质量)

如何知道你的 Harness 在变好

正面信号

  • Agent 遇到新任务时犯的是”新类型”错误,而不是以前修过的错误
  • 你在审查代码时,花更多时间在”这个设计决策是否正确”,而不是”这个代码有没有遵守规范”
  • 新工程师(或新 Agent)上手时,通过读 AGENTS.md 和 docs/ 就能快速理解约束,不需要口头解释
  • QUALITY_SCORE.md 的分数在缓慢上升

负面信号

  • 同类错误反复出现(说明工程化解决做得不够)
  • AGENTS.md 在持续变长(说明在错误地把规则堆积进去)
  • 你花越来越多时间审查代码(说明自动验证不够用)
  • pre-check.sh 运行时间超过 30 秒(说明它在变成慢速集成测试,Agent 会开始跳过它)

随模型升级的 Harness 演进策略

模型升级会使某些 harness 组件变得多余,同时带来新的机会。设计原则:

模块化设计(来自 Philipp Schmid 的建议):

✓ 好的设计:每个 harness 组件独立可替换
  - 约束规则存在代码中(可版本控制)
  - 反馈脚本独立于模型
  - 文档结构独立于 Agent 框架

✗ 坏的设计:harness 组件深度耦合特定模型
  - 利用了某个模型的特定能力,换模型就失效
  - prompt 技巧绕过了约束,而不是修复约束

模型升级时的 Harness 审查清单

## 模型升级检查清单

升级到新模型时,按以下顺序检查:

1. **运行全量测试**:新模型下所有现有测试是否仍然通过?
   - 如果某些以前失败的测试现在通过了,检查是否是新模型的能力提升(好事)
   - 如果某些以前通过的测试现在失败了,找出原因(可能是 harness 对旧模型过度优化)

2. **检查绕过机制**:是否有 prompt 技巧是为了补偿旧模型的弱点?
   - 新模型可能不需要这些补偿,移除它们可以简化 harness

3. **测试新模型的边界**:重新运行你的"发现 Agent 边界"流程(Mitchell Hashimoto 的阶段二)
   - 新模型在哪些类型的任务上仍然会犯错?
   - 是否有新的错误模式需要工程化解决?

4. **更新 QUALITY_SCORE.md**:记录模型升级后的基准分数

Harness 演进路线图

第一个月:
  - 建立 AGENTS.md(Level 3)
  - 写 pre-check.sh
  - 跟踪首次通过率

第二至三个月:
  - 工程化 5 个以上常见错误类型
  - 建立 CI 自动化验证
  - 开始追踪 PR 合并率

第四至六个月:
  - 引入 Sub-Agent 架构
  - 部署 doc-gardening agent
  - 建立 QUALITY_SCORE.md

六个月以后:
  - 优化多 Agent 编排效率
  - 模型升级适配流程
  - 考虑扩展到团队/组织层面

附录

参考资源 Top 10

  1. OpenAI Ryan Lopopolo 的工程博客 — AGENTS.md 最佳实践的一手来源,描述百万行代码库的构建实践
  2. Stripe Minions 技术博客 — 企业级 Agent 基础设施,反馈左移的具体实现
  3. Mitchell Hashimoto 的 AI 采纳博客 — 6 阶段渐进式路径,最可操作的个人实践指南
  4. METR 评测研究 — benchmark 与真实质量的差异,警示优化错误目标的风险
  5. Cursor 工程博客 — 约束优于指令原则,模糊指令的危害
  6. Philipp Schmid(Hugging Face)的 Harness Engineering 文章 — 模块化 harness 设计,为模型升级准备
  7. HumanLayer 六大配置杠杆 — CLAUDE.md / MCP / Skills / Sub-Agents / Hooks / Back-Pressure 的系统性框架
  8. Anthropic Claude Code 文档 — Sub-agent 和 Hook 的官方使用指南
  9. Latent Space 播客:Harness Engineering 专题 — Big Model vs Big Harness 争论的深度分析
  10. Charlie Guo 的 Brownfield 研究 — 存量代码库 AI 适配的挑战与现状

术语表

术语定义
Harness为 AI Agent 搭建的约束和引导系统,包括上下文文件、验证脚本、架构约束等
AGENTS.md / CLAUDE.md代码库根目录的 Agent 配置文件,为 AI 提供项目上下文和约束
渐进式披露只在需要时提供信息,而不是一次性提供所有信息的上下文管理原则
反馈左移将验证和反馈移到开发流程的更早阶段(本地验证 < CI < 人工审查)
Sub-Agent由主 Agent 派发的专职子 Agent,负责完成特定子任务,具有隔离的上下文
doc-gardening agent专职维护文档新鲜度的 Agent,定期清理过时文档
结构测试验证代码架构约束的测试(如验证分层依赖方向),与功能测试相对
上下文防火墙Sub-Agent 架构中,通过隔离上下文防止信息互相干扰的机制
技术债追踪系统性记录和量化已知技术债务的实践,参见 QUALITY_SCORE.md
Brownfield有大量历史代码的存量项目(相对于 Greenfield 新建项目)
MCPModel Context Protocol,允许 AI 访问外部工具和数据源的协议标准
垃圾回收 Agent定期清理代码库中 TODO 注释、过时文档、未使用代码的 Agent
条件规则系统按目录或模块对不同代码应用不同规则的 lint 配置方式

本手册基于截至 2026 年 3 月的公开工业实践提炼。随着工具和模型快速演进,建议每季度回顾一次具体的工具推荐和指标目标,但章节一到五的核心原则具有更长的有效期。

100 工程开发 Harness 落地执行手册

工程开发 Harness 落地执行手册

文档定位:面向研发团队的 Harness Engineering 正式落地方案。 参考材料:OpenAI Lopopolo(2026-03 Harness Engineering)、Anthropic Young(2025-11 长程 Agent Harness)、Anthropic Rajasekaran(2026-03 多 Agent 编排架构),以及团队本地 Harness-Engineering 调研。 不参考:产出目录下已有的 落地执行手册.md / 实践手册.md(那两份基于更广泛的网络资料,和本文定位不同)。


一、背景与目标

1.1 一句话定位

在我们团队(Java 服务端 + Web/安卓/iOS/H5 + 数仓 + GitLab + Jenkins)现有的工程体系上,增建一层 “Agent 可靠工作” 的支撑结构,让 Agent 能从”偶尔帮忙”变成”持续产出”的一等参与者。

1.2 团队现状识别

维度现状含义
服务端技术栈Java静态类型、生态成熟、适合强约束
前端技术栈Web / 安卓 / iOS / H5多端复杂、Agent 需为每个端分别适配
数仓独立团队数据逻辑的约束层需要单独设计
运维独立团队运维侧 Agent 介入需要单独规划(本手册暂不覆盖)
源代码GitLabMR 流程和 webhook 天然适合 Agent 接入
发布JenkinsCI/CD 反馈回路的物理承载点
Harness 经验调研阶段、尚无规划起点接近 Hashimoto 个人路径,不是 OpenAI 的 Greenfield 起点

关键判断:我们是成熟代码库上的增量接入,不是从零开始。所有 “OpenAI 七人团队百万行零人工代码” 式的参照都要打折——他们的起点不可复制,但他们的架构组件可复制。

1.3 本手册的范围

覆盖:服务端 + 前端(Web/安卓/iOS/H5)+ 数仓的 Agent 工程工作流设计与落地路径。

不覆盖

  • 运维侧 Agent 自动化(独立团队,独立规划)
  • 具体的 prompt 撰写技巧(那是独立课题)
  • 模型选型(Harness 是模型无关的)

1.4 成功标准

阶段 0 完成标志:存量代码扫描完成、业务逻辑隐性知识显性化、三方关键文档镜像到本地,知识库首次具备 “Agent 开工前能读到现实” 的条件。

阶段 1 完成标志:完整架构图 + 文档骨架就位,1-2 个 case 跑通 Agent 从提词到合入 MR 的完整闭环。

阶段 2 完成标志:六个 Agent 角色全部上线,全栈至少有一个栈完成 “提词 → 需求 → 开发 → 自测 → 人工反馈 → 自修” 的完整工作流。


二、五条核心原则

这五条是整个手册的决策依据。每当在细节上犹豫,回来看这里。

原则 1:仓库即现实

一句话Agent 运行时看不见的东西等于不存在

Slack/飞书/口头讨论/脑子里的架构理解——Agent 都读不到。只有 GitLab 仓库里的文件是它的”现实”。这决定了 AGENTS.md、设计文档、架构决策记录都必须 checked in。

来源:OpenAI Lopopolo 原文——“从智能体的角度来看,它在运行时无法在情境中访问的任何内容都是不存在的。“

原则 2:约束优于指令

一句话能用代码强制的,就不要用自然语言提醒

“请不要在 Service 层直接写 SQL” 这种提醒性指令,Agent 遵守率在 80-90% 之间;而一个 ArchUnit 测试会 100% 拦住它。指令会随上下文衰减,约束不会。

来源:Cursor / OpenAI / Stripe 三方独立共识(调研 findings.md 共识 1.2)。

原则 3:生成与评估必须分离

一句话让生成者批判自己的产出,天然不可靠

Anthropic Rajasekaran 的核心实验结论:调优独立评估器保持怀疑态度,比让生成器自我批判容易得多。这决定了我们的多 Agent 架构必须是 Planner/Generator/Evaluator 分离,不能一个 Agent 包打天下。

来源:Anthropic Rajasekaran 2026-03 博客原话。

原则 4:文档可信度必须由独立 Agent 持续校验

一句话AI 写的文档会以 AI 速度腐烂,必须用 AI 速度清理

OpenAI 博客的关键洞察:文档会快速腐烂——代码已改但文档未更新、规则已失效但仍在导航里、引用的 API 已不存在。人工清理根本追不上。OpenAI 的解法是配一个专职的 doc-gardening Agent,定期扫描偏差并发起修复 PR。

来源:OpenAI Lopopolo 原文——“定期运行一个 doc-gardening Agent 扫描过期或废弃文档,发起修复 PR” + 调研 findings.md 共识 1.4。

原则 5:吞吐量决定权衡方向

一句话起步阶段以”完整度”优先,吞吐上来后以”速度”优先

OpenAI 原话 “等待成本 > 纠错成本” 是 Agent 吞吐量已超人工注意力 情况下的结论。我们起步阶段恰好相反:吞吐量低、每个 PR 都稀贵、纠错成本相对高。所以不要照搬 “允许偶发失败重跑、最小化阻塞合并门” 这种后期做法。

来源:OpenAI Lopopolo + 我的独立判断(起步阶段反向适用)。


三、完整架构设计

用户要求:先有一个完整的设计,落地时按需分步。这一章给完整版。

3.1 一张图看懂整体架构

                        ┌─────────────┐
                        │    人类     │
                        │ 提词 / 评审 │
                        └──────┬──────┘

           ┌───────────────────┼───────────────────┐
           │                   │                   │
           ▼                   ▼                   ▼
    ┌──────────┐        ┌──────────┐        ┌──────────┐
    │ ① Planner│──────→│②Generator│──────→│③Evaluator│
    │ 需求展开 │  产出  │ 开发自测 │  产出  │ 独立评审 │
    └──────────┘  规格  └──────────┘  PR    └──────────┘

                                     通过/需修   │
                      ┌──────────────────────────┤
                      │                          │
                      ▼                          ▼
                ┌──────────┐              ┌──────────┐
                │ ④Reporter│◀──人工反馈──│ ⑤Reviser │
                │ 汇总上报 │              │ 自我修复 │
                └────┬─────┘              └──────────┘


                ┌────────────────────────────────────┐
                │      知识库(飞书 + GitLab 回写)  │
                └────────────────────────────────────┘

  ━━━━━━━━━━━━━━━━━━━━ 横向支撑层 ━━━━━━━━━━━━━━━━━━━━
  ┌────────────────────────────────────────────────┐
  │ 上下文层:AGENTS.md / docs/ 结构化文档          │
  │ 约束层:  Java/JS/Kotlin/Swift/SQL Linter      │
  │ 反馈层:  GitLab MR + Jenkins CI + E2E MCP     │
  │ 维护层:  ⑥ Doc-Gardener 持续校验文档可信度    │
  └────────────────────────────────────────────────┘

3.2 六个 Agent 角色定义

完整架构有六个 Agent 角色。阶段 1 不需要全部上线,但设计时全部预留接口。

#角色输入输出职责阶段 1 是否上线
Planner人的初始提词(1-3 句)结构化需求文档把模糊提词扩展为完整的产品规格 + 功能清单 JSON是(简化版)
Generator需求文档 + 当前代码状态代码 + 测试 + 本地自测结果按功能清单逐项实现,每次只做一个功能
EvaluatorGenerator 的 PR通过 / 需修复 + 具体问题独立于 Generator,以怀疑态度做 E2E 验证和规范检查是(最小版)
ReporterEvaluator 的结论 + CI 结果汇总报告入库把 Agent 全过程沉淀到知识库,人工可评论
Reviser人工反馈修复 PR读人工评论,自修复并重新走 Generator→Evaluator 闭环
Doc-Gardener整个仓库文档修复 PR + 质量评分定时扫描文档与代码漂移、过期引用、规则失效阶段 2(但阶段 1 预留结构)

3.3 Agent 工作流:对应你提的四个环节

你的描述对应 Agent具体流程
(a) 先给提词,Agent 慢慢扩展成需求文档Planner人写 1-3 句提词 → Planner 产出初稿 → 人审阅调整 → 定稿为 docs/specs/<case-id>.md + feature-list.json
(b) Agent 执行评估,按严格流程开发和自测Generator + EvaluatorGenerator 按 feature-list 逐项开发 → 每项做完触发 Evaluator → Evaluator 用 Playwright/Appium/Espresso 等做 E2E 验证 → 只有通过才标 passing: true
(c) 结果反馈到集中地方,人工评论Reporter + 知识库Reporter 把过程产物(PR、测试截图、覆盖情况)汇总到飞书多维表格 → 人工在表格段落级评论
(d) Agent 根据反馈自我修复ReviserReviser 订阅飞书评论事件 → 把评论翻译为新的 feature-list 修订 → 触发 Generator 回环

3.4 支撑层的物理承载点

组件承载位置
上下文层AGENTS.md / docs/GitLab 仓库内,每次 Agent 任务启动时自动读入
约束层Linter + 架构测试GitLab 仓库内 + Jenkins 的独立 Pipeline 阶段
反馈层CI / E2EJenkins(服务端)+ 浏览器/模拟器 MCP(前端)
维护层Doc-GardenerJenkins 定时任务触发,每周扫描
知识库飞书多维表格 + 文档飞书(人类协作友好)+ 周期回写 GitLab(Agent 可见)

3.5 为什么六个 Agent 不是一个大 Agent

这是设计里最关键的决策,来自 Anthropic Rajasekaran 的实验。

Rajasekaran 的复古游戏制作器实验数据:

  • 单一 Agent:20 分钟 / 9 美元 / 核心功能不工作
  • 完整编排(Planner + Generator + Evaluator):6 小时 / 200 美元 / 功能完整可玩

差距不是金钱 22 倍的问题,是”能用 vs 不能用”的问题。原因:

  • 一个 Agent 同时负责规划 + 生成 + 评估时,上下文被执行细节填满,规划层面的视角丢失
  • 生成者评估自己的产出天然存在偏差(Rajasekaran 原话:过度宽容)
  • 上下文焦虑:模型接近上下文限制时会”过早收尾”,功能半途而废

所以六 Agent 架构不是过度设计,是唯一能稳定产出的设计


四、技术栈适配

这一章把每个端的 Linter、反馈工具、约束要点都对应清楚。阶段 1 只做 1-2 个栈,但其他栈的设计先定好。

4.1 服务端(Java)

一句话:Java 生态的静态约束能力最强,适合作为阶段 1 的首选栈。

工具作用
上下文AGENTS.md + docs/architecture/约束层间依赖和模块划分
静态约束Checkstyle / PMD / SpotBugs代码风格和常见 bug 模式
架构约束ArchUnit(强烈推荐)以测试形式验证分层依赖、包边界、命名约定
依赖约束Maven Enforcer Plugin防止 Agent 随意引入新依赖
单元反馈JUnit 5 + Mockito常规
集成反馈Testcontainers真实 DB / 消息队列,避免 mock 过度带来的假通过
E2E 反馈REST Assured接口级 E2E
CI 承载Jenkins Pipeline串联以上所有验证

Java 场景下 Agent 最容易犯的错(需要首批进 Linter 的):

  1. 跨层依赖(Service 直接写 SQL 绕过 Repository)→ ArchUnit 规则
  2. 事务边界乱(@Transactional 滥用或缺失)→ 自定义静态检查
  3. 空检查冗余(Optional.ofNullable(x).get() 之类)→ PMD 规则
  4. 数据边界不解析(外部 JSON 直接用 Map<String, Object> 传递)→ 对应 OpenAI 的 “Parse don’t validate” 原则

配合 Jenkins 的 Pipeline 阶段设计

1. 静态检查阶段(< 1 min):Checkstyle + PMD + SpotBugs + ArchUnit
2. 单元测试阶段(< 5 min):JUnit
3. 集成测试阶段(< 15 min):Testcontainers
4. Evaluator Agent 阶段:独立 Job,读取上面三阶段报告 + 做语义评审

4.2 前端 Web

一句话:浏览器 E2E 可以用 MCP 做自动化,反馈闭环最完整。

工具
静态约束ESLint(含自定义规则) + TypeScript strict + Prettier
架构约束eslint-plugin-boundaries 或自定义规则
单元反馈Vitest / Jest
E2E 反馈Playwright MCP(Agent 可直接调用)

关键细节:Anthropic Young 博客明确指出”Claude 通过 Puppeteer MCP 看不到浏览器原生 alert 弹窗”。团队如果前端有大量依赖原生 alert/confirm 的交互,需要替换为自定义组件,否则 Evaluator Agent 会漏掉 bug。

4.3 安卓

一句话:Kotlin 生态 + Espresso 能做到较完整闭环,但模拟器启动速度是瓶颈。

工具
静态约束Android Lint + Detekt + ktlint
架构约束Konsist(Kotlin 版 ArchUnit)
单元反馈JUnit + Robolectric
E2E 反馈Espresso(真机/模拟器)或 Appium MCP(如果配置了)

Agent 接入难点:模拟器启动慢(通常 30 秒以上),Agent 的反馈周期会被拖长。建议 Jenkins 上长驻一个模拟器池,Agent 通过 API 调度。

4.4 iOS

一句话:iOS 生态的静态检查相对弱,Evaluator 要更重(多做 E2E)。

工具
静态约束SwiftLint
架构约束自定义脚本(iOS 生态目前缺 ArchUnit 类等价物)
单元反馈XCTest
E2E 反馈XCUITest

Agent 接入难点:必须跑在 macOS 构建节点,Jenkins 侧要规划 Mac agent pool。E2E 验证的 Agent 集成目前工业案例较少(所有主要 Harness 案例都没覆盖 iOS),团队需要做开荒工作。

4.5 H5

一句话:视作 Web 的子集,但要额外约束”移动端差异”。

H5 场景 Agent 最容易漏的问题:

  • 移动端视口(viewport 配置、rem 计算)
  • 触摸事件 vs 鼠标事件差异
  • 微信/支付宝内嵌浏览器的兼容性

对应的约束方式:Evaluator 用 Playwright MCP 跑移动端视口 + 真实 UA 串,而不是只跑桌面浏览器。

4.6 数仓

一句话:数仓场景更适合 Harness,因为 SQL 和数据模型天然结构化。

工具
静态约束SQLFluff(SQL Linter)
架构约束dbt 的 model 分层约定 / 自定义 schema 验证
单元反馈dbt test / Great Expectations
E2E 反馈数据质量断言 + 增量对比

数仓场景的独特优势:数据的正确性可以自动化验证(对比 count、对比聚合值、对比 schema),Evaluator 比代码场景更容易做”真实 QA”。建议阶段 1 的两个 case 之一选数仓

4.7 GitLab + Jenkins 的 Harness 集成

GitLab 承担什么

  • 代码仓库(原则 1:“仓库即现实”的物理载体)
  • MR 流程(Agent 提 MR,人/Evaluator 评审)
  • Webhook(触发 Jenkins、触发 Reviser)

Jenkins 承担什么

  • 所有 Linter / 测试 / E2E 的执行载体
  • Agent 之间传递信号的中间件(例如 Generator 完成 → 触发 Evaluator)
  • Doc-Gardener 的定时任务调度

整合方式

Agent 本地生成代码

推送到 GitLab 分支 + 提 MR

GitLab Webhook → Jenkins Pipeline

Pipeline 分阶段执行约束检查 + E2E

结果回写到 MR(comment API)

Reporter Agent 读取 MR + Jenkins 结果 → 汇总到飞书

五、三阶段落地路径

阶段 0:给 Agent 准备一个能读到现实的起始上下文。阶段 1:架构整体就位,窄范围跑通。阶段 2:全栈推广,多 Agent 全员上线

5.1 阶段 0:起始扫描与知识库奠基(第 0-4 周)

5.1.1 为什么必须有阶段 0

我们不是 OpenAI 的 Greenfield 起点。存量代码已经运行多年,但它的架构模式、业务约定、三方依赖版本——全部对 Agent 不可见

如果跳过阶段 0 直接让 Agent 做 case,会出现两类典型问题:

  • 风格漂移:Agent 写出的代码功能对,但命名/分层/依赖完全不符合团队习惯
  • 语义错误:Agent 做出了技术上对、业务上错的修改(例如改了某段”看起来冗余”的代码,其实那是三年前修某个 bug 的关键逻辑)

阶段 0 要解决的就是这两类问题,让 Agent 开工时能读到团队积累的”现实”。

5.1.2 阶段 0 的三项工作

工作 A:存量代码扫描(第 1-2 周)

做什么

  • 用一个”扫描 Agent”(可以复用 Claude Code 或写个一次性脚本)跑一次完整扫描
  • 产出四份文档:
    • docs/architecture/modules.md:模块清单 + 每个模块的一句话职责
    • docs/architecture/dependencies.md:模块间依赖关系图(基于实际 import 分析)
    • docs/architecture/conventions.md:命名约定、包结构、代码风格的统计归纳
    • docs/architecture/entry-points.md:HTTP API、定时任务、消息消费者、脚本入口
  • 这些文档作为 AGENTS.md 的扩展,不进主目录

关键一步扫描产出必须被人工审阅一遍

原因:扫描 Agent 会把坏模式也识别为”约定”——例如某个历史遗留的循环依赖、某种不该继续使用但仍存在的工具类。如果不人工区分”好的保留 vs 坏的标记”,Agent 会把坏模式当成团队规范继续复现。

人工审阅输出三类标签:

  • [保留]:这是团队的好约定,Agent 写新代码要遵守
  • [避免]:这是历史包袱,Agent 写新代码不要模仿(即使代码库里大量存在)
  • [存疑]:团队内部还没达成共识的,先记录,不强制

来源:OpenAI Lopopolo 原文 “Codex 会复现代码仓库中已存在的模式——甚至包括那些不均衡或不够理想的模式” —— 既然会复现坏模式,就必须预先标出来。

置信度:★★☆(扫描必要性 ★★★,人工审阅的三标签分类是我的独立设计)


工作 B:业务逻辑隐性知识显性化(第 2-3 周)

做什么

  • 针对阶段 1 将要接入的 1-2 个 case 所涉及的业务模块,组织业务负责人访谈
  • 访谈用固定的四个问题框架:
    1. 这个模块在业务上解决什么问题?
    2. 哪些设计看起来奇怪但有深层业务原因?(“看起来应该用 A,但我们用 B,因为……”)
    3. 有哪些历史包袱?(曾经出过什么问题、为什么现在这样处理)
    4. 哪些改动是红线?(业务规则、合规要求、历史 bug 补丁)
  • 产出:docs/business-logic/<模块名>.md,每份 200-500 字为佳
  • 必须 checked in 到 GitLab(原则 1:仓库即现实)

为什么必须做

  • 业务逻辑是”Agent 不可能从代码推断出来的信息”。代码只能告诉它”做了什么”,告诉不了它”为什么”
  • 这些知识目前散落在业务负责人脑子里、在历史飞书讨论里、在半年前的复盘文档里——对 Agent 完全不可见
  • 不显性化,Agent 会做”技术上对但业务上错”的修改

建议先做哪些模块:只做阶段 1 涉及的,不要一次性写全。阶段 1 以外的模块,在未来推广时按需补。

置信度:★★★(原则 1 的直接应用,调研 4.1 节也明确这是 Brownfield 接入的关键空白)


工作 C:三方文档镜像(第 2-3 周,可与 B 并行)

做什么

  • 识别团队高频使用的三方依赖:
    • 服务端:Spring Boot 核心模块、Lombok、Jackson、MyBatis/JPA、Redis 客户端、MQ 客户端
    • 移动端:Android SDK、iOS SDK、关键第三方 SDK
    • 数仓:dbt、具体数据库版本(MySQL/PostgreSQL/Hive)的 SQL 方言
    • 跨端:飞书开放平台 API(因为知识库要用)
  • 对每个依赖,处理方式二选一:
    • 方式 1(推荐):在 docs/external-refs/index.md 里写索引,指向官方文档的稳定 URL + 明确版本号
    • 方式 2(高频依赖才做):把关键子集提炼到 docs/external-refs/<依赖名>-<版本>.md 本地
  • 建立 docs/external-refs/index.md 作为统一入口

为什么必须做

  • Agent 的训练数据有截止时间,它”知道”的三方 API 可能已经过时
  • Agent 联网搜索得到的信息可能不准确(版本混乱、示例过时)
  • 把权威最新文档 checked in 或索引化,Agent 直接读取最可靠

文档示例结构

docs/external-refs/
├── index.md                          # 索引 + 版本表
├── spring-boot-3.2-key-features.md   # 高频用到的,提炼子集
├── mybatis-plus-3.5.md
├── android-sdk-34-api-notes.md
└── lark-open-platform-links.md       # 低频用到的,只放链接

index.md 的关键字段(也是 Doc-Gardener 要扫描的):

  • 依赖名
  • 当前使用版本
  • 最后更新日期
  • 三方文档的官方 URL
  • 本地镜像文件(如有)
  • 负责人

为什么要有”负责人”字段:Doc-Gardener 扫出过期时,要有明确的接口人处理。没有负责人的三方文档腐烂速度最快。

置信度:★★☆(OpenAI 的 references/*-llms.txt 模式是直接原型,但我们具体到”索引 vs 本地镜像”二选一是团队特化的设计)


5.1.3 阶段 0 的执行节奏

周次工作产出负责角色
第 1 周工作 A 扫描(脚本/Agent 跑)docs/architecture/ 初稿平台团队 1 人
第 2 周工作 A 人工审阅 + 三标签分类docs/architecture/ 带标签核心开发者 2-3 人(各半天)
第 2-3 周工作 B 业务访谈(并行)docs/business-logic/ 初版业务负责人 + 记录员
第 2-3 周工作 C 三方文档索引docs/external-refs/ 初版各端技术 owner
第 3 周合并入口到 AGENTS.mdAGENTS.md v0(≤100 行)平台团队
第 4 周阶段 0 回顾 + go/no-go 决策阶段 1 启动或延期整个团队

5.1.4 阶段 0 本身就有独立价值

即使后续 Harness 落地遇到阻碍,阶段 0 的三份产出也是不亏本的投资——

  • 存量代码扫描文档:人类工程师的 onboarding 直接受益
  • 业务逻辑文档:日常交接、新人培训都能用
  • 三方文档索引:对团队所有人都是生产力工具

这是”最小赌注”的落地方式:第一个 4 周把这三件事做好,团队的即时价值已经兑现,后面 Harness 能不能跑通反而是上升空间。


5.2 阶段 1:1-2 个 case 跑通完整闭环(第 1-3 个月)

前置条件:阶段 0 已完成。

5.2.1 目标

  • 完整架构图里的六个 Agent 中,Planner + Generator + Evaluator + Reporter + Reviser(最小版) 五个上线
  • Doc-Gardener 在阶段 1 预留结构但不要求完善
  • 1-2 个 case 跑通从提词到合并的全流程
  • 积累第一批真实的 Agent 错误日志(为阶段 2 的规则制定提供素材)

5.2.2 选 case 的标准

维度推荐避开
业务关键度非核心业务核心交易、支付、认证
技术栈Java 服务端或数仓(闭环最完整)iOS(E2E 工具弱)
需求复杂度中等(既不过简单显不出 Harness 价值,也不过复杂导致第一次就卡住)跨多端联调的复杂需求
规模预计 5-15 个 feature 的小模块百级 feature 的大功能

具体推荐

  • Case 1:一个内部工具的 Java 服务端模块(例如日志查询工具、数据导出工具)
  • Case 2:一个数仓的新数据集开发(新 dbt 模型 + 测试)

5.2.3 落地步骤(阶段 1 的执行清单)

Step 1:搭骨架(第 1 周)

  • 在 GitLab 新建 docs/harness/ 目录,放置 AGENTS.md 模板、feature-list.json 模板、agent 角色说明
  • 飞书开一份多维表格 “Harness-运行记录”,字段:case_id / 阶段 / Agent 名 / 产出链接 / 状态 / 人工反馈
  • Jenkins 配一个新的 view “Harness-Pipelines”,所有 Agent 相关 Job 挂这下面

Step 2:定 case 级隐性约束(第 1-2 周)

  • 针对选定的 case,在阶段 0 已有的架构文档基础上做增量补充
  • 产出:3-5 条该 case 最关键的”新人踩了就会被 review 打回”的规则
  • 其中可自动化的 → 直接写成 ArchUnit 测试或 Checkstyle 规则(这是阶段 1 的第一批 Linter)
  • 其中需上下文判断的 → 写进该模块的 AGENTS.md

Step 3:Planner Agent 上线(第 2-3 周)

  • 最小实现:一个脚本或服务,接收 1-3 句提词,调用 LLM 生成需求文档初稿 + feature-list.json 骨架
  • 产出物 commit 到 docs/specs/<case-id>.md
  • 人工审阅后定稿,标记 [locked]

Step 4:Generator + Evaluator 闭环(第 3-6 周)

  • Generator:读 locked 的 feature-list,每次只处理一个 feature,提 MR
  • Evaluator:独立 Agent,订阅 GitLab MR webhook,读 MR + Jenkins 结果 + 触发 E2E MCP
    • Evaluator 的 prompt 明确:以怀疑态度审视,找问题而不是确认正确
    • Evaluator 通过才允许 feature 的 passes 标记为 true
  • Evaluator 不通过 → 回传给 Generator 重做(这个闭环不经过人工)

Step 5:Reporter + 人工反馈(第 6-8 周)

  • Reporter:定期(比如每天)把 Harness-运行记录表格汇总,用飞书消息推送到团队群
  • 人工可在表格行级评论、在 MR 行级评论
  • 两类反馈的汇总点都是 Reporter,不要让人工反馈散落在多个地方

Step 6:Reviser Agent 最小版上线(第 7-8 周)

  • 订阅飞书多维表格的评论事件,把评论汇总为 feature-list 的修订建议
  • 关键约束:Reviser 的所有改动都要过人工批准,不自动合入
  • 阶段 1 的 Reviser 只要能做到”读懂评论、生成修订 PR、标记待人工合入”就算达标

Step 7:回顾 + 定义阶段 2 入口条件(第 8-12 周)

  • 回顾:积累的 Agent 错误日志清单、误报率、合并率
  • 入口判定:
    • Agent 错误日志 ≥ 30 条
    • Agent MR 合并率 ≥ 50%
    • 至少一个 case 完整跑完
    • 满足则进入阶段 2

5.3 阶段 2:全栈推广 + 全 Agent 上线(第 4-12 个月)

5.3.1 新增或完善的三件事

1. Reviser 能力升级(对应你要求的 (d) 环节的完整版)

  • 阶段 1 的 Reviser 只做 feature-list 修订。阶段 2 扩展到:
    • 能直接读 MR 行级评论 → 自动改代码
    • 能读 AGENTS.md 规则变更 → 主动扫已有代码找不合规处
  • 保留关键约束:Reviser 改动 AGENTS.md / docs/ / 规则文件,永远需要人工审阅,不允许直接合入

2. Doc-Gardener Agent 全面上线

详见下一章(第七章)单独展开。阶段 2 里把它从”预留结构”升级为”每周定时跑”。

3. 全栈推广

按照第四章的技术栈适配表,逐个栈接入。推荐顺序:

  1. Java 服务端(阶段 1 起家的栈,继续深化)
  2. 数仓(结构最规整,快速见效)
  3. 前端 Web(Playwright MCP 成熟)
  4. H5(Web 的延伸)
  5. 安卓(模拟器池准备好后)
  6. iOS(最后,E2E 工具还在演进)

4. 多 case 并发

阶段 1 是串行(一个 case 跑完再下一个)。阶段 2 要支持多 case 并发,这时需要引入隔离工作空间——每个 Agent 任务用独立的 Git worktree 或独立的开发容器。

OpenAI 用 git worktree,Stripe 用 10 秒启动的 devbox。我们起步用 git worktree 就够,先不上 devbox。

5.3.2 阶段 2 的完成标志

  • 六个 Agent 角色全部上线且稳定运行
  • 至少 3 个技术栈完成完整接入
  • Doc-Gardener 每周至少发起 5 个修复 PR
  • 团队对 Agent 的依赖从”偶尔用”变成”默认参与”

六、Harness 知识库:能力需求与方案选型

这一章回答:我们要一个什么样的知识库、它该具备哪些能力、候选方案哪个最合适、为什么

6.1 知识库在 Harness 里扮演什么角色

先界定边界:

  • 不是:一个通用的 wiki 或文档系统
  • :Harness 六 Agent 系统的运行时记忆 + 协作前台——Agent 读它获取知识、写它留下轨迹,人类读它追踪进度、写它给 Agent 反馈

这个角色定位决定了它的能力需求和通用文档系统不同。比如”段落级评论”对通用 wiki 是锦上添花,对 Harness 是刚需(因为 Generator 和 Evaluator 要以行/段为粒度反馈)。

6.2 完整能力需求清单(12 项)

#能力来源为什么必须有
R1人可以上传/编辑知识你提过Agent 无法自动产生业务隐性知识
R2Agent 可以读写你提过六 Agent 架构的基本前提
R3段落/行级标注与回复你提过Generator-Evaluator / 人-Reviser 反馈通道的载体
R4全文搜索 + 结构化过滤我补充原则 1”仓库即现实”的前提——Agent 要能在大量文档里精准定位
R5结构化字段(表格+元数据)我补充feature-list、错误日志、质量评分这些必须是结构化表格而不是散落文本
R6版本历史我补充调试 Agent 行为时要能回看”当时 Agent 读到的是什么版本”
R7新鲜度标记我补充Doc-Gardener 要知道每份文档的 mtime + 最后人工确认时间
R8交叉链接我补充文档间互引 + 文档到 GitLab commit / MR 的双向映射
R9权限分级我补充Agent 账号的写权限要限定范围;业务机密文档不能全员可读
R10与 GitLab 的周期性同步我补充原则 1:经过共识的知识最终要 checked in 到 GitLab
R11事件订阅(webhook)我补充评论要触发 Reviser、Agent 产出要触发 Reporter
R12多媒体支持(截图/视频)我补充Evaluator 跑 E2E 要传截图;人工反馈可能是录屏

6.3 候选方案

我评估三个方案。方案 D(自研)在 v0 已明确排除,这里不再展开:不是团队核心竞争力、隐性成本巨大、OpenAI 七人团队都没自研过任何知识库工具

方案构成
A飞书多维表格 + 飞书文档 + lark-mcp + Jenkins 每周 Git 回写脚本
BGitLab 原生(Wiki + Issues + MR 评论)+ 辅助脚本
CNotion / Confluence 等国际 SaaS + API + Git 回写

6.4 方案对 12 项能力的覆盖分析

符号说明:✅ 原生支持 / ⚠️ 部分支持或需补 / ❌ 不支持或有重大障碍

能力A 飞书B GitLabC 国际 SaaS备注
R1 人上传✅ 体验好,业务方熟悉⚠️ 工程师友好,业务方门槛高✅ 体验好B 的短板最关键:业务逻辑访谈需要业务方写
R2 AI 读写✅ lark-mcp 已配置✅ GitLab API 成熟⚠️ 需自行接 API
R3 段落/行级评论✅ 文档原生⚠️ 只能 Issue/MR 级,Wiki 弱✅ 原生R3 是 Harness 刚需,B 的弱点会严重影响反馈闭环
R4 搜索⚠️ Wiki 搜索弱
R5 结构化字段✅ 多维表格原生⚠️ 靠 YAML frontmatter + 约定✅ 数据库视图
R6 版本历史⚠️ 文档有历史,表格历史弱✅ Git 天然完备⚠️ 有限A 的最明显短板
R7 新鲜度标记✅ 字段 + 自动化✅ Git mtime⚠️ 需脚本
R8 交叉链接三者都 OK
R9 权限分级✅ 飞书组织架构成熟✅ 基于 GitLab 权限⚠️ 数据合规问题(见下)
R10 Git 同步⚠️ 需自建脚本✅ 天然就在 Git⚠️ 需自建A、C 的同等短板
R11 事件订阅✅ 飞书开放平台 webhook✅ GitLab webhook⚠️ 视具体服务
R12 多媒体⚠️ 图片 OK,视频弱
数据合规✅ 国内 SaaS✅ 可自托管❌ 数据出境合规风险对中国团队 C 存在硬限制
团队上手✅ 团队大概率已用✅ 工程师天然熟悉⚠️ 需引入新工具

6.5 选定方案:A 飞书三件套(带 Git 回写补强)

6.5.1 结论

推荐方案 A。理由不是 A 完美,而是 A 的短板可以低成本补强,B 和 C 的核心短板无法绕过。

6.5.2 为什么不是 B(GitLab 原生)

GitLab 原生看起来很对——“就在 Git 里,原则 1 天然满足”。但:

  • R1 业务方上手门槛:业务逻辑访谈的产出要由业务负责人写进 Wiki 或 Issue,他们大概率不会也不愿。结果就是文档靠工程师代写,失真
  • R3 段落级评论:Harness 的反馈闭环需要行级/段落级反馈(OpenAI 原文的 “在 MR 里给 Generator 具体的修复路径”)。GitLab Wiki 评论粒度太粗,Issue/MR 能行级但只适合代码场景,文档反馈不适配。
  • R5 结构化字段:feature-list 可以用 JSON+Git 解决,但 Harness-运行记录、质量评分这些要做视图、筛选、统计——用 Git 存 JSON 然后写前端?这变成了自研(回到方案 D 的坑)。

B 的本质问题:Git 是代码协作优化的,不是业务知识协作优化的。硬塞进去会把两边都做坏。

6.5.3 为什么不是 C(国际 SaaS)

  • 数据合规:中国团队把业务逻辑、业务红线、Agent 执行轨迹这些写进 Notion/Confluence,涉及数据出境,企业合规审计会拦。
  • 引入成本:团队大概率没有现成账号和使用习惯,从零推行比用飞书多一道组织门槛。
  • 没有明显优势:C 能做的 A 都能做,不如选 A。

6.5.4 A 的短板如何补强

A 的两个明显短板:R6 版本历史(表格弱)R10 Git 同步。补强方式:

  • 双轨制:飞书是协作前台(讨论、记录、反馈),GitLab 是真理后台(定稿、版本、Agent 读取)
  • 每周 Git 回写脚本(Jenkins 定时 Job):
    • 从飞书多维表格导出本周错误日志、Agent 运行记录 → append 到 GitLab 的 docs/harness/
    • 从飞书文档组导出标记为 [Ready] 的 ADR → 生成 MR 到 docs/decisions/
  • 关键约定任何 AGENTS.md / 规则文件的变更只能发生在 GitLab,不能发生在飞书。飞书只用于讨论和记录。这条纪律违反就会退化回”飞书是真实源”的混乱。

6.5.5 方案 A 三件套的最终形态

┌─────────────────────────────────────────────────────┐
│ 飞书多维表格                                        │
│ • Harness-运行记录(每次 Agent 任务的过程)          │
│ • Agent-错误日志(可工程化素材)                    │
│ • 质量评分追踪                                      │
│ • 三方文档索引(R7 新鲜度字段)                     │
│ MCP:lark-mcp__bitable_v1_*                        │
└─────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────┐
│ 飞书文档                                            │
│ • 需求讨论(阶段 1 的 Planner 初稿人工调整场所)    │
│ • ADR 草稿(达成共识前的讨论)                      │
│ • 业务逻辑访谈记录(工作 B 的临时产出场所)         │
│ • Agent 汇报报告(Reporter 汇总)                   │
│ MCP:lark-mcp__docx_*                              │
└─────────────────────────────────────────────────────┘
                        ↕ 每周回写
┌─────────────────────────────────────────────────────┐
│ GitLab(定稿 + Agent 读取的唯一可信源)             │
│ • AGENTS.md                                         │
│ • docs/architecture/(阶段 0 工作 A 产出)          │
│ • docs/business-logic/(阶段 0 工作 B 产出)        │
│ • docs/external-refs/(阶段 0 工作 C 产出)         │
│ • docs/decisions/(经共识的 ADR)                   │
│ • docs/harness/agent-error-log.md(回写的错误日志) │
│ • docs/specs/<case-id>.md(Planner 定稿)           │
└─────────────────────────────────────────────────────┘

各类内容应该住在哪里

内容类型产生位置最终归宿回写时机
业务逻辑访谈(阶段 0 工作 B)飞书文档GitLab docs/business-logic/每次访谈结束+定稿
架构扫描结果脚本产出GitLab docs/architecture/扫描+人工审阅后直接 commit
三方文档索引飞书多维表格GitLab docs/external-refs/index.md每周同步
Agent 任务记录飞书多维表格GitLab docs/harness/runs/每周同步
错误日志飞书多维表格GitLab docs/harness/agent-error-log.md每周 append
ADR 讨论飞书文档GitLab docs/decisions/定稿后手动标 [Ready]
feature-list飞书文档(讨论)→ GitLab(定稿)GitLab docs/specs/<case-id>/feature-list.json定稿即 commit
人工反馈评论飞书表格评论GitLab MR 评论Reviser 转译

6.6 阶段落地步骤

阶段 0 期间

  • 开 “Harness-知识库” 飞书空间
  • 多维表格建三张:运行记录、错误日志、三方文档索引
  • 文档组建四个:需求讨论、ADR 讨论、业务访谈、Agent 汇报

阶段 1 期间

  • 写 Jenkins 定时 Job 跑 Git 回写脚本(每周五)
  • 在 AGENTS.md 里加导航:“重要讨论参见飞书,定稿沉淀在 GitLab docs/”
  • 明确纪律:AGENTS.md 和规则文件只能在 GitLab 改

阶段 2 期间

  • 增加 “Agent-Execution-Trace” 表,为未来微调做数据基础(对应 Schmid 信号”轨迹即资产”)
  • 增加 “Quality-Score” 表,对应第 7.2 节的质量评分追踪

6.7 一句话总结

双轨制——飞书做人和 Agent 共享的协作前台,GitLab 做 Agent 的唯一可信源,每周脚本把前台讨论回写到后台。这是在”R1 业务方体验”和”R10 Agent 可见性”之间的最优解。


七、文档可信度校验(Doc-Gardener)

你特别强调这一点。OpenAI 博客里这是最容易被忽略但最关键的机制之一。

7.1 为什么单独开一章

其他几个 Agent 解决的是”生成问题”,Doc-Gardener 解决的是”腐烂问题”。前者是瞬时的,后者是持续的。没有 Doc-Gardener,所有上下文层的投资会在 3-6 个月内完全失效。

7.2 它具体做什么

OpenAI Lopopolo 博客明确描述的三类扫描:

1. 文档新鲜度扫描

  • 某个文档最后修改时间 vs 它描述的代码的最后修改时间
  • 差距 > 阈值 → 标记”可能过期”
  • 文档引用的 API/函数是否仍存在 → 不存在则标记”引用失效”
  • 特别针对三方文档:扫 docs/external-refs/index.md 里的版本号,对比 pom.xml / build.gradle / Podfile.lock / package.json 里的实际版本,不一致就报警

2. 文档与代码一致性扫描

  • 文档里说 “Service 层不直接写 SQL”,grep 代码发现 @Service 类里有 jdbcTemplate.query → 生成修复 MR
  • 文档里的示例代码能不能跑通(静态编译尝试或语法校验)
  • 特别针对业务逻辑文档:如果 docs/business-logic/<模块>.md 提到的模块名在 docs/architecture/modules.md 里已经消失,报警

3. 规则覆盖率扫描

  • AGENTS.md 里的每条”不可违反原则”,是否有对应的 Linter 规则或测试在强制执行?
  • 没有 → 标记”规则可能流于形式”
  • 这条扫描直接服务于原则 2:约束优于指令。如果一条原则没有对应约束,它就是纸老虎

7.3 Doc-Gardener 的运行方式

Jenkins 定时任务(每周一次)

Doc-Gardener Agent 启动

扫描 docs/ 所有文档 + AGENTS.md + 相关代码

生成三类产出:
  ├─ 新鲜度报告 → 更新 QUALITY_SCORE.md
  ├─ 一致性问题 → 每个问题一个修复 MR(小粒度)
  └─ 规则漏洞 → 汇总到飞书,人工决定是否补规则

报告回流到知识库

小粒度 MR 是关键:每个 MR 应该小到”1 分钟内人工审完直接合入”。这是 OpenAI 原文描述的模式——如果 MR 太大,人工审核会堆积,Doc-Gardener 的价值就失效了。

7.4 阶段 1 和阶段 2 的差异

阶段 1:只做结构预留

  • docs/harness/ 下建 doc-gardener/README.md,写清未来的职责
  • 在 Jenkins 建一个空的定时 Job,先不跑
  • 目的:让团队有”这个东西一定会来”的心理预期

阶段 2:全面上线

  • 实现上面 7.2 里的三类扫描
  • 从最简单的”新鲜度扫描”开始(只扫 docs/ 目录的 mtime),逐步升级到语义扫描
  • 第一个月允许误报率较高,手动调参;第二个月进入稳定态

7.5 Doc-Gardener 本身也会腐烂怎么办

调研里明确指出的空白(findings.md 4.4):“doc-gardening Agent 能清理 AI 生成的文档熵增,但 harness 本身的文档熵增由谁清理?”

我的建议:季度性做一次 “harness 裸测”——

  • 临时把 AGENTS.md 换成空的
  • 让同一个 Agent 用同一个 prompt 做同一个任务
  • 对比产出质量差异

如果差异不大 → harness 已经没起作用,全部规则需要重审 如果差异明显 → harness 仍在起作用,Doc-Gardener 可信

这是目前唯一能验证 Harness 本身有效性的方法。


八、风险与观测指标

8.1 六个月内需要警惕的五个风险

风险征兆对策
AGENTS.md 百科全书化超过 100 行、开始出现历史遗迹规则Doc-Gardener 扫描 + 季度重构
Linter 误报率过高高于 10%回滚新增规则,重审定义
Evaluator 偏向通过合并率 > 90% 但真实问题仍在漏换 Evaluator prompt、加入”必须找出 3 个问题”的硬要求
飞书和 GitLab 不同步人在飞书讨论定了事、GitLab 上 Agent 仍按旧规则每周 Git 回写脚本稳定性排第一
双轨制失守有人直接在飞书改 AGENTS.md 规则定期审计,违反就回滚并重申纪律

8.2 月度观察指标

指标目标数据来源
AGENTS.md 行数≤ 100Git
Agent MR 合并率≥ 50% 起步,目标 ≥ 68%GitLab
Evaluator 发现问题率保持 ≥ 30%(太低说明它在放水)Evaluator 运行日志
Pre-commit 耗时≤ 5 秒Git hook 日志
Jenkins CI 平均轮次≤ 2 轮Jenkins
Agent 错误日志新增前 2 月 ≥ 5 条/周,第 6 月开始下降飞书多维表格
Doc-Gardener 每周修复 MR 数阶段 2 起 ≥ 5GitLab
飞书→GitLab 回写脚本成功率100%Jenkins Job 状态

8.3 放弃信号(承认失败比硬推重要)

  • 三个月后 Agent 错误日志 < 20 条 → 团队根本没真正用 Agent
  • 六个月后 Linter 规则超过 30 条还在增加 → 没在工程化共性,在打补丁
  • Agent MR 合并率长期 < 30% → Harness 方向错了
  • Evaluator 连续两个月发现问题率 < 10% → 它可能完全失效
  • 阶段 0 完成后 3 个月都没进入阶段 1 → 要重新评估动力和资源

九、附录

9.1 置信度来源对照表

章节/决策置信度主要来源
原则 1(仓库即现实)★★★OpenAI Lopopolo 金句
原则 2(约束优于指令)★★★Cursor + OpenAI + Stripe 三源
原则 3(生成与评估分离)★★★Anthropic Rajasekaran + GAN 架构 + Cursor 四代演进
原则 4(文档必须被持续校验)★★★OpenAI Lopopolo + Martin Fowler + Stripe
原则 5(吞吐决定权衡)★★☆OpenAI Lopopolo + 我的独立外推
六 Agent 架构★★☆Anthropic Rajasekaran 实验(Planner/Generator/Evaluator)+ OpenAI(Doc-Gardener)+ 我的补充(Reporter/Reviser)
Java 栈适配细节★★☆行业通用实践 + 我的团队经验推断
数仓作为起步首选★★☆结构化优势 + 我的独立判断
阶段 0 工作 A(存量扫描)★★☆扫描必要性 ★★★(OpenAI 会复现坏模式)+ 三标签分类是我的独立设计
阶段 0 工作 B(业务逻辑显性化)★★★原则 1 直接应用 + findings.md Brownfield 空白
阶段 0 工作 C(三方文档镜像)★★☆OpenAI references/*-llms.txt 模式 + 我的团队特化
知识库 12 项能力需求★★☆3 项来自你、9 项来自我对三篇博客的综合 + Harness 场景推断
选定方案 A(飞书+GitLab 双轨)★★☆12 项能力 × 3 方案矩阵分析 + 我的加权判断
Doc-Gardener 的三类扫描★★☆OpenAI Lopopolo 描述 + 我的具体化
Harness 裸测方法★☆☆调研明确空白 + 我的推测

9.2 本文与同目录其他手册的关系

  • 落地执行手册.md:参考网络资料生成,Q2 节奏导向。本文刻意不参考它
  • Harness-Engineering实践手册.md:通用方法论,不基于团队背景。本文不参考
  • 团队Harness规范-v0.md:本文的前身,纯细则驱动、没有完整架构图。本文是它的替代
  • 本文:基于 3 篇博客 + 本地调研,完整架构优先,团队技术栈落地。

9.3 修订触发条件

本文在以下情况需要修订:

  • 阶段 0 完成后(基于实际扫描结果可能需要调整阶段 1 的 case 选择)
  • 阶段 1 的第一个 case 完成后(基于实际错误日志)
  • 任何一条原则被团队观察到反例时
  • 出现新的 Harness 领域共识(例如 Brownfield 接入方案的权威案例)
  • 模型能力有重大升级(可能让某些 Agent 角色过时)

文档版本:v2 | 日期:2026-04-17 | 上次版本:v1(加阶段 0 + 重写第六章)| 下次修订:阶段 0 完成后

100 Harness Engineering — 业内深度问题清单

Harness Engineering — 业内深度问题清单

来源:findings.md 提问审计(第四轮收敛) 方法:art-of-questioning 业内提问模式 日期:2026-03-29 筛选标准:双重筛选——(1) 必须连接真实决策 (2) 不能查资料就直接回答,必须需要行业经验和判断力


一、Harness 的价值边界

[争议] 仅改进 Harness 就能跃升 28 个排名位次,但 METR 说 Harness 增益不显著——这两组数据矛盾吗?你该信哪个?

决策场景:决定团队未来半年在 harness 上投多少工程资源(10% 还是 50%) 方法论:证据探查 + 假设��查 问题背后的问题:两组数据其实测的不是同一件事。METR 测的是 benchmark 通过率,HumanLayer 测的是排行榜综合排名。而 METR 自己发现 benchmark 本身不可信(约半数通过的 PR 不会被真实维护者合并)。所以用一个不可信的评估工具测出来的”差距小”,可能本身就是噪音。但反过来问:如果 benchmark 不可信,HumanLayer 的排行榜就可信吗?它的评估维度是什么?——大多数人引用这两个数据时,都没有追问过评估工具本身的可靠性

[争议] “约束优于指令”是当前最强共识,但这个共识有多少是独立验证的,有多少是循环引用?

��策场景:决定是否把”约束优于指令”作为团队 harness 架构的第一原则来执行 方法论:证据���查 + 叙事解构 问题背后的问题:Cursor、Stripe、OpenAI 三家”独立”得出了相同结论——但 Martin Fowler 的文章引用了 OpenAI,Latent Space 综合了 Fowler 和 OpenAI,后续讨论又大量引用 Latent Space。引用链形成闭环后,“三个独立源”可能缩水为”一两个原始观察 + 一堆回声”。这不是说结论是错的,而是说它的置信度可能没有看上去那么高。你的团队要不要赌上架构方向,取决于你对这个置信度的判断

[判断] 你的 Harness 里,哪些组件是”永久型”(模型再强也需要),哪些是”补偿型”(模型变强就作废)?

决策场景:决定 harness 各组件的投资优先级和设计标准——永久型值得精打细磨,补偿型够用���行 方法论:时间透视 + 第一性原理 问题背后的��题:Big Model vs Big Harness 的时间轴分析给了一个框架:评估层、可观测性、安全约束是永久型;上下文补偿、输出格式修正是补偿型。但到了你的具体 harness 上,这条线怎么画?比如你自定义的 linter 规则——如果模型进步到能自觉遵守架构约束,这些规则是变成多余的,还是仍然作为安全网存在?答案取决于你对”模型自觉”这个假设的信任程度


二、架构决策

[争议] 多 Agent 编排值不值得投入?引入时机是什么?

决策场景:决定是继续优化单 Agent + 任务拆分,还是转向多 Agent 架构 方法论:假设探查 + 边界条件探查 问题背后的问题:Cursor 试了四代编排架构才成功,前三代的失败核心都是拓扑选错。这说明多 Agent 不是”加上去就更好”,而是”选错了比不用还差”。但行业叙事里,多 Agent 被包装成进化方向。你需要判断的是:你当前遇到的瓶颈,到底是单 Agent 的上下文装不下(需要多 Agent),还是任务拆分不够好(不需要多 Agent,需要更好的任务设计)?这两个诊断指向完全不同的投资方向

[判断] 五层架构模型要不要照搬?你的团队在哪一层有真实痛点?

决策场景:决定 harness 架构的演进路径——一次性搭五层,还是从痛点层开始按需叠加 方法��:第一性原理 + 叙事解构 问题背后的问题:五层模型是从 4 个顶级案例归纳的,findings 自己承认”没有单一来源完整验证过”。更关键的是,这四家(OpenAI、Stripe、Cursor、Anthropic)的工程资源、代码库规模、模型访问权限都远超普通团队。把他们的终态架构当作你的起点,大概率是过度工程。但反过来,如果你只搭两层,会不会在半年后发现缺失的层导致了系统性的质量退化?——这个判断没有通用答案,取决于你的 Agent 使用密度和代码库复杂度

[盲区] 上下文重置的时候,具体该保留什么、丢弃什么?谁来决定?

决策场景:决定长任务的上下文管理策略——重置点怎么选,状态摘要怎么写 方法论:边界��件探查 + JTBD ���题背后的问题:Anthropic 说”重置优于压缩”已经成为共识,但所有人都在讨论”要不要重置”,几乎没人讨论”重置的操作细节”。一个 2 小时的复杂重构任务,中间重置上下文时,结构化状态摘要该包含什么?包含太多就成了另一种形式的压缩(把噪音也带过去),包含太少就丢了关键上下文。这个”多少刚好”的判断,目前完全没有经验数据,每个团队都在盲人摸象


三、落地路径

[判断] 你的存量代码库里,Agent 最适合从哪个模块切入?

决策场景:决定 brownfield 项目的 Agent 试点模块 方��论:JTBD + 预验尸 问题背后的问题:所有公开案例几乎全是 greenfield,Stripe 是唯一的 brownfield 案例但方案成本极高。你需要自己回答一个没人替你回答过的问题:在你的代码库里,哪个模块同时满足”测试覆盖够高(Agent 犯错有安全网)”、“模块边界够清晰(上下文可控)”、“变更频率够高(ROI 够快)“这三个条件?更难的判断是:如果没有任何模块同时满足三条,你是先补测试覆盖再接 Agent,还是先接 Agent 再靠 harness 兜底?两条路的风险结构完全不同

[盲区] Harness 本身怎么测试?你怎么知道你的约束规则不是”心理安慰”?

决策场景:决定是否建立 harness 规则的验证机制 方法论:红队思维 + 证据��查 问题背后的问题:行业大量讨论”用 harness 测试 Agent 输出”,但几乎没人讨论”测试 harness 本身”。你加了 20 条 AGENTS.md 规则,Agent 可能根本没读其中 15 条——而你以为它全读了,因为你从来没有验证过。更深的问题是:即便你验证了”Agent 读了这条规则”,你怎么验证”Agent 正确理解了这条规则”?模式匹配和真正理解之间的差距,在当前 LLM 架构下可能是不可弥合的。这意味着 harness 的可靠性可能有一个天花板,而大多数人还没撞到它

[盲区] 谁来清理 Harness 本身的技术债?

决策场景:决定是否为 harness 建立定期维护机制(而不只是给 Agent 生成的代码做垃圾回收) 方法论:红队思维 + 时间���视 问题背后的问题:OpenAI 的 doc-gardening agent 清理 AI 生成代码的熵增,Stripe 用 CI 轮次上限约束债务积累——但这些都是针对 Agent 产出的清理。Harness 自身呢?模型升级后某些约束过时了、代码库演化后某些规则产生冲突了、AGENTS.md 的某些链接指向了已删除的文档——这些”harness 的技术债”由谁来清理?如果答案是”人工不定期检查”,那 harness 越复杂,维护负担越重,直到有一天维护成本超过 harness 带来的价值


四、组织与生态

[争议] Harness 该由 Platform 团队统建还是业务团队自建?

决策场景:决定 harness 的组织归属,影响团队结构和招聘方向 方法论:JTBD + 假设探查 ���题背后的问题:Stripe 走 Platform 路线(Toolshed),OpenAI 走嵌入式路线(3 人自治)。两者都成功了,但隐含的假设完全不同——Stripe 假设 harness 需求可以被抽象为通用基础设施,OpenAI 假设 harness 必须深度嵌入业务上下文。你的团队在这两个假设之间的位置,取决于你的业务线之间有多大的共性。如果三条业务线用同样的技术栈做类似的事,Platform 路线省力;如果每条线的领域知识差异巨大,统建的 harness 会成为”最大公约数陷阱”——看起来什么都支持,实际每条线都觉得不够用

[争议] Agent 执行轨迹到底是调试工具还是战略资产?值得现在就系统性投入吗?

决策场景:决定是否在 harness 中加入结构化轨迹记录层(跨季度基础设施投资) 方法论��时间透视 + 反事实推�� 问题背后的问题:Philipp Schmid 是目前唯一明确主张”轨迹 = 未来微调数据 = 公司壁垒”的人。这是一个信号,不是共识。争议点在于:即使轨迹数据确实有微调价值,你的公司有能力做模型微调吗?如果没有,轨迹数据的”战略价值”对你来说就不存在,它只是调试工具。但如果 3 年后微调成本大幅下降、或者有第三方服务帮你基于轨迹微调……你现在不记,到时候就没有数据。这是一个典型的不对称押注判断:下注成本低但不为零,回报不确定但潜力大

[盲区] 中国技术生态下的 Harness 实践路径跟美国案例有结构性差异吗?

决策场景:决定是否直接照搬美国案例的 harness 设计模式,还是需要做本地化调整 方法论:假设探查 + 边界条件探查 问题背后的问题:findings 明确标注了这个空白——24 个信息源全部来自美国英语圈。但中国团队使用的模型不同(通义千问、DeepSeek vs Claude/GPT)、代码库中英文混合程度不同、合规要求不同、工具链不同。这些差异是”换个 API 就能解决的表面差异”,还是”会导致 harness 架构需要重新设计的结构性差异”?目前没有数据。如果你是中国团队,你的每一个 harness 设计决策其实都在做没有参照物的判断


盲区自检

方法论是否使用备注
证据探查#1, #2, #8
假设探查#1, #2, #4, #10, #12
边界条件探查#4, #6, #12
预验尸#7
第一性原理#3, #5
时间透视#3, #9, #11
反事实推理#11
JTBD#6, #7, #10
红队思维#8, #9
叙事解构#2, #5
动机追问本主题的决策主体多为技术团队而非个人,动机追问适用性低
5 Whys双重筛选后,根因追问类问题因”可直接查证”被过滤
元认知反思属于个人认知层面,不符合业内提问的落地标准
HMW本次调研已有明确方案,不在机会发现阶段
类比迁移findings 中已有 SRE/DevOps/Platform Engineering 类比
100 Harness Engineering 落地执行手册

Harness Engineering 落地执行手册

基于:6 篇工业博客全文 + 3 篇论文 + 7 个项目源码级分析 目标:研发团队 Q2 落地——需求→开发→验收→发布的 agent 自动化 扩展目标:孵化 harness 的 harness、探索非编码领域


快速定位

你的情况从这里开始
团队还没用 agent 写过生产代码→ Phase 0(建验证层)
已有 CLAUDE.md,agent 偶尔写 PR→ Phase 1(建标准化流水线)
Agent 已日常出 PR,想提效提质→ Phase 2(多 Agent 编排)
想让 harness 自己优化自己→ Phase 3(Meta-Harness)

Phase 0:先建验证层,再引入 Agent(Week 1-2,累计 8-12h)

核心原则:Datadog 的最深刻教训——不要先让 agent 写代码再想怎么验证,而是先有验证能力再引入 agent。验证经济学已经倒转:agent 产出代码的速度远超人类审查速度,code review 不再是正确性的来源。

0.1 盘点团队的”隐性知识”(P0 / 2h)

做什么:让每个核心开发者花 30 分钟,写下”新人不知道但老人都知道”的规则。

具体操作

  1. 每人独立列出 10-20 条”我看到这种代码就知道有问题”的规则
  2. 合并去重,按以下分类:
    • 可自动验证的(如”Service 层不能直接调 DAO""API 响应必须包含 error_code”)→ 这些会变成 linter 规则
    • 需要上下文判断的(如”这个模块改动必须考虑并发”)→ 这些会写进 CLAUDE.md
    • 架构级的(如”微服务间通信只用 gRPC”)→ 这些会变成 ADR
  3. 产出一份 隐性知识清单.md,标注每条的分类

为什么先做这个:Harvey 的数据——通用 harness 在专业任务上的成功率只有 2-7%。你们的代码库有自己的规则,不写下来 agent 不可能知道。

⛔ 反模式:让一个人写完所有规则 — 隐性知识分散在不同人脑子里,一个人写会严重遗漏

0.2 写 CLAUDE.md / AGENTS.md(P0 / 2h)

做什么:把隐性知识转化为 agent 可消费的上下文文件。

结构模板

# 项目规则

## 架构约束(不可违反)
- [从隐性知识清单的"架构级"条目提取]
- 例:所有数据库操作必须通过 Repository 层,禁止 Service 直接写 SQL

## 代码规范(agent 必须遵守)
- [从隐性知识清单的"可自动验证"条目提取]
- 例:Controller 方法必须有 @ApiOperation 注解

## 业务上下文(帮助 agent 理解意图)
- [关键业务概念的一句话定义]
- 例:「积分」= 用户通过消费获得的虚拟货币,1 元 = 1 积分,可用于兑换商品

## 常见陷阱(agent 容易犯的错)
- [从以往 agent 使用经验或 code review 高频问题提取]
- 例:不要在 for 循环内发 HTTP 请求,用批量接口

## 测试要求
- 新增功能必须有单元测试
- 修改现有功能必须确认已有测试仍通过
- 测试命令:[具体命令]

关键原则(来自 Theo 在 X 上的分享):

  • 如果信息已经在代码库中(pom.xml、README),不要重复写进 CLAUDE.md——agent 会自己发现
  • CLAUDE.md 专注于纠错:agent 容易犯但代码库里看不出来的规则
  • 保持 ~100 行,做导航不做百科

0.3 建最小验证层(P0 / 4h)

做什么:确保 agent 提交的代码能被自动验证。

验证层分级(参考 Datadog 验证金字塔,按你们的技术栈适配):

层级目标时间内容工具选择
L1 秒级<10s编译 + linter + 格式检查现有的 maven/gradle build + checkstyle/spotbugs
L2 分钟级<3min单元测试 + 关键集成测试JUnit + 你们现有的测试框架
L3 十分钟级<10min全量测试 + 安全扫描CI pipeline(GitHub Actions / Jenkins)

具体操作

  1. 确保 L1 能在本地一条命令跑完(如 ./gradlew check
  2. 确保 L2 能在 CI 中自动触发
  3. 把这些命令写进 CLAUDE.md 的”测试要求”节

为什么 5 秒很重要:Datadog 的 DST 主验证层跑一次只要 5 秒——agent 每次改代码后立即得到反馈。如果你们的验证要跑 10 分钟,agent 就会在等待中做更多不必要的修改(Anthropic 称之为 context anxiety 的变体)。

⛔ 反模式:跳过 Phase 0 直接让 agent 写代码 — Datadog redis-rust 案例:agent 的第一个编译通过的实现就有隐蔽的语义 bug(8x 内存消耗),只有验证层才能捕获

0.4 跑一个端到端验证(P0 / 2h)

做什么:在引入 agent 之前,用人工模拟一次完整的 agent 工作流。

具体操作

  1. 从你们的需求池里选一个小需求(<2h 人工工作量)
  2. 假设你是 agent:只看 CLAUDE.md + 需求描述,不看任何其他上下文
  3. 按 CLAUDE.md 的规则写代码
  4. 跑 L1→L2→L3 验证
  5. 记录:哪些规则缺失导致你”犯错”?验证层哪里没覆盖?

产出:更新 CLAUDE.md + 验证层的具体补丁


Phase 1:单 Agent 标准化流水线(Week 3-4,累计 12-16h)

核心原则:Stripe 的 Blueprint 模式——将工作流拆为确定性节点(bash/测试/git)和 agentic 节点(规划/编码/审查),混合编排。

1.1 选定 Agent 运行时(P0 / 1h 决策)

你们的情况推荐理由
用 Claude CodeClaude Code + custom agents你们已有 skill/agent 生态
想跨工具OpenCodeRamp 选它的原因:server-first,可接多客户端
想要 GUI 管理ArchonYAML 定义 workflow,Web dashboard 可视化

不需要自建 agent。Ramp 用 OpenCode,Stripe fork 了 Goose,Coinbase 从零建——三种路径都走通了。你们团队规模最适合用现成的 agent + 自定义 harness。

1.2 定义标准化 Workflow(P0 / 4h)

做什么:用 Stripe 的 Blueprint 模式,定义从需求到 PR 的标准化流水线。

模板 Workflow

需求输入


[确定性] 解析需求 → 提取关键信息(模块、接口、依赖)


[Agentic] 生成实现方案 → 输出 plan.md


[确定性] 创建 feature branch + worktree


[Agentic] 编码实现(遵循 CLAUDE.md 规则)


[确定性] L1 验证:编译 + lint(<10s)
  │  ├─ 失败 → 返回编码
  │  └─ 通过 ↓

[确定性] L2 验证:单元测试(<3min)
  │  ├─ 失败 → 返回编码(最多 1 次重试)
  │  └─ 通过 ↓

[Agentic] 自审查:检查 plan.md vs 实际实现


[确定性] 提交 + 创建 PR


[确定性] L3 验证:CI 全量测试
  │  ├─ 失败 → Agent 修复(最多 1 次)
  │  │         └─ 仍失败 → 升级人工 ← Stripe 两击规则
  │  └─ 通过 ↓

人工审查 → Merge

关键设计决策

Stripe 两击规则(必须采用):CI 修复失败一次即升级人工。不允许 agent 陷入无限重试循环。Stripe 的原话:“agents are not allowed to waste cycles in infinite retry loops”。

确定性节点 vs Agentic 节点分离(必须采用):Coinbase 的核心架构模式。data-fetch/transform/git 操作是确定性的、可单元测试的;LLM 步骤单独隔离并有 evaluation harness。

1.3 实现 Workflow(P1 / 6h)

如果用 Claude Code

用 custom agent(.claude/agents/dev-workflow.md)定义 workflow:

---
name: dev-workflow
description: 需求→开发→验收标准化流水线
model: opus
tools:
  - Bash
  - Read
  - Write
  - Edit
  - Glob
  - Grep
---

你是研发团队的 coding agent。按以下流水线执行需求:

## 输入
用户会给你一个需求描述。

## 流程

### Step 1: 理解需求
- 读取需求描述,提取:涉及模块、需要修改的文件、依赖关系
- 输出 plan.md 到当前目录

### Step 2: 编码
- 严格遵循项目 CLAUDE.md 中的所有规则
- 每个文件改完后立即运行 lint:[具体命令]
- lint 失败立即修复,不继续下一个文件

### Step 3: 验证
- 运行单元测试:[具体命令]
- 如果失败:分析原因,修复,重跑测试
- 如果第二次仍失败:停止,报告问题给人类

### Step 4: 自审查
- 对比 plan.md 和实际改动
- 检查是否有遗漏的需求点
- 检查是否引入了不必要的改动

### Step 5: 提交
- git add 涉及的文件(不要 git add -A)
- 提交信息格式:feat/fix/refactor: [中文描述]

如果用 Archon

用 YAML 定义等价的 DAG workflow(Archon 的 archon-fix-github-issue.yaml 有 22 节点 10 阶段的完整参考)。优势:可视化 dashboard + 条件分支 + 按节点分配不同模型。

1.4 建立度量基线(P1 / 2h)

做什么:在 agent 开始日常出 PR 之前,记录当前基线。

必须跟踪的指标(Coinbase 的 Turakhia 持续跟踪这些):

指标含义怎么测
Agent 无人干预运行时长Agent 能独立跑多少分钟才需要人介入记录每次 agent session 的无中断时长
Agent PR 合并率提交的 PR 中多少被合并(vs 被关闭/大幅修改)PR 标签统计
两击升级率触发两击规则(CI 修复失败两次)的频率CI log 统计
人工审查耗时审查一个 agent PR 平均花多少分钟手动记录

Phase 2:多 Agent 编排 + 验收自动化(Week 5-8,累计 20-30h)

核心原则:一个 agent 做所有事不如多个专精 agent 协作。但多 Agent 的协调成本是真实的——角色边界必须清晰。

2.1 角色拆分(P0 / 4h)

参考 Anthropic 三角色 + Qoder Experts Mode

角色职责不能做什么
Planner理解需求 → 拆分任务 → 定义每个任务的完成标准不写代码
Coder按 plan 编码,遵循 CLAUDE.md不改 plan,不跳步
Reviewer审查代码 vs plan 的一致性 + 运行测试不直接改代码

关键(来自 Anthropic 的教训):

  • Planner 的产出是带完成标准的 plan,不是模糊的任务列表。Anthropic Sprint 3 有”27 criteria covering the level editor”——每个 sprint 的完成定义精确到这个程度
  • Reviewer 不要用 Claude 开箱即用——Anthropic 自己说”out of the box, Claude is a poor QA agent”,需要多轮校准才能让 Reviewer 的评分与人类判断一致

具体实现

  • 为每个角色创建独立的 .claude/agents/ 文件
  • 每个 agent 有独立的 tool 权限(Coder 有 Write/Edit,Reviewer 只有 Read/Bash)
  • 用主 agent 编排三者的执行顺序

2.2 验收自动化——Harvey 模式(P0 / 8h)

这是你们 Q2 目标的核心:让验收环节从人工审查变成 LLM Judge + rubric 自动评估。

Harvey 的方法

  1. 为每类需求编写评分 rubric(评分标准)
  2. LLM Judge 按 rubric 打分 + 写详细反馈
  3. Agent 读反馈 → 修改 → 重跑评估
  4. 循环直到达标或超过重试上限

实现步骤

Step 1:编写 Rubric 模板

# [需求类型] 验收 Rubric

## 功能完整性(40分)
- [ ] 所有需求点都有对应实现(每个 10 分,遗漏一个扣 10 分)
- [ ] 边界条件处理:空值、超长输入、并发(每个 5 分)

## 代码质量(30分)
- [ ] 遵循项目编码规范(CLAUDE.md 中所有规则)(15 分)
- [ ] 无明显性能问题(N+1 查询、循环内 HTTP 调用等)(10 分)
- [ ] 错误处理完整(5 分)

## 测试覆盖(20分)
- [ ] 新增功能有单元测试(10 分)
- [ ] 测试覆盖核心路径 + 至少 1 个边界条件(10 分)

## 可维护性(10分)
- [ ] 改动范围与需求匹配,无过度工程化(5 分)
- [ ] 关键逻辑有注释或自解释命名(5 分)

## 评分标准
- ≥80 分:自动合并
- 60-79 分:Agent 自修复一轮后重评
- <60 分:升级人工

Step 2:实现 LLM Judge

用一个独立 agent(.claude/agents/judge.md):

  • 输入:需求描述 + PR diff + 测试结果 + Rubric
  • 输出:逐项打分 + 总分 + 详细文字反馈(“哪些做对了,哪些遗漏了,推理哪里有误”)
  • 关键:Judge 用的模型应与 Coder 不同(如 Coder 用 Opus,Judge 用 Sonnet),避免自我偏袒

Step 3:建闭环

Coder 产出 PR


Judge 评分(按 Rubric)

    ├─ ≥80 分 → 自动标记"Ready for Review" → 人工最终确认

    ├─ 60-79 分 → 反馈发回 Coder → Coder 修复 → 重新评分(最多 1 次)
    │                                               └─ 仍 <80 → 升级人工

    └─ <60 分 → 直接升级人工 + 记录失败模式

Harvey 的数据告诉你这有效:基线 40.8% → 优化后 87.7%。关键是 rubric 质量——“当 rubric 质量高时,agent 可以 hill-climb 到惊人的高度”。

2.3 Agent 产出的验证层加强(P1 / 6h)

Phase 0 的验证层是基础。现在加强:

Ramp 的视觉验证(如果你们有前端):

  • 在沙箱中跑完整应用
  • Agent 提交前后各截一张截图
  • 用 LLM 对比两张截图,判断 UI 变化是否符合预期

Coinbase 的确定性 + 概率分离

  • 数据变换逻辑(SQL、数据映射)= 确定性测试(断言输入输出完全匹配)
  • 业务逻辑(决策、规则)= property-based testing(验证性质而非具体值)
  • LLM 产出(文案、描述)= LLM Judge 抽检 + 置信度打分

2.4 发布自动化(P1 / 4h)

做什么:Agent PR 通过验收后,自动触发发布流程。

具体实现

  1. Agent PR 合并到 develop 分支 → 触发 CI
  2. CI 通过 → 自动部署到 staging
  3. staging 跑冒烟测试(确定性,可预定义)
  4. 冒烟通过 → 通知人工确认是否发布到 production
  5. 人工确认 → 自动部署

不要自动发布到 production:Datadog 的原话——“full autonomy is possible here because every property we care about is machine-checkable”。如果你们的 staging 验证不能 100% 覆盖所有关心的性质,就保留人工确认这一步。


Phase 3:Meta-Harness——让 Harness 自己优化自己(Week 9-12)

核心原则:Stanford 的 Meta-Harness 证明了同一个 LLM 换不同 harness 性能差距可达 6 倍。如果自动化 harness 优化本身呢?

3.1 建立 Harness 改进循环(P0 / 8h)

参考 Harvey + auto-harness (NeoSigma)

Step 1:建 Agent 错误日志

每次 agent 犯错(两击升级、Judge 评分 <60、人工审查发现问题),记录:

## [日期] [错误类型]

**需求**:[简述]
**Agent 的做法**:[描述]
**问题**:[具体错误]
**根因**:[为什么犯这个错]
**工程化修复**
- [ ] CLAUDE.md 规则补充:[具体内容]
- [ ] Linter 规则新增:[具体规则]
- [ ] 测试用例补充:[具体测试]
- [ ] Rubric 更新:[具体条目]

这就是 Mitchell Hashimoto 的定义:“每当发现代理犯错时,花时间工程化解决方案防止再次出现。”

Step 2:周期性 Harness 审计

每两周做一次(1h):

  1. 回顾 Agent 错误日志,检查是否有重复模式
  2. 检查 CLAUDE.md 是否膨胀(>100 行需要重构)
  3. 检查 Rubric 是否覆盖了新发现的失败模式
  4. 删除不再需要的 harness 组件——如果模型升级后某类错误消失了,对应的规则就是开销而非价值

3.2 Rubric 自学习(P1 / 8h)

Harvey 模式的进阶:让 Judge 不只是打分,还能提出 Rubric 改进建议。

实现

  1. 每次 Judge 评分后,额外问 Judge:“基于这次评估,Rubric 中是否有遗漏的维度?是否有条目需要调整权重?”
  2. 收集 Judge 的建议,人工审核后更新 Rubric
  3. 记录 Rubric 的版本历史,跟踪每次更新对通过率的影响

长期目标:Harvey 的 agent 自主发明了 stop hooks(预运行验证钩子)——这意味着给足够的循环,agent 可以发现人类没想到的验证策略。

3.3 探索自动化 Harness 搜索(P2 / 探索性)

参考 Stanford Meta-Harness,但要注意其局限性:

可以做的

  • 准备一个 benchmark 集(从历史需求中选 20-30 个有标准答案的任务)
  • 让 agent 在不同 harness 配置下跑同一组任务
  • 对比结果,找到最优配置
  • 这就是 Meta-Harness 的核心思路,但用人工替代 proposer

暂时不做的

  • 完全自动化的 proposer(成本高——单次搜索数百到数千美元)
  • 让 agent 修改自己的 CLAUDE.md(风险高,先用人工审核)

可以直接用的

  • revfactory/harness:100 个 harness 模板,用其 meta-skill 为你们的领域生成 agent 团队配置。对照实验显示质量提升 60%

Phase 4:非编码领域探索(持续)

核心原则:Harvey 证明 harness engineering 可迁移到非编码领域,但前提是领域满足四个条件。

4.1 评估你们的业务场景

对团队中的非编码重复任务,逐一评估:

任务可评估的交付物?可自动化反馈?可积累的技能?可定义约束?适合度
需求文档撰写✅ 文档质量可打分🟡 LLM Judge✅ 模板化✅ 格式规范
测试用例设计✅ 覆盖率可测✅ 自动化✅ 模式库✅ 规范明确
接口文档生成✅ 完整性可查✅ 自动验证✅ 模板化✅ 规范明确
代码审查🟡 审查质量较主观🟡 需 LLM Judge✅ 审查清单✅ 规范可定义
技术方案评审❌ 难以客观评分❌ 反馈难自动化🟡 部分模板化🟡 约束模糊

4.2 高适合度场景的 Harness 化路径

以”测试用例设计”为例

  1. 定义 Rubric:覆盖率指标 + 边界条件数量 + 等价类划分完整性
  2. 建 Agent:输入需求文档 + 接口定义 → 输出测试用例集
  3. 建验证:跑测试用例 → 统计覆盖率 → LLM Judge 评估边界条件质量
  4. 建闭环:覆盖率 <80% 或 Judge <70 分 → 反馈 → Agent 补充 → 重评

反模式总表

反模式为什么有害正确做法
跳过 Phase 0 直接让 agent 写代码Agent 的第一个编译通过的实现就可能有隐蔽语义 bug(Datadog redis-rust:8x 内存)先建验证层,再引入 agent
CLAUDE.md 写成百科全书>100 行时 agent 的遵循率显著下降,且信息越多上下文衰减越快保持 ~100 行,做导航不做百科
允许 agent 无限重试 CI 修复Agent 会陷入循环,每次产出更多乱改,越修越烂Stripe 两击规则:失败一次即升级人工
一个 agent 做所有事角色混杂导致 agent 在规划和执行之间来回切换,品质下降拆分 Planner/Coder/Reviewer 角色
用同一个模型做 Coder 和 Judge自我评估偏差——自己写的代码自己评分天然偏高Judge 用不同模型或不同 temperature
Harness 只加不减每个组件编码一个关于模型缺陷的假设,模型升级后假设可能不成立,多余的组件变成开销每次模型升级后审计 harness,删除不需要的组件
用 code review 保正确性Agent 产出速度远超人类审查速度,验证经济学已倒转投资自动化验证 > 人工审查
追求完全自主Datadog 的限定:只有”所有关心的性质都可以机器验证”时才能完全去掉人类生产发布保留人工确认
”museum quality”式的模糊提示Anthropic 发现这会导致输出收敛到特定方向,失去多样性用具体的功能/性能标准替代主观描述

阶段策略矩阵

Phase时间投入里程碑关键指标
0: 建验证层Week 1-28-12hCLAUDE.md + 三层验证可用 + 端到端模拟跑通L1 验证 <10s, L2 <3min
1: 单 Agent 流水线Week 3-412-16h标准化 workflow 跑通 + 首批 Agent PR 合并Agent PR 合并率 >50%
2: 多 Agent + 验收Week 5-820-30hPlanner/Coder/Reviewer 三角色 + LLM Judge 验收Judge 评分与人工评分相关性 >0.7
3: Meta-HarnessWeek 9-1216-20hHarness 改进循环运转 + Rubric 自学习两击升级率逐月下降
4: 非编码领域持续按场景首个非编码 harness 跑通该场景的自动化率

Checklist

Phase 0(Week 1-2)

  • 隐性知识盘点完成 — 2h
  • CLAUDE.md 编写完成(<100 行)— 2h
  • L1 验证(编译+lint)<10s 可用 — 1h
  • L2 验证(单元测试)<3min 可用 — 2h
  • L3 验证(CI 全量)可用 — 1h
  • 端到端模拟跑通 — 2h

Phase 1(Week 3-4)

  • Agent 运行时选定并安装 — 1h
  • 标准化 Workflow 定义完成 — 4h
  • dev-workflow agent 实现并测试 — 4h
  • 两击规则写入 workflow — 0.5h
  • 度量基线记录 — 2h
  • 首批 3-5 个 Agent PR 提交并审查 — 2h

Phase 2(Week 5-8)

  • Planner/Coder/Reviewer 三角色 agent 创建 — 4h
  • 验收 Rubric 编写(覆盖主要需求类型)— 4h
  • LLM Judge agent 实现 — 4h
  • Judge 评分与人工评分校准(跑 10 个案例)— 4h
  • 验收闭环跑通(Coder→Judge→修复→重评)— 4h
  • 发布自动化(PR→staging→冒烟→人工确认→prod)— 4h

Phase 3(Week 9-12)

  • Agent 错误日志模板建立 — 1h
  • 首次 Harness 审计完成 — 2h
  • Rubric 自学习机制实现 — 4h
  • Benchmark 集准备(20-30 个历史任务)— 4h
  • 不同 harness 配置对比实验 — 4h
  • revfactory/harness 评估 — 2h

工具速查

场景推荐工具备选
Agent 运行时Claude Code custom agentsOpenCode / Archon
Workflow 编排Claude Code agents 编排Archon YAML DAG
验证/Linting现有 CI + promptfooagnix(399 规则)/ ctxlint
多 Agent 编排Claude Code subagentsOpen SWE / Overstory
LLM Judge独立 Claude agentpromptfoo eval
错误日志Markdown 文件Linear / GitHub Issues
Harness 模板revfactory/harnessharness-kit/Odin
上下文文件 Lintctxlint(drift 检测)agents-lint

信息源

本手册的每个建议都有具体来源:

建议来源
验证经济学倒转Datadog Part 1
两击规则Stripe/MindStudio
确定性+概率节点分离Coinbase
Claude 不擅长 QAAnthropic
Rubric 质量决定优化上限Harvey
CLAUDE.md ~100 行原则GitHub 官方博客 / @daniel_mac8
Harness 组件编码模型缺陷假设Anthropic
16KB 文件大小限制Datadog Part 2
Server-first 选型Ramp/Modal
Meta-Harness 搜索成本Stanford arXiv:2603.28052
证据原始数据 (3 条)