Harness 机制与通用 Agent 工作执行系统
0. 问题拆解与结论
Agent 如何通过 Harness,把模型能力变成可控、可验证、可复用的工作执行系统?
这个问题可以拆成三层:
- 架构层:Harness 位于模型与真实工作环境之间,负责上下文、工具、权限、执行、观察、恢复、验证和长期状态。
- 原理层:模型生成意图和动作,Harness 把动作变成受控工具调用,并用证据闭环约束结果。
- 工程层:不同产品把控制重点放在不同位置,Codex 偏工作区执行,Claude Code 偏团队执行链治理,OpenClaw 偏本地多渠道 Gateway,Hermes 偏长期记忆和 Skill 学习。
关键结论
Harness 不是单一权限拦截器。它是 Agent 和真实工作环境之间的控制系统。它让 Agent 能处理代码、文档、合同、数据、浏览器、消息平台、定时任务、企业系统和多工具工作流,同时把每一步变成可审计、可恢复、可复用的执行轨迹。

1. Harness :工程控制系统原理
1.1 Harness 解决的问题
裸模型只能根据输入生成文本或结构化意图。真实工作执行需要进入文件系统、浏览器、命令行、API、数据库、消息平台、文档系统和企业后台。没有 Harness,系统会面临四类工程风险:
| 风险 | 具体表现 | Harness 的控制方式 |
|---|---|---|
| 上下文失真 | 模型看不到关键文件、合同条款、历史消息或工具输出 | Context Builder 选择材料并压缩噪声 |
| 副作用失控 | 删除文件、发送消息、提交代码、调用生产 API | Permission / Sandbox / Approval 限制动作 |
| 执行不可证 | 只给结论,没有命令输出、diff、来源或 trace | Observation 和 Verification 保留证据 |
| 经验不可复用 | 每次任务都从零开始 | Memory 保存事实,Skill 沉淀流程 |
1.2 核心模块
| 模块 | 作用 | 适用任务 |
|---|---|---|
| Context Builder | 决定当前任务需要看哪些材料 | 代码、文档、合同、网页、消息记录 |
| Memory | 保存长期事实、偏好、环境状态 | 个人偏好、团队规则、项目状态、客户上下文 |
| Skill | 保存可复用操作流程 | 合同审查、周报生成、数据分析、代码修复 |
| Tool Adapter | 把外部工具包装成可控能力 | shell、文件、浏览器、MCP、Slack、数据库 |
| Permission / Sandbox | 判断动作能否执行,限制副作用 | 删除、发送、提交、修改、联网、调用 API |
| Execution | 执行工具调用 | 运行命令、读写文件、浏览网页、发消息 |
| Observation | 收集输出、日志、错误、结果 | 测试结果、审查结论、API 返回、工具日志 |
| Recovery | 失败重试、降级、请求人工介入 | 工具失败、权限不足、上下文缺失 |
| Verification | 证明任务完成 | 测试、diff、来源证据、审核记录、trace |
1.3 执行循环
Harness 的执行循环不是“模型思考一次然后执行一次”,而是持续的控制闭环:
- 用户目标进入系统。
- Harness 组装 Context。
- Agent 基于 Context 生成动作。
- Harness 检查权限和风险。
- Tool Adapter 执行工具。
- Observation 收集结果。
- Recovery 处理失败。
- Verification 验证完成。
- Memory / Skill 记录可复用经验。
%%{init: {"theme":"base","themeVariables":{"background":"#f8fafc","fontFamily":"Arial","lineColor":"#334155"}}}%%
flowchart TD
Title("通用 Harness 执行循环<br/>模型能力 → 受控工作执行"):::title
subgraph Stage1["🎯 阶段1 任务与上下文"]
Goal("用户目标<br/>代码/文档/合同/数据/消息"):::start
Context("Context Builder<br/>选择材料与压缩噪声"):::process
Memory("Memory<br/>长期事实与偏好"):::storage
Skill("Skill<br/>可复用流程"):::storage
end
subgraph Stage2["🧭 阶段2 动作与权限"]
Action("Agent 动作<br/>计划/工具调用/参数"):::process
Permission("Permission / Sandbox<br/>审批与副作用边界"):::decision
Blocked("阻断或请求人工介入"):::failure
end
subgraph Stage3["⚙️ 阶段3 执行与观察"]
Adapter("Tool Adapter<br/>shell/文件/浏览器/MCP/API"):::process
Execution("Execution<br/>执行工具调用"):::process
Observation("Observation<br/>输出/日志/错误/结果"):::process
end
subgraph Stage4["✅ 阶段4 恢复与验证"]
Recovery("Recovery<br/>重试/降级/补上下文"):::failure
Verification("Verification<br/>测试/diff/来源/trace"):::success
Update("Memory / Skill 更新<br/>沉淀经验"):::success
end
Title --> Goal
Goal --> Context
Memory -. "长期事实" .-> Context
Skill -. "流程模板" .-> Action
Context --> Action
Action --> Permission
Permission -- "允许" --> Adapter
Permission -- "高风险/越权" --> Blocked
Blocked --> Recovery
Adapter --> Execution
Execution --> Observation
Observation --> Verification
Verification -- "未通过" --> Recovery
Recovery --> Context
Verification -- "通过" --> Update
Update -. "复用经验" .-> Memory
Update -. "改进流程" .-> Skill
classDef title fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef start fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef process fill:#dbeafe,stroke:#2563eb,color:#0f172a,rx:10,ry:10;
classDef storage fill:#ffe4e6,stroke:#e11d48,color:#0f172a,rx:10,ry:10;
classDef decision fill:#ffffff,stroke:#64748b,color:#0f172a,rx:10,ry:10;
classDef success fill:#dcfce7,stroke:#16a34a,color:#0f172a,rx:10,ry:10;
classDef failure fill:#fee2e2,stroke:#dc2626,color:#0f172a,rx:10,ry:10;
style Stage1 fill:#eef6ff,stroke:#1e3a8a,stroke-dasharray:5 5
style Stage2 fill:#fff7ed,stroke:#9a3412,stroke-dasharray:5 5
style Stage3 fill:#f0fdf4,stroke:#166534,stroke-dasharray:5 5
style Stage4 fill:#fdf2f8,stroke:#9d174d,stroke-dasharray:5 5
2. Codex:受控工作区执行范式

2.1 核心定位
Codex 仍然以代码仓库任务为核心,但它代表的技术范式不是“只会写代码”,而是受控工作区执行。工作区可以包含代码、配置、Markdown、测试、脚本、数据样例和项目规则。Codex 的强项是在可写根目录、沙箱、审批策略和验证命令约束下,完成文件型工作并给出可复查证据。
核心结论
Codex 的优势是受控工作区内的可验证执行。代码是主要场景,但不是唯一可处理的文件型工作。
2.2 面向的工作类型
Codex 最适合结构化工作区中的任务:
| 工作类型 | 典型任务 | 技术原因 |
|---|---|---|
| 代码修改 | 修复 bug、实现小功能、重构局部模块 | 有文件、测试、diff、提交前检查 |
| 配置调整 | 修改构建、环境、CI 配置 | 文件边界清晰,验证命令可运行 |
| 文档修改 | README、技术文档、迁移说明 | 可用 patch 精确修改 |
| 测试验证 | 运行单元测试、构建、lint | 命令输出可作为完成证据 |
| PR 前置检查 | 检查改动范围、测试残余风险 | diff 和命令 trace 可审计 |
| 仓库知识整理 | 读取文件、总结模块、生成说明 | 上下文来自当前工作区 |
2.3 Harness 实现方式
Codex 的 Harness 控制面主要由工作区、文件系统、shell、apply_patch、沙箱策略、审批策略和会话上下文组成。它强调“先读取、再修改、再验证”,并且把用户/仓库规则作为执行约束。
| 技术点 | Codex 体现 |
|---|---|
| Context | 当前工作区、AGENTS.md、读取文件、命令输出、测试结果、diff |
| Memory | 项目规则和会话上下文,不以长期个人记忆为核心 |
| Skill | 更偏任务执行方法和仓库规则复用,不主打长期 Skill 学习 |
| Tool | apply_patch、shell、测试命令、文件系统 |
| Permission | sandbox、approval policy、可写根目录、网络限制 |
| Verification | test、diff、验证命令、残余风险说明 |
2.4 Context / Memory / Skill 机制
Codex 的 Context 构造从工作区开始:先读 AGENTS.md、README、配置、目标文件和测试,再根据命令输出继续补充材料。它适合“材料在仓库内或命令可观测”的任务。
Memory 更像项目规则和会话状态:AGENTS.md、当前对话、已读取文件、命令输出、失败记录和用户偏好会影响后续动作,但 Codex 不把长期个人记忆作为核心卖点。
Skill 更接近“执行方法复用”:例如先定位测试、再最小修改、再跑验证、最后说明风险。它也能使用已安装的本地 Skill,但核心产品优势仍然是工作区内的可控执行。
2.5 Tool / Permission / Verification
Tool Adapter 主要面向本地工作区:读文件、搜索、apply_patch、运行命令、测试和构建。权限边界由沙箱、可写根目录、网络限制和审批策略共同决定。验证不是口头判断,而是测试输出、构建结果、文件清单、diff 和残余风险说明。
实现细节可以压缩成“工作区材料 + 执行控制面”两部分:
1 | workspace/ |
1 | Codex execution surface |
其中,规划不是一次性生成完整方案,而是“任务拆解与下一步动作选择”的滚动过程:
1 | Codex planning loop |
其中,权限门与验证闭环可以用当前 harness-demo 的 Codex-style 策略说明。来源位置:harness_demo/harnesses/codex_style.py。
1 | class CodexStyleHarness(HarnessStrategy): |
%%{init: {"theme":"base","themeVariables":{"background":"#f8fafc","fontFamily":"Arial","lineColor":"#334155"}}}%%
flowchart TD
Title("Codex 机制图<br/>工作区任务 → 规则 → patch → 验证"):::title
subgraph Stage1["📁 阶段1 工作区入口"]
Task("工作区任务<br/>代码/文档/配置/测试"):::start
Agents("AGENTS.md<br/>项目规则与输出约束"):::storage
Files("工作区材料<br/>源码/文档/配置/日志"):::storage
end
subgraph Stage2["🧠 阶段2 上下文构造"]
Read("读取文件与命令输出"):::process
Context("上下文<br/>目标/约束/已有变更/测试结果"):::process
Plan("执行计划<br/>最小修改与验证路径"):::process
end
subgraph Stage3["🛡️ 阶段3 审批与执行"]
Approval("审批与沙箱<br/>可写根目录/网络/高风险命令"):::decision
Patch("apply_patch / 文件修改<br/>文档/配置/代码"):::process
Shell("shell / 测试命令<br/>构建/lint/pytest"):::process
Deny("阻断或请求批准"):::failure
end
subgraph Stage4["✅ 阶段4 验证与交付"]
Verify("验证<br/>测试/构建/内容检查"):::success
Diff("diff / 结果说明<br/>改动范围与残余风险"):::success
end
Title --> Task
Task --> Agents
Task --> Files
Agents -. "规则" .-> Context
Files -. "材料" .-> Read
Read --> Context
Context --> Plan
Plan --> Approval
Approval -- "允许" --> Patch
Approval -- "需确认/越权" --> Deny
Deny --> Approval
Patch --> Shell
Shell --> Verify
Verify --> Diff
classDef title fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef start fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef process fill:#dbeafe,stroke:#2563eb,color:#0f172a,rx:10,ry:10;
classDef storage fill:#ffe4e6,stroke:#e11d48,color:#0f172a,rx:10,ry:10;
classDef decision fill:#ffffff,stroke:#64748b,color:#0f172a,rx:10,ry:10;
classDef success fill:#dcfce7,stroke:#16a34a,color:#0f172a,rx:10,ry:10;
classDef failure fill:#fee2e2,stroke:#dc2626,color:#0f172a,rx:10,ry:10;
style Stage1 fill:#eef6ff,stroke:#1e3a8a,stroke-dasharray:5 5
style Stage2 fill:#f0f9ff,stroke:#075985,stroke-dasharray:5 5
style Stage3 fill:#fff7ed,stroke:#9a3412,stroke-dasharray:5 5
style Stage4 fill:#f0fdf4,stroke:#166534,stroke-dasharray:5 5
2.6 特色优势、短板与适合场景
- 优势
- 工作区边界清晰,文件改动、命令输出和验证结果可复查。
apply_patch适合精确修改代码、配置和 Markdown。- 沙箱、可写根目录和审批策略能限制高风险副作用。
- 短板
- 不以长期个人记忆、多渠道消息入口和跨系统自动化为核心。
- 对浏览器、消息平台、企业系统的持续运行能力依赖外部连接器或自动化配置。
- 适合文件型工作,不适合无工作区边界的泛化助理任务。
- 适合场景
- 仓库内代码修改、配置调整、文档改写、测试验证。
- PR 前置检查、仓库知识整理、可通过命令验证的工程任务。
- 结构化文件工作区内的合同、报告、说明文档修订。
3. Claude Code:团队执行链治理范式

3.1 核心定位
Claude Code 的强场景是 coding,但它的技术意义更大:它把团队规则、权限、Hooks、外部系统连接、MCP、Subagents、上下文压缩和 trace 放进 Agent 执行链。它代表的是团队执行链治理。
核心结论
Claude Code 的优势是团队执行链治理。coding 是强入口,但底层机制可迁移到更广义的团队工作流。
3.2 面向的工作类型
Claude Code 可扩展到:
| 工作类型 | 机制支撑 | 技术原因 |
|---|---|---|
| 代码开发 | 项目文件、命令、MCP、Subagents | 工程上下文和工具链成熟 |
| 文档生成 | CLAUDE.md、项目资料、Hooks 校验 | 团队模板和审查规则可注入 |
| 内部工具操作 | MCP 和命令工具 | 外部系统可变成受控工具 |
| 数据查询 | MCP 数据源、权限规则 | 查询前后可治理和审计 |
| CI/CD 辅助 | 命令、Hook、trace | 执行步骤可记录 |
| 企业知识库查询 | MCP、团队规则、上下文压缩 | 大上下文可分段管理 |
| 工程流程自动化 | settings permissions、Hooks | 团队级安全边界可配置 |
3.3 Harness 实现方式
Claude Code 的 Harness 控制点不只在工具调用本身,而是在整个执行链:规则从 CLAUDE.md 和 settings 进入上下文,权限模式决定 allow / ask / deny,Hooks 在生命周期上阻断或校验动作,MCP 扩展企业工具,Subagents 隔离复杂任务,上下文压缩保留关键历史。
| 技术点 | Claude Code 体现 |
|---|---|
| Context | 项目文件、CLAUDE.md、工具结果、MCP 返回数据、压缩后的会话上下文 |
| Memory | CLAUDE.md 和多层级配置承载项目规则、团队规则、用户偏好 |
| Skill | 可与插件、行业工作流、Subagents 配合形成可安装工作流 |
| Tool | 命令、文件、MCP、Hooks、Subagents |
| Permission | settings permissions、allow / ask / deny、Hooks 阻断 |
| Verification | Hooks、tool trace、命令输出、上下文压缩后的证据保留 |
3.4 Context / Memory / Skill 机制
Claude Code 的 Context 来源比工作区更广:项目文件、CLAUDE.md、工具输出、MCP 返回、子代理结果和压缩后的会话摘要都会影响下一步动作。Context compaction 的价值在于把长任务中的历史变成可继续执行的摘要,而不是简单丢弃。
Memory 主要通过文件和配置承载:CLAUDE.md 可以保存团队规范、项目约束、常用命令和工作方式;settings 可以分层配置权限、工具和 Hooks。这里的 Memory 更偏组织规则和工作流规范,不是单纯个人偏好库。
Skill 可作为可安装流程使用,和插件、MCP、Hooks、Subagents 组合后,可以把行业流程固化为团队执行链,例如发布检查、合同条款审查、数据查询前置审批、文档格式校验。
3.5 Tool / Permission / Verification
Claude Code 的工具接入包括命令、文件、MCP 和 Subagents。权限控制不仅是工具调用前的 allow / ask / deny,还包括 Hooks 的生命周期拦截。验证也不只靠测试,而是靠 Hook 输出、命令日志、工具 trace、MCP 返回和交付检查共同形成证据链。
实现细节可压缩成“规则文件 + 权限配置 + Hook 门禁”:
1 | project/ |
1 | Claude Code control chain |
其中,Hook 门禁体现了“团队规则进入工具执行链”的方式。来源位置:Claude Code docs Hooks。以下是团队侧可实现的精简 Hook 脚本示例,用于说明机制,不作为官方源码。
1 |
|
%%{init: {"theme":"base","themeVariables":{"background":"#f8fafc","fontFamily":"Arial","lineColor":"#334155"}}}%%
flowchart TD
Title("Claude Code 机制图<br/>团队规则 → 权限 → Hooks → Tool/MCP → trace"):::title
subgraph Stage1["📚 阶段1 团队规则"]
Rules("团队规则<br/>安全策略/流程规范/知识沉淀"):::start
ClaudeMd("CLAUDE.md<br/>项目规则与偏好"):::storage
Settings("settings permissions<br/>allow / ask / deny"):::storage
end
subgraph Stage2["🧠 阶段2 上下文窗口"]
Context("上下文<br/>项目文件/工具结果/MCP 数据"):::process
Compaction("context compaction<br/>压缩长会话证据"):::process
end
subgraph Stage3["🛡️ 阶段3 治理链"]
Permission("权限判断<br/>允许/询问/拒绝"):::decision
PreHook("PreTool Hooks<br/>输入校验与风险阻断"):::decision
Tools("Tool / MCP<br/>命令/文件/数据库/企业系统"):::process
Subagents("Subagents<br/>隔离上下文并行处理"):::process
PostHook("PostTool Hooks<br/>结果校验与审计"):::decision
Deny("阻断并记录原因"):::failure
end
subgraph Stage4["🚚 阶段4 交付"]
Trace("tool trace<br/>命令输出/MCP 返回/Hook 记录"):::success
Delivery("交付<br/>代码/文档/查询结果/流程动作"):::success
end
Title --> Rules
Rules --> ClaudeMd
Rules --> Settings
ClaudeMd -. "规则注入" .-> Context
Settings -. "权限策略" .-> Permission
Context --> Permission
Permission -- "allow" --> PreHook
Permission -- "ask/deny" --> Deny
PreHook -- "通过" --> Tools
PreHook -- "阻断" --> Deny
Tools --> Subagents
Subagents --> PostHook
PostHook -- "通过" --> Compaction
PostHook -- "失败" --> Deny
Compaction --> Trace
Trace --> Delivery
classDef title fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef start fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef process fill:#dbeafe,stroke:#2563eb,color:#0f172a,rx:10,ry:10;
classDef storage fill:#ffe4e6,stroke:#e11d48,color:#0f172a,rx:10,ry:10;
classDef decision fill:#ffffff,stroke:#64748b,color:#0f172a,rx:10,ry:10;
classDef success fill:#dcfce7,stroke:#16a34a,color:#0f172a,rx:10,ry:10;
classDef failure fill:#fee2e2,stroke:#dc2626,color:#0f172a,rx:10,ry:10;
style Stage1 fill:#fdf2f8,stroke:#9d174d,stroke-dasharray:5 5
style Stage2 fill:#eef6ff,stroke:#1e3a8a,stroke-dasharray:5 5
style Stage3 fill:#fff7ed,stroke:#9a3412,stroke-dasharray:5 5
style Stage4 fill:#f0fdf4,stroke:#166534,stroke-dasharray:5 5
3.6 特色优势、短板与适合场景
- 优势
- 团队规则、权限策略、Hooks 和 MCP 可以进入同一执行链。
CLAUDE.md与 settings 分层后,项目规则、团队规范和个人偏好可以分离。- Hooks 让安全、格式、审计和质量检查具备确定性门禁。
- 短板
- 配置复杂度高,需要维护权限矩阵、Hook 脚本和 MCP 服务。
- 治理过重会增加执行摩擦,降低小任务效率。
- 外部系统接入越多,审计、密钥和工具输出一致性压力越大。
- 适合场景
- 团队代码开发、工程流程自动化、CI/CD 辅助。
- 企业知识库查询、内部工具操作、数据查询前置审批。
- 需要工具 trace、权限审计和团队规范复用的工作流。
4. OpenClaw:多渠道本地 Gateway 范式

4.1 核心定位
OpenClaw 不应按 coding agent 理解,更合理的定位是本地常驻个人工作助手。它的关键不是仓库 patch,而是把聊天平台、本地工具、浏览器、插件、MCP 和定时任务接入同一个 Gateway,让用户可以从多渠道触发个人自动化。
核心结论
OpenClaw 的优势是把聊天平台、本地工具、浏览器、插件和定时任务接入同一个个人 Gateway,适合非编程类个人工作自动化。
4.2 面向的工作类型
| 工作类型 | OpenClaw 适配方式 | 技术原因 |
|---|---|---|
| 消息平台任务 | channel 输入输出 | 用户可以在聊天中发起和确认任务 |
| 个人自动化 | Gateway + plugins + cron | 本地常驻进程可持续接收触发 |
| 浏览器操作 | browser 工具和 profile | 可使用用户浏览器状态处理网页任务 |
| 定时提醒 | cron | 周期性触发并回传渠道 |
| 文件处理 | workspace + tool adapter | 本地文件可被读取、整理、改写 |
| 多渠道入口 | message channels | 同一 Agent 可以接 Slack、Telegram、Webhook 等 |
| 轻量工作流编排 | skills + plugins | 可把常用流程沉淀为工具链 |
4.3 Harness 实现方式
OpenClaw 的 Harness 控制重点在 Gateway。用户消息、浏览器事件、定时任务和插件能力进入 Gateway 后,由 Agent Routing 选择模型、Skill、插件和工具。权限通过 approvals、exec-policy 和 sandbox 控制,结果通过 tool-result middleware 清洗后返回原渠道。
| 技术点 | OpenClaw 体现 |
|---|---|
| Context | channel 消息、workspace、memory、skills、plugins、浏览器和工具结果 |
| Memory | 个人助手长期状态、workspace 状态、channel 上下文 |
| Skill | 个人自动化能力扩展,与 plugins 配合 |
| Tool | Gateway、browser、cron、MCP、plugins、message channels |
| Permission | approvals、exec-policy、sandbox |
| Verification | tool-result middleware、channel 回传、任务状态 |
4.4 Context / Memory / Skill 机制
OpenClaw 的 Context 不是单个仓库,而是“渠道 + 工作区 + 工具结果”:一次 Slack 消息、一次浏览器操作、一个本地目录和一次 cron 触发都可以成为任务上下文。Memory 更偏个人助手状态,例如频道会话、偏好、长期任务状态和 workspace 信息。
Skill 与 plugins 共同扩展能力:Skill 保存流程,plugin 提供工具接入。两者组合后,OpenClaw 更像个人工具箱,而不是一个只对代码仓库工作的执行器。
4.5 Tool / Permission / Verification
OpenClaw 的 Tool Adapter 覆盖浏览器、MCP、cron、插件和消息平台。Permission 依赖 approvals、exec-policy 和 sandbox,适合处理“发消息、执行命令、访问网页、调用插件”这类个人侧副作用。Verification 通过 tool result middleware、任务状态和 channel 回传完成。
实现细节可以选取 Exec approvals 来看。官方文档将它定义为 companion app / node host guardrail:沙箱内 Agent 想在真实 host 上执行命令时,必须同时满足工具策略、host 本地审批策略、allowlist 和可选人工确认。来源位置:OpenClaw docs Tools > Exec Approvals。
1 | OpenClaw Exec approvals |
其中,host exec 审批决策体现了 OpenClaw 对本地副作用的控制方式。来源位置:OpenClaw docs Tools > Exec Approvals。以下是按文档机制抽象的精简伪代码。
1 | function decideHostExec(plan, policy) { |
%%{init: {"theme":"base","themeVariables":{"background":"#f8fafc","fontFamily":"Arial","lineColor":"#334155"}}}%%
flowchart TD
Title("OpenClaw 机制图<br/>channels → Gateway → Skills/Plugins → channel"):::title
subgraph Stage1["💬 阶段1 多渠道入口"]
Channels("channels<br/>Slack/Telegram/Discord/Email/Webhook"):::start
Browser("浏览器<br/>网页访问与自动化"):::process
Cron("cron<br/>定时任务与提醒"):::process
Workspace("workspace<br/>文件/数据/笔记"):::storage
end
subgraph Stage2["🧭 阶段2 Gateway 路由"]
Gateway("Gateway<br/>本地常驻进程"):::process
Routing("Agent Routing<br/>选择模型/Skill/工具链"):::process
ChannelContext("channel 上下文<br/>会话/身份/任务状态"):::storage
end
subgraph Stage3["🧩 阶段3 能力扩展"]
Skills("Skills<br/>个人自动化流程"):::storage
Plugins("Plugins<br/>浏览器/MCP/本地工具"):::process
Approval("approvals / sandbox<br/>exec-policy 与风险控制"):::decision
Deny("拒绝或风险提示"):::failure
end
subgraph Stage4["📣 阶段4 结果回传"]
ToolResult("tool-result middleware<br/>清洗/格式化/结构化"):::success
Return("返回原渠道<br/>状态/结果/后续问题"):::success
end
Title --> Channels
Browser --> Gateway
Cron --> Gateway
Workspace -. "本地材料" .-> Gateway
Channels --> Gateway
Gateway --> Routing
Routing --> ChannelContext
ChannelContext -. "会话状态" .-> Skills
Skills --> Plugins
Plugins --> Approval
Approval -- "通过" --> ToolResult
Approval -- "拒绝/高风险" --> Deny
Deny --> Return
ToolResult --> Return
Return --> Channels
classDef title fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef start fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef process fill:#dbeafe,stroke:#2563eb,color:#0f172a,rx:10,ry:10;
classDef storage fill:#ffe4e6,stroke:#e11d48,color:#0f172a,rx:10,ry:10;
classDef decision fill:#ffffff,stroke:#64748b,color:#0f172a,rx:10,ry:10;
classDef success fill:#dcfce7,stroke:#16a34a,color:#0f172a,rx:10,ry:10;
classDef failure fill:#fee2e2,stroke:#dc2626,color:#0f172a,rx:10,ry:10;
style Stage1 fill:#fdf2f8,stroke:#9d174d,stroke-dasharray:5 5
style Stage2 fill:#eef6ff,stroke:#1e3a8a,stroke-dasharray:5 5
style Stage3 fill:#fff7ed,stroke:#9a3412,stroke-dasharray:5 5
style Stage4 fill:#f0fdf4,stroke:#166534,stroke-dasharray:5 5
4.6 特色优势、短板与适合场景
- 优势
- 同一个 Gateway 可以接收聊天、浏览器、cron、Webhook 和插件触发。
- 结果可以回传原渠道,审批也可以发生在用户当前聊天环境中。
- 本地运行和独立浏览器 profile 适合个人隐私与个人工具箱场景。
- 短板
- 治理粒度偏个人和本地,团队级规则分层、集中审计需要额外建设。
- 插件和渠道越多,权限误配、密钥泄露和误发送风险越高。
- 长期 Skill 学习和组织级知识沉淀不是其最核心优势。
- 适合场景
- 消息处理、个人提醒、网页操作、文件整理。
- 日程、邮件、浏览器、轻量数据分析和个人多渠道自动化。
- 需要本地 Gateway 统一接入多个个人工具的工作流。
5. Hermes:长期运行、自我改进的通用 Agent 系统

5.1 核心定位
Hermes 更适合写成长期运行、自我改进的通用 Agent 系统。它不是只围绕代码仓库,而是围绕长期助手能力:多渠道入口、Provider 抽象、持久记忆、Skill 索引、执行轨迹、上下文压缩和 Learning Loop。
核心结论
Hermes 的优势是把多类型工作中的执行经验资产化,适合长期运行、经验复用和自我改进场景。
5.2 面向的工作类型
| 工作类型 | Hermes 适配方式 | 技术原因 |
|---|---|---|
| 研究任务 | 会话搜索、长期记忆、工具轨迹 | 需要跨会话复用事实和过程 |
| 文档处理 | 文件工具、Skill、记忆 | 可沉淀固定审查和生成流程 |
| 企业流程 | Gateway、MCP、Provider | 可接入外部系统和多终端后端 |
| 定期监控 | cron + gateway 回传 | 长期运行比一次性 CLI 更适合 |
| 数据整理 | 工具集合、Provider、后端隔离 | 数据管线可固化为 Skill |
| 多工具任务 | Skill activation + trace | 执行轨迹可学习与复盘 |
| 个人 / 团队长期助手 | persistent memory | 偏好、状态和历史可积累 |
5.3 Harness 实现方式
本地 hermes-agent 源码显示,Hermes 通过 MemoryManager 编排内置 Memory Provider 与一个外部 Memory Provider;Skill 通过 SKILL.md、skill index 和 slash command 加载;Gateway 支持消息平台入口;执行环境通过 local、Docker、SSH、Daytona、Singularity、Modal 等后端抽象;运行过程可保存 trajectory,并在 Learning Loop 中推动 Skill 和 Memory 更新。
| 技术点 | Hermes 体现 |
|---|---|
| Context | gateway 消息、persistent memory、Skill 索引、任务轨迹、工具结果 |
| Memory | 保存长期事实、偏好、环境状态 |
| Skill | 通过索引、触发条件、执行轨迹和 Learning Loop 持续沉淀 |
| Tool | Provider 抽象、多终端后端、MCP、工具集合 |
| Permission | authorization、command approval、backend isolation |
| Verification | execution trace、learning feedback、Skill/Memory 更新记录 |
5.4 Context / Memory / Skill 机制
Hermes 的 Context 包含当前消息、Gateway 平台信息、会话历史、压缩摘要、Memory Provider 召回、Skill 内容、工具输出和任务轨迹。源码中的 MemoryManager.prefetch_all() 会在 turn 前从各 provider 收集回忆上下文,sync_all() 在 turn 后同步新信息,on_pre_compress() 在上下文压缩前提取信息,避免长期任务中关键事实丢失。
Memory 是显式插件体系:内置 Memory Provider 始终存在,外部 provider 通过 plugins/memory/<name>/ 接入。MemoryProvider 抽象定义了 initialize()、prefetch()、sync_turn()、get_tool_schemas()、handle_tool_call()、on_session_end()、on_memory_write() 等生命周期。技术结果是长期事实、用户偏好、环境状态和会话知识可以跨任务使用。
Skill 是程序化经验资产:Skill 由 SKILL.md 描述,slash command 可以在 CLI 与 Gateway 中加载,内容支持变量替换、配置注入和辅助文件。Hermes 的 README 明确强调它会从经验中创建和改进 Skills,并通过 session search、memory 和 learning loop 形成长期复用。
5.5 Tool / Permission / Verification
Hermes 的工具接入更像 Provider 层:模型 provider、工具 provider、终端后端、MCP、浏览器、文档、数据和消息平台都可以成为能力。权限控制依赖 authorization、command approval、消息平台身份控制和后端隔离。验证不是单点测试,而是执行 trace、trajectory、工具输出、学习反馈和 Skill/Memory 更新记录。
本地 Hermes 源码副本中可以看到较清晰的实现模块边界。下方用 $HERMES_REPO 表示 Hermes 源码根目录,避免暴露本机用户目录。
1 | $HERMES_REPO/ |
其中,Memory Provider 召回编排体现了 Hermes 如何把长期记忆注入当前任务。来源位置:$HERMES_REPO/agent/memory_manager.py 的 prefetch_all()。
1 | def prefetch_all(self, query: str, *, session_id: str = "") -> str: |
%%{init: {"theme":"base","themeVariables":{"background":"#f8fafc","fontFamily":"Arial","lineColor":"#334155"}}}%%
flowchart TD
Title("Hermes 机制图<br/>Gateway → Memory/Skill → Provider → Learning Loop"):::title
subgraph Stage1["📨 阶段1 消息入口"]
Gateway("Message Gateway<br/>Telegram/Discord/Slack/CLI/cron"):::start
ContextBuilder("Context Builder<br/>消息/平台/任务/历史"):::process
end
subgraph Stage2["🧠 阶段2 长期状态"]
Memory("Persistent Memory<br/>事实/偏好/环境状态"):::storage
SkillIndex("Skill Index<br/>SKILL.md/触发条件/版本"):::storage
SessionSearch("Session Search<br/>历史会话检索"):::storage
end
subgraph Stage3["🧩 阶段3 Skill 与工具"]
Activation("Skill Activation<br/>匹配流程与参数"):::process
Provider("Tool / Provider<br/>MCP/浏览器/文件/数据/消息"):::process
Backend("Execution Backend<br/>local/Docker/SSH/Modal/Singularity"):::process
Approval("Authorization<br/>命令审批/后端隔离"):::decision
Deny("拒绝或降级"):::failure
end
subgraph Stage4["🔁 阶段4 轨迹与学习"]
Trace("Execution Trace<br/>工具结果/日志/状态"):::success
Learning("Learning Loop<br/>反馈/经验提炼/失败归纳"):::success
Update("Skill / Memory Update<br/>写入长期经验"):::success
end
Title --> Gateway
Gateway --> ContextBuilder
Memory -. "召回" .-> ContextBuilder
SessionSearch -. "历史证据" .-> ContextBuilder
SkillIndex -. "可用技能" .-> Activation
ContextBuilder --> Activation
Activation --> Approval
Approval -- "通过" --> Provider
Approval -- "拒绝/越权" --> Deny
Deny --> ContextBuilder
Provider --> Backend
Backend --> Trace
Trace --> Learning
Learning --> Update
Update -. "事实更新" .-> Memory
Update -. "流程改进" .-> SkillIndex
classDef title fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef start fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef process fill:#dbeafe,stroke:#2563eb,color:#0f172a,rx:10,ry:10;
classDef storage fill:#ffe4e6,stroke:#e11d48,color:#0f172a,rx:10,ry:10;
classDef decision fill:#ffffff,stroke:#64748b,color:#0f172a,rx:10,ry:10;
classDef success fill:#dcfce7,stroke:#16a34a,color:#0f172a,rx:10,ry:10;
classDef failure fill:#fee2e2,stroke:#dc2626,color:#0f172a,rx:10,ry:10;
style Stage1 fill:#eef6ff,stroke:#1e3a8a,stroke-dasharray:5 5
style Stage2 fill:#fdf2f8,stroke:#9d174d,stroke-dasharray:5 5
style Stage3 fill:#fff7ed,stroke:#9a3412,stroke-dasharray:5 5
style Stage4 fill:#f0fdf4,stroke:#166534,stroke-dasharray:5 5
5.6 特色优势、短板与适合场景
- 优势
- Memory 保存事实,Skill 保存流程,trace 保存执行证据。
- Learning Loop 可以把多次工作结果反哺为长期能力。
- Provider 和终端后端抽象适合长期运行、多环境执行和跨渠道接入。
- 短板
- 系统复杂度高,长期运行需要处理权限、隐私和记忆污染。
- Skill 自动沉淀需要质量控制,否则会出现流程退化和重复 Skill。
- 多后端、多 Provider、多渠道会增加一致性和故障恢复成本。
- 适合场景
- 长期研究、跨会话文档处理、周期监控、企业流程。
- 数据整理、多工具任务、个人或团队长期助手。
- 需要把经验沉淀为 Memory / Skill / trace 的持续型工作。
6. 四类产品总对比
| 维度 | Codex | Claude Code | OpenClaw | Hermes |
|---|---|---|---|---|
| 工作类型 | 代码、配置、文档、测试、仓库知识 | 代码、文档、内部工具、数据查询、CI/CD、知识库 | 消息、浏览器、文件、定时任务、个人自动化 | 研究、文档、企业流程、定期监控、数据整理、多工具长期任务 |
| Harness 控制重点 | 工作区 | 团队执行链 | 本地 Gateway | 长期学习 |
| Context 管理 | 当前工作区、AGENTS.md、命令输出、diff | 项目文件、CLAUDE.md、MCP、工具结果、压缩上下文 | channel + workspace + plugins + 浏览器结果 | gateway 消息 + memory + skill index + 任务轨迹 |
| Memory 管理 | 项目规则和会话上下文 | CLAUDE.md、多层级配置、团队规则 | 个人状态、workspace、channel 上下文 | persistent memory、user profile、session search |
| Skill 机制 | 执行规则复用 | 插件工作流、Subagents、行业流程 | skills + plugins | Learning Loop、Skill 索引、自我改进 |
| 工具接入 | shell + patch + 文件系统 | MCP + Hooks + 命令 + 文件 + Subagents | Gateway + plugins + browser + cron + MCP | Provider + terminal backends + MCP + tools |
| 权限边界 | sandbox + approval + 可写根目录 | allow/ask/deny + Hooks + settings | approvals + exec-policy + sandbox | authorization + command approval + backend isolation |
| 结果验证 | test + diff + 命令输出 | Hooks + tool trace + 命令输出 | middleware 回传 + channel 状态 | execution trace + learning feedback + Skill/Memory 更新 |
| 主要优势 | 可验证工作区执行 | 团队流程治理 | 个人多渠道自动化 | 长期经验资产 |
| 主要风险 | 不擅长全域长期个人状态 | 配置和治理复杂度高 | 企业级审计和团队规则弱 | 记忆污染、长期权限和系统复杂度 |
7. 当前项目 harness-demo 设计与评估
7.1 Demo 定位
当前项目 harness-demo 是一个 Python CLI 最小实验,用确定性任务模拟 Harness 的核心机制。它以代码任务为主线,但只覆盖受控工作区执行的一部分:工具调用、权限阻断、失败重试、上下文消耗、验证结果和聚合指标。
它不能代表 Codex、Claude Code、OpenClaw 或 Hermes 的真实产品性能,也不能外推到所有 Agent 工作类型。它的价值是用可运行代码解释 Harness 的最小闭环。
7.2 Demo 模块
| 文件 | 功能 |
|---|---|
harness_demo/cli.py |
CLI 入口,支持 python -m harness_demo.cli run --scenario all |
harness_demo/tasks.py |
定义确定性任务集 |
harness_demo/tools.py |
模拟工具注册表、权限阻断和工具失败 |
harness_demo/harnesses/base.py |
共享 Harness 策略、重试和指标计算 |
harness_demo/harnesses/*.py |
模拟 none、generic、codex_style、claude_code_style、openclaw_style、hermes_style |
harness_demo/metrics.py |
聚合成功率、平均耗时、重试、上下文、阻断和可复现分数 |
7.3 Demo 架构图
%%{init: {"theme":"base","themeVariables":{"background":"#f8fafc","fontFamily":"Arial","lineColor":"#334155"}}}%%
flowchart TD
Title("harness-demo 最小实验<br/>用确定性代码模拟 Harness 控制闭环"):::title
subgraph Stage1["🎯 阶段1 输入"]
CLI("CLI 命令<br/>python -m harness_demo.cli run --scenario all"):::start
Tasks("任务集<br/>读工作区/恢复失败/阻断危险命令/上下文压力/验证 patch"):::storage
end
subgraph Stage2["🧪 阶段2 策略执行"]
Factory("Scenario Factory<br/>none/generic/codex/claude/openclaw/hermes"):::process
Harness("HarnessStrategy<br/>权限门/重试/上下文倍率/耗时倍率"):::process
Registry("SimulatedToolRegistry<br/>read_workspace/run_command/apply_patch/run_tests"):::process
Permission("Permission Gate<br/>阻断 rm -rf"):::decision
end
subgraph Stage3["📊 阶段3 观察与验证"]
Result("TaskResult<br/>成功/工具调用/重试/阻断/上下文"):::success
Metrics("ScenarioReport<br/>成功率/平均耗时/恢复率/可复现分数"):::success
Boundary("边界<br/>模拟指标不是产品性能"):::failure
end
Title --> CLI
CLI --> Tasks
Tasks --> Factory
Factory --> Harness
Harness --> Registry
Registry --> Permission
Permission -- "安全" --> Result
Permission -- "危险命令" --> Result
Result --> Metrics
Metrics --> Boundary
classDef title fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef start fill:#0f172a,stroke:#0f172a,color:#ffffff,rx:10,ry:10;
classDef process fill:#dbeafe,stroke:#2563eb,color:#0f172a,rx:10,ry:10;
classDef storage fill:#ffe4e6,stroke:#e11d48,color:#0f172a,rx:10,ry:10;
classDef decision fill:#ffffff,stroke:#64748b,color:#0f172a,rx:10,ry:10;
classDef success fill:#dcfce7,stroke:#16a34a,color:#0f172a,rx:10,ry:10;
classDef failure fill:#fee2e2,stroke:#dc2626,color:#0f172a,rx:10,ry:10;
style Stage1 fill:#eef6ff,stroke:#1e3a8a,stroke-dasharray:5 5
style Stage2 fill:#fff7ed,stroke:#9a3412,stroke-dasharray:5 5
style Stage3 fill:#f0fdf4,stroke:#166534,stroke-dasharray:5 5
7.4 运行方式
1 | python -m harness_demo.cli run --scenario all |
7.5 真实运行评估结果
运行时间:2026-05-13,本地命令真实执行得到以下输出。指标来自 Demo 的确定性模拟逻辑,不代表任何真实产品性能。
| scenario | success_rate | avg_ms | avg_tools | retries | recovery_rate | context | blocks | repro_score |
|---|---|---|---|---|---|---|---|---|
| none | 0.600 | 70.55 | 1.40 | 0 | 0.000 | 267 | 0 | 1.000 |
| generic | 1.000 | 91.00 | 1.60 | 1 | 1.000 | 222 | 1 | 0.950 |
| codex_style | 1.000 | 98.28 | 1.60 | 1 | 1.000 | 208 | 1 | 0.950 |
| claude_code_style | 1.000 | 101.92 | 1.60 | 1 | 1.000 | 198 | 1 | 0.950 |
| openclaw_style | 1.000 | 95.55 | 1.60 | 1 | 1.000 | 214 | 1 | 0.950 |
| hermes_style | 1.000 | 100.10 | 1.60 | 1 | 1.000 | 193 | 1 | 0.950 |
7.6 Demo 结果解释
none 没有权限门和恢复能力,因此遇到不安全命令或瞬时失败时成功率较低。generic 之后的 Harness 风格都开启权限门和一次重试,因此成功率达到 1.000,并且会记录一次危险命令阻断。
不同产品风格的差异来自 Demo 中配置的 duration_multiplier 和 context_multiplier,用于教学比较,不是实测产品性能。例如 hermes_style 的 context 最低,是因为示例里给了更低的 context_multiplier,表达“长期记忆/Skill 索引可能降低重复上下文”的教学假设,而不是 Hermes 真机基准。
7.7 Demo 边界与风险
这个 Demo 只覆盖 Harness 的最小机制:工具调用、权限阻断、重试、上下文估算和验证指标。它没有实现真实浏览器、消息平台、合同审查、企业系统、长期 Memory Provider、真实 Skill 学习、MCP 服务和多后端隔离。因此它适合作为 Harness 核心机制实验,不适合作为产品性能或全场景能力评测。
8. 工程落地建议
落地通用 Agent 工作执行系统时,应先决定 Harness 控制重点,而不是先决定模型:
| 目标 | 推荐范式 | 设计重点 |
|---|---|---|
| 仓库内可验证任务 | Codex 式工作区执行 | 文件边界、patch、测试、diff、审批 |
| 团队流程和外部系统治理 | Claude Code 式执行链治理 | 规则分层、Hooks、MCP、权限矩阵、trace |
| 个人多渠道自动化 | OpenClaw 式本地 Gateway | channel、browser、cron、plugin、同渠道审批 |
| 长期助手和经验复用 | Hermes 式长期学习 | persistent memory、Skill index、trajectory、Learning Loop |
工程上应优先实现五件事:
- 明确 Context Builder 的材料选择规则,避免把所有数据都塞进模型。
- 对所有有副作用的动作做权限分级,包括删除、发送、提交、联网、支付、生产 API。
- 让每个 Tool Adapter 输出结构化 Observation,保留日志、错误和状态。
- 把 Verification 设计成必经节点,使用测试、来源、审核、diff、trace 或人工确认。
- 将 Memory 和 Skill 分离:Memory 保存事实,Skill 保存流程,避免把个人偏好混入可执行流程。
9. 风险与边界
| 风险 | 影响 | 控制方式 |
|---|---|---|
| 上下文污染 | 错误材料进入决策 | 来源标注、上下文分层、压缩前抽取 |
| 记忆污染 | 过期或错误事实长期影响任务 | Memory 写入审批、过期策略、可撤销 |
| Skill 退化 | 错误流程被持续复用 | Skill 版本、评审、回滚、执行指标 |
| 权限越界 | 删除、发送、提交、调用敏感 API | allow/ask/deny、沙箱、审批、最小权限 |
| 工具输出不可控 | API 错误、网页变更、命令失败 | Observation 标准化、Recovery、重试上限 |
| 验证缺失 | 任务看似完成但无证据 | 强制 Verification 和 trace |
| 长期运行安全 | 后台任务持续产生副作用 | 定时任务审计、身份绑定、密钥隔离 |
10. 参考文献
- OpenAI Codex overview:https://platform.openai.com/docs/codex/overview
- OpenAI AGENTS.md guide:https://developers.openai.com/codex/guides/agents-md
- OpenAI Codex sandboxing concept:https://developers.openai.com/codex/concepts/sandboxing
- OpenAI Codex agent approvals and security:https://developers.openai.com/codex/agent-approvals-security
- Claude Code docs:https://code.claude.com/docs/en/how-claude-code-works
- Claude Code memory docs:https://code.claude.com/docs/en/memory
- Claude Code settings docs:https://code.claude.com/docs/en/settings
- Claude Code hooks docs:https://code.claude.com/docs/en/hooks
- Claude Code MCP docs:https://code.claude.com/docs/en/mcp
- Claude Code subagents docs:https://code.claude.com/docs/en/sub-agents
- Claude Code skills docs:https://code.claude.com/docs/en/skills
- OpenClaw exec approvals docs:https://docs.openclaw.ai/tools/exec-approvals
- OpenClaw browser docs:https://docs.openclaw.ai/browser
- OpenClaw skills docs:https://docs.openclaw.ai/tools/skills
- OpenClaw MCP docs:https://docs.openclaw.ai/cli/mcp
- Hermes Agent GitHub:https://github.com/NousResearch/hermes-agent
- Hermes Agent README:
$HERMES_REPO/README.md - Hermes Memory 实现:
$HERMES_REPO/agent/memory_manager.py、$HERMES_REPO/agent/memory_provider.py - Hermes Skill 实现:
$HERMES_REPO/agent/skill_commands.py、$HERMES_REPO/agent/skill_preprocessing.py - Hermes Provider / Backend 实现:
$HERMES_REPO/tools/environments/base.py - 当前 Demo 分支:https://github.com/bujiuzhi/ai-demo-lab/tree/harness-demo,目录:
harness_demo/、README.md、pyproject.toml - dotey X thread:https://x.com/dotey/status/2054383106115678639?s=46
- dotey X thread:https://x.com/dotey/status/2053601852261110201?s=20
- 一文搞懂 Hermes:新顶流 Agent 如何从经验中自我进化:https://mp.weixin.qq.com/s/yHva-zLaRTxe8b4HSUr86Q
- 微信公众号文章:https://mp.weixin.qq.com/s/8PwDQSX7ZX6HdDiW-H9Dzg
- 微信公众号文章:https://mp.weixin.qq.com/s/NtsksL2gkMtMqkILi4xvRg
- 微信公众号文章:https://mp.weixin.qq.com/s/_Yn-PRW2kmoOusUbTbi3vQ
- 关于 Harness 如何构建 Harness 六大组件全解析:https://mp.weixin.qq.com/s/HwqEaXSGkcYgUNrzB2okuA
- 微信公众号文章:https://mp.weixin.qq.com/s/qdycBcCUujnVBkO4vky0wA?scene=334
- 微信公众号文章:https://mp.weixin.qq.com/s/JPhcyDc4JwRmnMQ-76A-FQ?scene=334