im_wower
·
2026-03-28
BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md
1# BAA 浏览器最终消息中继需求
2
3## 状态
4
5- `已落地(T-S029 已实现)`
6- 优先级:`high`
7- 记录时间:`2026-03-27`
8
9## 关联文档
10
11- [BAA_INSTRUCTION_SYSTEM.md](/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md)
12- [README.md](/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/README.md)
13- [06-integration-with-current-baa-conductor.md](/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/06-integration-with-current-baa-conductor.md)
14- [07-rollout-plan.md](/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/07-rollout-plan.md)
15
16## 背景
17
18当前 repo 已经具备:
19
20- Firefox 插件 `page-interceptor.js` 的 network / SSE 拦截骨架
21- `controller.js` 的 WS 上报链路
22- Claude / ChatGPT / Gemini 的平台定义和空壳页模型
23
24但 BAA 指令系统真正需要的输入不是“半截 stream chunk”,而是:
25
26- 一条最终权威 assistant message
27- 稳定的 `platform`
28- 最小可用的消息身份元数据
29- 完整原文 `raw_text`
30
31如果没有这层“最终消息 raw relay”,conductor 就无法把 BAA 解析、去重、执行中心稳定地放在服务端。
32
33## 核心结论
34
35- 浏览器侧只负责“观察最终权威消息并 raw relay”,不负责 BAA 提取、解析、格式化或执行
36- 首批需求必须覆盖:
37 - `chatgpt`
38 - `gemini`
39- 输入必须是最终完成态消息,不允许在 streaming 半截执行
40- 同一条 assistant 最终消息,插件侧最多发出一条 `browser.final_message`
41- 首版只要求 raw relay 稳定到 conductor,不要求在本任务里同时完成 BAA 执行闭环
42
43## 首版范围
44
45- ChatGPT 最终 assistant message 观察
46- Gemini 最终 assistant message 观察
47- Firefox bridge 新消息类型:
48 - `browser.final_message`
49- 最小必要元数据:
50 - `platform`
51 - `conversation_id`
52 - `assistant_message_id`
53 - `raw_text`
54 - `observed_at`
55- 插件侧去重与重复抑制
56- 文档与自动化 smoke
57
58## bridge 消息合同
59
60首版推荐消息形态:
61
62```json
63{
64 "type": "browser.final_message",
65 "platform": "chatgpt",
66 "conversation_id": "conv_xxx",
67 "assistant_message_id": "msg_xxx",
68 "raw_text": "```baa\n@conductor::describe\n```",
69 "observed_at": 1760000000000
70}
71```
72
73### 合同要求
74
75- `raw_text` 必须是完整最终文本,不是 chunk
76- `assistant_message_id` 允许首版按平台能力退化;如果页面暂时取不到稳定 message id,至少要提供当前轮次稳定去重所需的等价字段
77- `conversation_id` 允许为空,但应尽量提供
78- `observed_at` 使用插件本地时间戳,单位毫秒
79- 首版 server 侧只要求 live 接收与最近快照保留,不要求同时落库
80
81## 插件侧需求
82
83### 观察原则
84
85- 只观察最终权威 assistant message
86- 不解析 ` ```baa `
87- 不根据消息内容直接执行任何外部能力
88- 不在普通用户输入、草稿、thinking 中间态上报
89
90### 推荐实现边界
91
92- 优先基于页面内已存在的 network / SSE / 页面状态信号完成最终消息拼接
93- DOM 兜底只能作为最后手段,不应成为首选主路径
94- 对同一 assistant 消息做最小重复抑制,避免页面重渲染、重放或 reconnect 时重复上报
95
96## conductor 侧需求
97
98首版 conductor 侧只需要:
99
100- 接收 `browser.final_message`
101- 记录或转交给后续 instruction center
102- 为后续 dedupe / audit 保留最小字段
103
104### 当前明确不要求
105
106- 不要求在本需求里完成 BAA 提取和执行
107- 不要求在本需求里完成 artifact upload / download
108- 不要求在本需求里补多 AI 路由、任务池或共识层
109
110## 明确不做
111
112- 不在插件里实现 `extractBaaBlocks`
113- 不在插件里实现 `parseBaaBlock`
114- 不在插件里做 result formatting / manifest / delivery plan
115- 不把 ChatGPT / Gemini 页面自动化当成首版 blocker
116- 不要求首版做 Claude 最终消息 raw relay,一旦 ChatGPT / Gemini 路线稳定,再按同合同补齐即可
117
118## 验收条件
119
120- ChatGPT 最终 assistant message 能稳定产生一条 `browser.final_message`
121- Gemini 最终 assistant message 能稳定产生一条 `browser.final_message`
122- streaming 半截、重复重放、页面重渲染不会导致同一消息多次上报
123- 插件仍保持薄层,不引入 BAA 解析逻辑
124- 文档已同步到 `docs/firefox/`、`plans/`、`tasks/`
125
126## 当前平台边界与残余风险
127
128- ChatGPT 当前主要依赖 conversation SSE 结构;如果页面后续调整 payload 形态,需要同步修改提取器
129- Gemini 当前基于 `StreamGenerate` / `batchexecute` 风格 payload 的启发式解析来抽取最终文本;稳定性弱于 ChatGPT,因此保留 synthetic `assistant_message_id` 兜底
130- conductor 侧现已把 `browser.final_message` 接到 live instruction ingest,且 live message dedupe / instruction dedupe 已落到单节点本地持久化;但这层不做跨节点共享
131- 当前 ingest / execute 摘要已进入 bounded journal;读面保留最近窗口,不扩成无限历史
132- 当前 live 路径已接到 artifact / upload / inject / send,但仍只允许 Phase 1 精确 target,不扩到跨节点或完整 task/run 编排