返回 FEED
AGENT2026-06-17

Agent Harness 工程:从单 Agent 到自进化系统的 14 步路线图

所有人都在讨论 Loop 工程,却几乎没人讨论 Loop 跑在什么上面。

0xCodez 指出一个残酷现实:90% 的 Claude Code 用户运行在默认 Harness 上——没有规则、没有子 Agent、没有 Hook、没有记忆。然后他们奇怪为什么 Loop 产出的全是垃圾。

真相很简单:Loop 的质量取决于它下面的 Harness。这篇文章给出了从单 Agent 到自进化系统的 14 步路线图。


什么是 Harness?

剥去术语,Harness 就是 Agent 运行的环境,由四个要素构成:

  • 模型:负责思考
  • 工具:Agent 能调用的能力
  • 权限:对工具的限制
  • 上下文:每次运行开始时读取的信息

其他一切——子 Agent、Hook、记忆——都是对这四种要素的塑形方式。

同一个模型,不同的 Harness,完全是两个 Agent。


三层架构:Harness、Loop、系统

大多数"我的 Agent 设置一团糟"的问题,根源是混淆了三个层级:

层级定义关键操作
Harness单个 Agent 的运行环境静态配置:模型、工具、权限、上下文
Loop定时触发 Agent,生成辅助任务在 Harness 之上运行
自进化系统Loop + 可累积的记忆每次运行让下一次更精准

实用原则:事实放上下文, enforcement 放 Hook,流程放 Skill,隔离放子 Agent。把 enforcement 写进 CLAUDE.md、把流程塞进上下文——这是 Agent 不稳定且昂贵的根本原因。


14 步路线图

第一层:夯实基础(步骤 1-9)

步骤 1:理解 Harness 的本质

Agent 本质上是一个 while True 循环:选工具 → 执行 → 看结果 → 决定下一步。Harness 定义了有哪些工具、允许做什么、启动时知道什么。

步骤 2:.claude/ 目录——Harness 的全部

所有配置集中在一个目录:

.claude/
├─ CLAUDE.md          # 每次会话读取的常驻知识
├─ settings.json      # 权限、模型、Hook
├─ .mcp.json          # 外部工具连接
├─ rules/             # 路径级行为规则
├─ agents/            # 子 Agent 定义
├─ skills/            # 可复用流程
└─ agent-memory/      # 跨会话记忆

关键原则:保持小到能解释每个文件的存在理由。解释不清的,删掉。

步骤 3:区分 Harness、Loop、系统

三个层级不能混。Harness 是静态配置,Loop 是定时运行层,自进化系统是带累积记忆的 Loop。

步骤 4:认清默认 Harness 的局限

安装 Claude Code 打开文件夹,你已有 Harness——只是一个空壳。有模型、有内置工具、有审批提示,但没有项目上下文、没有自定义子 Agent、没有记忆。

一次性任务够用。重复任务会让 Agent 每次从头推导项目,为安全操作反复申请权限,关闭终端后忘光一切。

步骤 5:CLAUDE.md——常驻事实,保持精简

CLAUDE.md 是 Agent 每次会话的常驻知识:项目约定、架构规则、"那次事故后我们不再这样做"。

最常见错误:让它膨胀成巨型流程文档,拖垮每次会话。

实操规则:主记忆文件控制在约 500 tokens。常驻事实放这里,多步流程放 Skill(步骤 8),路径专属规则放 rules/ 文件。如果 CLAUDE.md 的某段变成了流程而非事实,移到别处。

步骤 6:settings.json——权限与模型,一次设定

默认 Harness 对每个风险操作都询问。你在旁边看着时这是对的,无人值守时这是错的。

settings.json 预批准安全操作、拒绝危险操作、选择运行模型。

判断标准:如果搞错了,恢复成本多高?低成本 → 自动批准;高成本(force-push、删文件、碰密钥)→ 始终拒绝或提示;中间地带可以自动批准但记录日志。

步骤 7:子 Agent——隔离脏活

子 Agent 是从主会话启动的独立 Claude 会话,有自己的上下文窗口和工具列表。目的不是并行本身,而是把噪音隔离出主上下文

读 40 个文件的研究任务、需要新视角的审查、产生满屏日志的评估运行——这些该放进子 Agent,避免污染主线程。

最有价值的子 Agent 是审查者:模型审查自己的输出会手下留情,独立审查者用全新上下文窗口能抓住主 Agent 自我说服时遗漏的问题。这是 Writer-Checker 分离,让 Loop 产出的每一轮都可信赖。

步骤 8:Skill——可复用流程

Skill 是 SKILL.md 文件,通过 /skill-name 调用或任务匹配时自动触发。与子 Agent 不同,它在同一上下文窗口运行,只是可复用的指令。

创建信号:发现自己在每次新对话中粘贴相同指令。PR 检查清单、评估流程、发布流程——写一次,永久调用。

Skill 是 Harness 随时间进化的核心机制:每次流程以新方式失败,把教训加入 Skill,下一次运行继承它。

步骤 9:Hook——模型无法幻觉的确定性规则

之前的一切依赖模型"理解"指令。Hook 不依赖理解。

Hook 是在 Agent 生命周期固定点触发的 shell 命令——工具运行前、文件变更后、会话结束时——其退出码可以阻断操作。Hook 是 enforcement,CLAUDE.md 是建议。

几乎每个 Harness 都值得配置的两个 Hook:

  • PreToolUse 网关:确定性阻断危险命令(rm -rf、读取 .env、push 到 main)。退出码 2 在命令执行前停止调用,模型无法说服它放行。
  • PostToolUse 格式化器:每次编辑后自动运行 linter/formatter。Agent 永远不会提交未格式化代码,因为 Harness 自动处理。

Hook 用于"必须发生或绝不能发生"的事——安全、格式化、审计日志。不用于判断性决策,那是模型的事。好的 Harness 有一两个锋利的 Hook,不是二十个。


第二层:构建 Loop(步骤 10-11)

步骤 10:添加 Loop——Harness 开始定时运行

配置好的 Harness 仍等你输入。Loop 让它自主运行。Claude Code 的 /loop 是最简单版本——定时重复提示。

配合 /goal,Loop 持续运行直到目标条件达成,由独立评分者而非 Agent 自我评分来判断"完成"。

关键洞察:Loop 没有增加智能。它复用了 Harness 中的一切——规则、审查子 Agent、安全 Hook。好的 Harness 让 Loop 变得 trivial。这就是先打基础的全部意义。

步骤 11:动态工作流——Harness 自己写编排逻辑

对于太复杂而无法用单 Loop 处理的任务——大规模并行、高度结构化、对抗性验证——Claude 可以即时生成自己的 JavaScript 编排逻辑。

动态工作流用 agent() 生成、parallel() 发散、pipeline() 流转。它将 Harness 中定义的子 Agent 组合成"发散-综合"或"对抗验证"等模式。

关键联系:动态工作流的质量取决于它能调用的子 Agent 和 Skill。有锋利的审查子 Agent 和完善的评估 Skill,工作流有好材料编排;Harness 是空的,工作流无米下锅。

工作流是指挥,Harness 是乐团。


第三层:实现自进化(步骤 12-14)

步骤 12:添加记忆——Agent 遗忘的,Harness 记住

这是将配置好的 Harness 转变为真正进化系统的关键步骤。Agent 每次运行后忘光一切。Harness 不必如此。

状态文件——agent-memory/ 中的 markdown 文件,或 Linear 看板——记录尝试过的、有效的、失败的、存活下来的规则。

让记忆产生复利效应的三步模式:

  • 写完后才离开:每次运行结束时更新状态文件——教训、验证事实、下一步。
  • 开始时读取:每次运行开始时读取状态文件和相关 Skill,实现"继续"而非"重启"。
  • 提炼为 Skill:当一条教训具有通用性("Windows runner 需要 bash 而非 PowerShell"),它从状态文件"毕业"进入 Skill,应用于所有未来项目。

步骤 13:闭环——输出 → 教训 → Skill → 更好的输出

三个层级在此处锁定为自进化系统:

每次运行产生输出 → 审查子 Agent(步骤 7)检查 → 结果写入记忆(步骤 12)→ 通用教训提炼为 Skill(步骤 8)→ 下一次运行继承更锋利的 Skill 和更丰富的记忆。

模型从未改变。周围的 Harness 变得更锋利。这才是"自进化"的诚实含义——不是模型在学习,而是 Harness 在累积。

步骤 14:发布 Harness——打包、分享、复用

在一个项目上有效的 Harness 是资产。将 Skill、子 Agent、规则打包成插件,整个团队一步安装相同配置——相同约定、相同安全 Hook、相同审查者。

Harness 从个人设置变成共享基础设施。


常见 Harness 错误

  • 运行默认配置:无上下文、无规则、无记忆——Agent 每次从头推导项目
  • CLAUDE.md 膨胀:流程塞进常驻上下文,拖垮每次运行。移到 Skill
  • 用 CLAUDE.md 做 enforcement:模型可以忽略建议,无法忽略退出码 2 的 Hook
  • 单 Agent 既写又评:添加有全新上下文的审查子 Agent
  • 无记忆:每次从零开始。状态文件让明天得以继续
  • 在烂 Harness 上套 Loop:Loop 只是更快地产出垃圾。先打基础
  • Hook 过多:一两个锋利的胜过一堆没人理解的
  • 发布前不扫描:泄露的密钥和过宽权限会传播给每个安装者

结论

Loop 获得荣耀。Harness 承担工作。

Loop 工程是令人兴奋的部分——Agent 自我提示、在你睡觉时运行。但 Loop 只是定时运行的 Harness。

决定产出是好是垃圾的一切,都住在下一层:你选择的模型、允许的工具、编写的上下文、添加的审查者、保留的记忆。

把这一层建好,上面的一切都会产生复利:Loop 复用你的子 Agent,工作流编排你的 Skill,记忆让每次运行比上一次更精准。

自进化从来不是模型的属性。它是你围绕模型构建的 Harness 的属性。

选一个今天还没做的事——可能是审查子 Agent、安全 Hook、或状态文件——加上它。保持 Harness 小到能解释清楚。然后套上 Loop,看着基础替你干活。