编码 Agent Harness Engineering 最佳实践

0 阅读16分钟

这是群里老姚发起的话题,我让 opus爆肝了一下午写出来的文章,看了一下质量很高,就没有再润色加工,不是什么权威论述,只是希望这篇综述似的最佳实践能给大家节约一些时间


摘要

Harness Engineering 指的是:coding agent = AI model(s) + harness

这里的 harness 不是单一工具,而是围绕编码 Agent 构建的配置层与运行时环境,通常包括指令文件、工具/MCP、Skills、Sub-agents、Hooks、反压机制等。

它的目标不是“让模型更聪明”,而是通过工程化手段减少错误、提升可验证性、控制上下文消耗,并把正确行为变成默认行为。

HumanLayer 的表述是:Harness Engineering 描述的是利用这些配置点来定制和改进编码 Agent 输出质量和可靠性的实践。

Mitchell Hashimoto 的表述是:任何时候你发现 agent 犯了一个错误,你都应该花时间设计一个解决方案,使 agent 不会再犯同样的错误。

image.png

核心发现表

#主题核心发现
1Harness 定义coding agent = AI model(s) + harness,重点在配置层与运行时环境。
2指令文件命令优先、完成定义、任务组织、升级规则、短小精悍最有效。
3信息披露不要一次塞满上下文;把 AGENTS.md 做成目录,Skills 按需加载。
4Sub-agents最重要价值是上下文隔离,而不是简单角色分工。
5Hooks用于通知、审批、集成、验证;它们是确定性控制流。
6反压机制验证能力越强,Agent 越容易成功;成功输出必须尽量静默。
7长期运行 HarnessInitializer + Coding Agent 的双阶段方案更适合长任务。
8工作模式One-Shot、Plan、Spec-Driven、Multi-Agent 需要分级使用。
9项目脚手架高代码健康度与“Code SEO”会显著提升 Agent 效能。
10执行流水线任务设计与上下文汇编往往比模型本身更关键。
11质量控制需要三层审查、工具兼容性管理和 MCP 约束。
12反模式散文式规则、模糊指令、过多工具、无验证路径都很危险。
13路线图先基础、再核心、后成熟、最后优化,逐步收敛。
14迁移原则从“写更多代码”转向“构建更可靠的 Harness”。

来源索引

#来源标题日期评级URL
1HumanLayerSkill Issue: Harness Engineering for Coding Agents2026-03⭐⭐⭐www.humanlayer.dev/blog/skill-…
2AnthropicEffective Harnesses for Long-Running Agents2025-11⭐⭐⭐www.anthropic.com/engineering…
3Blake CrosleyAGENTS.md Patterns: What Actually Changes Agent Behavior2026-02⭐⭐⭐blakecrosley.com/blog/agents…
4Vitthal MirjiBuild the harness, not the code2026-02⭐⭐⭐vitthalmirji.com/2026/02/bui…
5Jason RobertPatterns for AI-Assisted Development2026-03⭐⭐jasonrobert.dev/blog/2026-0…
6OpenAIHarness Engineering: Leveraging Codex2026-02⭐⭐无公开 URL
7vibecoding.appAGENTS.md Complete Guide2026-03⭐⭐vibecoding.app/blog/agents…
8builder.ioImprove your AI code output with AGENTS.md2025-09⭐⭐www.builder.io/blog/agents…
9ClaudeTabCLAUDE.md vs AGENTS.md 完整指南2026-03-26⭐⭐⭐claudelab.net/en/articles…
10Vibe CodingAGENTS.md Guide2026-03-12⭐⭐vibecoding.app/blog/agents…
11MarmelabAgent Experience: 40+ Best Practices2026-01-21⭐⭐⭐marmelab.com/blog/2026/0…
12CodeSceneAgentic AI Coding Best Practice Patterns2026-02-20⭐⭐⭐codescene.com/blog/agenti…
13CodegenHow to Build Agentic Coding Workflows2026-03-10⭐⭐codegen.com/blog/how-to…
14AI HeroA Complete Guide to AGENTS.md2026-01-18⭐⭐www.aihero.dev/a-complete-…

第一章:核心概念 — 什么是 Harness Engineering

定义

核心定义是:coding agent = AI model(s) + harness

Harness 是围绕 AI 编码 Agent 构建的配置层和运行时环境。它负责把模型能力、工具调用、流程约束、上下文结构和验证机制组织成一个可控系统。

为什么重要

Harness Engineering 的关注点不是单纯增加模型参数或更换模型,而是通过工程设计改变 Agent 的行为边界:

  • 让正确动作更容易发生。
  • 让错误更难重复发生。
  • 让验证更便宜。
  • 让上下文更聚焦。

关键引述

HumanLayer:Harness Engineering 描述的是利用这些配置点来定制和改进编码 Agent 输出质量和可靠性的实践。

Mitchell Hashimoto:任何时候你发现 agent 犯了一个错误,你都应该花时间设计一个解决方案,使 agent 不会再犯同样的错误。

结论

Harness Engineering 的本质是把经验教训产品化、系统化,并通过工具链固化成默认行为。

第二章:指令文件最佳实践(AGENTS.md / CLAUDE.md)

ETH Zurich 研究结论

研究给出的信号很直接:

  • LLM 自动生成的 agentfile 反而降低性能,同时增加 20%+ 成本。
  • 人类编写的 agentfile 仅改善约 4%。
  • Agent 处理指令文件时多花 14-22% reasoning tokens,并引入更多步骤和工具调用。
  • 代码库概述和目录列表完全无用;Agent 自己能探索仓库结构。

什么有效 ✅

1. 命令优先(Command-first)

每条指令都应落到可执行命令。

## Build and Test Commands
- Install: `pip install -r requirements.txt`
- Lint: `ruff check . --fix`
- Test: `pytest -v --tb=short`
- Full verify: `ruff check . && ruff format --check . && pytest -v`

2. 定义“完成”(Closure definitions)

任务完成必须可验证。

## Definition of Done
A task is complete when ALL of the following pass:
1. `ruff check .` exits 0
2. `pytest -v` exits 0 with no failures
3. `mypy app/ --strict` exits 0

3. 按任务组织(Task-organized)

让规则跟任务类型绑定,而不是把所有规则堆在一起。

## When Writing Code
- Run `ruff check .` after every file change

## When Reviewing Code
- Check for security issues: `bandit -r app/`

## When Releasing
- Run full suite: `pytest -v && ruff check . && mypy app/`

4. 升级规则(Escalation rules)

告诉 Agent 卡住时该怎么办。

## When Blocked
- If tests fail after 3 attempts: stop and report
- Never: delete files to resolve errors, force push, or skip tests

5. 保持简短

短文件更有效:

  • 单个 section < 50 行。
  • 整个文件 < 150 行。
  • HumanLayer 的 CLAUDE.md 只有 60 行以下。

什么无效 ❌

  • 散文段落:例如“我们重视整洁、经过良好测试的代码……”这类内容通常会被忽略。
  • 模糊指令:例如“尽量小心”“在可能时”“优雅地处理”。
  • 矛盾的优先级:没有显式排序的多个约束会让 Agent 无法决策。
  • 无法验证的风格指南:没有 lint 命令支撑的风格要求很难落实。

编写优先级

  1. 构建和测试命令。
  2. “完成”定义。
  3. 升级规则。
  4. 按任务组织的 sections。
  5. 目录作用域(仅 monorepo)。

AGENTS.md vs CLAUDE.md 对比表

维度AGENTS.mdCLAUDE.md
目标面向多工具/多 Agent 的通用指令入口Claude Code 的独立指令格式
作用方式原生支持,适合跨工具协作Claude Code 原生格式,独立于 AGENTS.md
推荐形态作为目录与索引,连接更细的文档保持简短,强调可执行规则
典型内容构建、测试、完成定义、升级规则工作流规则、约束、验证命令
最佳实践按作用域拆分,monorepo 可多文件文件更短、更聚焦,避免堆积说明

第三章:渐进式信息披露

核心原则

不要把所有知识一次性塞进上下文窗口。

AGENTS.md 作为目录而非百科全书

OpenAI 仓库使用 88 个独立的 AGENTS.md 文件:通常是 monorepo 中每个服务/包一个文件。

Root AGENTS.md 约 100 行,只做索引,详细内容放在 docs/ 子目录。

Skills 机制

Skills 也体现渐进式披露:

  • 只有当 Agent 决定需要时才加载。
  • 每个 Skill 有自己的目录,可捆绑多个 markdown 文件。
  • 主 SKILL.md 负责告诉 Agent 目录里有什么,以及何时读取。

结论

最优做法不是“给更多”,而是“给得更晚、更准、更少”。

第四章:Sub-agents — 上下文防火墙

核心洞察

Sub-agents 的价值主要不是角色分工,而是上下文隔离。

HumanLayer 观察到:“前端工程师”sub-agent 和“后端工程师”sub-agent 这种角色化切法不起作用。

有效用途 ✅

  • 定位代码库中的特定定义或实现。
  • 分析代码库以识别特定工作的模式。
  • 追踪信息在服务边界间的流动。
  • 通用代码、文档、Web 研究任务。

无效用途 ❌

  • 仅按职位名称切分,期待自动协作。
  • 把子 Agent 当作“更小的主 Agent”来复制完整上下文。
  • 在父线程中保留过多中间搜索与推理过程。

上下文防火墙

上下文防火墙的关键是:

  • 父 Agent 只看到 sub-agent 的 prompt 和最终结果。
  • 中间工具调用、搜索结果不会污染父线程。
  • 主线程留在“智能区域”(Smart Zone)。
  • 返回结果应极度精炼,同时附带 filepath:line 引用。

成本控制

  • 父线程使用昂贵模型负责规划与编排。
  • Sub-agents 使用更便宜模型处理具体任务。

结论

Sub-agents 不是为了“拆人设”,而是为了“拆上下文”。

第五章:Hooks — 确定性控制流

核心原则

CLAUDE.md 的规则是建议,Hook 是强制执行。

四种用途

  1. 通知:任务完成时播放声音或发送 Slack 消息。
  2. 审批:自动批准或拒绝工具调用,例如阻止运行 migration。
  3. 集成:创建 GitHub PR、设置预览环境。
  4. 验证:每次 Agent 停止时运行 typecheck + lint,有错误则强制继续修复。

静默成功 / 显性失败

最关键模式是:

  • 成功时 hook 完全静默,不消耗上下文。
  • 失败时只输出错误信息。
  • exit code 2 告诉 harness 重新启动 Agent 修复问题。

结论

Hooks 把原本“可建议”的行为变成“可执行、可阻断、可重试”的控制流。

第六章:反压机制

核心判断

Agent 成功解决问题的可能性,与其验证自身工作的能力强相关。

验证机制类型

  • Typecheck + build。
  • 单元测试 / 集成测试。
  • 代码覆盖率报告。
  • UI 交互测试(Playwright, agent-browser)。

输出精简的教训

早期运行完整测试套件会产生 4000 行通过结果,淹没上下文,导致 Agent 丢失任务。

因此现在的做法是:

  • 吞掉成功输出,只显示错误。
  • 构建成功时静默,失败时详细输出。

结论

反压机制的目标是让验证信息足够、但不淹没主任务。

第七章:长期运行 Agent 的 Harness(Anthropic 官方)

两部分解决方案

1. Initializer Agent

首次运行时设置环境,包括:

  • 创建 init.sh 脚本。
  • 创建 claude-progress.txt 进度日志。
  • 创建初始 git commit。
  • 生成全面的功能需求列表(JSON 格式)。

2. Coding Agent

每次后续运行做增量进度,包括:

  • 读取 git log 和 progress file 了解当前状态。
  • 一次只做一个功能。
  • 用 git commit 记录进度。
  • 用浏览器自动化工具做端到端测试。
  • 离开时确保代码处于“干净状态”。

关键模式

  • 功能列表用 JSON 而不是 Markdown,减少 Agent 不当修改。
  • 每次会话开始:pwd → 读 git log → 读 progress → 读 feature list → 选择下一个任务。
  • 增量工作,每次只做一个功能。

结论

长期运行场景下,Harness 需要把“初始化”和“持续推进”分开。

第八章:工作模式分级

4 模式表

模式时间适用场景
One-Shot~1 min明确的小改动
Plan Mode~2-3 min多文件变更,先看方案
Spec-Driven~5-10 min中大型任务,团队需可审查的计划
Multi-Agent~10-30 min大型功能,复杂代码库,质量门控

Spec-Driven 细节

  • 生成代码前先生成 markdown 规格文件。
  • 规格文件签入仓库并 code review。
  • 结构化规格帮助模型和人类同样多。

Multi-Agent 评审循环

  • Architect Agent → Content Reviewer(打分 0-100) → 低于 90 则返回修改 → Readability Reviewer。
  • 评审循环通常 2-3 次,复杂情况可达 5-6 次。

结论

工作模式不是单一选择,而是按任务复杂度分层。

第九章:Agent 友好的项目脚手架

代码健康度研究

CodeScene 的研究显示:

  • Agent 在代码健康度 ≥ 9.5/10 的代码上表现非线性提升。
  • 健康度 7.0 时,准确度约 60%,且 token 消耗较高。
  • 健康度 9.5+ 时,准确度约 95%,效率更高。

结论是:先改善代码质量,再引入 Agent。

Code SEO

Marmelab 给出的“代码 SEO”原则是让 Agent 更容易搜索:

  • 使用同义词注释:客户 = 用户 = 账户。
  • 避免重复文件名:多个 index.ts 会混淆 Agent。
  • 完整词优于缩写:userProfile 优于 usr_prof
  • 文件和类添加标签注释。
// [feature:user-management] [domain:account] [pattern:service-layer]
// Related: src/repos/UserRepository.ts, src/tests/user.test.ts

8 大 Agent 友好模式

  1. 域知识嵌入代码:AGENTS.md + 代码注释 + 文件夹级 README。
  2. 代码 SEO:同义词、一致命名、标签。
  3. 简洁性:函数 < 100 行,文件 < 300 行。
  4. 偶然发现:交叉引用、标签、内嵌文档。
  5. 可测试性:TDD、覆盖率 ≥ 80%、mock 隔离。
  6. 遵循约定:成熟框架、设计模式、ADR。
  7. 防护栏:Hooks、MCP safeguards、CI 检查。
  8. 使用说明:工作示例、Context7 MCP、合理默认值。

结论

脚手架不是“让项目更漂亮”,而是让 Agent 更容易理解、定位与验证。

第十章:执行流水线与任务设计

Codegen 5 层架构

1️⃣ 任务输入(结构化的 Agent-Ready 任务)
   ↓
2️⃣ 上下文汇编(从 Linear/GitHub Issues 抽取)
   → 接受标准 + 关联文档 + 冲刺背景
   ↓
3️⃣ 沙箱执行(完全隔离)
   → Agent 读全代码库,生成提交和 PR
   ↓
4️⃣ PR 输出(自动化 + 人工审查)
   → AI 审查 FIRST → 人工审查
   ↓
5️⃣ 反馈循环
   → 审查问题追踪到原始任务 → 更新规范

Codegen 的判断是:80% 的 agentic 工作流失败发生在第 1-2 层,也就是任务设计和上下文,而不是 Agent 本身。

Agent-Ready 任务的 4 部分结构

  1. 清晰的成功定义,而不是只写“构建什么”。
  2. 显式的作用域:哪些文件、哪些禁区。
  3. Agent 无法从代码推断的约束。
  4. 相关背景:设计文档、示例实现、相关工单。

对比示例

差 ❌好 ✅
给用户列表添加分页/api/users 添加基于游标的分页。页大小:25。参考 /api/orders 模式。不要修改认证中间件。验证: GET /api/users?cursor=X 返回 25 个用户和 next_cursor。

结论

任务设计越结构化,Agent 越少走弯路。

第十一章:质量控制

代码审查三层防护

1️⃣ 实时审查(生成时)→ Code Health MCP
2️⃣ 提交前审查(本地)→ pre_commit_code_health_safeguard
3️⃣ PR 预检查(分支 vs 基线)→ analyze_change_set

跨工具兼容性矩阵

工具原生文件读取 AGENTS.md?
Codex CLIAGENTS.md原生支持
Cursor.cursor/rules原生支持
GitHub Copilot.github/copilot-instructions.md原生支持
Windsurf.windsurfrules原生支持
Claude CodeCLAUDE.md否(独立格式)
OpenCodeAGENTS.md原生支持
Gemini CLIGEMINI.md可配置
AiderCONVENTIONS.md需手动 flag

MCP 工具注意事项

  • 工具过多会填满上下文,加速进入“愚蠢区域”。
  • 如果 CLI 已在训练数据中有良好覆盖,直接用 CLI 比 MCP 更好。
  • 例如 GitHub、Docker、数据库:优先用 CLI + grep/jq,而不是 MCP。
  • HumanLayer 的实践是:Linear MCP 替换为自定义 CLI + 6 个示例用法,从而节省数千 tokens 的工具定义。

结论

质量控制不是后置检查,而是贯穿生成、提交、PR 的三层护栏。

第十二章:反模式集合

AGENTS.md 反模式

1. 散文式描述

  • 问题:可读但不可执行,Agent 容易忽略。
  • 修复:改成命令、条件、退出标准。

2. 模糊词汇

  • 问题:“尽量”“优雅地”“必要时”无法形成决策。
  • 修复:改成明确命令与阈值。

3. 矛盾约束

  • 问题:多个要求没有优先级时,Agent 无法判断。
  • 修复:写出排序。

4. 无法验证的风格要求

  • 问题:没有 lint/test 支持,规则落不了地。
  • 修复:把风格要求绑定到检查命令。

5. 过长文件

  • 问题:section 太长会增加阅读成本。
  • 修复:保持短小,分文件、分作用域。

6. 把百科全书塞进单文件

  • 问题:信息过载,降低有效 token 密度。
  • 修复:AGENTS.md 只做索引,详细内容下沉到文档。

工作流反模式

1. 只按“角色”切 Sub-agent

  • 问题:角色名不能解决上下文污染。
  • 修复:按具体信息任务拆分。

2. Hook 里输出大量成功日志

  • 问题:成功信息占满上下文。
  • 修复:成功静默,失败才输出。

3. 测试通过输出淹没上下文

  • 问题:4000 行成功输出会丢失主任务。
  • 修复:吞掉成功输出,只保留错误。

结论

反模式的共同点是:它们都让 Agent 更难做出确定、可验证的动作。

第十三章:实施路线图

周 0:基础

  • 用一句话描述项目目的。
  • 列出非标准构建/typecheck 命令。
  • 记录 3-5 个 Agent 最常犯的错误。

周 1:核心

  • 添加“做”和“不做”(具体示例)。
  • 添加文件级命令(typecheck、lint、test 单文件)。
  • 定义“完成”(显式退出码)。
  • 添加 1-2 个参考实现示例。

周 2-4:成熟

  • 按任务类型组织(编码、审查、发布)。
  • 添加升级路径。
  • 设置代码健康度检查(MCP)。
  • 可选:单体库嵌套 AGENTS.md。

第 1 个月:优化

  • 测量 PR 质量。
  • 反馈循环:差 PR → 更新任务规范。
  • 裁剪 AGENTS.md(删除被忽视的规则)。
  • 按作用域拆分为多文件。

结论

实施应当渐进推进:先让规则可执行,再让规则可维护,最后让规则可扩展。

附录 A:核心参考 URL

  1. www.humanlayer.dev/blog/skill-…
  2. www.anthropic.com/engineering…
  3. blakecrosley.com/blog/agents…
  4. vitthalmirji.com/2026/02/bui…
  5. jasonrobert.dev/blog/2026-0…
  6. 无公开 URL
  7. vibecoding.app/blog/agents…
  8. www.builder.io/blog/agents…
  9. claudelab.net/en/articles…
  10. vibecoding.app/blog/agents…
  11. marmelab.com/blog/2026/0…
  12. codescene.com/blog/agenti…
  13. codegen.com/blog/how-to…
  14. www.aihero.dev/a-complete-…

附录 B:术语表

Harness

围绕 AI 编码 Agent 的配置层与运行时环境,包括指令文件、工具/MCP、Skills、Sub-agents、Hooks、反压机制等。

AGENTS.md

用于给 Agent 提供可执行规则和目录索引的指令文件格式。

Progressive Disclosure

渐进式信息披露;把信息分层按需提供,而不是一次性灌入上下文。

Sub-agent

用于处理局部任务、并通过隔离上下文来控制污染的辅助 Agent。

Context Firewall

一种让父线程只接收精炼结果、隔离中间过程的上下文防火墙机制。

Hook

在特定事件上强制执行动作的确定性控制流机制。

Back-Pressure

通过验证与输出压缩来防止上下文被成功结果或噪声淹没的机制。

Smart Zone

父 Agent 保持专注与推理质量的上下文区域。

Spec-Driven Development

先写规格,再生成代码,并把规格纳入审查与版本控制的开发方式。

MCP

模型上下文协议相关工具接口;在本报告中强调工具数量、描述长度与上下文成本。

Agent-Ready Task

对 Agent 友好的任务描述,应包含成功定义、作用域、约束和背景。

Code Health

代码健康度;反映代码库结构、可读性和可维护性的指标。

Code SEO

让代码更容易被 Agent 搜索、理解与定位的一组命名、注释和结构策略。

One-Shot

适合一次性完成的小任务模式。

Plan Mode

先产出计划,再执行的中等复杂度模式。

Multi-Agent

多个专用 Agent 协同或串联完成复杂任务的模式。

Initializer Agent

长期运行场景中负责首次环境设置和初始化工件的 Agent。

Coding Agent

负责后续增量编码与推进的执行型 Agent。

Definition of Done

对“任务完成”的可验证定义,通常由命令退出码和测试结果构成。