所有人都在讨论 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,看着基础替你干活。