fix: 多 bot 话题中 @ 某 bot 时其他 bot 不再抢答#262
Conversation
|
Claude finished @lishuceo's task in 2m 46s —— View job PR Review: 多 bot 话题 @ 某 bot 时其他 bot 不再抢答
✅ Approved — 改动正确、最小、且有精准回归覆盖根因分析(飞书 open_id 按 app 隔离, 逐路径核对了行为,均正确:
几个我特意确认过的边界,都没问题:
🟡 一点可选的观察(非阻塞,confidence ~70,不计入正式 finding)本 PR 修的是 thread_bypass 这道闸。多 bot 模式下还有一条独立的 commander 路由( 这与本 PR 想达到的「@ 别人时不抢答」在 commander 这条路径上并不完全一致。不过:
建议在 PR 描述提到的**二期( 测试
整体评价:小而准的修复,根因清晰、注释把「为什么这么改」讲透了,可以合并。 |
多 bot 共处一个话题时,用户 @ 某个 bot,其他 bot 也会响应。 根因:飞书 open_id 按 app 隔离,同一 bot 在不同 app 下 open_id 不同。 thread_bypass 的闸用 `!anyBotMentioned`(是否 @ 了已知 bot)判定,而 getAllBotOpenIds() 只存各 bot 用自己 app 拉到的「自视 open_id」。当用户 @ 了另一个 bot 时,本 bot 的 app 收到的那条 mention 是「对方在本 app 视角 下的 open_id」,不在 knownBotIds 里 → anyBotMentioned 漏判 → 话题创建者 bot 误以为没人被 @ 而走 bypass 抢答。 修复:改用「是否 @ 了非自己」作为不 bypass 的判据。每个 bot 唯一能可靠 识别的就是自己的 open_id —— 只要消息 @ 了除本 bot 外的任何对象,就说明在 叫别人,不 bypass。同时给单 bot 路径补上此前缺失的同款 mention 闸。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 多 bot: 创建者 bot 看到 @ 了跨 app open_id 未识别的对象 → 不 bypass - 单 bot: 创建者 bot 看到 @ 了另一独立服务 bot → 不 bypass 两个用例在修复前均会失败(走 thread_bypass 抢答),修复后通过。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0792d42 to
fedca02
Compare
|
Claude finished @lishuceo's task in 1m 6s —— View job PR Review: 多 bot 话题中 @ 某 bot 时其他 bot 不再抢答
✅ Approved — 根因准确,修复最小且有精准回归根因分析无懈可击:飞书 open_id 按 app 隔离, 逐路径核对,行为均正确:
我额外确认过的边界,都没问题:
🟡 一点可选观察(非阻塞,confidence ~70)本 PR 修的是 thread_bypass 这道闸。多 bot 模式下还有一条独立的 commander 兜底路由( 测试
小而准的修复,根因清晰、注释把「为什么这么改」讲透了,可以合并。 |
|
Acknowledged(🟡 commander 路径观察)— 确认这是 |
问题
单实例多 bot 模式下,在一个话题里 @ 某个 bot,其他 bot 也会跟着响应。
根因(有日志铁证)
抓到真实双响应消息
@张全栈 接下来做啥(在土豆儿创建的话题里),同一条消息两个 account 收到的文本不同:接下来做啥(@已剥离)mentioned✓@张全栈 接下来做啥(@未剥离)thread_bypass✗ 抢答飞书 open_id 按 app 隔离——同一个 bot 在不同 app 下 open_id 不同。
accountManager.getAllBotOpenIds()存的是每个 bot 用自己 app 拉到的「自视 open_id」。当用户 @ 张全栈时,土豆儿的 app 收到的那条 mention 是「张全栈在 pm-app 视角下的 open_id」,不在knownBotIds里 →anyBotMentioned = false→event-handler.ts里!anyBotMentioned那道闸失效 → 土豆儿作为话题创建者命中thread_bypass抢答。每个 bot 唯一能可靠识别的,就是它自己的 open_id。
修复
把 thread_bypass 的闸从「是否 @ 了已知 bot」改成「是否 @ 了非自己」:
mentioned路径照常响应;「完全不 @」走 bypass 照常响应;唯独「@别人」不再抢答。测试
mention-gate.test.ts新增 2 个用例,精确复现@张全栈 接下来做啥跨 app 漏判场景(多 bot + 单 bot 各一)。npx vitest run:1686 passed,唯一 1 个失败(memory/quality.test.ts)在 base 上同样失败,与本改动无关。后续(可选,二期)
更深的修复是用
union_id(跨 app 稳定)做 bot 互认,让@张全栈在土豆儿侧也能被正确剥离,顺带修掉「prompt 里混进@张全栈字面量」这个次要问题。本 PR 先以最小改动止血。🤖 Generated with Claude Code