Skip to content

[Bug]: 【agent-teams】团队暂停→恢复后用户输入静默丢失:事件总线残留 SHUTDOWN 信号 + pending_resume 续跑标记丢失 #501

Description

Checklist

  • 我已经搜索过相关问题,但没有得到预期的帮助。
  • 最新版本中该错误尚未修复。
  • 请注意,如果您提交的Bug描述缺少相应的环境信息和最小可复现的demo,我们将很难复现和解决该问题,从而降低收到反馈的可能性,甚至该问题将被关闭。

🐞 问题详细描述

现象

团队模式完成一轮对话、协调层进入暂停(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

其他辅助信息

版本信息

感谢您的贡献 🎉!

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions