baa-conductor


baa-conductor / tasks / archive
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- 还有哪些剩余风险