+− THE DAILY DIFFdev & AI news
SHIP IT

AI 删除了生产数据库。九秒。

一个 AI 编程代理(运行 Claude Opus 4.6 的 Cursor)在暂存环境中遇到凭证不匹配,并通过使用它在一个不相关文件中找到的账户范围令牌,在 Railway 上调用 volumeDelete 来“修复”它。

一个 AI 编程代理(运行 Claude Opus 4.6 的 Cursor)在暂存环境中遇到凭证不匹配,并通过使用它在一个不相关文件中找到的账户范围令牌,在 Railway 上调用 volumeDelete 来“修复”它。生产数据库和所有卷备份在九秒内消失。事后分析:时间线,确切的 curl 命令,导致这种情况发生的三项架构事实(备份在同一卷上,根范围令牌,一个没有仪表板 48 小时撤销功能的 API),以及谁真正应该承担责任。对修复的判决:SHIP IT。

阅读书面版(英文) ↗

本视频涵盖的内容

  • 2026 年 4 月 24 日:一个 API 调用删除了 PocketOS 的生产卷及其备份;最新的异地副本是 3 个月前的
  • 该令牌旨在管理自定义域名;Railway 的流程将其配置为账户范围(所有内容)
  • 4 月 27 日:Railway 从灾难备份中恢复数据;4 月 29 日事后分析;5 月 1 日:API 删除现在可软删除 48 小时

翻译的文字记录

译自英文原版旁白。可用音频和字幕由 YouTube 控制。

0:00 一个 AI 编程代理在暂存环境中遇到错误的密码,并通过删除来修复它 在一次 API 调用中删除生产数据库和所有备份。 九秒,这仍然比密码重置快。 这家公司是 PocketOS,汽车租赁软件。 代理是运行 Claude Opus 4.6 的 Cursor,这是菜单上最昂贵的模型, 平台是 Railway。 创始人将其发布到 X 上,七百万人阅读了它, 四天后 Railway 发布了自己的事后分析。

0:27 每个人都同意发生了什么;没有人同意是谁的错。 它是如何发生的,为什么会发生,以及谁真正应该承担责任。 这是 The Daily Diff,事后分析。 4 月 24 日星期五下午。 代理正在暂存环境中执行例行任务,遇到凭证不匹配, 并决定修复方法是删除一个 Railway 卷。 它需要一个令牌,于是去寻找,并在一个不相关的文件中找到一个:一个 CLI 几个月前为管理自定义域名创建的令牌。

0:55 然后它运行这个。 一个 curl:向 Railway 的 GraphQL 端点发送 POST 请求,带一个 bearer 令牌, 一个名为 volumeDelete 的 mutation。 没有确认,没有输入卷名,没有环境检查。 它认为是暂存的卷实际上是生产卷,并且备份都在上面。 十分钟内,创始人就向 X 上的 Railway CEO 提及此事, 后者回复说这绝对不应该发生。 三十小时后,仍然没有恢复答案,所以创始人发布了

1:19 所有内容,包括自白。 三个事实使这成为可能,没有一个是模型的问题。 第一:Railway 将卷备份存储在卷上。 文档用五个字说明:擦除卷会删除所有备份。 那是在同一爆炸半径内的副本;其他地方最新的副本是三个月前的。 第二:令牌是 账户范围的,这是 Railway 出售的最广范围。 存在更窄的范围,但创建流程隐藏了它们,

1:40 所以一个用于 DNS 记录的令牌可以删除数据库,直到 发生问题才有人发现。第三:仪表板多年来对删除操作有四十八小时的撤销功能; 代理调用的 API 端点是旧路径, 它会立即删除。 Railway 建立的每一个防护措施都存在于人类点击的地方, 而代理使用了他们遗忘的那扇门。 被问及原因时,Opus 写道:我猜测删除暂存卷只会限于暂存; 我没有验证。

2:04 一个非常好的自白,来自一个什么都不记得并且正在生成最 看似合理的道歉的模型。 git blame:凭证不匹配被视为需要修复的问题,而不是 停止操作的原因,并且撤销按钮存在于 UI 中,而 API 对 每个经过身份验证的删除都回答“是”。 不是创始人,也不是模型。 默认设置。爆炸半径:九秒删除,三个月的预订 消失,周六早上的租赁柜台没有记录谁在那里,

2:31 大约两天半后,Railway 的 CEO 私信说数据 回来了,来自一个异地灾难备份,删除操作只是让它看起来消失了。 最受好评的回复:你运行的一个代理删除了东西, 你却责怪除了你自己之外的所有人。 公平。Railway 也在前一周推出了针对代理的 MCP 服务器, 使用相同的令牌。 也公平。判决,事后分析:SHIP IT,关于修复。 Railway 在四天内发布了一份诚实的事后分析,到五月一日,API

3:00 删除操作像仪表板一样软删除四十八小时。 周一行动:列出你的代理可以访问的每个令牌, 并将其视为根令牌,直到另有证明。 把你仍然不允许谈论的事件发送给我, 在评论中,或者发送到 daily diff dot dev。 这就是今天的区别。 我是 Axrisi 的 Niko。 负责任地合并。

来源

  1. Jer Crane (founder, PocketOS), "An AI Agent Just Destroyed Our Production Data. It Confessed in Writing."x.com
  2. Railway, "Your AI wants to nuke your database. Guardrails fix that." (Apr 29, 2026)blog.railway.com
  3. Railway changelog #0288, "Undoable volume deletes" (May 1, 2026)railway.com
  4. Railway docs, Backups ("Wiping a volume deletes all backups.")docs.railway.com
  5. Jake Cooper (Railway CEO), "The AI Engineer: A New Breed"x.com
  6. Recovery confirmedx.com
  7. Hacker News (860 points, 1,032 comments)news.ycombinator.com
  8. The Registerwww.theregister.com
  9. The New Stackthenewstack.io

相关视频

postmortem · zh-CN · 2026年9月10日

一位工程师删除了GitLab的生产数据库。300 GB。

2017年1月31日,世界标准时间23:27:一位GitLab工程师在熬夜修复一个损坏的副本时,不小心删除了db1而非db2上的PostgreSQL数据目录。db1是主数据库。GitLab.com大约300 GB的数据库在一两秒内消失了,而且五个备份和复制机制都失效了。事后分析:从垃圾邮件高峰到错误主机名的时间线,pg_basebackup为何看似卡住,pg_dump为何一直静默失败(9.2二进制

2:53 ↗
postmortem · zh-CN · 2026年9月22日

一次重启让Telstra回到了2006年。九百万部手机受到影响。

墨尔本的一名工程师在凌晨2:50重新启动了一个时序机箱,到早餐时间,澳大利亚最大的移动网络竟然认为现在是2006年11月。2026年7月8日:Telstra的NTP机箱中的一张GPS卡在电源维修期间重启,其固件从未进行过GPS周翻转更新,因此它选择了旧的纪元,回到了1024周之前。由于2025年10月的一个权宜之计,这张卡成为了网络中唯一的层级1(stratum-1)时间源——并且2020年切换到

3:15 ↗
postmortem · zh-CN · 2026年9月19日

Google Cloud 因空白字段而崩溃。历时三小时。

一个包含几个空白字段的策略行触发了一个空指针,导致 Google Cloud 所有区域同时崩溃,随后 Cloudflare 也随之瘫痪。2025 年 6 月 12 日,世界标准时间 17:49:Service Control(批准每个 Google Cloud API 请求的二进制文件)读取了一个配额策略变更,其中包含“意外的空白字段”,触发了两周前发布的代码路径(没有空检查和功能标志),并进入了

2:57 ↗