HARNESS ENGINEERING · 设计方案 · 2026-10-19

Harness 工程方案

把一个"会调用工具的模型"变成可控、可恢复、可验证、可演进的 Agent。下面用六个问题讲清楚这套方案:为什么需要 Harness、它长什么样、一个任务怎么跑完、出了问题怎么办、怎么持续变好、怎么落地。

01 · 为什么需要 Harness

NESTED

模型只能决定下一步;要让任务可靠地做完,需要一套模型之外的工程系统——这就是 Harness。

Agent = Model + Harness Agent 由 Model 与 Harness 组成:模型负责理解、推理并决定下一步;Harness 是模型之外的工程系统,负责准备上下文、维护状态、执行工具、控制权限、恢复故障和验证结果。 Agent = Model + Harness Harness · 模型之外的工程系统 意图 上下文 MODEL Model 理解 · 推理 决定下一步 准备上下文 每轮该看见什么 维护状态 做到哪、从哪恢复 执行工具 在隔离环境里动手 控制权限 什么能做、什么要批 恢复故障 中断后接着干 验证结果 用证据证明完成 模型只决定下一步;把下一步变成可靠结果的,是模型之外的 Harness。

单独打开此图 ↗

一句话定义:Harness 是模型之外,负责组织上下文、维护状态、执行工具、控制权限、恢复故障和验证结果,把模型的一次次判断变成可执行、可恢复、可验证的任务过程的代码、配置和执行逻辑。

单靠模型做不到这些:

  • 没有记忆。一次模型调用不知道上一轮做到哪,也不知道任务是否在别处推进过。
  • 窗口有限。长任务里的全部事实装不进上下文。
  • 意图不等于授权。模型说"我要删这个文件",不代表当前用户允许删。
  • 说完成不等于完成。模型可以声称测试通过了,却证明不了。

所以 Agent = Model + Harness:模型负责理解和决策,Harness 负责把决策变成可靠的结果。Harness 也不是"更长的 Prompt"——Prompt 只是它每一轮生成的输入之一。

02 · 整体长什么样

ARCHITECTURE

Harness 分三层:编排层决定"怎么做",运行层保证"做得下去",控制层管住"做得对、改得稳"。

整体架构:编排层、运行层、控制层 控制层下发版本与策略并回收验证结果与 Trace;编排层由 Agent Loop、Context Builder、中间件与验证组成,持有任务语义;运行层由 Runtime、State Store、AI Gateway 和 Sandbox 组成,负责调度恢复、保存事实、接入模型与工具以及隔离执行。 控制层 编排层 运行层 任务 追加事件 模型调用 受控执行 版本与策略 验证结果 · Trace CONTROL 版本、策略与评估中心 Release · Policy · Eval · Audit CORE Agent Loop 推进循环 · 何时停 Context Builder 每轮该看见什么 中间件与验证 权限 · 预算 · 证据 RUNTIME Runtime 调度 · 暂停 · 恢复 STATE State Store Event Log · Checkpoint GATEWAY AI Gateway 通往模型 · 工具 · MCP ISOLATION Sandbox 文件 · 进程 · 网络 图例 任务语义中枢 组件 持久状态 隔离边界 调用 策略 / 回流

单独打开此图 ↗

  • 编排层(橙色)持有任务语义:推进循环、构建每轮上下文、检查权限与预算、判断是否完成。它决定模型看到什么、能做什么、什么时候停。
  • 运行层负责物理保障:任务在哪个实例上跑、中断后从哪恢复、事实存在哪、模型和工具从哪接入、动作在哪个隔离环境里执行。
  • 控制层负责治理与演进:集中定义版本、策略和预算,回收验证结果与 Trace,决定一个新版本能不能上线。

两条原则贯穿三层:状态外置——任务事实只存在 State Store 里,不在模型上下文或进程内存里,所以任何实例都能接手;策略集中定义、就地执行——控制层下发规则,编排层和运行层在请求路径上直接判定,不让控制层成为每次调用的同步依赖。

03 · 一个任务是怎么跑完的

LOOP

任务是一圈一圈跑完的:每一圈只有"模型决策"这一步是概率性的,其余五步都是确定性的代码。

一个任务的循环:六步与外置任务状态 每一轮依次经过构建上下文、模型决策、权限检查、工具执行、记录状态和验证完成,每一步都把事件写入外置的任务状态;权限检查是模型无法绕过的确定性关口,验证不通过就进入下一轮。 追加事件 记录副作用 构建上下文 规则 · 代码 · 记忆 模型决策 只给出下一步 权限检查 阶段 · 参数 · 预算 工具执行 在 Sandbox 里 记录状态 事件 · Checkpoint 验证完成 证据齐了才结束 任务状态Event Log · Checkpoint

单独打开此图 ↗

用一个例子走一遍:「修一个 bug:登录接口在密码为空时返回 500」。任务进来后先建好任务记录(目标、验收标准、预算),然后进入循环。

① 构建上下文:这一轮模型该看见什么

Harness 每轮重新编译一份上下文,而不是把全部历史塞进去:先按身份和权限过滤,再按相关性排序,再按 Token 预算取舍。大块内容(比如两千行的测试日志)放进 Workspace,窗口里只留摘要和引用。

Context 组装:五类来源汇入一次模型调用 系统指令与 Skill、任务状态、记忆、知识检索和工具结果五类来源汇入 Context Builder,先按身份与权限过滤,再排序去重、分配 Token 预算、压缩与引用化,按层级编译成本次模型调用的上下文;同时生成记录来源与版本的 Context Manifest,大结果被卸载到 Workspace 只留引用。 组装视图 卸载 记录 系统指令与 Skill 按需渐进披露 任务状态 Plan · Todo · 最近事件 长期记忆 偏好与经验 · 有写入门槛 知识检索 带权限过滤与来源 工具结果 截断或摘要后进入 CONTEXT POLICY Context Builder 身份与作用域 → 权限与可信度过滤 相关性排序与去重 分配 Token 预算 压缩 · 截断 · 引用化 按层级编译,每次调用都重建 LLM CALL 模型调用 只看到本次视图 Workspace 大结果外置 · 文件交接 Context Manifest 来源 · 版本 · 选择原因 图例 组装策略 内部来源 外部知识 运行时结果 进入上下文窗口 外置引用

单独打开此图 ↗

修 bug 的第一轮,模型看到的是:Issue 描述、仓库规则、登录模块的相关文件、当前计划(复现 → 定位 → 修复 → 回归),以及一个"依赖与接口修复"的 Skill 简介——只有名称和一句话,真正用到时才加载全文。每次调用都会留下一份 Manifest,记录模型到底看到了哪些材料,出错时先查"它有没有看见对的东西"。

② 模型决策:只给出下一步

模型读完上下文,给出一个意图:"先运行登录模块的测试,复现问题。"它可以选择行动、委派、提问、等待或申请完成,但它只是提议,不直接动任何东西。

③ 权限检查:模型绕不过去的关口

中间件逐项检查:这个工具在当前阶段允许吗?参数是否落在工作区内?预算还剩多少?结果是三选一——放行、拒绝(并告诉模型原因和替代做法)、需要人确认。跑测试是只读的,直接放行;之后若模型想直接推送到主干,就会被拦下等审批。

护栏分层:按执行位置组织的控制目录 六层护栏从可被绕过的 Prompt 指令,到 Harness 中间件、AI Gateway、Sandbox、人工审批和控制面,越往下越不依赖模型配合,Harness 中间件是每一步都执行的关键层。 提示性 强制性 L06 Prompt 指令 角色、目标与约束说明,仅作提示 MODEL · BYPASSABLE L05 Harness 中间件 Schema 校验 · 审批 Hook · 输出过滤 · 循环检测 CODE · EVERY STEP L04 AI Gateway 工具级 ACL · 凭证托管 · 限流与预算 PLATFORM · EVERY CALL L03 Sandbox 文件 · 进程 · 网络出站 · Secrets 注入 PLATFORM · AT EXEC L02 人工审批 不可逆 / 高影响动作 · 运行中 Steering HUMAN · KEY POINTS L01 控制面 策略版本 · 短期凭证吊销 · 异步审计 PLATFORM · RELEASE 只写在 Prompt 里的规则不是边界:越往下的护栏越不依赖模型配合,也越难被绕过。

单独打开此图 ↗

护栏按"在哪里执行"分层:写在 Prompt 里的规则只是提示,模型可以绕过;真正的边界在中间件、网关、Sandbox、人工审批和控制面这些模型无法控制的地方。

④ 工具执行:在隔离环境里动手

放行之后,调用经过网关换取短期凭证,在 Sandbox 容器里执行:只能读写这个仓库的副本,没有生产环境凭证,网络出站受白名单限制。即使代码里藏了"顺手部署一下"的指令,Sandbox 的网络和凭证边界也让它做不到。

一次受控工具调用的六个环节 Harness 编排层发起工具调用后,策略层完成身份、权限和参数校验,高影响操作先请求人工审批,再交给 Sandbox 隔离执行,结果经校验截断后异步写入审计,最后作为观察结果返回编排层。 OPT[高影响 / 不可逆] ① 请求 tool(args) ② 身份 · 权限 · Schema ③ 请求审批 批准 ④ 隔离执行 原始结果 ⑤ 结果校验 · 截断 ⑥ 记录事件 (异步) 观察结果 Harness 编排层 能力选择 策略层 Middleware · Gateway 审批人 Human-in-the-loop Sandbox 隔离执行环境 审计与状态 Event Log · Trace 图例 发起方 隔离边界 同步调用 返回 异步通知 主路径返回

单独打开此图 ↗

一次工具调用就是图里这六个环节。工具设计也有讲究:"创建合并请求"和"发布生产"必须是两个工具,因为风险、可逆性和审批要求完全不同;不要让模型用通用 Shell 自己拼生产操作。

⑤ 记录状态:先落账,再进入下一轮

测试结果回来:失败用例 1 个,堆栈指向空密码时未做校验。Harness 把这一步写成事件(调了什么、结果是什么、花了多少),更新计划("复现"打勾,"定位"进行中),关键节点写 Checkpoint。模型下一轮看到的进度来自这份状态,而不是从几百条聊天记录里猜。

⑥ 验证完成:证据齐了才算完

几圈之后,模型补上校验并新增一条回归测试,然后说"修好了"。这只是申请完成。Harness 运行验收:全部测试通过、新增测试覆盖空密码场景、代码改动只在授权目录内、独立评审没有阻断问题。缺一项就把缺口作为新的观察结果送回循环,继续修。

子 Agent 编排:主控委派与权限收窄 主控 Agent 持有计划并把子任务委派给研究、执行、评审和可选的外部 Agent,每个子 Agent 拥有独立上下文与更窄的权限,执行 Agent 的高影响动作需要经过人工审批门。 委派 · 收窄权限 高影响动作 ORCHESTRATOR 主控 Agent 持有计划 · 汇总结果 研究 Agent 检索 · 阅读 · 汇总 tools: read-only 执行 Agent 改文件 · 跑测试 sandbox: rw workspace 评审 Agent 独立上下文复核 model: independent 外部 Agent 跨团队能力 · 可缺省 protocol: A2A 人工审批门 不可逆动作之前 权限、预算与上下文只随委派收窄; 主控可以一次性撤销整棵子任务树。 图例 主控 / 前门 有写权限的子 Agent 只读子 Agent 可选接入 审批门

单独打开此图 ↗

评审这一步适合交给子 Agent:它用独立的上下文只读代码差异和测试报告,不和执行者共享中间判断,更容易发现盲点。同样,定位阶段可以让一个只读的研究 Agent 并行翻代码。子 Agent 只拿到完成子任务所需的最少上下文和更窄的权限,结果回来后仍由主 Agent 校验和整合——任务完成的责任不随委派转移。

最终交付的不是一句"已完成",而是一组证据:代码差异、测试报告、评审意见,以及一个等待负责人审批的合并请求。

04 · 出问题怎么办

STATE MACHINE

出问题时,任务不是"崩了",而是进入一个明确的状态:等待、恢复、或带着进度结束。

出问题时任务去哪:等待、恢复与终止 任务从已创建经运行中、验证中到已完成;遇到高风险动作进入等待审批,批准后继续;实例中断进入恢复中并从检查点续跑;验证未通过回到运行中,审批拒绝或取消进入已取消,预算耗尽进入失败。 等待 / 恢复 主阶段 终止结果 开始 申请完成 证据齐全 高风险动作 批准 续跑 实例中断 拒绝 / 取消 预算耗尽 未通过,继续修 等待审批 挂起 · 不占资源 恢复中 加载 Checkpoint 已创建 排队 运行中 循环推进 · 每步落事件 验证中 测试 · 评审 已完成 交付结果 已取消 补偿已发副作用 失败 保留进度 · 转人工 图例 主阶段 等待 / 恢复 终止结果 状态迁移 中断与续跑 成功路径

单独打开此图 ↗

中断了:从 Checkpoint 接着干

执行实例随时可能挂掉。因为事实都在 State Store 里,任何实例都能加载最近的 Checkpoint 续跑。关键是恢复前先查再做:比如"补丁已写入、测试结果还没回来"时中断,恢复后应先查那次测试的结果,而不是再改一遍文件。有副作用的操作都带幂等键,用来判断"上一次到底做没做过"。

预算花完了:明确结束,而不是悄悄截断

预算是多维的:步数、时长、Token 与费用、工具调用次数、高风险动作次数。快到上限时,Harness 让模型收敛范围、优先交付已完成的部分;真的耗尽时进入"失败",保留进度和未完成清单,转给人处理。比步数上限更早的信号是"没进展":反复调用同一工具、反复得到同一错误、计划长时间不变——检测到就先要求重新规划,再考虑缩小任务或转人工。

高风险动作:先预览,再审批,再执行,再核实

发布、删除、付款、对外发消息这类动作,走 Preview → Approve → Commit → Verify:

行动授权:ALLOW · DENY · ASK 与 Preview—Approve—Commit—Verify 统一的 Action Request 先经过策略判定:DENY 返回结构化原因与替代项;ALLOW 直接以幂等键提交执行;ASK 先生成预览,经审批绑定身份、范围和对象版本后再提交;提交后查询真实系统状态验证,通过则提交状态与证据,失败则进入修复、补偿或升级。 ASK 重新校验版本 DENY ALLOW 通过 失败 Action Request 统一请求 Policy身份·资源·风险 拒绝执行 结构化原因 Preview 差异 · 目标 · 影响 Approve 绑定身份与范围 Commit 使用幂等键执行 Verify查询真实状态 提交状态与证据 修复 / 补偿 / 升级 Repair·Compensate·Escalate 图例 策略判定 人工审批 步骤 判定 流转 完成路径

单独打开此图 ↗

  • Preview:给审批人看实际要提交的内容、目标对象和影响范围。
  • Approve:批准绑定到具体身份、对象版本和范围;批准后重新校验,防止等待期间环境已经变了。等待审批的任务挂起,不占计算资源。
  • Commit:带幂等键执行,超时也不会重复提交。
  • Verify:查询真实系统状态确认生效;失败就修复、补偿或升级给人,而不是把"请求已发出"当作成功。

审批不是越多越好。处处要确认会让人机械点"同意"。优先用更窄的工具、参数约束和 Sandbox 把风险降下来,只在策略判断不了的地方请人确认。

05 · 怎么持续变好

FLOWCHART

任何改动——Prompt、Skill、工具、模型——都打包成一个版本,过评估门禁、灰度验证,才能进生产。

评估与发布闭环:从生产证据到受控变更 带版本的 Trace 与 Outcome 先按症状与根因聚类诊断,再形成最小针对性的 Harness Patch 并打包成 Agent Release;回归门禁覆盖成功、成本与安全,不通过则回到 Patch,通过后灰度发布,在线达标则全量上线并继续采集证据,不达标则回滚。 通过 否 是 否 持续采集 Trace 与 Outcome 失败聚类与根因诊断 最小 Harness Patch 打包 Agent Release 回归门禁成功 · 成本 · 安全 灰度发布 小流量 · 对比实验 在线达标?成功率 · 成本 · 风险 全量上线 回滚上一版本 Release 可回退 图例 步骤 判定 流转 关键门禁 证据回流

单独打开此图 ↗

版本化发布

一个 Agent Release 把影响行为的东西全部锁在一起:模型与路由、Harness 版本、Prompt 与 Skill、工具清单与权限、Sandbox 配置、评估集与上线阈值。线上任何一条 Trace 都能追溯到具体版本,出了问题能复现、能回滚。

release: bugfix-agent@2026.10.19-3
model: model-a@2026-09     harness: 1.8.2     skills: [repo-nav@3, test-fix@5]
tools: tools@19            sandbox: container  eval: { dataset: bugfix@12, gate: success>=0.82 }

评估门禁

改进从真实失败出发:把线上 Trace 按症状和根因聚类,再做最小、对准根因的修改——缺事实就改上下文,工具用错就改工具定义或权限,没进展就调循环或计划,误判完成就加强验收。不要看到一条失败就往 Prompt 里加一句话。回归集同时包含原失败用例、相邻的正常用例和安全对抗用例,看成功率,也看成本和安全事件。

灰度上线

过了离线门禁,新版本先接小流量,与旧版本对比成功率、成本和风险;达标才全量,不达标直接回滚到上一个版本。Agent 不在生产中修改自己:模型或反馈生成的任何补丁,都只是下一轮的候选变更。

06 · 怎么落地

ROADMAP

从一个场景、一个 Agent 起步,每个阶段有明确的退出标准,达不到就不进入下一阶段。

P0 · 1–2 周

定边界

  • 选 1 个场景,写清目标、允许与禁止的动作、成功标准
  • 确定审批点、数据边界和影响范围
  • 准备 30–50 条评估样例

退出:评审通过的任务定义 + 首版评估集

P1 · 4–6 周

单 Agent 可用

  • 编排层:循环、多维预算、上下文构建、权限中间件、验收
  • 容器 Sandbox + 工具注册
  • 事件日志 + 带版本的 Trace

退出:离线评估达标,高风险动作 100% 经审批

P2 · 6–8 周

生产化

  • Runtime:排队、Checkpoint、恢复、取消补偿
  • 网关与短期凭证
  • 版本化发布 + 评估门禁 + 灰度回滚

退出:中断恢复演练通过,灰度能证明改进

P3 · 持续

规模运营

  • 长期记忆与 Skill 资产库
  • 按需引入子 Agent 与长任务
  • 多租户配额与共享控制层

退出:多个应用复用同一套默认路径

几个关键权衡

  • Workflow 还是 Agent:审批、入账这类确定性环节留给 Workflow,Agent 只处理路径无法穷举的部分。
  • 单 Agent 还是多 Agent:默认单 Agent;只有上下文装不下、权限需要隔离或子任务能并行时才拆,拆了要付出通信和合并成本。
  • 自建还是复用:编排层自己掌握,因为它决定任务效果和可回归性;Sandbox、模型接入这类执行基础可以用托管服务。
  • 隔离强度与速度:默认容器;运行不可信代码或处理高敏数据时升级到微虚拟机。
  • 脚手架随模型简化:每次换模型都重新评估,删掉已经不需要的补偿逻辑。