长任务为什么要分轮续跑
解释 GoWork 里的 Assistant continuation rounds 与交接摘要为什么要成对设计:什么时候应该 declare_continuation,交接里必须写什么,为什么它比一句“下轮继续”更能保证长任务不丢进度。
先说结论:长任务要分轮续跑,不是因为系统“聊不完”,而是因为可靠执行需要把一条很长的工作链切成多个可验证的里程碑。 在 GoWork 里,真正让长任务可持续推进的不是一句“下一轮继续”,而是 declare_continuation 产出的交接摘要:它要把这轮已经完成并验证的内容、剩余步骤、关键路径、ID、文件和未完成风险明确写下来。没有这份摘要,下一轮就只能靠模糊上下文猜前情,长任务越跑越容易丢状态。
这也是 OmniGoAI 的 GoWork 和“一轮聊到底”的普通聊天助手最不一样的地方之一。很多真正有价值的工作都不短:内容流水线、桌面排查、跨平台发布、长链运维任务、需要多次验证的修复流程。这些任务的难点往往不是某一步不会做,而是做了很多步之后,怎么在不中断证据链的前提下继续做完。 如果系统没有续跑机制,assistant 常见的结局只有两个:要么在单轮里硬撑到上下文发散,要么停在半路让用户自己记前情。
如果你已经看过 定时任务跑完后怎么回报结果 和 哪些只读工具该并行,哪些桌面动作必须串行,这篇文章要回答的是更底层的一问:为什么长任务不该强行一轮做完,Assistant continuation rounds 与交接摘要到底解决了什么问题?
长任务真正会坏在哪里?不是“步骤多”,而是“状态会散”
很多人看到长任务,第一反应是“那就多给模型一点上下文”。问题在于,长任务最容易坏掉的地方,通常不是某一条信息缺失,而是下面三种状态同时出现:
- 已完成与未完成混在一起;
- 验证过与还没验证的结果混在一起;
- 下一步依赖哪些真实产物,没有被明确写死。
比如一条内容流水线任务,可能已经完成了选题、写作、构建,但还没部署;另一条桌面排查任务,可能已经确认了问题窗口、改了配置、重启了进程,但还没验证修复是否生效。到了这种阶段,如果只留下“我已经做到一半,下轮继续”,下一轮 assistant 面对的不是连续性,而是一团半完成状态。
长任务最怕的,不是步骤多,而是没人能准确回答:现在到底做到哪、哪些结果已经可信、后面还能不能直接接着干。
为什么不能简单地说一句“下一轮继续”?
因为“继续”不是状态描述,只是一种意图。
一句含糊的“下轮继续”至少漏掉四类关键事实:
- 这一轮到底完成了哪些动作;
- 哪些完成项已经验证,哪些只是做了但还没验;
- 下一轮必须依赖哪些路径、ID、链接、窗口或任务号;
- 剩余工作应该按什么顺序继续。
举个最典型的反例:
- “文章写好了,下轮继续发布。”
这里至少有五个问题说不清:
- 是只写了中文,还是双语都写完了?
npm run check和npm run build过了吗?- 官网 URL 已经生成了吗?
- OmniPost 的发布参数是不是已经准备好了?
- 如果下一轮直接去发,会不会把还没验证的内容当成已完成状态?
所以真正可靠的续跑,从来不是靠一句“我待会继续”,而是靠一份可以被下一轮直接执行的交接摘要。
Assistant continuation rounds 到底是什么?
可以把它理解成:把一个太长、但仍然属于同一目标的任务,切成多个连续运行的执行回合。
每一轮的职责都很明确:
- 在本轮里尽量推进到一个自然里程碑;
- 对已经完成的内容做必要验证;
- 明确列出未完成部分;
- 用结构化摘要把“已完成 / 待完成 / 依赖什么”交给下一轮。
这和“重新开一个新任务”完全不是一回事。新任务意味着重新理解需求;continuation round 则意味着目标不变,只是执行被切成多个可交接的阶段。
所以 continuation 的核心价值,并不是“能多跑几轮”,而是:
- 不让一轮上下文塞进过多细枝末节;
- 不把还没验证的中间状态误当成最终结果;
- 不要求用户自己记住之前到底发生了什么。
什么时候应该 declare_continuation?
最实用的判断法不是看 token,还是真实工作结构。
一般来说,当任务同时满足下面两条中的任意两条时,就应该认真考虑 declare_continuation:
- 已经推进了可观工作量,但还没到最终完成点;
- 当前已经出现一个清晰里程碑,例如“写作完成”“构建通过”“登录态确认完毕”“第一阶段排查结束”;
- 剩余工作仍然很多,强行塞在本轮会让验证和总结变得含糊;
- 后续步骤依赖本轮产物,例如文件路径、commit、recordId、部署结果;
- 如果现在停住,下轮很难靠自然语言记忆准确复原现场。
典型场景包括:
- 长链内容流水线:写作、构建、部署、收录、分发、记录;
- 桌面自动化排障:多窗口、多次截图、多次判断;
- 长时间命令与验证:启动后台服务、等构建完成、再看窗口或端口;
- 多平台发布:每个平台可能成功、失败、审核中、跳过,且都要记录。
如果任务已经自然完成,就不该为了“看起来规范”而 declare_continuation。续跑机制是为还没做完但值得交接的任务准备的,不是为了把简单任务人为切碎。
一份合格的交接摘要,至少要写哪三层?
1. 已完成了什么,而且哪些已经验证
交接里最重要的不是“做过什么”,而是“哪些成果现在可以被下一轮当作事实依赖”。
比如:
- 已生成
content/blog/zh/<slug>.md与content/blog/en/<slug>.md,并通过npm run check; - 已获得任务 ID、recordId、commit hash;
- 已确认某窗口出现,或某服务端口可访问。
如果某项只是“执行过但没验证”,也必须明确写出来,不能装作已经稳定可用。因为未验证成果不能成为下一相位的前提。
2. 剩余工作是什么,而且顺序要明确
“还剩一点收尾”这种描述对下一轮几乎没有操作价值。真正可用的写法应该类似:
- 部署官网并确认脚本以
[done]结束; - 提交中英文 URL 到收录脚本;
- 准备四个平台改写稿并正式发布;
- 更新 topics 与 content-log;
- 提交官网仓库并记录 commit hash。
顺序之所以重要,是因为很多长任务不是一串独立珠子,而是有依赖的业务链。没有顺序,下一轮就容易先做后面再回头补前面,最终把状态搞乱。
3. 关键依赖与风险点是什么
如果下轮需要继续,就必须知道哪些东西不能丢:
- 文件路径;
- 任务 ID / run ID / recordId;
- 当前登录态或平台状态;
- 哪一步失败过、为什么失败;
- 哪些动作还不能重跑,否则会重复发布、重复提交或覆盖现场。
这部分的作用,不是写“风险提示”给人安心,而是防止下轮 assistant 重新踩已经踩过的坑。
为什么交接摘要比“把上下文留着”更可靠?
因为原始上下文是过程流,交接摘要是执行结论。
长任务跑到后半程时,原始上下文里常常混着:
- 试错时的错误路径;
- 已经作废的假设;
- 多轮中间读到的临时状态;
- 已经被后续步骤覆盖的旧信息。
如果下一轮只是继续读这些原始痕迹,它并不知道哪些是“历史噪音”,哪些才是当前可依赖事实。交接摘要的价值就在于:把过程压缩成下一轮真正需要的现实状态。
这也是为什么好的 continuation 不是复制聊天记录,而是重写一份“当前世界模型”:
- 哪些成果已落地;
- 哪些还没完成;
- 下一步从哪里开始;
- 不能误判的边界是什么。
continuation rounds 如何避免“做过的又重做一遍”?
这是长任务里最现实的问题之一。
没有好的交接摘要,下一轮最常见的低级错误就是:
- 重跑已经成功的步骤;
- 把旧错误再试一遍;
- 对已经拿到的结果再次探测,浪费时间;
- 在外部平台上制造重复动作,例如重复发布、重复提交、重复建草稿。
而交接摘要可以通过三种方式减少这种问题:
- 用 verified 清单明确“哪些别再动”;
- 把失败原因写成边界条件,让下轮换假设或换路径,而不是机械重试;
- 保留关键 ID 与路径,让下轮直接接着用,而不是重新找。
对于内容发布、桌面排障、长命令验证这类任务,这种差异非常大。一次没写好的交接,下一轮可能白白浪费十几分钟;一次写好的交接,下一轮通常能直接从正确阶段接上。
什么叫“自然里程碑”,为什么它是续跑的最佳切点?
不是每个暂停点都适合做交接。
好的切点通常有三个特征:
- 当前阶段已经形成完整子结果;
- 这个子结果可以被验证;
- 下一阶段对它有明确依赖。
例如:
- 写作完成且
check/build通过; - 官网部署完成且公开 URL 可访问;
- 平台账号状态已核验完毕;
- 第一轮诊断结束并定位到故障根因。
相反,下面这些切点通常不够好:
- 正改到一半的文件;
- 刚点完按钮但还没看到界面反馈;
- 命令刚发出但还没验证产物;
- “差不多快好了”这种没有边界的主观状态。
续跑切点的本质,是把一段工作停在“已形成结论”的地方,而不是停在“刚好没时间了”的地方。
长任务为什么尤其需要把“未验证成果”标出来?
因为长任务最容易出现一种错觉:已经做过,就等于已经完成。
其实执行系统里经常有这种情况:
- 命令跑了,但产物还没确认;
- 文件改了,但 build 还没过;
- 发布返回成功了,但真实状态还是审核中;
- 窗口弹出来了,但目标页面没真正加载完成。
这些都只能算“done but unverified”,不能直接当成下一阶段的前提。如果交接里不把这层讲清,下一轮很容易把“做过”误读成“可依赖”。
所以一份成熟的 handoff 通常不只写 done list,还会显式区分:
- verified:已经完成并验证;
- done:已完成但仍需验证;
- pending:尚未开始。
这个分层看起来像是细节,实际上决定了下一轮会不会建立在假前提上。
continuation 机制对用户体验的真正价值是什么?
表面上,它是在帮 assistant 续跑;本质上,它是在帮用户省掉“重新解释前情”的成本。
用户真正讨厌的通常不是任务要多轮,而是:
- 每次都要重新说目标;
- assistant 忘了上轮做到哪;
- 明明已经完成的步骤还被重做;
- 最终没人说得清真实状态。
有了好的 continuation rounds,用户看到的体验会变成:
- 任务持续往前推进,而不是停在中途;
- 每轮都停在一个可理解的里程碑;
- 失败时也知道卡在哪里;
- 下一轮不是重来,而是续上。
这就是为什么“长任务分轮续跑”不是妥协,而是一种更成熟的执行设计。它承认现实任务有长度、有依赖、有验证成本,然后用交接摘要把这些复杂性管理起来,而不是假装一轮就能包打天下。
如果你们正在设计会写文件、会跑命令、会操作桌面、还要长期记住状态的常驻助理,可以把这套机制理解成一个底层原则:一轮负责推进到里程碑,交接负责把里程碑变成下一轮的起点。 你可以继续看 GoWork 下载页、定时任务跑完后怎么回报结果 和 哪些只读工具该并行,哪些桌面动作必须串行 来把这套续跑机制放回完整的执行系统里理解。
常见问题
FAQ 1:是不是任务一长就应该立刻 declare_continuation?
不是。只有当任务已经推进到一个自然里程碑、剩余工作仍明显很多,而且继续硬塞在本轮会让验证和总结失真时,续跑才是更好的选择。短任务或已完成任务不该硬切分。
FAQ 2:交接摘要和普通运行报告有什么区别?
运行报告主要面向用户,重点是结果和当前状态;交接摘要主要面向下一轮执行,重点是已验证成果、关键依赖和剩余步骤。两者会重叠,但用途不同。
FAQ 3:为什么不能只把整段历史上下文传给下一轮?
因为原始历史混有试错、作废假设和旧状态。下一轮真正需要的不是完整过程,而是压缩后的当前事实模型:哪些已完成、哪些可信、从哪继续。
FAQ 4:交接里最容易漏掉的是什么?
最容易漏掉的是“哪些成果还没验证”。很多问题不是没做,而是做了却还不能依赖。如果这层没写,下一轮很容易建立在错误前提上。
FAQ 5:一句话概括 continuation 与 handoff 的关系,最准确的说法是什么?
可以。continuation round 负责把长任务拆成多个执行回合,handoff 负责把上一回合的真实状态压缩成下一回合可直接接手的起点。