选 Agent harness 时先核对这五层有没有真拦得住
Towards AI 2026-09-21 把 harness 拆成执行边界、沙箱、记忆、验证上限和上下文预算。对照 Claude Code 图运行时前,先问任务是否真的需要图。

「harness」在 2026 年被用来指系统提示、整套带沙箱的 CLI,或一个评估循环。Ali Süleyman TOPUZ 在 2026 年 9 月 21 日的 Towards AI 文章里主张先别比产品名。他引用 Anthropic《Building Effective Agents》的分界:工作流是代码规定好的调用路径,Agent 是模型自己决定过程和工具。该用工作流时上 Agent,会更贵也更难交接。下面的 agent harness 五层 是他归纳的检查单,数字凡是他标明没复现的,这里保持为转述。
五层各自挡住哪类失败
第一层是执行边界:模型决定调用工具之后、工具真的跑起来之前,有一段代码可以拒绝。他写自己用提示词禁止危险 git 命令试了十一次不同措辞后放弃,改成调用前拦截。他同时承认黑名单永远不全。Claude Code 的 PreToolUse hook 是同一形状:在调用前看参数,按 JSON 决定拒绝。边界不让模型变聪明,只让最笨的那类调用死在代码里。
第二层是沙箱。文章把容器和微虚机分开:共享宿主机内核仍是攻击面;Firecracker 一类微虚机有独立内核。他引用的 AWS 公开量级是启动约 125 毫秒、每虚机内存开销低于 5 MiB。这些不是某家托管沙箱的对比广告。容器方案里他强调 --network none 比其他 flag 更常被省掉,因为省掉才能中途 pip install。需要网络就应是点名的域名,不是默认值。自建隔离他点了 Apache 2.0 的 alibaba/OpenSandbox,可接 Docker、Kata、gVisor 或 Firecracker。Codex 沙箱补丁是产品侧的另一层,版本见 Heapjack 与 Overpatch 升级。
第三层是跨会话记忆,而且条目要能过期。他用 SQLite 加 expires_at 举例,并建议在证明需要语义检索之前不要先上托管向量库。第四层是验证循环必须有次数上限。他描述一次翻译任务没设上限,评估器挑了四十一轮措辞才被他杀掉。第五层是上下文预算:选取、压缩、隔离,按 token 上限截断,而不是无限追加。他把「上下文工程」写成最容易被跳过的一层,因为账单出来之前不像 bug。
五层和模型品牌无关。产品若缺一层,会在具体失败里现形,而不是在介绍页上。ECC 这一类现成 harness 里装了什么,见 ECC harness 里面有什么,不要和这五层名词一一划等号。
三款开源各押在不同角上
文章后半安装了三个项目,结论是它们没有在比同一个东西。
DeepSeek Harness(dsh)把循环、调度、沙箱、SDK 都做成 Cordis 插件。他记录的安装约 359 MB,默认模型目录只有两个;若仓库里 CLAUDE.md 和 AGENTS.md 已经分叉,它会把两份全文都放进每一轮,不去重。Vercel Labs 的 fx(vercel-labs/fx)是 Zig 写的小二进制,他写的体积约 7.8 MiB,扩展靠 skills、MCP 和子 Agent 三套机制,而不是一个万能插件接口。模型走 Vercel AI Gateway,加价为零,另有 Codex 与 Grok 的直接认证。OpenSandbox 他明确说不是完整 harness:没有自己的推理循环,只提供执行隔离,并用 MCP 让别的 harness 把代码送进来。
因此「选一个 harness」要先问你缺的是循环还是隔离。只有隔离不够时,OpenSandbox 是加在现有循环下面的组件,不是 Claude Code 的替代品。
什么时候才值得上 Claude Code 的图
文章转述 Claude Code 的 dynamic workflows:一段由模型写下的 JavaScript,在后台编排子 Agent,主会话只看最终结果。他强调控制流(循环、分支)是普通脚本,不按 token 计费,只有 agent() 调用模型才计费。每步默认用会话模型,除非脚本指定更便宜的模型。文中「大约 92% 质量、63% 成本」被作者标明自己没有在受控基准里复现,这里不把它当成测量结果。
他用的四问是:子任务是否真的需要各自的上下文和工具;是否有并行再汇合,而不只是顺序画成方框;控制流是否要变成可 diff 的代码;同样形状是否会再跑,值得把编排存下来。零个或一个「是」,只是把循环换了个名字。Claude Code 进度视图会在调度超过 25 个 Agent 或预计超过 150 万 token 时警告,这是产品在替你挡第四问。原语是 agent()、pipeline()、parallel()。迁移按文件、多来源并行再汇总、修到类型检查通过并设轮数上限,是他常用的三种形状。
若四问里你只能回答「想让它自己想」,留在单会话循环,把第一层 hook 和第三层过期先补上。