Agent Harness 源码拆解(九):Memory 与扩展——记忆怎么存才不越权,扩展怎么留口才不失控
这是系列的最后一篇。前八章把 harness 的骨架拆了一遍,最后一块拼图是两个”对外”的边界:记忆(agent 记住的东西)和扩展(别人给 agent 加的东西)。它们共享一个危险——都在把外部信息送进 agent 的决策里,处理不好,记忆会越权成命令,扩展会变成绕过权限门的后门。
记忆:它自己必须声明”我不是真相”
grok-build 对记忆的第一条设计原则,直接写进了提示词:“记忆是历史不是真相”,每条记忆还自带日期。为什么?因为模型有个坏习惯——把”曾经记录过的事”当成”现在成立的事”。记忆系统要做的第一件事,就是让它自己声明不可信。
它还有一个工程上值得抄的纪律:两代管线物理隔离,互不读写。v2 记忆和 legacy 记忆不共享文件、不共享搜索、不共享 flush——否则合并逻辑会渗进所有代码路径。v2 的布局是三件套:topics(维护的主题笔记)、observations inbox(新观察的收件箱)、生成的只读索引。
配套的还有 Maka 的一条:目录进提示,正文按需加载。记忆条目只把索引/摘要进系统提示,全文靠工具按需读取——这和工具系统的”默认少、按需开”是同一笔账。
记忆越权的反面案例是 CodeWhale 明确防御的:它的记忆指引教模型把记忆读作偏好,不是命令。给模型任何”可自定义”的层(记忆、风格、人格)时,同时给它”我绝不覆盖什么”的合同——风格层才不会变成行为层。
扩展:进入的是既有收口,不是平行宇宙
CodeWhale 对扩展的立场最鲜明,一句话:扩展进入的是既有收口,不是平行宇宙。MCP(外部工具)、Skills(指令知识)、Plugins(能力打包)三个扩展面,接入点是同一个——同一套工具目录(eager/deferred)、同一套九层审批、同一条 KV-cache 契约。它文档里写得很直白:reviewed 的 plugin 贡献 MCP servers 时,”without creating a second transport or approval system”。
这条的迁移价值极高:扩展面再多,审批、缓存、授权都只有一份实现,审计面不随扩展数量膨胀。反过来,每给扩展开一条”捷径”(绕过审批、绕过缓存、绕过工具目录),就是多一个不受控的后门。
pi 的扩展系统是另一条路线:40+ 个类型化事件 + 一个注册面,扩展用 jiti 运行时加载 TypeScript,不需要编译步骤,内置扩展和外部扩展用同一个 API——“吃自己的狗粮”。它把策略全下放成扩展(权限门、plan mode、沙箱都是扩展),核心只留机制。