type
Post
status
Published
date
slug
summary
一次围绕状态持久化、标准化 handoff、失败恢复与可验证收口的任务接续系统改造复盘。
tags
category
AI
icon
password
很多任务系统,平时看着都挺能跑。
会派单,会回执,会显示“执行中”,甚至还能把下一棒写得明明白白。可一旦任务跨时间、跨角色、跨执行器,问题就出来了:线还在,消息还在,人也还在,但任务就是接不上。上一轮做到哪了?为什么停了?下一步该谁接?出错后从哪恢复?这些问题一旦答不上来,所谓“任务系统”其实只是一个会留下痕迹的聊天流,不是一套真正能持续推进的执行系统。
这次我们做“任务接续系统改造”,不是为了把 agent 再堆多一点,也不是为了把自动化讲得更漂亮。要补的,是系统最容易被忽略、但一断就全盘暴露的那层能力:**任务断了以后,怎么继续。**

一、我们真正缺的,不是更多执行器,而是“不断线”的能力

旧链路有个很典型的问题:看起来很忙,实际上很脆。
任务一发出去,receipt 有了;状态一更新,板面前滚了;有时连 `next_role` 都写好了。表面上像是在推进,实际上却常常卡在最关键的地方:没有真实执行证据,没有统一交接格式,也没有明确恢复点。结果就是——
  • 任务暂停几小时后,回来只能从聊天记录里捞上下文;
  • 任务转给下一个角色后,接棒的人不知道该从哪一步继续;
  • 子任务失败了,系统不会自动回退到可恢复状态,只会把“处理中”挂在那里;
  • 最后明明每个人都觉得自己动过了,整条线却没有真正收口。
这类问题本质上都不是“某一步没写好”,而是系统缺了任务连续性。
换句话说,旧系统会做事,但不会续做。

二、什么叫“任务接续”

如果把这个概念说得硬一点,我会这样定义:
> **任务接续 = 任务在跨时间、跨角色、跨执行器、跨失败场景下,仍能基于明确状态和标准回执继续推进的能力。**
这句话里有四个关键点。

1)状态要持久化

任务不能只活在聊天里,也不能只活在某个执行器的上下文窗口里。
它必须有一个外部可读、可回写、可追踪的状态层,让系统知道当前是在 `received / routed / executing / verifying / done / blocked` 的哪一段,而不是靠“刚才好像有人说在做”。

2)交接要标准化

handoff 不是一句“你接一下”,而是一次结构化移交。
谁来接、接什么、当前做到哪、上一棒留下了什么证据、下一棒的完成条件是什么,这些都得带着走。否则每次换人都等于重读上下文、重建意图、重猜目标。

3)恢复点要明确

真正的系统不是永远不出错,而是出错后还能接着跑。
所以每一条任务线都应该知道:
  • 失败后往哪退;
  • 哪个节点可以重试;
  • 什么情况下转人工;
  • 什么情况下明确标 `blocked`,而不是继续假装“执行中”。

4)收口要可验证

任务完成不能只靠口头说“搞定了”。
需要有能核验的产物、结论或回单字段。没有这些,系统就只能得到一种很危险的假象:看起来一切都有人管,实际上没有一条线真正闭环。

三、旧系统的问题,不是功能少,而是连续性差

回头看改造前的链路,问题主要集中在四件事上。

状态散落

消息里一点、记忆里一点、临时文档里一点、执行器上下文里再藏一点。任务的真实状态没有单一可信视图。

handoff 靠猜

很多交接动作都停留在“谁来接”这一层,没有把“接什么、做到哪、为什么停、下一步最小动作是什么”说清楚。

中断不可恢复

旧流程里,一旦失败、超时、环境变动,系统不会自然回到某个稳定恢复点。最常见的结果不是自动续上,而是悬空。

收口不可核对

不同任务线回来的回单格式不统一,有的写结论,有的贴日志,有的只说“已完成”。这让自动汇总、自动校验、甚至人工审核都变得很痛苦。
这些问题加在一起,造成的不是偶发故障,而是一种结构性脆弱:任务只适合一口气做完,不适合真实世界那种会暂停、会中断、会换人、会返工的推进方式。

四、这次改造,核心是把“会做事”改成“能续做”

我们这次没有继续往旧流程上补胶布,而是直接把任务接续拆成四个基础能力。

1)统一状态模型

先把状态讲清楚。
任务不再只分“在做 / 做完 / 卡住”这种模糊口径,而是统一按轻量状态机理解和汇报:
  • `received`:收到请求,尚未路由
  • `routed`:已明确交给谁处理
  • `executing`:执行中
  • `verifying`:进入验证/审核
  • `done`:已完成并收口
  • `blocked`:当前明确受阻,等待条件解除
这件事看起来简单,实际特别关键。因为一旦状态语言统一,系统才能知道什么时候该继续派、什么时候该等、什么时候该转验证、什么时候必须显式告警。

2)补上 handoff 协议

交接不再靠一句话。
每次续派,都要尽量带上最小必需字段,比如:
  • 这条线当前目标是什么;
  • 已完成到哪一步;
  • 留下了哪些证据;
  • 为什么需要续派;
  • 下一棒的完成标准是什么;
  • 若失败,优先回退到哪里。
这么做的直接效果是:下一棒拿到的不是“一个任务”,而是“一个带状态、带意图、带边界的任务节点”。

3)把失败后处理纳入日常路径

以前很多系统最大的问题,是把失败当成异常分支,结果异常一多,主流程就形同虚设。
这次改造后,我们默认任务推进里就应该包含:
  • 短重试;
  • 回退执行;
  • 必要时回中书重拆;
  • 最终明确 `blocked`。
也就是说,失败不是“流程外事件”,而是流程本身必须消化的一部分。

4)复杂任务默认带验证席

这是很重要的一刀。
以前很多线做到最后,用户看到的是一个“像完成了”的成品,但系统内部其实没经过稳定验收。现在复杂任务默认把验证环节编进流程,不再等做到最后才临时想“要不要验一下”。
这样做的好处是,收口不再只取决于执行者的自述,而是有更稳定的审核闭环。

五、真正让系统稳下来的,不只是状态机,而是“接续视角”

如果只把这次改造理解成“加了几个状态、补了几个字段”,其实还差一层。
真正变化的是系统看待任务的方式。
以前的默认视角更像“单轮执行”:
  • 来一个任务;
  • 派出去;
  • 做完就结束。
这个模型在简单任务上没问题,但一旦任务跨天、跨角色、跨工具,它就会开始失真。因为现实里的任务不是直线,而是会停、会转、会失败、会恢复、会再往前滚。
所以这次改造真正立住的一件事,是把“任务”从一次性动作,改成一条可以被持续维护的线。
这个视角变了以后,很多动作的意义也跟着变了:
  • 派工不是发出去就算完成,而是要考虑能不能被接住;
  • 中断不是“先放着”,而是要明确恢复条件;
  • 回单不是留痕,而是要服务下一次接续;
  • 完成不是一句话,而是系统真正能验明这条线已经闭环。

六、一个典型变化:系统开始知道“断了以后怎么继续”

改造前,常见情况是这样的:
任务做了一半,执行器超时了。外面只看到一段聊天、一条回执,甚至任务板还停留在“执行中”。等人回来想接这条线时,往往只能重新翻记录、重新判断现状、重新决定下一步,成本高,而且容易接错。
改造后,同样的情况会被拆开处理:
  • 先确认当前节点真实停在什么状态;
  • 看是否已有足够证据进入验证;
  • 如果没有,判断是短重试、回退执行,还是直接 `blocked`;
  • 续派时带着上一轮上下文摘要、证据位置和下一步目标;
  • 下一棒接到手后,不需要“再理解一遍任务是什么”,而是直接从当前恢复点继续。
这不是把问题变少了,而是把问题从“靠人补”变成“系统可处理”。

七、这类改造真正带来的收益,不只是效率

很多人一听到工作流、状态机、handoff,会先想到效率。
效率当然重要,但这次改造更大的价值其实是三件事。

1)可恢复性

系统不再要求每条任务都一口气跑完。中断之后还能有秩序地接回去,这一点比单次速度更重要。

2)可协作性

任务跨角色推进时,不再过度依赖某个人的脑内上下文。交接质量上来以后,多人协作才真正开始成立。

3)可治理性

一旦状态和回单结构统一,后面无论是做统计、做巡检、做自动提醒,还是做问题复盘,都会顺很多。因为系统终于开始沉淀“可计算”的过程信息,而不是只有聊天痕迹。

八、任务系统最重要的,不是自动化,而是不断线

回头看这次改造,最容易说错的一句话是:我们做了一个更强的 agent 系统。
其实不止是这个。
我们真正补上的,是一套让任务在真实世界里活得更久的能力:它可以暂停,可以转交,可以失败,可以恢复,也可以被验证和收口。
一个真正能落地的任务系统,不是每一步都自动,而是在任何一步出问题时,都知道如何继续。
这才是“任务接续系统改造”真正想解决的事。
一次多-agent 路由与 sessions_spawn 派工链路的真实修复过程手搓导航站日记 (1):受够了书签栏,结果掉进了图标的坑 🕳️
Loading...
Leisurelywolf
Leisurelywolf
一个普通到不能再普通的干饭人🍚
公告
SYSTEM STATUS: CHILLING

🛠️ 项目
开始花点心思做个博客。
🚫 意图
什么都不想分享。
🎮 核心
就是纯玩!
"Don't follow me, I'm lost too."