7e3fd411a1
M1C-2b 为澄清 pending 新增的「drop 执行锁 -> 取项目锁 -> 重取执行锁」重排块, 两次取锁都用裸 `?`。执行锁的重取只等 25 x 10ms,而用户刚提交澄清回答时那把锁 会被 move 进后台续跑任务、持有整个 Provider 回合,稳超等待上限;错误经 recovery_scan 的裸 `?` 上抛,掐掉 for agent_id 循环里整批 Agent 的恢复,并把一次 纯瞬时的锁竞争直接返回给前端。 锁被占恰恰说明别处正在推进,是最不该判失败的时候。同一个 commit 里的姊妹代码 (planning session 恢复窗口)已经写对:项目锁按 transient 判据 continue,执行锁 用非阻塞 try_acquire 拿不到就 continue。 - AgentRuntimePendingActionResume 新增不带锁的 Deferred,表示两把锁都已释放、 本轮让出;批量扫描的三处 match 一律 continue - 项目锁改为 transient 判据让路,其余错误仍带上下文上抛 - 执行锁改用 try_..._with_wait:等待宽限不变,超时是「本轮没轮到」而非「恢复失败」 - Runner 定向续跑不是批量扫描,Deferred 仍如实报错,文案沿用执行锁自己的措辞 - 回归 planning_clarification_recovery_defers_when_execution_lane_is_still_held: 按住项目锁把恢复卡在重排窗口,抢走执行锁后放开项目锁,断言必须 Deferred。 变异验证:回退成阻塞版 `?` 后该用例报出 "Agent Runtime 正在执行该 Agent 的其他任务:project-supervisor" Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>