文件: internal/swarm/manager.go L609-621(SendToTeammate)、L740-747(GetTeamResults)
问题描述
m.mu 下取 team 指针后解锁再操作。与 DeleteTeam/ShutdownTeammate 并发时:消息可投进已被 cancel 的 teammate Inbox,runner 已退出不消费,SendToTeammate 返回 nil 静默成功。对比 ShutdownTeammate 自身(L520-524 在 tm.mu 下同步 cancel+移除)与 #2121 对 SpawnTeammate 的同类修复,修复模式已存在而 Send 路径未用。
触发场景
leader 并发 SendToTeammate(team, tm, msg) 与 DeleteTeam(team):Send 在 L616 解锁后被调度让出;DeleteTeam 完成移除+cancel;Send 恢复后消息投递成功返回 nil,实际无人消费。
修复建议
投递操作纳入 team 生命周期临界区(team.mu 下校验 teammate 存活 + 投递原子化),或对已 cancel 的 teammate inbox 投递返回错误。
严重程度: medium(并发窗口窄,但后果为静默消息丢失 + 假送达)
来源: cron-1 深度审查,初审 sa-133 + 独立复核 sa-134 双重确认
文件: internal/swarm/manager.go L609-621(SendToTeammate)、L740-747(GetTeamResults)
问题描述
m.mu 下取 team 指针后解锁再操作。与 DeleteTeam/ShutdownTeammate 并发时:消息可投进已被 cancel 的 teammate Inbox,runner 已退出不消费,SendToTeammate 返回 nil 静默成功。对比 ShutdownTeammate 自身(L520-524 在 tm.mu 下同步 cancel+移除)与 #2121 对 SpawnTeammate 的同类修复,修复模式已存在而 Send 路径未用。
触发场景
leader 并发 SendToTeammate(team, tm, msg) 与 DeleteTeam(team):Send 在 L616 解锁后被调度让出;DeleteTeam 完成移除+cancel;Send 恢复后消息投递成功返回 nil,实际无人消费。
修复建议
投递操作纳入 team 生命周期临界区(team.mu 下校验 teammate 存活 + 投递原子化),或对已 cancel 的 teammate inbox 投递返回错误。
严重程度: medium(并发窗口窄,但后果为静默消息丢失 + 假送达)
来源: cron-1 深度审查,初审 sa-133 + 独立复核 sa-134 双重确认