← 返回文章

一次生产发布中,我交给 AI 智能体的工作,以及自己保留的三项决定

发布后期,智能体已经能够回答授权提示、放行检查点。我保留发布时间、最终切换和生产负载预算三项决定,并回看跨厂商审查的价值,以及哪些指令真正说清了授权边界。

一周开始时,每次生产操作都要等我按下 y。一周结束时,智能体已经能够核对授权内容、放行检查点,我只保留三类决定:什么时候发布,是否执行最终切换,以及生产环境可以承受多少验证负载。

精确比较可以交给智能体,发布时间、最终切换和生产负载则由我决定。等待的代价、不可逆操作和预算,仍需要有人负责。跨厂商审查也确实有价值:约 60 份结论中,约 40% 阻止了改动继续,拦下了几个本会在生产环境暴露的问题。不过,审查不能替代真实平台演练,也需要明确的停止条件。

从每次按 y,到明确授权范围

最初,每次生产写入都停在 Proceed? [y/N]。协调智能体写好 Shell 脚本,交给我运行,让我比较一段 64 字符的摘要值,只有完全相同才输入 y。

我问:为什么精确比较还需要我来做?其实智能体比我更适合比较字符串,缺的是授权。说清这一点后,我们调整了分工:

  • 我不再代跑智能体写的脚本。已经委托的步骤由智能体执行;尚未委托的步骤,我批准一句范围明确的操作说明。
  • 授权提示交给上一篇介绍的精确匹配执行器。
  • 检查点交给协调智能体放行,每次批准绑定证据哈希。

每天数小时的交接因此省掉了,也让我看清了真正需要自己负责的决定。

逐条回看我的真实指令

下面保留我在发布期间发出的原话,包括拼写错误。多数指令有效,也有几条没有限定好范围。

六条真实指令的评价:四条正确,一条部分正确,一条不太妥当
fig 01 六条真实指令的评价:四条正确,一条部分正确,一条不太妥当

“why you do not have the confidence to check whtehre the prompt exactly matches, why you need a human to verify that”——问得对。 这区分了能力和权限。智能体并非不会比较,而是没有得到许可。一旦明确授权,精确匹配执行器就接管了确认步骤,不再需要数小时的人机交接。

“why you keep delaying it to tomorrow. do it today”——要求得对。 智能体优先避免出错,但总得有人承担等待的成本。那天晚上就开始执行,夜里碰到了一个新的平台限制。再等一天也不能避免这个限制,只会晚一天发现。

“auto-approve the fresh plan if counts match”——这条最有效。 授权附带了程序能检查的条件:对象数、引用数、零阻塞项、零删除。智能体知道何时可以批准,何时必须停止。

“why do you need so many passes” / “It causes me upstash memory if you pull very oftent”——预算意识对,术语说错了。 消耗的是请求额度,不是内存。但验证确实需要预算:原计划对线上网站完整检查五轮,每轮约一小时,每轮都会读取数据存储数千次。

“you shall just do it yourself, drive it from there”——只对了一部分。 委托下一步操作是对的,但那一步会删除生产数据存储中的 379 个键,我没有说清范围。之所以没有失控,是因为智能体自行将授权绑定到了试运行(dry run)得到的精确摘要值和键数。更完整的要求应该是:“run the reset yourself; approve only deletions=379 and this digest; stop on anything else.” 委托操作时,同一句话就应该说明边界。

“pause any codex run”——不太妥当。 “Any”包含了另一个智能体与这次发布无关的后台工作。协调智能体用 SIGSTOP 冻结了这些进程,另一个会话里的看门狗将其中两个判定为卡死并终止。更好的说法是:“stop starting new Codex runs; let the in-flight ones finish.” 必须明确是哪些任务、以什么方式停止。“暂停”对不同进程可能有不同含义。

有效的指令往往有两类:追问原因,暴露隐藏的假设;或者给出可以核验的授权条件。最弱的几条只指定了动作,没有限定范围。

我保留的三项决定

第一,发布时间窗口。 智能体的谨慎不断把计划往后挪:重新固定版本、重做计划、等明天早上。我要求当天执行后,它们发现有一个阶段当晚就能开始,也确实开始了。避免出错有价值,但等待也有成本,需要有人决定如何取舍。

第二,不可逆的域名切换。 将域名指向新部署,需要我明确批准。我提前给出一次授权,范围只覆盖那次会话的切换。这样就不会在周六中午因等待我回复而卡住,同时决定权仍然由我保留。

第三,生产负载预算。 切换后,原计划对线上网站进行五轮完整验证。每轮向站点函数发送数千次请求,每次又会读取有月度请求额度的 Upstash。我问为什么需要这么多轮,才发现原计划假设每轮只要几分钟,实际却要一小时。完成两轮无误的检查后,我结束了重度监测,改为每 30 分钟检查十个 URL。验证会消耗资源,预算负责人必须明确何时停止。

独立审查值在哪里

七天的 60 份审查结论:25 份因 CRITICAL 或 HIGH 问题阻止推进,33 份通过,另有 2 份其他结论
fig 02 七天的 60 份审查结论:25 份因 CRITICAL 或 HIGH 问题阻止推进,33 份通过,另有 2 份其他结论

这次由 OpenAI Codex 实现,另一家厂商的 Claude Opus 审查;只有 CRITICAL 或 HIGH 问题会阻止推进。

它拦下了几个会影响发布的问题:

  • npx 在伪终端内等待安装确认。这会卡住首次上传,留下需要人工修复的预留记录。
  • 回滚处理程序收到 SIGTERM 时,会和日志管道一起退出,恰好在需要回滚时失去保护。
  • 回滚报告成功,却没有重新读取别名验证实际指向。
  • 恢复命令无法接着完成封存过程中崩溃的操作。

但它没能发现真实平台上的 Upstash Lua 限制和 Vercel 保留查询字符串的重定向行为。审查读取代码、运行本地测试,真实环境的依据仍然要通过演练补足。

每轮审查花 10–20 分钟,部分改动要审两三轮。审查模型也曾出错:它建议增加一项回滚后永远无法通过的检查,又在下一轮拿出证据,指出了自己建议的问题。要求每条发现提供证据,才能让错误的审查意见也被纠正。

可复用的审查提示骨架

Review <commit> (parent <sha>) in <repo>. It runs against PRODUCTION <when>.
Do it yourself, synchronously. READ-ONLY w.r.t. production: never run <list of write commands>.
Context (verified facts): <what's already proven, with numbers>.
Focus, highest stakes first:
  1. <the failure that would hurt most, phrased as a question to answer>
  2. <rollback / fail-closed paths: signals, pipes, partial failure, readback>
  3. <is every guard actually tested? mutate 3-4 guards, report killed/survived>
Output: findings tagged CRITICAL/HIGH/MEDIUM/LOW with file:line and a concrete fix;
at most ~8 real findings; MEDIUM/LOW get a one-line "why not blocking".
End with exactly: VERDICT: READY TO COMMIT — <C>C/<H>H/<M>M/<L>L  or  VERDICT: NOT READY — …

这里最重要的是三个要求:

  • 先说最担心哪类失败, 让审查把时间用在高风险问题上。
  • 要求实际改动防护条件来验证测试。 测试通过,不代表防护失效时测试一定会失败。
  • 以脚本能解析的结论行收尾, 让是否放行由程序检查。

审查何时可以结束

  • 只有 CRITICAL 和 HIGH 阻止推进。MEDIUM、LOW 放入遗留事项清单,每项用一句话解释为什么当前可以接受。
  • 如果一轮阻塞项全部只是测试完整性问题,没有发现生产缺陷,就停止无限补测。列出已有测试通过变异验证覆盖的不变量,请审查模型指出一类确实新的不变量,或者接受现有测试。总能再想到一个测试,并不意味着需要无休止地迭代。
  • 审查深度随风险调整。只改一行的配置连接修复,可以做十分钟的定向审查;新的授权机制,则需要完整审查。

下次仍会沿用的分工

智能体负责实现、跨厂商审查、协调执行和运行演练;我负责发布时间、最终切换和生产负载预算
fig 03 智能体负责实现、跨厂商审查、协调执行和运行演练;我负责发布时间、最终切换和生产负载预算
工作 负责人
先写测试,再实现 实现模型
从对抗角度审查 另一家厂商的模型;限定范围,输出可解析的结论
执行各阶段、放行检查点、回答授权提示 协调智能体,依据精确匹配和证据哈希
核实平台实际行为 在真实后端演练;人限定范围,智能体执行
发布时间、最终切换、生产负载预算 我

智能体可以承担生产发布中的绝大多数工作。等待多久、接受何种不可逆后果、花多少预算,把这三项决定写清楚,明确交给一个人负责;能够通过精确比较完成的工作,则交给智能体。

这三篇记录的是同一套分工如何逐步形成:第一篇补上真实后端演练,第二篇让执行器在条件不满足时停止,这一篇则明确哪些比较可以委托,哪些决定由我承担。