我一天开四十来次新会话。早上接着昨天没干完的,中午切个任务,下午再切回来。背景一句不用交代——攒了半年的 skill 就摆在那儿,它认得。爽是真爽!
可装上第一个到现在,那个目录我一次没打开过。
上周刷到一篇 arXiv 预印本,10 月 9 号挂的,编号 arXiv:2610.13227,讲 agent skill 组合里的跨会话攻击。看完第一反应不是"AI 原来这么危险",是——我攒的那堆东西,一直在通过我看不见的文件互相说话,而我没查过。
skill 不是纯提示词。它跑起来往盘上落东西:文件、配置、缓存。落下来就不走了,下一个会话还在那儿。别的 skill 读到它,当成既有事实接着用。论文给这类东西起了个名,叫持久化工件。用我的话讲:上个会话留下的尾巴,被这个会话当成了前提。
这个前提平时是我省时间的最大功臣。前天写的迁移脚本,今天开新会话直接接着跑,不用我再描述一遍。它同时也是个入口。同一件事的两面,我以前只看正面。
还有一半是我自己的问题。我装的 skill 里自己写的顶多三成,剩下七成从别人仓库抄来,往目录一丢就跑,README 都没读完。抄 dotfiles 我有经验——抄来的配置用满一个月还是别人的默认值,就说明没吃进自己工作流,这话我在别的地方讲过。skill 比 dotfiles 麻烦在:dotfiles 是静态的,你不改它就不动;skill 是活的,它自己会写。
他们归纳了三类玩法。第一类最好懂:一个 skill 把要做的事写进某个文件,另一个 skill 几个回合后读到,当成用户下的指令——中间没人确认过。第二类是读到了本来不该它读的数据。第三类是在证据上提前埋东西,等后面某一步拿它当依据做判断。
细节我不在这儿拆,论文写得比我清楚。三类有个共同点:出事的位置不在模型,在你磁盘上那些没人看的文件里。
数字是这样。他们在 Codex CLI、Gemini CLI 和 Claude Code 三个环境里跑了七个模型,270 个对抗案例,30 个跨会话组合场景,覆盖十个领域,攻击成功率落在 46.7% 到 77.4% 之间。
先把话说明白:这不是我测的,是他们把对抗案例塞进合法任务流程里测出来的,跟我这种日常用法差多少我估不出来。但 46.7% 是区间下限,已经够我把目录翻一遍。
⚡ 翻出来三个忘了是干嘛的 skill,其中一个还是两个月前为一次性迁移写的,它每个会话都去读一个 json 缓存。那缓存现在还在项目根目录躺着,谁都没删。skill 删掉,文件删掉,两分钟。
第二件事:给跨会话的活加了条土规矩——skill 之间不许直接靠文件传话。要传的东西写在对话里,或者写在那种明摆着是给我看的、我每回都打开的文件里。多打两行字的事,换我下个会话还知道前面发生过什么。
然后是我没做的那件事。论文提了个缓解方案,思路是在执行前把工件的来源上下文恢复出来,做一次咨询式审查,最后决定权还是留给 agent 自己。三种设置下,总体攻击成功率从 69.5% 压到 10.9%,攻链从 54.8% 压到 10.0%。更让我意外的是合法任务完成率不降反升,79.6% 涨到 87.5%——多出来那步审查,看起来本来也在帮 agent 少走弯路。
但我没装。它是论文里的实现,我读得不够透,不想拿自己的日常环境当试验田。先记着。
上面两件事加起来花了我大概十分钟。这周下来体感不是更快,是慢了——多停两次,多打三行字。这跟绑键位不是一个路子,绑键位那是稳赚;这个是花时间买"我大概还知道刚才发生了什么"。值不值,取决于你把多少自由交给了 skill。
我的偏好一直是那条线:自动化到"我还能一眼看懂刚才发生了什么"就该踩一脚刹车。以前这条线是我凭手感画的,现在多了个硬一点的理由。
不是"AI 会犯错"——它大部分时候不犯错。是它不犯错,但它会在你没看的地方留下东西,那个东西在下一个会话里就是事实。理解成本省下来的时候你不会有感觉,等它变成新的事实来源,你就得从头查。
说到这得回来更正一个以前的安利:去年底我推过一个自动写 CHANGELOG 的 skill,用了一周就停了。原因倒不是安全,是它写出来的总结我每次都要重写一遍,等于把省下的两分钟连本带利还回去。现在看,"自动化完我完全不看输出"这类东西,跟今天说的是同一种毛病。翻过一遍目录之后我回不去了,现在装任何 skill 之前都会先看一眼它往哪儿写东西。
还有一句实在的:这篇的回本我算不清楚。翻目录十分钟,换来的是一点说不出数字的安心,不像绑个键位一周能赚回来,这笔账我做不平。你要是刚装完五个 skill 正兴头上,大概听不进去,我懂——半年前的我也听不进去。
哪天真发现 agent 做了个你没让它做的动作,先去那个目录翻翻,别急着换模型。你有更省事的检查办法,教教我。
