#AI Agent#软件工程

Agent 会一直跑,问题是谁让它停

拆开发现、交接、验证、持久化与调度五个环节,看一个无人值守的循环凭什么继续、暂停或退出。

种下2026/06/29 4 分钟 常青

2026 年 6 月同一周内,三个人各自没对过口风,说了同一件事。

Google 的 Addy Osmani:你不再提示 Agent,你设计一个会自动提示 Agent 的系统。Anthropic 的 Boris Cherny:我不向 Claude 写 prompt 了,我写循环让循环去提示 Claude。OpenClaw 的作者 Peter Steinberger:你应该设计循环,而不是设计提示。

三个人没有商量,却在同一周伸手抓同一个词。不是巧合,是周围的工具悄悄越过了三道门槛:coding agent 已经可靠到能无人值守干完一个非平凡任务,调度原语刚出现在主流工具里,单次运行的成本掉到了反复跑也不算浪费。零件都齐了,「把它们组合起来」这个动作就对所有人同时变得显然。

名字滞后于实践好几个月。在有人叫它 Loop Engineering 之前,人们早就在写循环了。

五个工作站围成循环,检查站举着停止牌 循环能一直转,检查站握着唯一的停牌。

Loop Engineering 坐在哪一层

这些”XX 工程”不是互相取代,是一层摞一层,每层管的东西比下面大一号:Prompt → Context → Harness → Loop。

Prompt 管你这一句话写对了没。Context 管这一轮的窗口里装了什么。Harness 管单次运行里的工具、边界和错误恢复。Loop 管的是多次运行之间的关系。

把同一个 bug 放到四层里看——Agent 误读了某个函数的返回值。在 Prompt 层,纠正就是这句话。在 Context 层,相关文档没进窗口。在 Harness 层,这次对话没修对这个 bug。在 Loop 层,这个误读被写进状态文件,第二天当成事实读回,沿着它一层层往上盖。等有人去看时,那个错误假设已经成了承重墙。

错误的代价,等于它在被人发现前活过的轮数。循环按构造就是一台”把轮数最大化”的机器。 验证器、人工卡点、预算上限——这些全部不是”让循环跑得更快”,是缩短”犯错”到”被发现”之间的距离。

一圈五步

循环不是空转。每一轮都干具体的事。Addy Osmani 拆成五个部件:

发现工作。 谁来决定这一轮干什么?定时扫 GitHub issue、监控面板报警、上一个循环的遗留任务——这些全是”发现”的输入。发现不需要做完整判断,只需要把值得做的活挑出来。

交接执行。 发现的活交给一个 agent 去干。这一步的问题是并行。两个 agent 同时改同一个文件会互相覆盖——worktree 把每个 agent 隔离到独立的工作区。

验证结果。 这一轮产出的是对的吗?Generator 和 Evaluator 必须是两个不同的 agent。同一个模型既写代码又审代码,就像自己给自己的作文打分——不是这个模型不聪明,是结构上就没有否定自己的视角。配一个默认假设代码是坏的独立审查 agent,让它能动手验证而不只是读代码。

持久化状态。 Agent 记性是指定长上下文窗口。每次会话结束,窗口清空,它忘了刚刚做了什么。循环的记忆必须待在磁盘上——一个状态文件、一个看板、一份线性追踪。不是”记下来好回顾”,是”下一轮启动时这是它唯一能读到的外部事实”。

再次调度。 验证通过?标记完成、拉下一件。验证失败?给修复轮分配预算,重新进入交接。验证失败且没有新信息?标记失败、人工介入。预算耗尽?暂停循环。

什么时候停

一个循环能停下来,不是因为模型累了。是因为答案满足了四个人里至少一个:

验证器说”通过”——这是唯一有否决权的。明确失败且没有新信息——不改第三次。预算上限到了——token 预算或时间预算。出现分叉——必须交给人类判断的两条路。

没有停下来条件,循环就是一个永远写不完的 draft。 停下来不是 bug,是设计的终点。

这跟前几篇讲的每一件事都有关系。上下文工程决定了每轮进去的窗口质量。验证循环给了 Evaluator 说”不”的武器。Compound Engineering把这一轮的经验写进下一轮的默认环境。四篇文章共同回答的是同一个问题:Agent 已经能干活了。系统怎样让它看对、做对、留下经验,并在没人盯的时候不过界。

Loop Engineering 是这套答案里最后一个零件——它负责的不是单次质量,是让这个系统自己去转。你不再是个发指令的人。你是那个设计”谁来发指令”的人。