Skip to content
实验报告
待周评
只是按了暂停,任务为什么被判出故障?
开源工程观察 · 实验研究

只是按了暂停,任务为什么被判出故障?

暂停应该只是先等一等,为什么恢复后任务还要人工处理?问题藏在一句丢失了原因的“现在不能继续”里。

2026-09-15English →

只是按了暂停,任务为什么被判出故障?

按下暂停,再按恢复,你大概会期待原来的工作继续排队。

如果恢复后,一批任务却被标成“出了问题,需要人工处理”,就很容易让人觉得:是不是暂停把任务弄坏了?

这个反常的现象,来自一个 AI 团队管理工具的修复提案。它让我们注意到:“现在不能继续”有很多原因,把原因丢掉,等待就可能变成故障。

都是不能开始,后续却应该不同

Paperclip 用来组织 AI 助手和工作任务。它把一组助手与任务称为“公司”,这里可以把它理解为一个 AI 团队。

MrBlackTongue 在这份修复提案中报告:团队处于暂停状态时,自动检查未完成任务的程序,可能把任务按预算不足升级处理。这里的预算,是团队或助手被允许使用的费用额度。

暂停和额度不足,确实都能阻止新工作开始。但用户接下来要做的事不同:主动暂停,通常希望稍后恢复;额度不足,则可能需要调整额度或决定是否继续。

我们自己也在开发协作系统,所以对这个来源感兴趣。值得验证的是:程序到底根据什么,把“先等一等”变成了“有个问题要处理”?

原因原本在,中途却被省略了

负责检查的程序本来会返回阻止启动的具体情况,例如“团队暂停”或“费用额度不足”。

但下一段恢复程序只留下了一个简单答案:有阻碍,或者没有阻碍。只要有阻碍,就走进按预算问题处理的分支。

这就像一份说明原本写着“今天暂停,明天再做”,转交时只剩下“今天做不了”。后面的人如果按自己的猜测补上“因为没钱了”,处理方向就变了。这个比喻只说明信息怎样丢失;真正的程序中,被省略的是阻止执行的原因。

候选修复让原因一起传下来,并在处理每条任务前,查看团队是不是已经暂停。

不过,只在开头看一眼,还不够。

三个时刻,为什么会得出相反结论?

团队状态会在程序检查期间改变。我们专门安排了这样一个顺序:

  1. 开始检查时,团队还在运行。
  2. 随后团队暂停,后面的检查读到了“因为暂停,不能开始”。
  3. 等程序决定怎样处理时,团队又恢复了。

第三步如果重新查询,会看见“正在运行”。可是,这不能推翻第二步的事实:刚才那次不能开始,确实是因为暂停。

候选修复使用那次检查带回的原因,而不再拿稍后的状态倒推之前发生了什么。

后来的恢复,不能改写刚才暂停的原因

图 1:原因跟着当次检查结果传递。来源:本轮 paperclip.json 中控制了先后顺序的实验;不是实际多人同时操作的测量。

我们记录程序选了哪条路

实验使用原来的预算判断代码和相关恢复分支,让测试程序返回预先安排的状态,并记录它选择“等待”还是“按额度问题处理”。没有真的把任务写进数据库,也没有跑完整的任务恢复系统。

我们安排的情况原代码的选择候选修复的选择
开始时团队已经暂停按额度问题处理跳过,暂不处理
开头检查后才暂停按额度问题处理跳过,暂不处理
读到暂停原因后立即恢复按额度问题处理仍按当次暂停原因跳过
团队运行中,确实超出额度按额度问题处理仍按额度问题处理
团队运行中,某助手因额度暂停按额度问题处理仍按额度问题处理
没有阻止启动的情况继续后面的检查继续后面的检查
整个团队因额度原因被暂停按额度问题处理先尊重团队暂停,跳过

七组对照说明,修复没有把所有问题都变成等待:团队仍在运行、但确实存在额度问题时,原有处理保留了。

最后一行也有区别。如果整个团队已经暂停,候选先尊重这个整体状态,不在这轮检查里逐项升级任务。

跳过以后,什么时候再回来?

到这里,我们确认的是:受测代码不会再把这些暂停场景混成预算问题。

但“这次先跳过”还不是故事的终点。恢复以后,任务能不能及时被重新检查?会不会从误报故障,变成一直没人继续处理?这些都需要把完整恢复过程跑起来,进一步验证。

这也是下一步应追问的问题:怎样既记住“刚才为什么停下”,又能在条件改变以后及时重新开始检查?

对于开发者,可以从状态传递的每一步检查:原因有没有丢失,处理时是否拿了另一个时刻的状态来猜?对于使用者,恢复按钮按下后,你希望看到哪些任务继续等待、哪些还需要你处理,以及各自的原因?

暂停应该给人一个可理解的等待状态。保存原因,正是让这种等待可以解释、也可以继续处理的第一步。

实验版本、范围与复核入口

固定前身 0e9b24c 与候选 1db5d93,提取原 getInvocationBlock、预算阻塞恢复分支及候选暂停预检;数据库查询使用可控行替身,升级动作由记录器接住。七场景、两版本,共十四条观察。

表格里的“按额度问题处理”表示请求调用预算阻塞升级逻辑;“跳过”表示跳过当前候选任务;“继续后面的检查”只表示通过这一分支。它们都不等于真实任务数据库状态已经改变或任务最终恢复成功。暂停原因标识为 company_paused,真实预算阻塞标识为 budget_exhausted。

本轮没有执行 PostgreSQL 集成测试、真实并发工作人员、事务或恢复后的下一轮扫描。上游报告的批量事故不是我们的实验样本,也未据此确认 CodeFlowMu 存在相同问题。

完整源码来源、探针、结果与复跑方法

Last updated: