baa-conductor

git clone 

baa-conductor / plans / archive
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 编排