全部文章

该做什么,和怎么做完,是两套循环

每次活都起一个沙箱,没有常在的 backend loop,员工就不像员工。员工循环只问该做什么,干活循环把事做完。等的时候现场不能散,durable workflow 保住那件事。

手绘:桌上常开小主机,左边员工循环标着该做什么,右边干活循环标着怎么做完

某个周五,群里丢来一句:开会前帮我看一下预算。数字员工点了头。到了开会前它再问一次「我现在该做什么」,把表打开,发现缺一列,得等人补。

沙箱这时收了。人回来补上那一格,现场已经没了:表没打开过,改到哪也没人记得。剩下的只是一句空承诺。记得看预算,表却不在了。

丢事的是结构:活一来就起一个沙箱,干完就散。要在企业 IM 里像员工那样干活,得有一条常在的 backend loop:它看着场域和正在做的事,判断该直接答、该建任务、该交给云端 Agent,还是启动沙箱里的 Coding Agent,复杂活不在它身上干完。

开头这段是场景,不是某一次实测记录:预算表那件事我见过很多遍,但没有留下一份可核的运行日志。下面能核的是公开文档那几条,以及我们自己踩过的那个坑:把回话和干活焊在一次会话里,合盖就丢。

员工循环决定该做什么。干活循环决定怎么做完。两套必须拆开。

该做什么,怎么做完

回到那句预算。点头、记住、到点再问,是员工循环;打开表、改完、把结果送回去,是干活循环。焊在一次会话里,会话一断,承诺和干活一起没了。

员工循环长驻,问「我现在该做什么」。干活循环短命,问「这件事怎么做完」。员工循环不直接做复杂执行,只建任务,交给干活循环。

员工循环 干活循环
该做什么 怎么做完
寿命 长驻,跨重启还在 短命,做完就收
看见 聊天、日历、业务事件 这一次任务的现场
动作 回复、建任务、跟进、等待、再入 打开、改、跑、点、交回执
失败 忘了承诺、到点没提醒 做到一半丢了、副作用做重了

调度在员工循环里。它把「该做什么」展开成副作用:回一句、建一个任务、排一个到点再问。真正把预算表看完的,是干活循环。

空转没有意义。有事件进来,才决定要不要做、做什么,留下副作用,给未来排一个再触发。到点再问一次「该做什么」。承诺跨重启还在,靠的是员工循环的状态。

起步可以把干活循环做成假的(mock,即不真做事、只返回一个约定结果的假实现)。先证明员工循环会承诺、会到点再问、重启不丢。假实现停在「该做什么」这一层,执行仍在另一层。

让事件接到那件事

两套循环看见的时间不一样,一个按事件跳,一个按事情走。

Event 记录发生了什么:一条消息、一次审批、表上改了一格、沙箱跑完了、定时器到了。Task 记录需要持续完成什么:目标、计划、在等谁、做到哪一步、回执在哪。两者对不上,就先当观察,不要硬写进任务状态。event 接到 task,两套循环才接得上。

消息、审批、定时到了,接到正在做的这件事

外循环只调度,要做的事先成为 Task。事前无法判断一件事要做多久,就不在入口猜同步还是异步。短的前台呈现,长的后台接着干。一个 Task 可能要跑很多次才做完,每一次执行尝试叫一次 Run,一次 Run 只声明这一跳的回执。

等的时候,现场不能散

短命的是这一次执行:进程可以走,沙箱可以收。事情本身常常要等。

开头那张预算表卡住的就是这一段:沙箱可以收,事情不能散。

等的时候要记下三样:做到哪一步、在等什么、已经对外做过哪些有副作用的动作。

等什么 本子上留什么 回来做什么
人点头 问过谁、改到哪 按回执继续
表改了一格 已经动过哪些格 接着改剩下的
定时到了 承诺过到点再问 再入员工循环

进程走了,打开的本子还在,上面写着在等谁、已经做过

这就是 durable workflow 要接的那一段。事件到了,从中断处接着做,不要从头再雇一个人。

Restate 把每一步记进 journal。进程崩了,本子上已经落盘的那些步骤直接重放,不会再做一遍:模型调用不重打,邮件不重发,格子不重改。落盘之前那一小段故障窗口仍然存在,所以对外的写入要自己做幂等或去重。Durable Extension 让等待停在干活那一层。等人、等外部事件时,不占着回话,也不消耗模型调用。可以等一天,也可以等一周。

人把那一格补上了。事件接到这件事。本子上已经写过:表打开过、改到哪、在等这一格。接着改剩下的,把结果送回去。

事件到了,重放已完成的步骤,接着改,别从头雇

durable workflow 保住的是那件正在做的事。画成流程图的那类框架擅长节点、分支和局部存档(checkpoint),它们接上 durable runtime 之后同样能持久化和恢复,Durable Extension 就是这么做的。图这种表达本身不提供持久化保证,能不能在等事件、等人、等定时的地方停住再起来,取决于它底下接了什么。本地可以把这些跑在一台机器上。部署合并不等于所有权合并。

工位是手

手可以换。云端 Agent、沙箱里的完整 Coding Agent、本机 session 互派,都是手。状态不能跟一次沙箱 session 一起消失。任务、记忆、权限、预算、回执,要留在执行外面。

常开电脑解决坐在哪。上一篇讲的就是这张工位。工位有了,回话和干活还焊在一起,合盖、超时、容器挂了,活还是会丢。

Anthropic 2026 年 4 月的工程文拆开的是另一组零件。他们先把 session、harness、sandbox 焊进一个容器。容器挂了,session 就没了,成了养不活的宠物。后来拆开:harness 调用模型并路由工具,sandbox 是手,session 是只追加的事件日志,独立于模型的上下文窗口。脑子离开容器,手变成可替换的工具。

零件能对上。harness 靠近员工循环,sandbox 和本机 session 靠近手,session 日志加等待靠近干活循环要保住的那件事。他们管容器里的脑子和手。这篇管两套循环归谁持有。

Claude Code 把「谁来协调」单列成选择:会话里委派、人把任务交出去稍后回来看、由脚本持有计划。Workflow 在后台跑,当前会话保持可响应。

OpenClaw 一类方案给一个身体、一个常驻的入口,工位感很强。它的 README 讲的是控制面和可替换的 harness,没有交代承诺和任务归谁持有,所以身体有了,两套循环拆没拆开看不出来。这是我读它公开文档的判断,不是实测。

合上文章问三句

看你现在的 Agent:

  1. 谁在决定该做什么?
  2. 谁在把这件事做完?
  3. 等待到来时,哪一层还在?

三句答得出两层,它才开始像员工。工位在哪台机器上,上一篇已经讲过。

最强的反方是:一个持久化状态机就够了,何必分两套。如果它分别持有承诺和任务,承诺跨重启还在,任务有自己的生命周期和回执,那已经是拆开了,只是没起两个名字。本文反对的是另一种实现:承诺和执行焊在一次会话里,会话一断两样一起没。判断落在所有权,不落在进程数,也不落在部署在几台机器上。

静态知识问答可以停在员工循环,不必起任务。一次做完、没有等待、没有副作用的动作,不必硬拆。要持续完成的事,不能跟一次会话一起消失。

参考

  1. Mac mini 是团队数字员工最快的载体(查阅 2026-09-16)— 工位和派活通道。
  2. Scaling Managed Agents: Decoupling the brain from the hands(查阅 2026-09-16)— 脑子、手、session 日志不能焊在一个容器里。
  3. Run agents in parallel · Claude Code Docs(查阅 2026-09-16)— 协调和干活是不同表面。
  4. Orchestrate subagents at scale with dynamic workflows(查阅 2026-09-16)— 干活在后台,会话保持可响应。
  5. Durable Extension · Microsoft Learn(查阅 2026-09-16)— 等待不占回话循环。
  6. Durable Agents · Restate(查阅 2026-09-16)— 每一步记进 journal,崩溃后从中断处恢复。
  7. OpenClaw(查阅 2026-09-16)— 常驻入口与可替换 harness;README 没交代承诺与任务归谁持有。

相关阅读

选择 打开esc 关闭