codex@macbookpro
·
2026-03-31
BUG-032-dispatcher-missing-cooldown-after-success.md
1# BUG-032: Dispatcher 成功完成续命后未设置 cooldownUntil,同一对话会被连续续命
2
3> 提交者:Claude
4> 日期:2026-03-30
5
6## 现象
7
8Renewal dispatcher 在标记 job 为 `done` 后,没有回写 `cooldownUntil` 到 `local_conversations` 表。而 renewal projector 在判断对话是否可续命时会检查 `cooldownUntil`(`projector.ts:324`)。由于该字段始终为 null,projector 每个 tick 都会为同一对话的新消息生成新的 renewal job,导致:
9
10- 同一对话在短时间内被反复续命
11- 上游 AI 平台收到大量重复消息,触发限流或产生垃圾对话内容
12- 续命的节流机制形同虚设
13
14## 触发路径
15
16```text
171. projector 扫描到 auto 对话的新 assistant 消息,创建 renewal_job (status=pending)
182. dispatcher 执行 job,proxyDelivery 成功,标 status=done
193. 下一个 tick(10s 后),projector 再次扫描
204. 同一对话 cooldownUntil 仍为 null → projector 判定"可续命"
215. 新消息到达后再次创建 renewal_job
226. 循环重复
23```
24
25## 根因
26
27`apps/conductor-daemon/src/renewal/dispatcher.ts` 第 309-321 行,job 成功后只更新了 `renewal_jobs` 表:
28
29```typescript
30await artifactStore.updateRenewalJob({
31 attemptCount,
32 finishedAt,
33 jobId: job.jobId,
34 // ...
35 status: "done",
36});
37```
38
39缺少对 `local_conversations.cooldownUntil` 的回写。
40
41## 修复建议
42
43在 dispatcher 标记 job 为 `done` 后,调用 `artifactStore.upsertLocalConversation` 设置 cooldown:
44
45```typescript
46await artifactStore.upsertLocalConversation({
47 cooldownUntil: finishedAt + cooldownIntervalMs,
48 localConversationId: job.localConversationId,
49 platform: dispatchContext.conversation.platform,
50 updatedAt: finishedAt
51});
52```
53
54`cooldownIntervalMs` 应为可配置参数,建议默认值与 timed-jobs interval 对齐或更长(如 60s~300s)。
55
56## 严重程度
57
58**High**
59
60这是续命自动化的核心节流机制缺口。上线 auto 模式后会立即触发,导致重复发消息。
61
62## 发现时间
63
64`2026-03-30 by Claude`
65
66## 相关代码
67
68- dispatcher 成功路径:[apps/conductor-daemon/src/renewal/dispatcher.ts](/Users/george/code/baa-conductor/apps/conductor-daemon/src/renewal/dispatcher.ts) 第 309-321 行
69- projector cooldown 检查:[apps/conductor-daemon/src/renewal/projector.ts](/Users/george/code/baa-conductor/apps/conductor-daemon/src/renewal/projector.ts) 第 323-331 行
70- schema cooldown_until 字段:[packages/artifact-db/src/schema.ts](/Users/george/code/baa-conductor/packages/artifact-db/src/schema.ts) `local_conversations.cooldown_until`