合并曾经是终点。你提交一个 pull request,有人评审,合并进去,改动就算完成了。编码智能体已经悄悄挪动了这条终点线。当一个智能体接手一个 Linear issue、编写代码,并在你开会时打开一个 merge request,合并就不再是工作的终点——而是合并所触及的一切事情的起点。
合并不再是终点
合并从来都不只是合并。每一次改动都依赖于它周围的系统:本应关闭的 issue、从今天早上起就有些失实的文档、比昨天更红一点的 CI、没人写的发布说明,还有仍在等待一个其实几小时前就已上线的修复的客服对话。
当一名工程师每周只交付少量改动时,这些后续工作可以见缝插针地完成。你打开着 pull request 时顺手关闭 issue;因为刚改过代码,你也记得更新文档。而当一个智能体——或者一整支智能体队伍——每天交付大量改动时,这些缝隙就被撑爆了。代码本身不再是瓶颈,代码之后的一切才是。
维护模式并没有改变
开发变快了,维护却没有。我们用来保持项目一致性的工具大多仍然是手动的,依然依赖有人在恰当的时刻记得去用它们:
- merge request 合并了,但它所解决的 Linear issue 仍然处于打开状态。
- 文档仍在描述旧的行为,而且没人说得清究竟是哪一页。
- CI 已经间歇性失败了一周,大家都学会了对它视而不见。
- 三个月前加的 feature flag 既没有负责人,也没有下线日期。
- 客服用一个变通方案回复了工单,而对应的 bug 其实周二就已经修好了。
- 有人问这个版本发布了什么,诚实的答案是「让我看看 git log」。
这些都不是新问题,也都不是智能体带来的问题。它们是软件项目中寻常的熵增。智能体只是把节奏调快了,直到过去能吸收这些琐事的非正式系统再也跟不上。
靠提示驱动的清理无法规模化
显而易见的解决办法是让智能体也来做清理工作,你确实可以这么做。在 merge request 里 @taskgoblin,让它更新文档、关闭 issue、起草发布说明。这确实有效。但它依赖整个循环里最稀缺的资源:一个人每次都要在恰当的时刻记得去要求它。
维护不是一次性任务,而是一个循环。「检查文档是否是最新的」不是做一次就完事的事情。「确保已合并的 issue 被关闭」也不是做一次就完事的事情。任何等待人去注意「该跑一遍这个循环了」的事情,都会被不一致地执行——因为人对「注意到」这件事本来就不稳定,尤其是当智能体存在的整个意义,正是为了不再让你把这一切都记在脑子里。靠提示驱动的清理把工作转移给了智能体,却把工作的调度原封不动地留在了你身上。
我们为什么构建了Loops
一次普通的智能体运行由事件触发——一个 issue 被指派、一次提及、一个新的 pull request。而Loops由时间触发。你给智能体一条常设指令和一个节奏——每个工作日早上、每周一、每月一号——它就会在沙箱中自行运行,拥有和其他任何一次运行相同的工具和权限。
指令就是整个任务,好的指令读起来更像一份岗位说明,而不是一个愿望:要看什么、哪个仓库、要做什么、不要做什么,以及——让它能够安全无人值守运行的关键部分——当无事可做时该怎么办,那就是什么都不做。
每个工作日 09:00,查看
group/repo中过去一天内合并的 merge request,关闭它们所解决的、仍处于打开状态的 Linear issue。如果没有,就什么都不做。
这就是一个有专人负责的维护循环。它不需要你去记得。因为一次定时运行就是一次完整的智能体运行,它可以把事情做到底:不只是标记出过时的文档,而是直接打开修复它的 merge request;不只是发现已合并的 issue 又漂回了打开状态,而是直接关闭它们——然后把结果汇报到你真正会看到的地方:作为 Linear issue 上的评论、你指定的 Slack 频道里的一条消息,或者在没有更好去处时,一封邮件。
而且,因为它复用了普通运行已经具备的一切,那些棘手的边界情况也都被处理好了。错过的时间会被跳过而不是被补跑,所以一个宕机一小时的调度器不会醒来后就朝你发射一百次补跑。每次运行都有自己的预算和护栏。我们为这些循环提供了一整套起始模板——保持 issue 和合并同步、监控红了太久的 CI、追踪已经没有负责人的 feature flag、随发布进度起草发布说明——因为对大多数团队来说,真正有用的循环都差不多。你只需要填入自己的仓库和频道;护栏早已写好。
工程师的工作上移了一个层级
这一切背后其实藏着一种担忧:自动化维护是不是意味着把判断力也一并自动化了。并不是。它只是把判断力提升了一个层级。当这些循环自己运转起来,你就不再是那个记得去关闭 issue 的人,而是变成决定哪些循环应该存在、它们的护栏是什么、每一项的「完成」意味着什么的人。你评审的是常设指令,而不是亲自跑腿。
无论如何,这才是这份工作更资深的版本。智能体让写代码变得廉价;剩下的工作,是决定系统应该是什么样子,并确保它始终如此。Loops,就是在不把一切都记在脑子里的前提下,让这份「应然」保持真实——智能体创造工作,而一个常设循环负责维护它。