baa-conductor


baa-conductor / tasks / archive
im_wower  ·  2026-03-28

T-S029.md

  1# Task T-S029:补 ChatGPT / Gemini 最终消息观察与 `browser.final_message` raw relay
  2
  3## 直接给对话的提示词
  4
  5`/Users/george/code/baa-conductor/tasks/archive/T-S029.md` 任务文档,完成开发任务。
  6
  7如需补背景,再读:
  8
  9- `/Users/george/code/baa-conductor/plans/archive/BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md`
 10- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md`
 11- `/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/06-integration-with-current-baa-conductor.md`
 12- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
 13- `/Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
 14
 15## 当前基线
 16
 17- 仓库:`/Users/george/code/baa-conductor`
 18- 分支:`main`
 19- 提交:`3769b05`
 20- 开工要求:不要从其他任务分支切出;如需新分支,从当前 `main` 新切
 21
 22## 建议分支名
 23
 24- `feat/browser-final-message-relay`
 25
 26## 目标
 27
 28让 Firefox 插件稳定观察 ChatGPT / Gemini 的最终 assistant message,并以统一 `browser.final_message` 消息 raw relay 给 conductor。
 29
 30## 背景
 31
 32当前 BAA 指令系统的关键输入不是 stream chunk,而是最终权威消息全文。插件已经有 network / SSE / WS 基础设施,但还没有把 ChatGPT / Gemini 的最终 assistant message 稳定抽出来发给 conductor。
 33
 34如果这层没打通,conductor 侧的 BAA instruction center 就只能停留在离线或 synthetic fixture 阶段。
 35
 36## 涉及仓库
 37
 38- `/Users/george/code/baa-conductor`
 39
 40## 范围
 41
 42- ChatGPT 最终消息观察
 43- Gemini 最终消息观察
 44- `browser.final_message` bridge 消息
 45- 插件侧最小去重 / 重放抑制
 46- 对应 smoke / 文档回写
 47
 48## 路径约束
 49
 50- 插件只负责“观察并转发最终消息 raw text”,不要在插件里加入 BAA parser
 51- 不要在这个任务里实现 artifact upload / download / delivery plan
 52- 尽量把改动限制在 Firefox 插件和 browser smoke;如果 conductor 侧只需要最小兼容接收,可做最小增量,但不要扩成 instruction center 大任务
 53
 54## 推荐实现边界
 55
 56建议优先做:
 57
 58- 基于现有 network / SSE / 页面状态信号判断“最终 assistant message 完成”
 59- 统一消息形态为 `browser.final_message`
 60- 先保证 ChatGPT / Gemini 各自产出稳定单条最终消息
 61- 补 smoke 断言,覆盖“不在半截 stream 发送”和“同一条消息不重复上报”
 62
 63## 允许修改的目录
 64
 65- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
 66- `/Users/george/code/baa-conductor/tests/browser/`
 67- `/Users/george/code/baa-conductor/docs/firefox/`
 68- `/Users/george/code/baa-conductor/docs/api/`
 69- `/Users/george/code/baa-conductor/tasks/`
 70- `/Users/george/code/baa-conductor/plans/`
 71
 72## 尽量不要修改
 73
 74- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
 75- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
 76- `/Users/george/code/baa-conductor/packages/db/`
 77- `/Users/george/code/baa-conductor/apps/status-api/`
 78
 79## 必须完成
 80
 81### 1. 完成 ChatGPT / Gemini 最终消息观察
 82
 83- 能判断最终 assistant message 何时完成
 84- 不能在 stream 半截就上报
 85- 同一条 assistant 最终消息不能重复上报多次
 86
 87### 2. 补 `browser.final_message` raw relay
 88
 89- 统一消息形态
 90- 至少带:
 91  - `platform`
 92  - `conversation_id`
 93  - `assistant_message_id` 或等价稳定字段
 94  - `raw_text`
 95  - `observed_at`
 96- raw text 必须是完整最终文本,不是 chunk
 97
 98### 3. 补 smoke 和文档
 99
100- 补自动化验证,优先复用现有 browser smoke
101- 文档同步说明这层只是“最终消息 raw relay”,不是 BAA parser
102- 回写相关 `tasks/`、`plans/`、必要时 `docs/firefox/`
103
104## 需要特别注意
105
106- 不要在插件里做 `extractBaaBlocks()` / `parseBaaBlock()`
107- 不要把 ChatGPT / Gemini 的页面自动化扩成更大任务
108-`T-S030` 并行时,尽量不要碰 conductor instruction center 文件;共享合同以 `plans/BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md` 为准
109
110## 验收标准
111
112- ChatGPT 最终消息能稳定产生一条 `browser.final_message`
113- Gemini 最终消息能稳定产生一条 `browser.final_message`
114- 不会在 streaming 半截触发 relay
115- 同一条最终消息不会因重渲染 / 重放稳定重复上报
116- `git diff --check` 通过
117
118## 推荐验证命令
119
120- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
121- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
122- `git -C /Users/george/code/baa-conductor diff --check`
123
124## 交付要求
125
126完成后请说明:
127
128- 最终消息是如何判定完成的
129- `browser.final_message` 最终字段长什么样
130- 跑了哪些测试
131- 是否有平台特定边界
132- 还有哪些剩余风险
133
134## 完成回写(2026-03-27)
135
136- 已完成:
137  - Firefox 插件已补上 ChatGPT / Gemini 最终 assistant message 观察,并统一发送 `browser.final_message`
138  - bridge 已最小兼容接收 `browser.final_message`,并把最近快照暴露到 `GET /v1/browser`
139  - automated smoke 已覆盖 ChatGPT 流结束后再上报、Gemini 最终文本提取,以及 recent snapshot 保留
140- 平台特定边界:
141  - ChatGPT 当前主要依赖 conversation SSE 结构;如果页面后续更换 payload 形态,需要同步调整提取器
142  - Gemini 最终文本提取当前基于 `StreamGenerate` / `batchexecute` 风格 payload 的启发式解析,稳定性弱于 ChatGPT,因此保留 synthetic `assistant_message_id` 兜底
143  - conductor 侧本轮只做最小兼容接收和最近快照保留,不落当前持久化表,也没有直接接入 instruction parser
144- 实际验证:
145  - `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`:通过
146  - `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`:`39/39` 通过
147  - `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`:`6/6` 通过