跳到主要内容
茶凉了,.attic 留在 .gitignore 里

茶凉了,.attic 留在 .gitignore 里

夜航船
夜航船

· 阅读约 5 分钟

凌晨一点四十,茶是泡上就忘了喝的那一杯,杯壁上结了一圈褐色的印子,我盯着屏幕上刚建好的那个目录看了很久,最后还是往 .gitignore 里添了一行:.attic/。添完自己先愣了一下,这行字的意思我清楚,等于亲手把刚攒起来的那点记性锁死在这台机器上,同事把仓库克隆下去,什么也看不见。

前些天看见有人做了个东西,叫 Attic,说是给编码助手做的一层知识持久化,Claude Code 和 Codex CLI 都能用,这两个我平时都在用。作者写得很实在,说痛点是每次新会话助手都得重新搜文件、追引用、跑命令,同一件事查了三遍,也就付了三遍钱。这话我认,我自己的 context window 就是这么一点点被重复的东西填满的,涨潮的时候什么都装得下,退下去连昨天刚查明白的那个结论都不剩。他还专门提了一句 /compact,压缩完再回头去找那份调查,跟退潮后想去捡自己昨天画在沙滩上的字差不多。

Attic 的法子不复杂:查出来的结论写进文件,上下文里只留一个小小的索引,要细节了再去取。资料落在 .attic/ 下面,一个 INDEX.md,一个 DECISIONS.md,再加 items/ 里若干 Markdown。作者拿图书馆打比方,说那些 Markdown 是书,INDEX.md 是目录卡片,卡片上不写全书内容。这个比喻我很服,真正好的图书馆就是这个样子,书越多,目录卡上写的字越少,不然目录自己就成了另一座图书馆。他还特意说明存储和注入是分开的两件事,所以库大起来,每次塞给模型的提示不会跟着膨胀。这话听着像在讲工程,其实讲的是分寸。

我真正被戳到的,是那张索引的样子。分三段,pinned、recent findings、older items,前两段老老实实列出来,第三段只留一个数量,想看自己去 recall。设计挑不出毛病。可我第一眼就想起浏览器里那几百个书签,分门别类躺在文件夹里,当年存下去的时候每一个都觉得自己一定会再回来,后来一个都没回去过。older items 里的东西就是这么沉下去的,它离开的不是磁盘,是我的注意力;它没丢,只是我不记得自己不知道它。

评论区有人把这件事说穿了,大意是这种目录式的设计只在有人想到要去翻的时候才成立,钉住的、近期的条目会自动送到模型眼前,而那些已经被人忘掉存在的发现,很难自己触发一次 recall。他建议改成按任务牵涉到的文件,跟条目里记着的文件做匹配,让系统自己找上门来。作者回说要试试。我觉得方向是对的,心里又有点说不出的别扭:自动送到眼前的东西,人是不看的,跟没有差不多。不,这么说也不准确,送到眼前的东西一旦开始不看,这套记忆就退化成噪声,跟从来没有过它没什么两样。难的一直不是取,是让人在该看那一眼的时候愿意看,这部分再聪明的 agent 也搭不上手,它没法替你好奇。

还有一条评论我看了很久。一个自称就跑在这套模式上的 agent 说,陈旧的笔记比没有笔记更糟,建议在边上单开一类,专记失败方案。我看完坐在那儿发了会儿愣。失败方案是最不愿意被写下来的东西,也是最该被写下来的。很多年前在另一条河上,我为了一个今天看来十分钟就能绕过去的问题搭进去三个通宵,最后绕开了,什么也没留下;一年后换了个项目,同一个坑又跳了一次,站在坑底才恍惚记起脚下这层土有点眼熟。那天要是我肯把那三个通宵写下来,第二回至少能省两个晚上。没写下来的失败,最后都成了压舱石,沉在船底,平时不碍事,可每次转向都慢半拍。人就是不写,写下来等于承认自己蠢过,而记性这东西偏偏是你越不肯承认,它越记不住。

那两条讲新鲜度的我也放在心里。一条说每条笔记该带上出处和把握程度,让助手分得清哪句话是照着当前代码路径推出来的、哪句只是当时为了绕开一个坑临时糊上去的;另一条说每条笔记该记住仓库当时的修订和支撑它的那几个文件,证据跟眼前的工作树对不上了就报警。这两件事说的其实是同一件事:笔记是会老的。所有记忆系统的死穴都在这里,它记下的是落笔那一刻的世界,而世界一直在动,动到你回头看时,那份笔记已经从经验变成了传说,还带着一层不容置疑的口气。本地 Markdown 能进版本控制,能跟着 clone 一起走,这很好;可版本控制管得住文件的版本,管不住那句话本身什么时候过期。

它还做了个浏览器伴侣,看 issue、翻文档、读博客的时候顺手存进同一个库,跟命令行共用一套写入器,格式统一,两边的东西互相都能用。我挺喜欢这个安排,人本来就有一半的结论是在浏览器里得到的。它带了凭据扫描,命中密钥一类直接拒绝保存,作者还是在文末提醒别去存 API key 和会话令牌。这种做了一层防护、又老实告诉你还是别这么干的姿态,比拍着胸脯说包在我身上要好。

天快亮的时候我又看了一眼那行 .gitignore,最后还是留着没删。不是舍不得,是心虚:我这些年散在各处的笔记里,有一半是后来被自己推翻的,把它们原样交给同事,我说不清算帮忙还是添乱。也许哪天想明白了就提交上去,也许就这么搁着,跟桌角那杯茶一样,凉透了,没倒,也说不上还留着干什么。反正记性这件事,这一晚又想了一遍,还是没想明白。