没收到回复,再点一次会启动两个 AI 吗?

你在手机上按下"启动 AI 助手",等了几秒,屏幕没有回应。
再按一次吗?如果第一次根本没送到,重试很合理。可如果电脑已经开始做事,只是回复丢了,第二次点击就可能又开出一份任务。
设想两个助手各自修改一套文件,你要分辨哪份该保留;重复工作还可能多占用资源。这些是重复启动的可能代价,不是本轮实验里已经发生的事故。它们让这个小小的点击值得认真对待:没收到回复,不能当作什么都没发生。
给一次启动一个可复用的编号
我们从 brennanb2025 提交的 Orca #21106 得到启发。Orca 让手机等远端设备与运行 AI 助手的电脑协作。这项修改给启动操作留下可保存到文件的记录,让重试能够找回已有结果。
我们关注它,是因为启动一个助手可能同时创建工作目录和会话。回答重复了,可以忽略一遍;工作启动了两份,后续影响却可能一直继续。
这里的办法是给每笔启动操作一个编号。第一次请求用它,重试仍用它,电脑便能先查原来的记录。这个编号在代码里叫"操作 ID"。检查时还要认清发起者和任务内容,避免有人拿旧编号去做一件新事情。
这项机制有一条关键分界:"我已接单"和"我已完成启动",需要分别记录。
对照实验:结果、未知与内容冲突
我们运行原项目中负责保存记录、判断是否允许启动的代码,用真实临时文件做实验。先写入一份合成的成功结果,丢弃第一次返回值,再发一次相同编号的启动请求。
这里的"成功结果"指启动这一步的结果,例如它返回了哪个工作目录;不表示助手已经完成后续任务。本轮没有启动真实助手。
| 我们安排的情况 | 重试时观察到什么 |
|---|---|
| 启动成功结果已经保存,但回复被丢弃 | 找回并返回同一份结果 |
| 只有"已接单"记录,没有最终结果 | 保留"未知",拒绝再次放行 |
| 沿用同一编号,却改了任务内容 | 拒绝:这已经不是原来的请求 |
第一行解释了记录的价值:回复可以丢,已经存好的结果还可以找回来。第三行说明编号不能随意套用。真正让人犹豫的,是第二行------既然已经接单,为什么不能继续?

图 1:来源:作者依据真实临时文件实验绘制。图中"完成"只指启动操作;成功结果是合成数据。
接单以后,到底发生了什么?
假设电脑刚记下"我来执行",便在保存最终结果之前失去联系。仅凭接单记录,至少有三种解释:尚未开始、已经做了一部分、已经完成启动但没来得及写回结果。
于是,"已接单"不能直接翻译成"还没做",也不能翻译成"已成功"。再做一次可能制造重复;直接报成功,又可能让人等一项并不存在的工作。
受测代码保留了这种不确定性。它没有因为又收到同一个编号,就再发一张执行许可。我们还在同一进程内重新打开记录文件,已保存的成功结果仍能找回;不过,这不等于验证了断电或进程崩溃后的完整恢复。
截至本轮读取,这项修改已于 9 月 17 日 UTC 合入,但现有客户端尚未发送所需的外层操作编号。来源也明确把更广的恢复工作列在本次范围之外。因此,实验说明的是这层记录机制怎样处理重试,不能推成所有手机点击都已经受到保护。
"无法确认"之后,人还需要一个下一步
避免重复动作有价值,但使用者仍需要知道该等、该查,还是需要人工处理。
我们的实验把进一步的问题推向了"查证":如果能查看原操作编号、仍在运行的任务,以及已经创建的资源,就有机会减少猜测。这些是后续设计与验证方向,本轮没有实现查询或接管流程。
使用者可以提供很具体的反馈:没有收到回复时,界面显示了什么,你随后做了什么,后来是否发现已有任务正在运行。这样的时间顺序,能帮助开发者分清"动作没发生"和"回复没回来"。
当系统只能回答"暂时无法确认"时,它还应提供什么证据,才能让人放心决定下一步?
技术范围、固定版本与全部观察
保留的完整数值对照
"准入"指检查是否允许开始执行。下面八并发结果只在这一层观察;上层已有共享正在执行任务的处理,本轮未运行,因此七次拒绝不能外推成七次用户重试失败。
| 安排的情况 | 原实现给出的结果 |
|---|---|
| 成功结果已经保存,回复被丢弃 | 返回已保存的同一份结果 |
| 在同一进程重新打开记录存储,再重试 | 仍返回已保存的结果 |
| 同一操作 ID,换了任务内容 | 拒绝:内容冲突 |
| 同一配对设备,认证令牌轮换 | 仍识别为原操作并返回结果 |
| 只有"已接单"记录,没有最终结果 | 拒绝重做,保留"未知" |
| 八个请求同时争取同一操作 | 一个获准执行,七个在准入层收到未知拒绝 |
固定候选 d60ff2db02bf2b6c6ac4fd39c179c9854409d2a4;运行完整 durableAgentSessionRecordStore 和原始 admitAgentLaunchOperation、请求指纹与注册逻辑,使用真实临时文件和 proper-lockfile。11 条记录还覆盖不同配对设备隔离、已记录失败的重放、远端缺少配对身份、超过允许期限的新操作 ID。
不同发起设备可以拥有独立的同名操作;令牌轮换实验保持配对设备身份不变。八并发结果位于准入边界,上层 live join 未测。重新打开存储发生在同一进程。保存的成功结果是合成数据,没有实际创建工作目录、启动模型或调用移动端。
结果与复跑脚本。没有据此认定 CodeFlowMu 缺少幂等保护或存在重复启动缺陷。