首页 实战 N° F3

我监督 agent 改后端,3 处关键决策我都没盯住,最后 prod 挂了 4 小时

Supervisor 模式的承诺是「90% 放手 + 10% 关键点介入」。我放了 90%——但我把 10% 全压在了「agent 主动报告」上。agent 不报,我也没问。

一句话总结:Supervisor 不是「让 agent 自己跑、你偶尔看一眼」——是「agent 自己跑、你在 4-6 个关键决策点必须主动盯」。我没主动盯,把”等 agent 报告”当成”监督”。

任务源头

2026 年 1 月,我接了一个 freelance 后端改造任务——一个电商网站要从 MySQL 迁到 PostgreSQL,包括 schema 改写、数据迁移、API 适配、缓存层重构。客户预算 $8K,工期 2 周。

我打算用 Supervisor 模式:

  • 让 agent 写 schema 迁移脚本(高重复、高风险 → 应该 Commander)
  • 让 agent 写 API 适配代码(中重复、中风险 → 应该 Supervisor)
  • 让 agent 写测试(中重复、低风险 → Trainer)
  • 关键决策点(数据迁移策略、缓存失效顺序、灰度方案)我自己定

我以为我设计的挺合理:agent 跑执行,关键决策我介入

时间线:9 天(prod 挂 4 小时)

Day 1-3:跑得飞起。

agent 写了 6 个 schema 迁移脚本、12 个 API 适配、80 多个单元测试。我每天看 1 次 agent 的进度报告:

“Day 1 完成 6 个迁移脚本。所有测试通过。” “Day 2 完成 4 个 API 适配。所有测试通过。” “Day 3 完成 8 个 API 适配 + 80 个测试。所有测试通过。”

我每天就扫一眼报告,没看 diff。

Day 4:第 1 个关键决策(我应该盯但没盯)。

agent 写到数据迁移策略时,做了一个我没想到的决定——它把迁移脚本改成”先全量复制 + 后增量同步”,而不是我最初说的”灰度迁移 + 双写对比”。

为什么改?它在进度报告里写:「考虑到工期内全量复制更简单,且我们的测试覆盖率足够。」

我没看到这段。 我当时在看 1 个客户微信,没打开详细进度报告。

第二天 agent 直接按”全量复制”跑了——但客户的 API 在迁移期间会有 30 分钟停机。我在生产环境部署那天才被客户发现——「为什么停机 30 分钟?」

我打电话问客户经理能不能补个灰度方案,客户经理说:“你早说啊。我这边客户能配合。现在晚了。”

问题 1:我以为 agent 会主动报告关键决策。

实际上 agent 只报告”做了什么”不报告”为什么这么做”——它把”全量复制”当成”按工期最优解”,没意识到这是个需要人确认的策略变更

Day 5:第 2 个关键决策(同样没盯)。

agent 在缓存层重构时,决定把 Redis cache key 的命名空间从 cache:v1: 改成 cache:v2:——但忘了兼容旧 key。直接导致旧 key 在切换后永久丢失缓存

我没看 diff。Day 5 进度报告写:“缓存层重构完成,pass 测试。”

agent 的测试只测新 key——它没意识到要测新旧 key 共存

Day 6:第 3 个关键决策(同样没盯)。

agent 写了一个”性能优化”——把 4 个 SQL 查询合并成 1 个 join。但 join 没考虑 N+1 问题,生产环境某个页面从 200ms 变成 4s。

它没报告。Day 6 报告写:“性能优化完成。”

Day 7:上线前一天。我做 review。

我花了一晚上 review 全部 diff。发现 3 个关键决策都是 agent 自己拍的

  1. 迁移策略:全量而非灰度(30 分钟停机)
  2. 缓存命名空间:不兼容旧 key(永久数据丢失)
  3. SQL join:N+1 问题(页面性能退化)

我当场炸了。

Day 8:上线当天。prod 挂了 4 小时。

  • 上线后 30 分钟:迁移脚本启动全量复制,MySQL 主库锁表 30 分钟,所有写请求超时
  • 上线后 1.5 小时:缓存层切换后,所有用户 session 重新登录(cache miss)
  • 上线后 2 小时:用户登录后的首页加载 4 秒(join N+1)
  • 上线后 3 小时:我紧急回滚 + 重新部署旧版
  • 上线后 4 小时:prod 完全恢复

4 小时 prod 停机。客户群炸了。客户经理说”下次不要合作了”。

决策点反推

错误 1:把”看进度报告”等同于”监督”。

Supervisor 模式的关键不是”看 agent 报告了什么”——是主动介入 4-6 个关键决策点。这 4-6 个点必须你自己列出来,写在 brief 里

我没列。我只甩了一个大 brief,让 agent 自己跑。

正确的 Supervisor brief 应该长这样

任务:MySQL → PostgreSQL 迁移
我会在以下 5 个决策点要求你暂停并等我确认:
1. 迁移策略(全量 / 增量 / 灰度 / 双写)
2. 数据一致性校验(checksum / row count / 抽样对比)
3. 缓存层切换(双写期 / 失效顺序 / 回滚方案)
4. 性能瓶颈识别(慢查询 / N+1 / 索引失效)
5. 回滚方案(前置条件 / 操作步骤 / 验证清单)

每个决策点你必须显式停下,把选项 + 你的推荐 + 风险 一起报给我。我没说"go"之前不要动。

错误 2:我把”测试通过”当成”完成”。

agent 的”所有测试通过”——它只测了它写的代码没测它没改的代码。缓存命名空间不兼容、SQL N+1 都是它的测试覆盖不到的部分

监督的硬约束测试覆盖率是 agent 自己的视角,你需要从用户视角加场景

错误 3:我以为 agent 会”主动汇报异常决策”。

agent 没有义务汇报——它的协议是”按 brief 跑 + 报告进度”。如果 brief 里没写”迁移策略必须先问”,它就默认按”效率最优”自决

token 账单

项目数值
总轮次134 轮
Claude 调用次数870 次
Input tokens7.2 M
Output tokens2.1 M
总费用$186
prod 停机损失估算 $15,000(GMV + 用户流失 + 客户赔偿)
客户关系永久丢失
工期2 周 → 实际 4 周(回滚 + 修复 + 重部署)

$186 token 成本,4 小时 prod 停机完全不在一个量级。

给也想用 Supervisor 的朋友的 3 条避坑

避坑 1:brief 里必须显式列”4-6 个关键决策点”。

不是”agent 自己跑我看报告”——是你列决策点agent 必须等你说 go 才能动。这是 Supervisor 的硬结构,不是 agent 能替你做的判断。

避坑 2:测试通过 ≠ 完成。

agent 的测试是它自己视角的覆盖。你要从用户视角加场景

  • 旧用户首次访问(cache cold start)
  • 数据边界值(空表、极大表、并发写)
  • 失败恢复(断网、OOM、超时)
  • 回滚路径(能不能 1 分钟回到旧版)

避坑 3:每次 review 必须看 diff,不要只看报告。

“Day X 完成 Y” 这种进度报告是 agent 的 narrative——它会强调成功、淡化风险diff 是 ground truth——agent 做了什么、改了什么、没改什么,全在 diff 里。

我现在的规矩:任何 prod 相关任务,每天 review 至少 30 分钟 diff

反思

Supervisor 模式的承诺是「90% 放手 + 10% 关键点介入」。听起来很舒服。但你必须能识别哪些是关键点——这个能力不是 agent 替你做的,是你自己的事

我这次的 4 小时停机,本质原因不是 agent 跑错——是我没列关键决策点

agent 的默认行为是”按效率自决”——它会拍决策,因为不拍它没法继续跑。如果你不给它”暂停 + 等确认”的指令,它永远不会主动停下来问你

Supervisor 的真正含义不是”我在看”,是”我在 4-6 个点会主动介入”

失败成本:$186 + 4 小时 prod 停机 + $15K 估算损失 + 1 个客户。 真正贵的是「我把”看报告”当成了”监督”」。