a021f18b98
run 18:Supervisor 冻结目标合同后一次也没委派,改成反复调 agent.run_status 去查
一个根本不存在的委派,24 轮里 58 次 agent.run_status、0 次 agent.delegate,烧到
超时。两道防线各自失效:
· 空转闸门(AGENT_RUNTIME_PLAN_UPDATE_IDLE_LIMIT=4)只在裸 update_agent_plan 且
步骤没变化时累加,而任意非空 actions 都清零。于是「裸计划更新被 blocked →
调一次只读工具 → 计数归零」是一个结构上永远关不上的闸。
· Runtime 其实有一条精准提示「调用 agent.delegate 派出策划子 Agent」,但它在
plan.actions.is_empty() 分支里——模型一调 run_status 就有了动作,提示不再出现,
取而代之的是一份看起来像进展的「已读取 11 个 Agent 状态」。
本地原型没有这个问题,不是因为阈值,是因为它的 Supervisor 只有四个工具且每一个都
推进链路:「调了工具」和「推进了链路」在那边是同一件事,按前者计数就是准的。生产
把两者拆开了却还在按前者计数,工具也是全程可见。
三处改动:
1. 工具面按 durable 阶段开放。合同未冻结 → 只有 agent.goal_contract;合同已冻结
但本根 run 尚无委派 → 只有 agent.delegate;已有委派 → 取证/返工/审批那几个。
run 18 卡死的正是第二档,那一档模型连 run_status 都调不出来。阶段只按 durable
事实判定,不看 Provider 说了什么。
2. 砍掉 user.input_request。这条链路上它是死的:子 Agent 以信封退出后,Runtime 在
parent-wake 屏障处自己按信封原文构造 pending 且不恢复父 run,Supervisor 永远收不
到 needs-user-input observation。广告出去只会让它在别的时点调一次,撞上 Runtime
已装好的那份 pending 而硬失败。playbook 第 4 步与转达提问那条一并改写。
3. 空转判据改成看「本轮有没有能推进 durable 状态的动作」,只读工具不清零。纯只读
调查不受影响——不发裸计划更新就根本不会累加。这条对做游戏那条链路同样有效。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>