
只是按了暂停,任务为什么被判出故障?
按下暂停,再按恢复,你大概会期待原来的工作继续排队。
如果恢复后,一批任务却被标成“出了问题,需要人工处理”,就很容易让人觉得:是不是暂停把任务弄坏了?
这个反常的现象,来自一个 AI 团队管理工具的修复提案。它让我们注意到:“现在不能继续”有很多原因,把原因丢掉,等待就可能变成故障。
都是不能开始,后续却应该不同
Paperclip 用来组织 AI 助手和工作任务。它把一组助手与任务称为“公司”,这里可以把它理解为一个 AI 团队。
MrBlackTongue 在这份修复提案中报告:团队处于暂停状态时,自动检查未完成任务的程序,可能把任务按预算不足升级处理。这里的预算,是团队或助手被允许使用的费用额度。
暂停和额度不足,确实都能阻止新工作开始。但用户接下来要做的事不同:主动暂停,通常希望稍后恢复;额度不足,则可能需要调整额度或决定是否继续。
我们自己也在开发协作系统,所以对这个来源感兴趣。值得验证的是:程序到底根据什么,把“先等一等”变成了“有个问题要处理”?
原因原本在,中途却被省略了
负责检查的程序本来会返回阻止启动的具体情况,例如“团队暂停”或“费用额度不足”。
但下一段恢复程序只留下了一个简单答案:有阻碍,或者没有阻碍。只要有阻碍,就走进按预算问题处理的分支。
这就像一份说明原本写着“今天暂停,明天再做”,转交时只剩下“今天做不了”。后面的人如果按自己的猜测补上“因为没钱了”,处理方向就变了。这个比喻只说明信息怎样丢失;真正的程序中,被省略的是阻止执行的原因。
候选修复让原因一起传下来,并在处理每条任务前,查看团队是不是已经暂停。
不过,只在开头看一眼,还不够。
三个时刻,为什么会得出相反结论?
团队状态会在程序检查期间改变。我们专门安排了这样一个顺序:
- 开始检查时,团队还在运行。
- 随后团队暂停,后面的检查读到了“因为暂停,不能开始”。
- 等程序决定怎样处理时,团队又恢复了。
第三步如果重新查询,会看见“正在运行”。可是,这不能推翻第二步的事实:刚才那次不能开始,确实是因为暂停。
候选修复使用那次检查带回的原因,而不再拿稍后的状态倒推之前发生了什么。
图 1:原因跟着当次检查结果传递。来源:本轮 paperclip.json 中控制了先后顺序的实验;不是实际多人同时操作的测量。
我们记录程序选了哪条路
实验使用原来的预算判断代码和相关恢复分支,让测试程序返回预先安排的状态,并记录它选择“等待”还是“按额度问题处理”。没有真的把任务写进数据库,也没有跑完整的任务恢复系统。
| 我们安排的情况 | 原代码的选择 | 候选修复的选择 |
|---|---|---|
| 开始时团队已经暂停 | 按额度问题处理 | 跳过,暂不处理 |
| 开头检查后才暂停 | 按额度问题处理 | 跳过,暂不处理 |
| 读到暂停原因后立即恢复 | 按额度问题处理 | 仍按当次暂停原因跳过 |
| 团队运行中,确实超出额度 | 按额度问题处理 | 仍按额度问题处理 |
| 团队运行中,某助手因额度暂停 | 按额度问题处理 | 仍按额度问题处理 |
| 没有阻止启动的情况 | 继续后面的检查 | 继续后面的检查 |
| 整个团队因额度原因被暂停 | 按额度问题处理 | 先尊重团队暂停,跳过 |
七组对照说明,修复没有把所有问题都变成等待:团队仍在运行、但确实存在额度问题时,原有处理保留了。
最后一行也有区别。如果整个团队已经暂停,候选先尊重这个整体状态,不在这轮检查里逐项升级任务。
跳过以后,什么时候再回来?
到这里,我们确认的是:受测代码不会再把这些暂停场景混成预算问题。
但“这次先跳过”还不是故事的终点。恢复以后,任务能不能及时被重新检查?会不会从误报故障,变成一直没人继续处理?这些都需要把完整恢复过程跑起来,进一步验证。
这也是下一步应追问的问题:怎样既记住“刚才为什么停下”,又能在条件改变以后及时重新开始检查?
对于开发者,可以从状态传递的每一步检查:原因有没有丢失,处理时是否拿了另一个时刻的状态来猜?对于使用者,恢复按钮按下后,你希望看到哪些任务继续等待、哪些还需要你处理,以及各自的原因?
暂停应该给人一个可理解的等待状态。保存原因,正是让这种等待可以解释、也可以继续处理的第一步。
实验版本、范围与复核入口
固定前身 0e9b24c 与候选 1db5d93,提取原 getInvocationBlock、预算阻塞恢复分支及候选暂停预检;数据库查询使用可控行替身,升级动作由记录器接住。七场景、两版本,共十四条观察。
表格里的“按额度问题处理”表示请求调用预算阻塞升级逻辑;“跳过”表示跳过当前候选任务;“继续后面的检查”只表示通过这一分支。它们都不等于真实任务数据库状态已经改变或任务最终恢复成功。暂停原因标识为 company_paused,真实预算阻塞标识为 budget_exhausted。
本轮没有执行 PostgreSQL 集成测试、真实并发工作人员、事务或恢复后的下一轮扫描。上游报告的批量事故不是我们的实验样本,也未据此确认 CodeFlowMu 存在相同问题。