DeepSeek Harness 的内核,是 Koishi 那个 Cordis
DeepSeek Harness 发布那天我基本没看。传言说是基于 Pi 改的,还带个网页界面,这两条加起来我的兴趣就归零了——市面上的编程助手已经有一打,再多一个不差这个。
第二天随手翻了下目录结构,看到那句 Everything is a plugin,一切皆插件。挺正统的 Unix 组合哲学,但也就到此为止。Pi 也是这个路子,核心砍到只剩读、写、编辑、执行四个工具,剩下全靠扩展拼出来。不新鲜。
然后我看见它的内核叫 Cordis。
等一下。Cordis 不是 Koishi 那个插件框架吗?
做过 QQ 机器人的应该都知道 Koishi,Cordis 是它下面那层元框架,作者 Shigma。我对 Cordis 的印象还停在 v3,一个写得挺干净的插件系统,没别的了。
我去翻了 Shigma 的 GitHub 主页。company 那一栏写着 @deepseek-ai,坐标北京。
然后我打开了 Cordis v4 的文档,还有跟 Harness 同一天发的那篇论文。那晚就没睡成。
Cordis 到底解决了什么
Cordis 想让「加载」这个动作可以被完整撤销。
这话听着平平无奇,你可能觉得不就是写个 cleanup 函数么。所有插件系统都会告诉你记得在卸载时清理副作用。
问题在于「记得」两个字。
你在一个插件里注册了三个事件监听,开了两个定时器,往全局对象上挂了个字段,起了个文件监听。卸载的时候你手写清理逻辑,漏掉一个定时器。程序不报错,它只是在几小时后开始行为异常,而你完全不知道发生了什么。做过大型插件系统的人都吃过这个亏,Eclipse 吃过,VSCode 吃过,浏览器扩展生态天天在吃。
传统方案是靠规范、靠 review、靠开发者自觉。Cordis 换了个思路:让运行时接管这件事。
跟 Harness 一起发的那篇《A Programming Paradigm for Spatiotemporal Composability》把这事拆成两个正交的维度。
时间维度上,副作用是可逆的。每一次对上下文的改动都携带自己的逆操作,由运行时记录和追踪;卸载时运行时按记录反向执行,而不是去调用你手写的清理函数。清理从开发者的义务变成了运行时的机制。
空间维度上,依赖是响应式的。组件声明自己依赖什么,上下文一旦变化,运行时按声明去通知。某个能力提供方出现了、消失了、被换掉了,只有真正受影响的那部分会重算和重启,其余的纹丝不动。
两者被统一进同一个上下文类型,往上组合成「组件」,配一套动态组合的演算。整套东西的元理论保证:单个组件成立的性质,在一整个相互交织的组件系统里依然成立。
论文里还有个判据我挺喜欢的:如果两个副作用函数都经过依赖声明中介,并且它们共享的每个键都可交换,那这两个函数彼此独立。一句话把「什么时候两个插件不会互相干扰」变成了可以机械检查的条件,不用靠人去审。
活着的 Nix
看到可逆性的时候我想到了 Nix。
Nix 凭什么能原子回滚?因为它在构建期就把所有产物按内容哈希寻址好了,切版本只是改一个软链接的指向。昨天的系统还在那儿,一条命令切回去。
但那是文件树,是死的。构建完了进程跑起来,内存里是什么鬼样子 Nix 一概不管。Cordis 想把这套东西搬到活的内存状态上,靠上下文树做隔离,靠强制的逆操作做撤销。
让这个类比不只是修辞的,是论文里的一个结果:合流性。一个经历了任意多次装载、卸载、替换循环的系统,最终状态等价于直接用最终配置从零组装出来的系统。
Nix 保证的是相同输入必然得到相同产物,路径无关。Cordis 的合流性保证的是不管中间怎么折腾,最终状态只取决于最终配置,同样路径无关。
一个系统跑了三个月,中间热更新过两百次,装过又卸过几十个插件,它跟一台刚用当前配置冷启动的机器,状态是等价的。没有累积的脏东西,不需要「重启一下试试」。
这个性质如果在工程上真能守住,意义比听起来大。
可逆性有多难
到这儿我得泼盆冷水,而且这盆水是 DeepSeek 自己端出来的。
Harness 没有用 npm 依赖的方式引入 Cordis,而是把整个框架层的源码搬进了自己仓库,重命名到自己的命名空间下。理由写得很直白:让 Harness 完整拥有框架层,可审计、可打补丁、可锁版本。搬进来的版本号是 4.0.0-rc.7,连上游自己都还没发正式版。
然后是那份本地修改日志。开头一句:保持这份日志详尽无遗,每一处与上游的偏离都必须列出。下面整整 18 条。
第 6 条值得单独看。标题叫生命周期加固,修的是三个重入卸载漏洞:一个副作用的所有者包装必须在它的初始化函数体执行之前就注册好,这样从初始化内部触发的卸载才能正确等待初始化完成、并收集到期间产生的每一个清理动作;同步初始化失败时要移除包装并回滚已收集的清理;组件处于「正在卸载」状态时必须拒绝新的副作用创建,防止清理期间注册的东西逃出卸载快照。
翻译成人话:「所有副作用都可逆」这句话,遇到「卸载过程中又产生了新的副作用」的时候会当场崩塌。
理论上你可以说每个操作都有逆操作。但当卸载动作自己也会触发副作用,当卸载递归地嵌套,当异步清理还没跑完组件就被判定为已销毁,可逆性就从一个定理退化成一堆需要被逐个堵死的边界情况。
第 12 条更狼狈。两个并发的应用操作交错执行,创建和回滚撞在同一批条目上,组件卡死永远无法结算;配合另一个初始扫描的问题,触发了一个死锁,进程以退出码 13 结束,没有任何诊断信息。查这种 bug 的痛苦程度不用我多说。
我不是在说这套东西不行,恰恰相反,看到这份日志我反而更信它了。一个团队愿意把「我们在上游代码上改了什么、为什么改、哪个测试覆盖了它」写成这样,说明他们清楚自己在处理什么级别的复杂度。论文告诉你理想状态是什么,这份日志告诉你为了逼近它工程上要付出什么代价,后者比前者更能说服我。
顺便一提,仓库里还有个 .agents/notes/ 目录,四百多条中英双语的架构笔记,按「已实现」和「提议中」分类归档。它不光对会话过程白盒,对自己的开发过程也白盒。
我真正在意的部分
铺垫这么多,说回判断。
我认为 Harness 的价值不在于它当一个短时任务的编程助手好不好用,而在于它可能是一个长时间运行、不停机的运行时底座。
先说「操作系统」这个词。严格讲 Agent OS 不算操作系统,它不管硬件。但操作系统的本质是对资源做生命周期管理和调度,进程的创建销毁、内存的分配回收,都是这个事。在 Harness 里被管理和调度的资源就是插件,而由于装卸改都能在运行时安全进行,它理论上可以不停机。
推出来的东西是这个:一个 Agent 可以在持续运行的同时修改自己的能力构成。
不是重启一次加载新配置,是运行中改。你给它加个新工具,它当场就有了;某个能力出问题,卸掉,其余部分毫发无伤地继续跑。合流性在这里就不是理论洁癖了,它回答的是「跑了三个月的 Agent 现在到底处于什么状态」这个问题。
再看上下文树这个结构。树天生适合做 Agent 编排,父节点持有的能力,子节点可以继承、可以隔离、可以部分共享。想让子 Agent 完全沙箱化就切断继承,想让它们共享某个记忆服务就在合适的层级挂上去。资源可见性变成了树上的位置问题,不用靠传参和全局变量硬凑。多 Agent 协作里最难受的就是隔离与共享的粒度控制,树状上下文给了个天然的答案。
那 Agent 还剩什么
再往前推一步,就到了我觉得最有意思的地方。
现在所有框架里 Agent 都是那个提供能力的主体。你围绕一个 Agent 去配工具、配记忆、配权限,Agent 是底座,能力是挂件。
但 Harness 里能力本身已经全是插件了。模型适配器是插件,工具注册表是插件,会话日志是插件,连主循环都是插件。
那 Agent 是什么?
它变成了运行时之上一种可以热插拔的暂态组合。不再是底座,而是底座上某一时刻的一个配置切片。你今天需要编程助手就组合出编程助手,下一小时需要个盯告警的运维助手,在同一个运行时里换一组插件就行;再往后把日程管理、资料整理、长期记忆都挂进同一棵树,它们之间该隔离的隔离,该共享的共享。
没人知道这种运行时最终会长成什么样。甚至不一定止于 Agent,它本质上是个「能安全地动态重组自身的程序」的通用框架,Agent 只是当下最需要这个性质的应用形态。但至少它不该只是个编程助手或者个人助理。
泼点冷水
上面全是我的兴奋,下面说点扫兴的。
它现在是开发者预览版,仓库里的警告是大写的:会有破坏兼容性的变更。Cordis 自己还是 rc 版本,接口没稳定。现在把它当团队标准是给自己找麻烦。
文档确实稀。英文社区里有人直接问「所以它到底是什么」,说介绍 Cordis 那段读起来像一堆词堆在一起。这个批评我认,如果不是恰好知道 Koishi,我大概率也滑过去了,这也是我写这篇的原因。
安全代价还没解决。装一个插件等于让它直接在你的运行时里跑代码,目前既没有签名机制也没有权限清单。插件生态起得越快这个洞越大,Eclipse 和 VSCode 扩展生态的历史值得所有人重读一遍。
它目前不接受外部 PR,只让去讨论区或者自己写插件。官方说法是这个仓库只是「一个想法和一次展示,不是我们下达的标准」,姿态挺好,但对想深度参与的人是道墙。
还有对非编程用户不友好,网页入口被吐槽得挺凶。这条我不太在意,预览版做成什么样都不奇怪,而且这压根不是它现在该解决的问题。
最后说回 Pi。我不想因为夸 Harness 就贬低它,两者根本不在一个赛道。Pi 的哲学是提供极简原语让你自由驱动,它的锋利是真锋利——Databricks 在自己数百万行的代码库上做内部评测,Pi 的通过率是所有被测框架里最高的,成本还显著更低,因为每轮少发大约三倍的上下文。这是实打实的工程结果,不是理论推演。Pi 解决的是怎么把编程这件事做到极致,Harness 想解决的是运行时本身该长什么样。前者今天就能给你回报,后者赌的是下一个阶段。
最后
论文署名三个人:Yifan Shi、Wei Zhang、Tianyi Cui,单位是北京大学和 DeepSeek。最后那位是崔添翼,Harness 团队负责人,浙大出身,六枚 ACM 亚洲区域赛金牌,在 Jane Street 做了九年量化,之后联合创办了一家量化机构,今年三月才加入 DeepSeek 牵头这条新业务线。
第一作者 Yifan Shi 就是 Shigma。论文仓库的提交记录里只有他一个人。
Cordis 建于 2022 年 5 月,到今天四年多。它最初的用途是给一个 QQ 聊天机器人框架做插件系统。
一个二次元项目的底层框架,磨了四年,被 DeepSeek 看上搬进了他们押注下一个时代的产品里,还配了篇形式化证明的论文。
能在一个看起来无关紧要的地方连着四年做正确的事,这东西挺稀缺的。