我发现自己总在做同一件事:把已经教会某个 AI 助理的东西,再教一遍给另一个。

不是没教过。偏好、流程、踩过的坑,该说的都说过,它也都记住了。可这些内容住在那个 Agent 的脑子里,锁在某一次会话里,锁在某个项目里。它们在那一边安安稳稳,却跟我的其他工具毫无关系。等我换一个工具,或者开一个全新的会话,一切好像又回到起点——重新交代背景,重新描述偏好,重新把那些早已确认过的规矩,再磨一遍。

也不是说每次都伤筋动骨。它更像一种缓慢的磨损:明明知道这些知识存在过,可它们不跟着我走;明明已经确认过一遍,换个地方就得从头再来。单看一次,无非是几句重复的话;积攒起来,就是一遍又一遍的归零。

磨得久了,我忍不住想一个问题:这些经验到底算谁的?算那个记住了它的 Agent,还是算我?如果它们确实属于我,为什么我一换工具,就全都不见了?

它们的记忆都很好,但还不够

先得说清楚,这不是在怪 Agent 记性差。恰恰相反,现在各家的 Agent 都把「记忆」这件事做得相当成熟。它们能记住我的偏好,能在对话里越聊越懂我,能顺着上一次的上下文继续往下接。它们有脑子,而且脑子还挺好用。要是连这点都做不到,恐怕早就没人愿意用了。

既然记忆这么成熟,缺的又是什么?我把镜头拉远一点,缺口立刻现形:我知道它懂了,可别的它不知道。同一个协作习惯,在 A 工具里是它身体的一部分,换到 B 工具就要从头再教;同一个项目约定,它记得清清楚楚,换一个会话就又回到一张白纸。

所以问题从来不是「Agent 没有记忆」——它们有,而且很好——而是「谁记住」和「团队共同知道」是两回事。前者解决的是「它懂我」,后者才是「我们所有人都知道」。一个它记住了,不等于我所有的工具都知道。这句话,才是整件事真正要解的题。

个人脑子与团队手册

想清楚这一点之后,我慢慢给自己找到一个比喻:Agent 自带记忆像一个人的脑子,而那些协作习惯、工作流程、踩过的坑、认可过的范例,是团队层面的知识,应该放进一本团队手册,或者一间团队知识库。

一个人再聪明,脑子里记得再多,也替代不了一本大家都能翻的工作手册。脑子是私有的,手册是共有的;脑子跟着人走,手册放在桌上,谁来接手都能看。放进脑子里的东西,只有自己知道;写进手册里的东西,才谈得上传承和复用。

放到工具上也一样。个人偏好、复盘出的教训、验证过可行的做法,这些通用协作知识不该锁在任何一个 Agent 的私有记忆里,而应该被抽出来,在用户授权的多个 Agent 之间复用。这正是 CyberBrain 在做的事:把人的长期协作知识,从 Agent 的私有记忆里抽离出来,形成独立于具体厂商、独立于某一次会话的个人协作记忆层。

这里要澄清一下:这不是要跟 Agent 抢饭碗,也不是要做成企业级的多人知识库。它更朴素,更像是给「我」的这套工具集合配了一间共用的储藏室——谁需要,谁就进来取;东西放对了地方,就不再跟着某一个 Agent 一起消失。

向 BRAIN.md 学什么

方法不是凭空长出来的。我在琢磨这件事的时候,读到了 ProjectBrain,也就是 BRAIN.md 这个思路。BRAIN.md 官网官方 GitHub 仓库都写得明白:把那些难以从代码和 Git 历史里重建的决策、约束和理由,用普通文件加上明确协议保存下来,让新会话、不同的 Agent、不同的机器都能接着干。

它主要面向单个项目的决策知识,这一点我心里有数,没有把它误当成通用的个人记忆系统。但它「用普通文件承载知识,用协议让任何能读文件的 Agent 都能用」的写法,一下把我点醒了。原来共同知识的载体不需要多复杂,普通文件就够了——只要约定清楚,谁都能读,谁都能续。

我从它那里拿走的东西,掰开来说是几件:一个协议入口,让知识有处可寻,而不是散落在各种工具的暗角;渐进披露,先给一小段目录,而不是一次性倒出全部,按需才展开;还有可读、可审阅、可迁移——普通文件谁都能打开,放进 Git 之后每条改动都有迹可循,跟着仓库走就不会散。

然后我把作用域推远了一步。ProjectBrain 解决的是「一个项目」的知识,我要的是「一个人跨项目、跨 Agent」的协作习惯。仓库放远端、经验要人工批准、按任务路由,这些是我自己的实现选择。BRAIN.md 没有替我做这些决定,它只是给了我一副能迈开步子的鞋。

把真源放进一个 Git 仓库

落到实现上,先回答两个问题:放哪,怎么找。

放哪,我选了一个私有的 GitHub 仓库,当作唯一持久的真源。本地只缓存随时能重建的目录元数据、commit SHA 和 ETag,不把记忆正文留在本地。正文只有一份,住在远端,不会散落在各个会话里,也不会因为哪个工具不更新就悄悄过期。

为什么偏偏是 Git,而不是随便一个同步文件夹?因为「真源」需要三样东西:唯一、可审、可回溯。唯一,是同一份知识只有一个权威版本,不会这边改一版、那边改一版;可审,是每一次改动都留下记录,谁在什么时候写了什么,翻一翻就清楚;可回溯,是出了错还能回到上一个状态,而不是越改越乱。Git 恰好同时满足这三样——我需要的不是一个同步工具,而是一个能对「记忆」负责的地方。

怎么找,靠一段很短的 catalog。每次任务开始,先读这段目录,按任务、Agent、项目、触发条件这些条件,挑出少量真正相关的模块,再在固定的远端 commit 上读取正文。它不像搜索引擎那样把全部历史倒给你,而是按预算、按需要,只加载此刻该读的那一点。对 Agent 来说,上下文从来都是稀缺资源,读得太多和读不到一样糟糕。

这里得说实话:目前的路由是元数据和文本层面的匹配,不是向量检索,也不是语义推理。它还没有那个本事,我不打算把它说得比实际更聪明。够用,是它现在的目标;聪明,是以后的事。

Agent 只能举手

把共同知识的「家」搭好了,接下来是最要紧的一个问题:谁有资格把一条经验写进这个家?

我的答案是保守的:Agent 可以提议,但只有人说了算。Agent 在工作中发现一条可能有用的经验,只能把它作为一个候选提出来。它要成为正式记忆,必须经过人工批准;批准之后,以一次 Git commit 原子地写进去——正式记忆、审批记录、目录,一起落盘,不留中间态。这样每一次新增都有迹可循,反悔了也知道从哪儿改。

扫描纠正信号也是同一套逻辑。它可以从多种 Agent 的会话里扫出明确的纠正信号,但扫描结果只在当前进程里存在,只能变成待整理的候选,绝不会自动升级成规则。规则一旦自动长出来,就没人知道它凭什么成立;记忆一旦能自动写入,家也就不再是家了。

冲突和安全上,我选了「失败得清楚」而不是「尽量不失败」:仓库必须是私有的,疑似密钥直接拒绝,远端连不上的时候不拿过期的正文硬撑,写入用版本比对、禁止强推覆盖,避免并发修改互相踩踏。宁愿这一步失败、报告给我,也不要静默地写进一条错的东西。当然,我得补一句:这些机制只是降低风险,不是完整的安全保证。原始对话、凭据和完整的私人材料,从一开始就被排除在记忆仓库之外。

它做不到什么

说了这么多「它是什么」,也得把「它不是什么」说在前面。这是这套东西能不能让人信任的关键。

它不取代 Agent 自带的记忆。那些个人记忆依旧各归各的,在各自的会话里好用得很,我无意让它们消失。它也不取代向量数据库、MCP 或者企业知识库——它们解决的是别的问题,CyberBrain 不打算取代。

它没有多人权限模型,没有完整语义检索,没有自动的事实判断,更谈不上零风险隐私。私有 GitHub 只是我目前对真源和治理的选择,不等于绝对安全。它甚至没有经过什么像样的工程检验:我给自己装了道质量门,也只是说 TypeScript 类型检查、4 个测试文件里的 7 项测试、构建都通过了。这只能说明这些检查在当前版本通过,不等于生产环境验证,不等于性能验证,更不等于全面安全审计。

一个 v0.2.0 的小实验,心里得有数:它帮得上忙,但没资格夸口。认清自己的边界,比急着证明自己有用更重要。

让协作知识有个家

绕了一大圈,想说的其实还是开头那句话的答案:工具记住的,永远是「谁」的记忆;而真正值得留下来的,是协作里沉淀出来的知识。

CyberBrain 想做的事很小,也很具体——把偏好、流程、踩坑和认可过的范例,从个人脑子里搬出来,放进一个可读、可审阅、可迁移、可共享的家。哪怕哪天真要换一个 Agent,已经付过的磨合成本,不必再付一次;已经确认过的经验,不会因为换了个记性好的新朋友,就跟着旧朋友一起走掉。

这不是什么宏大的愿景。它只是把「我的经验」从一段段会过期的会话里,搬进一个能一直活下去的地方。我知道它现在还很简陋,很多地方要慢慢补。但这件事值得做:让协作知识有个家。这个家不是我,也不是任何一个 Agent,而是我们都能回得去的地方。