论文链接:arxiv.org/abs/2608.23953 代码仓库:研究对象 langchain-ai/deepagents、earendil-works/pi、deepseek-ai/deepseek-harness 发表时间:2026年8月 机构:南洋理工大学(新加坡,单人作者研究) 领域标签:cs.SE / 软件架构 / LLM Agent 基础设施
一、论文背景
1.1 什么是 Harness:把模型变成 Agent 的那层代码
大语言模型(LLM)本身只是一个"文本进、文本出"的大脑。要让它成为能自主完成长程任务的 Agent(智能体),需要一层外围代码来包装它:构建模型的上下文、中介它对工具的调用、驱动"思考-行动-观察"的运行循环、并在长程运行中持久化状态。这层代码就是 Harness(执行线束)——可以类比为"给大脑配上的身体与操作系统":模型负责思考,harness 负责让思考落地为行动。
Claude Code、Codex CLI、OpenHands 这些我们熟悉的编程 Agent 产品,本质都是"某个前沿模型 + 一套 harness"。模型相同、harness 不同,表现可能天差地别。
1.2 为什么要研究 harness 架构:约束瓶颈的转移
论文的出发点是一个越来越被业界承认的事实:在能力相当的前沿模型之间,harness 而非模型本身,往往主宰长程任务表现差异的大头。论文引用了 2026 年的一项量化研究:固定模型不变,仅更换 harness 就能让 Terminal-Bench 2 的 pass@1 移动数个百分点、让 SWE-bench Verified 移动最多 15 个点。这在软件工程里有个经典术语——约束瓶颈(binding constraint):木桶能装多少水取决于最短的板,如今最短的板已经是 harness。
如果 harness 是瓶颈,那么"harness 的架构正在走向何方"就不再是一个实现细节问题,而是一阶重要的研究问题。但此前没有人系统回答过:
- 已有的源码级研究读的是编码 Agent 应用(13 个脚手架的静态分类),没有读 harness 层本身;
- 已有的纵向研究量化的是发布速度与质量的关系,没有刻画演化产生的架构形态;
- 收敛现象只被顺带提及,从未被当作中心论点检验。
1.3 本文的独特方法:把软件工程实证方法带进 harness 研究
作者(南洋理工单人作者)采用软件工程领域的解释性、理论构建型多案例研究方法:选定三个哲学立场刻意对立的开源 harness,钉死 commit 逐行阅读源码、做 commit 考古学追踪演化轨迹、在沙箱中复现缺陷并向上游提交 issue/PR 验证论断。这不是一篇提出新方法的论文,而是一篇给快速膨胀的 harness 生态画地图、找规律的实证研究——类似当年《The Architecture of Open Source Applications》系列对开源软件做的事。
二、论文定位和关联工作
2.1 研究谱系一:harness 作为研究对象
| 工作 | 核心思想 | 与本文的关键区别 |
|---|---|---|
| Harness 综述(Meng et al. 2026) | 把 harness 形式化为六元组(执行循环/工具注册/上下文管理/状态存储/生命周期钩子/评估接口) | 建立了词汇表但不读实现,无比较性源码分析 |
| Harness 工程阅读清单(RUCAIBox) | 策展该领域文献地图 | 同上,不读代码 |
| 约束瓶颈研究(Zhang et al. 2026) | 量化证明 harness 是性能差异的主宰 | 说明"为什么值得研究",不回答"架构走向何方" |
2.2 研究谱系二:源码级分类学(最近邻)
Rombaut 2026 的《Inside the Scaffold》是最近邻:它钉死 commit 阅读 13 个编码 Agent 脚手架、按 12 个维度分类、证据锚定到文件行号。本文继承了它的方法论纪律(pinned commit、行级证据),但有三点本质差异:
- 对象不同:该研究显式排除了 deepagents(认为它"通用而非编码专用"),pi 和 dsh 更是从未出现在任何架构研究里——本文研究的恰是应用层之下的通用 harness 层;
- 时间维度不同:它只分析静态快照并明确放弃演化追踪,本文的中心证据恰是每个 harness 走过的轨迹;
- 框架不同:它把收敛当作偶然观察顺带报告,本文把收敛做成中心论点并检验其机制。
2.3 研究谱系三:自上而下的协议层
MCP 标准化工具调用、A2A 标准化智能体间消息、Autogenesis 协议更进一步规定提示/工具/环境/记忆都作为带版本、可追溯、可回滚的资源注册。这条路线自上而下地规定 harness 应该长什么样。本文反其道而行:自下而上地记录三个生产级 harness 实际长成了什么样。两者对照出一个惊人的不对称——协议层 prescriptions 的核心(可审计血缘),恰是三个 harness 全部缺失的维度。
2.4 本文定位结论
本文是首个以架构收敛为中心论点、以源码级证据为基础的 harness 层研究:填补"harness 层未被读过"(G1)、“架构轨迹未被刻画”(G2)、“收敛未被检验”(G3)三个空白。
三、问题定义
3.1 从具体现象到抽象问题
具体问题是模糊的:“三个 harness 的代码各是什么样?"——这只能得到三份产品说明书。作者把它抽象成一个可检验的社会学式问题:
在共享且不断增强的选择压力(长程自主运行)下,从对立设计哲学出发的 harness,是否会收敛到同一个架构形态?如果是,收敛的机制是什么?未收敛的维度在哪里?
这就像生物学中趋同演化(convergent evolution)的研究设计:鲨鱼(鱼类)、鱼龙(爬行动物)、海豚(哺乳动物)谱系完全不同,却在海洋这个选择压力下都演化出了流线型身体和鳍。如果三个对立哲学的 harness 也长出了相同"器官”,那说明这些器官是问题形状的属性,而非某个团队的偏好。
3.2 形式化
- 给定:三个最大差异选取的开源 harness(deepagents/pi/dsh,钉死 commit)、预设的比较维度表(先于细读固定,防止事后拟合)、commit 历史、可复现的缺陷标本;
- 求:RQ1 起点与轨迹(分歧)、RQ2 收敛形态与机制、RQ3 未收敛维度及解释;
- 约束:证据必须锚定 file:line、可复现、可重查;不宣称三例独立收敛(dsh 复用 pi 需披露并分析处理)。
3.3 这个抽象的精妙之处
“literal replication”(逐字复制逻辑):前两案归纳出候选模型 → 第三案作为 held-out 检验——这正是机器学习里"训练集建模、测试集验证"的思路移植到质性研究。而"不宣称独立发明、把收敛分解为三种机制"的克制,让结论免于最常见的质性研究陷阱(把相关性夸大为独立发现)。
四、问题解法:三案例、五要素、三机制
4.1 三个对立的起点(RQ1)
| deepagents(LangChain) | pi(Earendil Works) | dsh(DeepSeek) | |
|---|---|---|---|
| 哲学 | 大而全:中间件全家桶 | 极简主义:“最小可用 harness” | 一切皆插件 |
| 形态 | 规划/文件系统/子agent/摘要/记忆/权限全是中间件,三阶段组装 | 4 个工具、约300 token 基础提示、agent 包仅 2,368 行 | ~230 个插件跑在服务定位器运行时上,连 agent 循环都是一行可替换配置 |
| 演化方向 | 做减法:废弃自研基础提示、删除内置工具说明散文、把 todo 规划中间件降级为按模型选配 | 做加法:循环外围长到 146,170 行十包,曾经拒绝的子agent/压缩/模型适配全部以数据形式回归 | 复用:入场即接近中间态,provider 适配层直接依赖 pi 的包 |
一个漂亮的细节:pi 的循环文件仅 796 行、全程没有一个 try/catch——极简到"循环不会失败"的信仰;而 deepagents 的 commit 历史记录了它一步步减掉自研脚手架(“不再提供自研基础提示”),每一步都在向 pi 的立场移动。减法的与加法的相向而行。
4.2 收敛的中间形态:五要素(RQ2)
| 要素 | deepagents | pi | dsh | 通俗类比 |
|---|---|---|---|---|
| 商品化循环 | 不持有循环(委托 LangGraph) | 796 行循环文件 | 515 行驱动器,本身是可换配置行 | 发动机不再是大卖点,三家家家都有 |
| 仅追加可重放会话记录 | 压缩保持为视图(弱) | 仅追加条目+寄存器(中) | 事件溯源+运行时断言"可见⇒已记录"(强) | 账本只能添账不能撕页 |
| 模型怪癖数据化 | profile 类层级 | compat 数据目录(约15个兼容 flag 服务单一格式) | 适配器配置+运行时能力解析 | 把"各家模型脾气"写成资料卡而非 if 分支 |
| 上下文渐进披露 | 技能索引(名/描述/路径) | CLI 工具+README 按需读 | 投影+每能力 token/KV 成本契约 | 图书馆目录卡而非把整馆书塞进书包 |
| 显式扩展缝隙 | 中间件/后端/profile 三轴 | 事件总线+注册表 | 服务定义三元组 | 预留插座而非焊死 |
三个发现值得逐条咀嚼:
- 五要素在全部三列复现——尽管哲学对立,说明中间形态是问题的属性而非谱系的属性;
- 没有要素以相同代码复现——类层级、数据目录、运行时解析器是同一思想的三种序列化,说明收敛的是想法而非实现;
- 只有会话记录形成强度阶梯(视图 < 仅追加 < 事件溯源)而非并列簇,而这个阶梯恰好直指第 7 节的未收敛维度。
4.3 收敛机制的三分解
作者拒绝"独立发明"的廉价叙事,把收敛分解为:
- 平行发现:append-only 记录,pi 源于崩溃恢复压力、deepagents 源于检查点成本压力——起点和压力都不同,殊途同归;
- 扩散:AGENTS.md 约定靠模仿传播,两个项目彼此公开互知;
- 字面复用:dsh 的通用 provider 适配器
llm-pi-ai直接依赖 pi 的@earendil-works/pi-ai包,在树内自称"设计验证孪生"——一个团队直接采用另一个团队的已解决问题。
4.4 汇聚断层线:缺陷也收敛
作者在沙箱中独立复现了两个缺陷(deepagents 的路径归一化绕过、pi 的节流误判),并向两个上游提交了 issue/PR(一个文档修复被合并)。全部缺陷落在四条断层线上:
| 断层线 | 机制 → 后果 | 损失 |
|---|---|---|
| S1 同步/异步漂移 | 手写 async 孪生体的 guard 在 try 内外不一致 → 恢复时 KeyError 崩溃 | 可恢复 |
| S2 归一化信任间隙 | //secrets 与 /secrets 路径分量不相等而文件系统相等 → 删除拒绝/审批/路由检查全部 fail-open | 不可逆 |
| S3 字符串匹配语义 | 约25个正则决定错误含义 → 措辞一变,瞬时限流被误判为上下文溢出而触发破坏性压缩 | 不可逆 |
| S4 静默 vs 响亮失败 | 未识别形状默认放行继续跑,而非停下 | 跨切性质 |
关键洞察:四例中三例的损失不可逆(递归删除穿透拒绝规则、对话历史被压缩覆盖)。教训直白——昂贵的东西恰好是自主系统无法走回头路的操作,所以每个自动化破坏性动作都应被记录、且尽量可逆。
4.5 唯一零收敛维度:外部可验证性(RQ3)
论文给出一个"可验证性阶梯":无持久记录 → 检查点(deepagents:为恢复而非证据存在,恢复时还会改写历史)→ 仅追加会话文件(pi:仍是进程私有的可变文件)→ 运行时可重构(dsh:最高,但文档自己承认 ctx.tools.restrict() 是"可见性组合而非权限边界")→ 外部可验证的防篡改记录(空缺)→ 域溯源(空缺)。
三家全部止步于"外部可验证线"之下。作者解读:这不是疏忽而是预测性缺口——三家的受众都是"终端前的开发者",这个受众不需要第三方可验证性,所以收敛在此停止;而协议层(Autogenesis 等)自上而下规定的恰是这个。下一个 harness 的差异化轴,就在这里。
五、评估指标与实验证据
作为定性研究,本文没有 benchmark 分数,其"实验设计"是围绕可信度构建的证据体系。理解这套设计才能理解结论为什么站得住。
5.1 量化锚点(可复核的硬数字)
| 证据 | 数值 | 支撑的论点 |
|---|---|---|
| pi agent 包 / 循环文件行数 | 2,368 / 796 行 | 极简哲学的可验证性;循环无 try/catch |
| pi 外围代码 | 146,170 行、十包 | “加法"轨迹的体量 |
| pi compat 目录 | 2,998 行生成器、约15个兼容 flag/单一格式 | 模型怪癖数据化的深度 |
| dsh 驱动器 | 515 行 | 循环本身是配置行的字面证据 |
| dsh 插件数 | ~230 个 | 插件绝对主义 |
| deepagents PR #4859/#4929 | 删除内置工具散文、移除 todo 中间件 | 减法轨迹的 commit 证据 |
| dsh 的 llm-pi-ai | 直接依赖 pi 的包 | 字面复用的字面证据 |
| 复现缺陷 | 2 个沙箱复现 + 1 个上游合并修复 + 1 个 filed issue | 论断获上游确认 |
5.2 为什么这套设计能证明论点
- 先验维度防拟合:比较维度表在细读之前固定(并尽量对齐最近邻研究的 12 维),防止"先看数据再造框架”;
- pinned commit + file:line:所有论断可在钉死的修订版上一致重查;
- literal replication:deepagents+pi 归纳模型 → dsh 作 held-out 检验,模拟"训练/测试分离";
- 复现与上游确认:缺陷不是纸面推断而是沙箱跑出来的,其中一个还被上游确认合并——外部校验;
- 诚实的局限性披露:明确说明 N=3、dsh 读得较浅(文档级论断已标注)、五要素是从两个奠基案例中归纳的(构造效度风险已声明)、作者自披露可验证性维度与本人研究兴趣相关。
这不是"跑分式"证明,而是让每个断言都可被任何人复核的证明方式——与论文本身主张的可验证性形成微妙互文。
六、效果优势的根源解释
本文的"效果"是论证质量而非跑分:为什么这套三案例研究能得出可信的收敛结论?根源在三条机制设计。
因果链一:最大差异选取 → 收敛信号的纯度。 如果选三个互相模仿的 harness,发现相同要素毫无信息量。选三个哲学、组织形态(风投支持的框架公司/两位独立工程师/前沿实验室)、语言(Python/TypeScript)都对立的案例,相同要素的出现才可归因于共享选择压力而非同源。这是实验设计里"控制混淆变量"的质性版本。
因果链二:轨迹证据 → 因果方向。 静态快照只能说"它们现在像",commit 考古学才能说"它们从不像变得像"——deepagents 的减法(废弃自研提示/删中间件)与 pi 的加法(拒绝的东西以数据回归)方向相反、终点相同,“相向而行"的图景只有轨迹证据能画出。这把相关性升级成了有方向性的演化证据。
因果链三:机制分解 → 结论免疫"抄袭"质疑。 收敛研究最容易被质疑"它们只是互相抄”。作者不回避反而主动分解:平行发现(不同压力源头)、扩散(公开约定模仿)、字面复用(依赖包)三种机制各自成立、互不削弱论点——因为论点不是"独立发明",而是"相同形状在共享压力下反复出现"。无论哪种机制,都支持"这些形状是已解决的"这一结论。dsh 复用 pi 恰是论文自己推荐的工程动作(“采用它,别维护你自己的版本”)在项目之间的现场演示。
反事实推理:如果去掉"先验维度"设计,研究者可以在细读后挑五个"恰好都存在"的要素拼成模型——结论会退化为不可证伪的叙事。如果去掉 held-out 检验(第三案例),五要素模型只是两案归纳的假设。两者共同把"讲得通的故事"变成"可被否证又未被否证的模型"。
七、必要知识反推
假设一个完全没有背景的人要完成这项研究,他最少需要知道什么?
7.1 领域知识层
- Harness 的构成与运作:执行循环、工具中介、上下文管理、状态持久化各是什么、在代码里长什么样——不能读懂这几个部件就无法做任何行级判断;
- 三大产品的设计哲学谱系:LangChain 式中间件栈、极简主义、插件化运行时各自的拥趸与理由——否则"最大差异选取"无从下手;
- 生产级 Agent 的真实痛点:崩溃恢复、上下文溢出、模型间的怪异差异——不知道这些压力,就无法识别哪些架构要素是对压力的回应。
7.2 方法论知识层
- 多案例研究设计(Yin 的 Case Study Research、Runeson & Höst 的 SE 案例研究指南):literal replication、最大差异选取、构念效度/内部效度/外部效度威胁分析——这是整个研究骨架;
- 开源软件架构研究传统(《The Architecture of Open Source Applications》):如何用叙事+行级证据写架构分析;
- 语法推断/趋同演化式的类比框架:识别"形状反复出现意味着什么"的推理模式。
7.3 工程知识层
- 读大型代码库的能力:在十数万行的 monorepo 里定位关键文件、读懂 LangGraph 中间件与 TypeScript 服务定位器;
- commit 考古学:从 PR 标题、废弃说明、代码注释里重建演化叙事(如"harness 不再提供自研基础提示"这句话就是减法轨迹的直接物证);
- 沙箱缺陷复现:构造
//secrets绕过与节流误判的最小复现,并向上游提交合格的 issue/PR。
7.4 知识融合的关键节点
真正的化学反应发生在三个节点:(1)把 ML 的 held-out 验证逻辑嫁接到质性多案例研究(第三案例作检验集);(2)把生物学趋同演化的"问题形状决定形态"视角嫁接到软件架构比较(收敛 ⇒ 形状已解决);(3)把缺陷分析反转为架构证据(断层线聚集在不可逆操作上 ⇒ 指向可验证性缺口)。三个融合点分别支撑了 RQ2 的可信度、收敛的解读、以及 RQ3 的预测。
八、论文中可以提取的通用性灵感
灵感一:形状反复出现 = 问题已被解决,采用它而不是捍卫自己的版本。 论文证据:五要素在三个对立哲学下复现;dsh 直接依赖 pi 的包作为 provider 层。 推广场景:前端状态管理(各家库收敛到相似 API)、数据库(LSM 树成为写密集存储的标配)、微服务框架(sidecar 模式普及)、CI/CD 流水线设计、任何有多个独立实现竞争的技术领域——当对手和你在同一压力下长出相同器官,该器官就是"已付过三次学费的答案"。
灵感二:把"模型/环境的怪癖"存为数据,而非写成代码分支。 论文证据:pi 用 2,998 行生成器维护约 15 个兼容 flag 的怪癖目录,deepagents 用 profile 类、dsh 用运行时解析器——同一思想三种序列化;deepagents 的减法轨迹正是把" coached in code"的怪癖外置为数据。 推广场景:多供应商 API 对接(把各家接口差异做成配置表)、跨浏览器兼容(feature table 替代 UA 嗅探 if)、多租户系统定制、游戏引擎的平台适配层、任何"宿主差异多而稳定"的集成场景。
灵感三:历史只能追加,不能改写——可审计性来自不可变性。 论文证据:三家都学到"改写历史是陷阱",形成 view < append-only < event-sourced 的强度阶梯;三例缺陷中三例不可逆损失都涉及"覆写了不可恢复的东西"。 推广场景:数据库 WAL 与事件溯源、金融交易流水、协作文档的 operation log、实验记录管理(ML 实验追踪系统)、甚至个人知识管理——所有需要"事后说清楚当时发生了什么"的系统,append-only 都是底线设计。
灵感四:贵的东西恰好是不可逆的操作——把工程预算花在"不能走回头路"的地方。 论文证据:四条断层线中三条的损失是不可逆的(递归删除、历史覆盖),唯一可恢复的只是崩溃。 推广场景:安全工程(不可逆操作的二次确认与审计优先级最高)、数据库运维(DROP TABLE 类操作的事前备份纪律)、产品发布(不可撤回动作的灰度机制)、自动化交易(熔断器放在清算前而非清算后)。
灵感五:预测一个领域的下一步,看"全体参与者都缺什么、而局外人正在呼吁什么"。 论文证据:外部可验证性在三家全部缺位,但协议层提案(Autogenesis)把它放在中心——自上而下的需求与自下而上的空缺之间的不对称,是预测性缺口。 推广场景:前端框架演进(类型安全曾是缺口+TC39 在推进)、AI 安全(对齐研究的呼声与产品现状)、隐私计算法规与工程实践的落差、电动车充电协议——凡是"论文在规定、产业没实现"的维度,就是下一个竞争轴。
灵感六:诚实地分解"收敛"这类强结论,比宣称独立发现更有说服力。 论文证据:作者主动披露 dsh 复用 pi、主动分解三种收敛机制、主动标注自己研究兴趣与结论维度的相关性。 推广场景:任何实证研究写作(竞争性解释的预先排除)、投资尽调(把"巧合"与"抄袭"与"必然"分开评估)、技术选型报告(相似方案的出现是独立演化还是同一来源辐射)。
附录:一句话总结
三个从对立哲学出发的 harness 相向而行,汇聚成"商品化循环 + append-only 账本 + 怪癖数据化 + 渐进披露 + 显式缝隙"的中间形态——这些形状是问题付了三次学费买来的答案,直接采用;而它们全部缺失的外部可验证性,就是下一个 harness 将与之不同的地方。正如论文标题借《三国演义》开篇所言:分久必合,合久必分——收敛的尽头,新的分歧已在酝酿。