im_wower
·
2026-03-28
T-BUG-020.md
1# Task T-BUG-020:修复 ChatGPT 新对话 final-message 仍复用旧 identity
2
3> 已完成并归档:`2026-03-28`
4
5## 直接给对话的提示词
6
7读 `/Users/george/code/baa-conductor/tasks/archive/T-BUG-020.md` 任务文档,查看已完成任务记录。
8
9如需补背景,再读:
10
11- `/Users/george/code/baa-conductor/bugs/archive/BUG-024-chatgpt-final-message-stale-identity.md`
12- `/Users/george/code/baa-conductor/tasks/TASK_OVERVIEW.md`
13- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md`
14
15## 当前基线
16
17- 仓库:`/Users/george/code/baa-conductor`
18- 分支基线:`main`
19- 提交:`499bd69`
20- 开工要求:必须先从当前 `main` 新建任务分支,再开始开发;禁止直接在 `main` 上修改。功能任务分支名必须以 `feat/` 开头,缺陷任务分支名必须以 `bug/` 开头。
21- 开发隔离要求:必须使用新的 `git worktree` 开发本任务,禁止直接在当前正在使用的插件工作目录里修改并 reload 扩展,避免影响当前稳定可用的 Firefox 插件。
22
23## 必须创建的新分支名
24
25- `bug/bug-024-chatgpt-final-message-identity`
26
27## 推荐 worktree
28
29- 建议新建:`/Users/george/code/baa-conductor-bug-024`
30- 建议命令:`git worktree add ../baa-conductor-bug-024 -b bug/bug-024-chatgpt-final-message-identity main`
31
32## 目标
33
34让 ChatGPT 的新对话 / 新回复在真实页面里稳定产出新的 `browser.final_message` identity,不再把新消息上报成旧消息重放,导致 conductor 判成 `duplicate_message`。
35
36## 背景
37
38当前真实测试里,用户已经在 ChatGPT 新对话里拿到新的 assistant 回复,但 conductor 最新 ingest 仍然显示:
39
40- `status = duplicate_message`
41- `assistant_message_id` 还是旧值
42- `conversation_id` 还是旧值
43
44与此同时,conductor 的 delivery 没有新记录,说明问题发生在 final-message 上报之前或上报时,不是在执行或 delivery 阶段。
45
46这张卡的重点不是改 conductor dedupe,而是修正 ChatGPT 页面观察 / 提取 / relay identity。
47
48## 涉及仓库
49
50- `/Users/george/code/baa-conductor`
51
52## 范围
53
54- 修复 ChatGPT final-message identity 复用旧 assistant / conversation 的问题
55- 修复页面重载、脚本 reinject 或旧消息重放导致的 stale relay
56- 补最小自动化回归
57
58## 路径约束
59
60优先在 Firefox 插件的 final-message 观察链里解决,不要通过放宽 conductor dedupe 来掩盖问题。必要时才最小改动 `conductor-daemon` 测试或快照读面。
61
62## 推荐实现边界
63
64建议优先做:
65
66- 检查 ChatGPT candidate 提取对 conversationId / assistantMessageId 的来源优先级
67- 检查 observer reinject / stream state 是否会把旧页面的旧消息再次当成新消息上报
68- 保持 conductor 现有 dedupe 语义,不要把“旧消息重放”误判为新执行
69
70## 允许修改的目录
71
72- `/Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
73- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
74- `/Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
75- `/Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
76- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
77
78## 尽量不要修改
79
80- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
81- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/firefox-ws.ts`
82- `/Users/george/code/baa-conductor/plugins/baa-firefox/delivery-adapters.js`
83- `/Users/george/code/baa-conductor/docs/`
84
85## 必须完成
86
87### 1. 修正新消息 identity
88
89- 新的 ChatGPT assistant 回复要生成新的 `assistant_message_id` / `conversation_id` 组合,或至少生成新的 relay identity
90- 不允许继续把新对话回复上报成旧消息
91
92### 2. 修正 stale replay
93
94- 页面刷新、扩展 reload、脚本 reinject 后,旧消息不能再次被当成新消息 relay
95- 但真正的新回复仍然要能被 relay
96
97### 3. 补回归
98
99- 覆盖 ChatGPT 新 turn 的 final-message identity 更新
100- 覆盖旧消息 replay 不会错误触发新执行
101- 保持现有 Claude / Gemini final-message 行为不回归
102
103## 需要特别注意
104
105- 不要通过关闭 conductor dedupe 来“修复”这个问题
106- 不要把这张卡扩成 delivery 架构重构;delivery 改造留给 `T-S038`
107- 不要回退已经修好的 Claude live-tab / final-message 观察链
108
109## 验收标准
110
111- 新的 ChatGPT 回复进入 conductor 时,不再被判成旧消息 `duplicate_message`
112- `instruction_ingest.last_execute` 能出现新的 assistant message identity
113- ChatGPT、Claude、Gemini 现有 final-message 测试不回归
114
115## 推荐验证命令
116
117- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
118- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
119- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
120- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
121- `git diff --check`
122
123## 交付要求
124
125完成后请说明:
126
127- 修改了哪些文件
128- identity 复用的根因是什么
129- 新的 dedupe / relay 判断是怎么做的
130- 跑了哪些测试
131- 还有哪些剩余风险