10
CHAPTER 10

Harness 工程

模型不变,改善模型周围的一切

Harness engineering:通过塑造“围绕模型的一切”来提升编码 Agent 的产出,而不是去改模型本身。你固定模型,只动可控的两个杠杆:Agent 拿到的上下文,和它能用的工具(含告诉它“是否做对了”的测试/linter/沙箱)。同一个错误犯第二次,不是写更长的提示,而是改 Harness 让这个错误变得不太可能发生、或在被人看到之前就能被捕获。

前馈
指令 / Guides
告诉 Agent 否则会猜错的东西:AGENTS.md、CLAUDE.md、skills、规范、架构说明。
行动
工具 Tools
让 Agent 作用于真实系统:CLI、MCP、浏览器、模拟器、数据库访问。
反馈
传感器 Sensors
告诉 Agent 对不对:测试、类型检查、linter、结构测试、审查 Agent。
环境
Environment
干净可复现的工作区:worktree、容器、setup 脚本、初始化数据库、独立端口。
护栏
Guardrails
限制一次运行能造成的破坏:沙箱、审批模式、网络规则、密钥处理。
观测
Observability
看清发生了什么、花了多少:日志、转录、trace、用量与成本。
Inner Harness(内置)
  • 每个 Agent 自带:系统提示、代码检索方式、你无法控制的 Agent Loop
  • Claude Code / Codex / OpenCode 本身就是一个 Harness
Outer Harness(你搭的)
  • 为你的代码库而建,对所有 Agent 通用、保持 Agent 中立
  • AGENTS.md、skills、测试、setup 脚本——一处写好,处处复用
OpenAI“零手写代码”实验带来的三条经验
  • 让仓库教会 Agent:藏在人脑或聊天记录里的知识对 Agent 等于不存在——把约定、架构决策、“我们之所以不这么做是因为那次事故”写进仓库、贴近代码
  • 把品味变成检查:偏好一次性固化(用共享工具包而非到处手搓、边界处校验而非臆测数据结构),并强制应用于每次改动
  • 持续清理垃圾:后台任务扫描漂移、更新质量分级、开小的重构 PR(多数一分钟内可评审),每天还债胜过痛苦的集中大重构
上手清单
① 记录 Agent 反复犯错的清单,每次重复都当作一个 Harness bug;② 把 build/test/lint 命令和“能证明改动有效的那一条命令”放最显眼处;③ 每纠正过两次的约定就加一条 linter 规则或结构测试;④ 用 setup 脚本让新 worktree 开箱即用;⑤ 给人工自检用的工具(浏览器、日志、staging)也给它;⑥ 加一个审查 Agent 作为“先于人类”的传感器;⑦ 跟踪每个合入改动的成本与耗时,判断 Harness 改动是否真的有用。