正在刊行长文 · Essay
2026-08-25所有内容
随机比特 · Random Bits

AI 开始自己等消息了:盯着 PR,失败就继续改

2026-08-25AI Engineering / Systemsrbits.uk
AI 开始自己等消息了:盯着 PR,失败就继续改

我在本地重放了 8 条模拟 PR 事件,其中 7 条唯一。无状态程序被唤醒 7 次;加上控制逻辑后,Agent 只醒了 3 次。同一条失败通知没有触发第二次修改,涉及生产密钥的评论也被交给人工。对于准备把 Agent 接进研发流程的团队,这三个结果比“能否自动修复代码”更值得先验证:它们决定了系统能否在无人看守时不重复执行、不越过权限边界。

如果系统只有 webhook、提示词和自动执行,它离无人值守还差一套可恢复、可核销的运行状态。

持续订阅扩大了自动执行的边界

Cursor 在 2026 年 8 月 19 日的更新中称,Cloud Agents 可以订阅 PR、Slack 线程和定时任务,在事件到达时自动唤醒;它还会自动订阅自己创建的 PR,继续处理 CI 失败和机器人评论。Subscriptions 目前仅适用于 Cloud Agents。官方说明:https://cursor.com/changelog/08-19-26

这类能力让 Agent 不必守在一次对话里等待下一条指令,但也让一次任务跨过了更长的时间和更多外部状态。上午发出的修复,下午可能收到重复通知;进程重启后,它还要判断上午那次 git push 到底有没有成功。

这里的数字来自本地模拟,不是 Cursor 产品实测,也没有连接真实 GitHub PR。实验只验证控制结构,不能说明 Cursor 的成功率、延迟、成本或生产可靠性。无状态基线的“唤醒”也只表示程序收到事件,未记录的后续结果不作推断。

事件 无状态基线 受控循环
PR 创建 不执行 建立目标状态
单测失败 触发 首次修复成功
同事件重投 再次触发并重复动作 忽略
变量改名评论 触发 处理成功
生产密钥轮换 触发并尝试处理 转交人工
集成测试失败 触发 首次失败,第二次成功
CI 通过 触发 更新为绿色,目标未完成
人工解除阻塞 触发 清除待办并完成目标

真正进入自动动作的是单测失败、变量改名评论和集成测试失败,因此 Agent 被唤醒 3 次;集成测试多尝试一次,所以共执行 4 次动作。三次成功动作各留下一条动作回执,共 3 条。

事件重放暴露状态缺口

重放开始后,单元测试失败事件先触发了一次修复。紧接着,同一个事件再次投递。无状态程序又醒了一次,并重复执行动作;受控版本根据稳定的事件 ID 认出重复投递,直接忽略。如果上游每次重试都会生成新 ID,仅靠投递 ID 仍不够,还要结合 PR、Commit SHA 和当前任务状态生成业务幂等键,确认“是不是同一次修复”。

随后,集成测试失败。第一次修复没有成功,第二次在限定次数内通过。因此,受控版本虽然只唤醒 Agent 3 次,却产生了 4 次动作尝试。每次成功都留下可查询的动作回执,最终共 3 条。回执可以是 commit hash,也可以是评论 ID;进程恢复时,它用来判断外部写操作已经落地、明确失败,还是结果未知。

**结果未知时再次执行,往往比执行失败更危险。**失败可以进入有限重试,未知状态则应先查询外部系统,不能靠模型猜测。

随后收到一条要求轮换生产密钥的评论。无状态基线会尝试处理这项高风险操作;受控版本没有把它交给 Agent,而是登记为人工待办。稍后 CI 已经变绿,任务仍未结束;直到人工解除这项阻塞,目标状态才转为完成。绿色构建只是一个条件,不代表所有风险事项已经清空。

事件驱动 Agent 的去重、目标状态、风险判断与动作回执控制层

无人值守取决于系统能否恢复判断

把这套控制逻辑放进设计评审,可以沿着一次中断来检查:服务重启后,系统能否还原当前 PR 的目标状态;能否识别已经处理过的事件;能否查询上一次外部写操作的回执;遇到敏感权限、重试耗尽或结果未知时,是否会停下并留下明确的人工入口。

这些信息若只存在于模型上下文或进程内存中,重启后就会消失。此时 Agent 看似会等待消息,实际只是一个会被反复触发的执行器。**当系统答不出“是否处理过、写操作是否成功、何时交给人”时,就不应开启无人值守。**这条判断同样适用于 Slack 工单和定时任务。

随机比特公众号二维码
公众号 · 随机比特
从 AI 工具热闹里拆工程真相

写边界、控制面、上下文、成本与安全。