Checklist
🐞 问题详细描述
现象
团队模式完成一轮对话、协调层进入暂停(pause)后,用户再次发送消息,无任何成员响应。约 300 秒后被上层 relay 的 stall 看门狗强制中断。pause→resume 一次即可稳定复现(4/4)。
日志特征:user input enqueued to coordination 正常打出(消息已入队),但之后再无 user_input → deliver_input(消息从未被投递给成员),且全程无任何报错。
根因
排查后发现 pause→resume 路径上存在两个相互独立的缺陷,均位于协调层:
缺陷一:事件总线残留的 SHUTDOWN 信号导致新循环启动即退出(主因)
openjiuwen/agent_teams/agent/coordination/event_bus.py 的 stop() 先将 _running 置为 False,再向队列放入 SHUTDOWN 信号。若此时事件循环正在处理 wake(轮末暂停几乎总是如此),循环处理完后经 while 条件检查直接退出,SHUTDOWN 残留在队列中。下次 start() 启动的新循环取到的
第一个事件就是该残留 SHUTDOWN,启动后立即退出。此后总线"看起来正常"(入队均成功),但无任何消费者,用户输入全部积压,无任何日志。
缺陷二:wake 回调泄漏的 CancelledError 杀死事件循环
wake 回调内部某个 await 被取消时(例如向正在重建 harness 的成员投递),CancelledError 会泄漏到事件循环。该异常继承自 BaseException,不被循环的 except Exception 捕获,导致循环任务静默退出。由于没有任何代码 await 该任务的结果,连 traceback 都不会输出。
缺陷三(同一提交窗口修复):pending_resume 续跑标记在竞态下丢失
coordination/kernel.py 的 _persist_pending_resume() 原先以"harness 仍处于 PAUSED"为写入前提。park 成功后、写盘之前,轮末 finalize_round 若恰好终止 harness,标记被静默丢弃,冷恢复的成员读不到标记直接进入 idle,挂起的轮次丢失,且无法区分"轮次已结束"与"标记未写入"。
详细的环境信息描述
windows
其他辅助信息
版本信息
感谢您的贡献 🎉!
Checklist
🐞 问题详细描述
现象
团队模式完成一轮对话、协调层进入暂停(pause)后,用户再次发送消息,无任何成员响应。约 300 秒后被上层 relay 的 stall 看门狗强制中断。pause→resume 一次即可稳定复现(4/4)。
日志特征:user input enqueued to coordination 正常打出(消息已入队),但之后再无 user_input → deliver_input(消息从未被投递给成员),且全程无任何报错。
根因
排查后发现 pause→resume 路径上存在两个相互独立的缺陷,均位于协调层:
缺陷一:事件总线残留的 SHUTDOWN 信号导致新循环启动即退出(主因)
openjiuwen/agent_teams/agent/coordination/event_bus.py 的 stop() 先将 _running 置为 False,再向队列放入 SHUTDOWN 信号。若此时事件循环正在处理 wake(轮末暂停几乎总是如此),循环处理完后经 while 条件检查直接退出,SHUTDOWN 残留在队列中。下次 start() 启动的新循环取到的
第一个事件就是该残留 SHUTDOWN,启动后立即退出。此后总线"看起来正常"(入队均成功),但无任何消费者,用户输入全部积压,无任何日志。
缺陷二:wake 回调泄漏的 CancelledError 杀死事件循环
wake 回调内部某个 await 被取消时(例如向正在重建 harness 的成员投递),CancelledError 会泄漏到事件循环。该异常继承自 BaseException,不被循环的 except Exception 捕获,导致循环任务静默退出。由于没有任何代码 await 该任务的结果,连 traceback 都不会输出。
缺陷三(同一提交窗口修复):pending_resume 续跑标记在竞态下丢失
coordination/kernel.py 的 _persist_pending_resume() 原先以"harness 仍处于 PAUSED"为写入前提。park 成功后、写盘之前,轮末 finalize_round 若恰好终止 harness,标记被静默丢弃,冷恢复的成员读不到标记直接进入 idle,挂起的轮次丢失,且无法区分"轮次已结束"与"标记未写入"。
详细的环境信息描述
windows
其他辅助信息
版本信息
感谢您的贡献 🎉!