baa-conductor

git clone 

baa-conductor / bugs / archive
codex@macbookpro  ·  2026-03-30

BUG-030-score-conversation-link-weak-signals-beat-strong.md

 1# BUG-030: scoreConversationLink 累加分数允许弱信号叠加超过 targetId 强信号
 2
 3> 提交者:Claude
 4> 日期:2026-03-30
 5
 6## 现象
 7
 8`resolveExistingConversationLink` 在多个候选 link 中按分数选最优。当前评分逻辑为累加制:
 9
10```
11targetId  匹配 +100
12pageUrl   匹配 +80
13routePath 匹配 +60
14pageTitle 匹配 +10
15```
16
17如果一个候选项没有匹配 `targetId`,但同时匹配了 `pageUrl + routePath + pageTitle = 150`,则其分数 150 > 100,会胜过另一个只匹配 `targetId` 的候选。
18
19在用户同一平台上同时开着多个对话 tab 时,旧 tab 的 URL 和 routePath 碰巧匹配新对话的概率不低,会导致绑定到错误的 `localConversation`20
21## 触发路径
22
23```text
241. 用户有两个 chatgpt tab:
25   - link_A: targetId=tab:1, pageUrl=/c/abc, routePath=/c/abc
26   - link_B: targetId=tab:2, pageUrl=/c/abc, routePath=/c/abc, pageTitle="My Chat"
272. 新 observe 来自 tab:1,但 link_B 的 pageUrl + routePath + pageTitle 全部匹配
283. scoreConversationLink:
29   - link_A: targetId 匹配 = 100
30   - link_B: pageUrl(80) + routePath(60) + pageTitle(10) = 150
314. link_B 胜出 -> 新消息绑定到 link_B 的 localConversation
32```
33
34## 根因
35
36`apps/conductor-daemon/src/renewal/conversations.ts``scoreConversationLink` 用累加制打分,没有让最强信号(`targetId`)绝对优先。
37
38## 修复建议
39
40### 方案 A(推荐)
41
42`targetId` 的分数拉高到不可能被叠加超过的值:
43
44```typescript
45if (observedRoute.targetId != null && candidate.targetId === observedRoute.targetId) {
46  score += 1000;
47}
48```
49
50### 方案 B
51
52改成瀑布式匹配:如果 `targetId` 匹配则直接返回,不再计算其他维度。
53
54## 严重程度
55
56**Medium**
57
58多 tab 场景下偶发,但一旦触发会导致对话关联错乱。
59
60## 发现时间
61
62`2026-03-30 by Claude`
63
64## 相关代码
65
66- 评分函数:[apps/conductor-daemon/src/renewal/conversations.ts](/Users/george/code/baa-conductor/apps/conductor-daemon/src/renewal/conversations.ts) `scoreConversationLink`
67- 调用方:同文件 `resolveExistingConversationLink`