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` 通过