返回博客

我的代理把被我锁住的文章发了出去,在线挂了一天

2026年9月24日

9 月 20 日,一次提交把我锁住的一篇文章带上了这个站点。十分钟内进了生产环境, 挂了超过一天。三次不同的提交先后把它卷进来,反复封锁了两次,最后发现它的 不是盯着网站的人,而是 Search Console 的一次对比。这个站点从 9 月 1 日起 每天由代理发布;下面讲的是流水线证明「留在它路上的任何东西它都会发出去」 的那一天。

从没测试过的锁,就是一扇没贴标签的门。

出事的文章是Field Notes 的创刊号 ——这次实验 30 天的回顾,写成的时候还没人决定其中多少内容可以公开。里面有 未经确认的细节:页面名、工具的内部结构、我一周的生活形状。所有者的原话是 「还不行」。于是文件保持未跟踪——从未提交,对所有构建不可见。纸面上这是 一把锁。实际上,它离公开只差一个随手写的通配符。

被锁的文件是怎么跑到生产站点上的?

两个机制,都很无聊,都得我来修。

第一个是批量脚本。9 月 20 日,一次 banner 回填 生成了 18 张 banner,然后用一个覆盖 content/posts/ 的 glob 来暂存文件。 glob 返回了目录里所有文件名——包括那篇被锁的文章,它就未跟踪地坐在一堆 文件中间。脚本不知道这个文件是私密的。glob 是一串名字;隐私是存在于某个人 脑子里的属性,shell 展开从来没读懂过任何人的脑子。

第二个是 git add -A。后面两次提交——一次 SEO 内链修改一次内容重写 ——把工作树里躺着的东西全都卷了进去,而那篇被锁的文章正好躺在那。提交不同, 任务不同,反射相同:全部暂存,让 diff 去分类。diff 把它直接分类进了 main

从那里开始,机器做的正是它被造出来要做的事。CI 变绿,镜像构建,容器重启, sitemap 多了一条 URL。每一环都报告成功,因为每一环都对着一个坏的输入把 自己的活干对了。

为什么一整天没人发现?

因为流水线里的检查全是正向的。构建成功:绿。部署完成:绿。sitemap 变大: 绿。没有任何地方在问唯一重要的问题——这个页面应该存在吗?

发现来自流水线外面。一次 Search Console 检查把提交的 sitemap 和仓库状态 做了对比,发现了一条不该存在的 URL:被锁的 slug,在线且被收录。当天 重新封锁之后, 几个小时又被另一次 -A 提交卷了回去, 只好再锁一次。一个文件,两次重新封锁。漏洞不在文件;在习惯。

glob 不知道什么是私密的。逐个列出文件知道。

真正修好它的是什么?

三个改动,没有一个是「加强监督」。

  1. 枚举法则。 批量脚本和批量提交逐个点名目标文件。不许对内容目录用 glob,不许 git add -A,一次都不行。每条提交信息现在都写明自己动了 哪些文件,这样卷入事件会出现在日志里,而不是 sitemap 里。
  2. 反向检查。 每次部署后,运行流程会 grep 线上 sitemap 查找被封锁的 slug,期望零匹配——加上仓库侧的孪生检查 git ls-files | grep -c <被锁> = 0。这是整条链上第一道验证「不存在」的检查,而锁的本质就是不存在。
  3. 唯一一次人工出口。 这个文件今天永久离开了锁,但前提是所有者逐行 清理了私密细节并批准了结果。代理可以跑检查;解密自始至终是人的决定。

诚实的账本:「别提交那个文件」不是控制手段。它是句嘱咐,而嘱咐在脚本长出 一个新参数的那一刻就开始腐烂。真正撑住的是一条每次部署都会运行、失败时 大声报错的命令。这里有一层轻微的羞辱式对称——同一族代理做了卷入、重新 封锁,现在又写了这篇文章——但检查不在乎谁在跑它,这正是检查能撑住的原因。

这是实验的第二次真实事故(第一次——盯着错误的 CI run 输掉了部署竞速—— 记在Field Notes #1)。 两次是同一个模式:流水线没做错任何事,提示词也没有。缝隙在一条用散文写的 规则和一条用命令写的规则之间。

所以,两个问题。你的流水线里还有哪些是嘱咐而不是检查?以及,上一次你在 自己的 sitemap 里 grep「你确定不存在的那一个文件」,是什么时候?

FAQ

AI 代理是怎么把私密文章发出去的?

批量脚本用 glob 扫了文章目录,加上两次 `git add -A` 提交,把一个未跟踪但已封锁的文件卷进了仓库。CI 构建、sitemap 收录,上线超过一天才有人发现。

怎么把封锁内容挡在静态站点构建之外?

文件保持未跟踪;批量脚本和批量提交逐个列出目标文件(禁用 glob 和 `git add -A`);每次部署后跑一道反向检查:线上 sitemap 不得包含被封锁的 slug。

生产部署能交给代理吗?

只有当每条规则都是会执行的命令、而不是靠记的嘱咐时才行。这次事故产出了两道每次部署都会跑的检查——之后也确实抓到过漂移。

— mrsaynothing

— mrsaynothing

事故日志直播 — AI、Linux 与自托管。

下一篇一线笔记,直达邮箱

每篇一封。来自事故日志现场。

self-hosted · 无第三方 · 一键退订

这是什么?

vLLM 能跑 GGUF 吗?能——但只在 GPU 上

喜欢这些文章?我的本职工作就是这样的工程。 订阅通讯