
2026 年 6 月,OpenClaw 创始人 Peter Steinberger 发了一条浏览量超 800 万的推文:
❝"You shouldn't be prompting coding agents anymore. You should be 「designing loops」 that prompt your agents." (别再给编程 Agent 写提示词了,去设计能提示你的 Agent 的循环。) ❞
紧接着,Claude Code 之父 Boris Cherny 在回顾 CC 一周年时说,他现在的工作已经不是写代码、也不是调 Agent,而是——「"写 Loop"」。Google 工程师 Addy Osmani 随后把这套打法系统化为 「Loop Engineering(循环工程)」。
这篇文章想把三件事讲透:① Loop Engineering 到底解决什么问题、和你已经熟悉的 Prompt/Context/Harness 是什么关系;② 一个 Loop 落地需要的「五块积木 + 一个记忆」;③ 把它和 「DeepAgents、ReAct」 摆在一起,看清这条"从内到外层层包裹"的演进链。文末附一个「最小可运行的 Loop 示例」。图文并茂,建议收藏。
过去两年,我们用 AI 编程助手的方式,本质都是"一问一答":你写一条 prompt,它给一段结果,你看一眼、再写下一条。「人始终站在循环里」,是那个一轮一轮发指令的操作员。
Loop Engineering 的主张很激进:「把人从"循环里的操作员"挪到"循环外的设计者"。」 你不再逐轮 prompt,而是设计一个系统——它自己发现该做什么、分发执行、检查结果、记住进度、决定下一步,然后定时再跑。
放到 Agent 工程的演进脉络里,它是最新的一层抽象跃迁:

阶段 | 关注点 | 一句话 |
|---|---|---|
「Prompt Engineering」 | 怎么写好"一次"提示 | 把话说清楚 |
「Context Engineering」 | 怎么管理上下文窗口 | 把对的信息喂进去 |
「Harness Engineering」 | 怎么搭"单次运行"的脚手架 | 给 Agent 一套趁手的工具与环境 |
「Loop Engineering」 | 怎么让脚手架「自己定时跑、自我喂料」 | 把"做好一次"变成"自动地做很多次" |
Addy Osmani 给了一句最精准的定位:
❝「"Loop Engineering sits one floor above the harness. The harness runs on a timer, it spawns little helpers, and it feeds itself."」(循环工程坐在 harness 上面一层。harness 靠定时器跑起来、派生小助手、自我喂料。) ❞
记住这个"上面一层"——它是理解后面所有内容的钥匙。
Addy Osmani 把一个能跑起来的 Loop 拆成 「5 块结构性积木 + 1 个外部记忆」。好消息是:到 2026 年中,这六块「已经内置进 Claude Code 和 Codex」,命名略有差异、能力相同,你基本不用从零造。
心智模型是这样的:「五块积木负责"循环怎么跑起来、跑得稳",第六块记忆负责"跑得久、能接力"。」

按计划自动触发循环,并完成「任务发现 + triage(分类)」:有发现的进收件箱,没发现的自动归档。这是让"一次性运行"变成"真正循环"的关键。
/loop 把节奏转成 cron 定时;hooks 在 Agent 生命周期节点触发 shell;可挂到 GitHub Actions 持续跑。❝⚠️ 这是「头号烧钱点」:调度循环 + 每轮验证模型,token 消耗很快。务必「从慢节奏、紧目标起步」,观察几天成本再放量。 ❞
让并行的多个 Agent 「不会互相覆盖文件」。git worktree = 独立工作目录 + 独立分支,但共享同一仓库历史。Codex 内置支持;Claude Code 用 git worktree / --worktree / 子 Agent 的 isolation: worktree,每个助手拿到一个用完自动清理的检出。
❝💡 关键限制——「"你仍是天花板"」:worktree 只解决机械冲突,解决不了「审查瓶颈」。你能 review + 合并多少,才决定能并行跑多少 Agent。 ❞
把项目知识(约定、构建步骤、目录结构)写进一个含 SKILL.md 的文件夹,避免每次会话都让 Agent 重新猜。Codex 用 $ / /skills 调用,也会在任务「匹配描述时自动触发」——所以「朴素精确的描述胜过花哨描述」。没有 Skill,循环每轮从零推导;有了 Skill,知识在每次运行间「复利累积」。
基于 「MCP(模型上下文协议)」,让 Agent 读问题追踪器、查数据库、调 staging API、发 Slack。这是"提出修复建议"的 Agent,与"自动开 PR、关联工单、CI 过了通知频道"的循环之间的「分水岭」。Codex 与 Claude Code 都支持 MCP,连接器通常能跨工具复用。
把**写代码的 Agent(maker)「和」检查代码的 Agent(verifier)**分开——maker 对自己的产出太宽容,需要一个指令不同、甚至模型不同的第二 Agent 把关。
.codex/agents/ 下的 TOML(名称 / 描述 / 指令 / 可选模型与推理强度)。.claude/agents/ 子 Agent + Agent 团队互相传递工作。❝这正是
/goal底层做的事:「用一个全新模型判断循环是否完成」,而不是让干活的模型自评。 ❞
模型在两次运行间会忘光一切,上下文窗口也装不下长期状态。所以记忆必须「落盘」,而非塞进上下文。核心原则一句话:
❝「"Agent 会遗忘,仓库不会。"」 ❞
Memory 保存的是「变化的状态」(已试过什么、什么通过了、还剩什么待办),载体可以是 markdown 文件、GitHub issue 列表、Linear 看板。第二天的运行读取它,从昨天停下处接力。
三个最容易混的机制,一张表分清:

机制 | 存什么 | 放哪 |
|---|---|---|
「Skill」 | 长期不变的项目知识 / 约定 | 仓库里的 SKILL.md |
「Memory」 | 会变的进度状态(done / todo) | markdown / issue 看板 |
「Connector」 | 外部工具与数据访问能力 | MCP 服务器配置 |
很多人会问:这跟我熟悉的 「DeepAgents、ReAct」 是不是一回事?答案是——它们恰好构成一条「从内到外、层层包裹」的链,谁都没取代谁。

先各用一句话定位:
Thought → Action → Observation → … 直到收敛。一张表把三者拉开:

它们如何嵌套,才是最准确的理解——一套「俄罗斯套娃」:
❝「Loop Engineering(外循环)」 每次心跳发现一个任务 → 拉起一个 「DeepAgent(harness / 内循环)」 作为 worker → DeepAgent 内部跑 「ReAct(最内核)」 的
Thought→Act→Obs把任务做完 → verifier //goal把关 → 写回 「Memory」 → 等下一次心跳。 ❞
一句话收束:「ReAct 决定"一步怎么想怎么做";DeepAgents 决定"一个复杂任务怎么做完做稳";Loop Engineering 决定"很多任务怎么自动地、跨时间地一直做下去"。」
❝另一个等价视角(philschmid):DeepAgents 主攻 「inner loop」——Agent 在「一个任务内」自我验证、迭代;Loop Engineering 主攻 「outer loop」——Agent 靠持久化 memory / skills / rules 把经验「带到下一个任务」。 ❞
光说概念太虚,我们写一个「真能跑」的最小外循环。任务很具体也可验证:「自动确保 notes/ 下每个 .md 笔记都带合规 front-matter(title / tags / updated 三个字段)」。它是一个安全的 「closed loop」——目标明确、能收敛、带轮次与重试上限防烧钱。
主控循环长这样(伪代码,六大组件都标了出来):
def main():
state = load_state() # ⑤ 记忆:从磁盘恢复,断点续跑
for cycle in range(MAX_CYCLES): # ⑥ 调度:心跳(sleep 模拟 cron)
tasks = discover(notes_dir, state) # ① 发现:扫描 + triage 出待办
ifnot tasks:
print("✅ 循环已收敛"); return # closed loop 正常退出
for path in tasks: # ② 分发(生产中可为每任务开 worktree 并行)
rec = state[path]
if rec["attempts"] >= MAX_ATTEMPTS:
continue # 成本护栏:失败任务不无限重试
rec["attempts"] += 1
execute(path) # ③ 执行:maker(LLM 或 mock 兜底)
ok, err = verify(path) # ④ 验证:独立 verifier 重新读盘把关
rec["status"] = "done"if ok else"failed"
save_state(state) # ⑤ 每步落盘,崩溃可续
time.sleep(INTERVAL) # ⑥ 心跳间隔
关键设计点:
state.json:哪个文件 done、试了几次、上次报什么错,全落盘。删掉某个笔记的头部再跑,循环只会处理"重新变得不合规"的那个文件——这就是"Agent 会遗忘,仓库不会"。MAX_CYCLES(最大心跳)+ MAX_ATTEMPTS(单任务最大尝试)共同防止 open loop 失控烧钱。实测两条路径都正常:mock 模式下补全两篇笔记、跳过已合规的那篇,第 2 轮"发现 0 待办"自动收敛;切到真实 LLM 时即便 API 报错,也能看到「异常被记账 → 按上限重试 → 放弃 → 安全收敛」,护栏生效。

❝把这个例子里的
execute()(现在是简单 LLM/mock)「换成一个 DeepAgents / Claude Code 这样的 harness」,你就得到了第三节那条三层套娃:外循环调度 harness 作为 worker,harness 内部跑 ReAct。 ❞
Loop Engineering 很性感,但不是银弹。给三条朴素建议:
从 Prompt 到 Loop,变的不只是一个 buzzword,而是「人在系统里的位置」:
❝你不再是那个一轮轮敲 prompt 的操作员,而是「设计循环的人」和「守住合并的人」。 ❞
把这篇的脉络在脑子里过一遍就够了:
❝「Loop(外循环)定时唤醒 → 发现任务 → 分发到隔离环境 → DeepAgent(harness)执行 → ReAct 跑工具循环 → 独立 verifier 把关 → 写回 Memory → 下一次心跳接力。」 ❞
Boris Cherny 删掉 IDE、只写 Loop,未必是每个人都该立刻照搬的姿势。但他指向的方向很清楚:当"做好一次"已经被工具解决,「真正的杠杆,在于怎么让它自动地、跨时间地做很多次。」 这就是 Loop Engineering 想回答的问题。