- commit
- 00dc4be
- parent
- 3769b05
- author
- codex@macbookpro
- date
- 2026-03-27 16:11:53 +0800 CST
docs: add baa next-wave plan and task splits
6 files changed,
+564,
-1
1@@ -0,0 +1,123 @@
2+# BAA 浏览器最终消息中继需求
3+
4+## 状态
5+
6+- `待落地(对应 T-S029)`
7+- 优先级:`high`
8+- 记录时间:`2026-03-27`
9+
10+## 关联文档
11+
12+- [BAA_INSTRUCTION_SYSTEM.md](/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md)
13+- [README.md](/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/README.md)
14+- [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)
15+- [07-rollout-plan.md](/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/07-rollout-plan.md)
16+
17+## 背景
18+
19+当前 repo 已经具备:
20+
21+- Firefox 插件 `page-interceptor.js` 的 network / SSE 拦截骨架
22+- `controller.js` 的 WS 上报链路
23+- Claude / ChatGPT / Gemini 的平台定义和空壳页模型
24+
25+但 BAA 指令系统真正需要的输入不是“半截 stream chunk”,而是:
26+
27+- 一条最终权威 assistant message
28+- 稳定的 `platform`
29+- 最小可用的消息身份元数据
30+- 完整原文 `raw_text`
31+
32+如果没有这层“最终消息 raw relay”,conductor 就无法把 BAA 解析、去重、执行中心稳定地放在服务端。
33+
34+## 核心结论
35+
36+- 浏览器侧只负责“观察最终权威消息并 raw relay”,不负责 BAA 提取、解析、格式化或执行
37+- 首批需求必须覆盖:
38+ - `chatgpt`
39+ - `gemini`
40+- 输入必须是最终完成态消息,不允许在 streaming 半截执行
41+- 同一条 assistant 最终消息,插件侧最多发出一条 `browser.final_message`
42+- 首版只要求 raw relay 稳定到 conductor,不要求在本任务里同时完成 BAA 执行闭环
43+
44+## 首版范围
45+
46+- ChatGPT 最终 assistant message 观察
47+- Gemini 最终 assistant message 观察
48+- Firefox bridge 新消息类型:
49+ - `browser.final_message`
50+- 最小必要元数据:
51+ - `platform`
52+ - `conversation_id`
53+ - `assistant_message_id`
54+ - `raw_text`
55+ - `observed_at`
56+- 插件侧去重与重复抑制
57+- 文档与自动化 smoke
58+
59+## bridge 消息合同
60+
61+首版推荐消息形态:
62+
63+```json
64+{
65+ "type": "browser.final_message",
66+ "platform": "chatgpt",
67+ "conversation_id": "conv_xxx",
68+ "assistant_message_id": "msg_xxx",
69+ "raw_text": "```baa\n@conductor::describe\n```",
70+ "observed_at": 1760000000000
71+}
72+```
73+
74+### 合同要求
75+
76+- `raw_text` 必须是完整最终文本,不是 chunk
77+- `assistant_message_id` 允许首版按平台能力退化;如果页面暂时取不到稳定 message id,至少要提供当前轮次稳定去重所需的等价字段
78+- `conversation_id` 允许为空,但应尽量提供
79+- `observed_at` 使用插件本地时间戳,单位毫秒
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/`
+138,
-0
1@@ -0,0 +1,138 @@
2+# BAA 指令解析中心与最小执行闭环需求
3+
4+## 状态
5+
6+- `待落地(对应 T-S030)`
7+- 优先级:`high`
8+- 记录时间:`2026-03-27`
9+
10+## 关联文档
11+
12+- [BAA_INSTRUCTION_SYSTEM.md](/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md)
13+- [BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md](/Users/george/code/baa-conductor/plans/BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md)
14+- [README.md](/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/README.md)
15+- [02-protocol-spec.md](/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/02-protocol-spec.md)
16+- [04-execution-loop-state-machine.md](/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/04-execution-loop-state-machine.md)
17+- [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)
18+
19+## 背景
20+
21+`BAA_INSTRUCTION_SYSTEM.md` 已经把总模型定义清楚了:
22+
23+- ` ```baa ` 一块一指令
24+- `@target::tool::params`
25+- conductor 是唯一解释中心
26+- 插件不解析 BAA
27+
28+现在缺的不是继续讨论语法,而是把这套模型拆成当前 repo 可执行的第一阶段工程需求:
29+
30+- 从完整 assistant message 中提取 ` ```baa `
31+- 解析为标准化指令
32+- 做去重、权限和最小路由
33+- 先跑通最小执行闭环
34+
35+## 核心结论
36+
37+- 语法层直接冻结在 v3 / v5 当前定义,不再反复改格式
38+- parser / normalize / dedupe / policy / router / executor 全部放进 conductor
39+- 首版只消费“完整最终消息文本”,不依赖 streaming 中间态
40+- 首版先做精确 target,不做 `pool.*` / `role.*`
41+- 首版先做最小工具集,不把 artifact / upload barrier 一次性塞进同一任务
42+
43+## 首版范围
44+
45+### 输入
46+
47+- 完整 assistant message 文本
48+- 最小上下文:
49+ - `platform`
50+ - `conversation_id`
51+ - `assistant_message_id` 或等价 dedupe 字段
52+
53+### 语法与解析
54+
55+- 提取 ` ```baa ` 代码块
56+- 支持四种参数形式:
57+ - 单行字符串
58+ - 单行 JSON
59+ - 多行 body
60+ - 无参数
61+- 忽略普通代码块
62+- 一块一指令,多块并行语义
63+
64+### 标准化与去重
65+
66+- 生成标准化 instruction envelope
67+- 生成稳定 dedupe key
68+- 明确 block index、message identity、target、tool、params
69+- 失败必须 fail-closed,不允许“半解析半执行”
70+
71+### 最小执行闭环
72+
73+首版建议先支持:
74+
75+- `@conductor::describe`
76+- `@conductor::status`
77+- `@conductor::exec`
78+- `@conductor::files/read`
79+- `@conductor::files/write`
80+
81+### 当前明确不要求
82+
83+- 不要求首版就接 `@browser.*::send`
84+- 不要求首版就做 artifact upload / download
85+- 不要求首版就做 `pool.*` / `role.*`
86+- 不要求首版就做多轮 gossip / consensus / task pool
87+
88+## conductor 侧模块建议
89+
90+建议优先新增:
91+
92+```text
93+apps/conductor-daemon/src/instructions/
94+ extract.ts
95+ parse.ts
96+ normalize.ts
97+ dedupe.ts
98+ policy.ts
99+ router.ts
100+ executor.ts
101+ loop.ts
102+```
103+
104+## 路由与执行边界
105+
106+### 路由原则
107+
108+- 先只做精确 target:
109+ - `conductor`
110+ - `system`
111+- `browser.chatgpt` / `browser.gemini` 的真正业务执行留给后续阶段
112+
113+### 执行原则
114+
115+- 优先复用当前 `conductor-daemon` 已有能力
116+- 不要再实现一套平行 shell / file 执行器
117+- executor 只负责把标准化指令映射到现有能力入口
118+
119+## 明确不做
120+
121+- 不在插件里放 parser
122+- 不在本需求里要求 ChatGPT / Gemini 页面拦截完工;那是平行方向
123+- 不在本需求里强行完成最终注入、上传确认、artifact barrier
124+- 不把语法讨论重新打开成新一轮格式设计
125+
126+## 与平行任务的关系
127+
128+- `T-S029` 负责浏览器最终消息 raw relay
129+- 本需求负责 conductor 侧 instruction center
130+- 为了并行推进,本需求必须允许先用 synthetic message / fixture 跑通,而不阻塞于浏览器端最终消息中继
131+
132+## 验收条件
133+
134+- parser 能稳定提取 ` ```baa `,并忽略普通代码块
135+- 四种参数形式都有自动化测试
136+- dedupe key 稳定且可解释
137+- 最小工具集能通过标准化指令跑通执行闭环
138+- 插件侧仍没有 parser 逻辑
139+- 文档已同步到 `plans/`、`tasks/` 和必要的 `docs/baa-instruction-system-v5/`
+13,
-1
1@@ -18,11 +18,15 @@
2 - `已完成`:`T-S001` 到 `T-S025`、`T-S027`、`T-S028`,以及 `T-BUG-011`、`T-BUG-012`、`T-BUG-014`
3 - `当前 TODO`:
4 - `T-S026` 真实 Firefox 手工 smoke 与验收记录
5+ - `T-S029` ChatGPT / Gemini 最终消息观察与 `browser.final_message` raw relay
6+ - `T-S030` BAA 指令解析中心 Phase 1 与最小执行闭环
7 - `待处理缺陷`:当前无 open bug backlog(见 `bugs/README.md`)
8 - `低优先级 TODO`:`4318/status-api` 兼容层删旧与解耦
9
10 当前新的主需求文档:
11
12+- [`./BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md`](./BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md)
13+- [`./BAA_INSTRUCTION_CENTER_REQUIREMENTS.md`](./BAA_INSTRUCTION_CENTER_REQUIREMENTS.md)
14 - [`./BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md`](./BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md)
15 - [`./FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md`](./FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md)
16
17@@ -80,6 +84,8 @@
18
19 - 当前最高优先级剩余任务按顺序是:
20 - `T-S026`:真实 Firefox 手工 smoke 与验收记录
21+ - `T-S029`:补 ChatGPT / Gemini 最终消息观察与 `browser.final_message` raw relay
22+ - `T-S030`:收口 BAA 指令解析中心 Phase 1 与最小执行闭环
23 - 当前 bug backlog 单独留在 `bugs/` 目录,不把它和主线需求任务混写
24 - 当前不把大文件拆分当作主线 blocker
25 - 以下重构工作顺延到下一轮专门重构任务:
26@@ -92,7 +98,7 @@
27 ## 当前缺陷 backlog
28
29 - 当前 open bug backlog:无
30-- 当前没有 bug fix 正在主线开发中;当前下一波主线任务顺序是 `T-S026`
31+- 当前没有 bug fix 正在主线开发中;当前下一波主线任务顺序是 `T-S026 -> (T-S029 || T-S030)`
32
33 ## 低优先级 TODO
34
35@@ -164,6 +170,12 @@
36 - 当前 open bug backlog 已清空
37 - 当前主线下一波任务是:
38 - `T-S026`:真实 Firefox 手工 smoke 与验收记录
39+- BAA 下一波工程任务已拆成两个并行方向:
40+ - `T-S029`:插件侧 ChatGPT / Gemini 最终消息观察与 `browser.final_message` raw relay
41+ - `T-S030`:conductor 侧 BAA 指令解析中心与最小执行闭环
42+- 这两个方向默认并行推进,但边界要保持稳定:
43+ - `T-S029` 不把 parser 放回插件
44+ - `T-S030` 允许先用 synthetic final message / fixture 跑通,不阻塞于浏览器端 relay 完工
45 - `BUG-012` 这轮修复已补上 stale `inFlight` 自愈清扫;当前残余边界是“健康但长时间完全静默”的超长 buffered 请求,理论上仍可能被 `5min` idle 阈值误判
46 - ChatGPT 当前仍依赖浏览器里真实捕获到的有效登录态 / header,且没有 Claude 风格 prompt shortcut;这是当前正式支持面的已知边界
47 - `BUG-014` 的自动化验证目前覆盖的是 conductor 侧语义透传,不是 Firefox 扩展真实运行环境里的 reconnect 生命周期;真实“重连完成”仍依赖后续 `hello` / 状态同步
+132,
-0
1@@ -0,0 +1,132 @@
2+# Task T-S029:补 ChatGPT / Gemini 最终消息观察与 `browser.final_message` raw relay
3+
4+## 直接给对话的提示词
5+
6+读 `/Users/george/code/baa-conductor/tasks/T-S029.md` 任务文档,完成开发任务。
7+
8+如需补背景,再读:
9+
10+- `/Users/george/code/baa-conductor/plans/BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md`
11+- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md`
12+- `/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/06-integration-with-current-baa-conductor.md`
13+- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
14+- `/Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
15+
16+## 当前基线
17+
18+- 仓库:`/Users/george/code/baa-conductor`
19+- 分支:`main`
20+- 提交:`3769b05`
21+- 开工要求:不要从其他任务分支切出;如需新分支,从当前 `main` 新切
22+
23+## 建议分支名
24+
25+- `feat/browser-final-message-relay`
26+
27+## 目标
28+
29+让 Firefox 插件稳定观察 ChatGPT / Gemini 的最终 assistant message,并以统一 `browser.final_message` 消息 raw relay 给 conductor。
30+
31+## 背景
32+
33+当前 BAA 指令系统的关键输入不是 stream chunk,而是最终权威消息全文。插件已经有 network / SSE / WS 基础设施,但还没有把 ChatGPT / Gemini 的最终 assistant message 稳定抽出来发给 conductor。
34+
35+如果这层没打通,conductor 侧的 BAA instruction center 就只能停留在离线或 synthetic fixture 阶段。
36+
37+## 涉及仓库
38+
39+- `/Users/george/code/baa-conductor`
40+
41+## 范围
42+
43+- ChatGPT 最终消息观察
44+- Gemini 最终消息观察
45+- `browser.final_message` bridge 消息
46+- 插件侧最小去重 / 重放抑制
47+- 对应 smoke / 文档回写
48+
49+## 路径约束
50+
51+- 插件只负责“观察并转发最终消息 raw text”,不要在插件里加入 BAA parser
52+- 不要在这个任务里实现 artifact upload / download / delivery plan
53+- 尽量把改动限制在 Firefox 插件和 browser smoke;如果 conductor 侧只需要最小兼容接收,可做最小增量,但不要扩成 instruction center 大任务
54+
55+## 推荐实现边界
56+
57+建议优先做:
58+
59+- 基于现有 network / SSE / 页面状态信号判断“最终 assistant message 完成”
60+- 统一消息形态为 `browser.final_message`
61+- 先保证 ChatGPT / Gemini 各自产出稳定单条最终消息
62+- 补 smoke 断言,覆盖“不在半截 stream 发送”和“同一条消息不重复上报”
63+
64+## 允许修改的目录
65+
66+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
67+- `/Users/george/code/baa-conductor/tests/browser/`
68+- `/Users/george/code/baa-conductor/docs/firefox/`
69+- `/Users/george/code/baa-conductor/docs/api/`
70+- `/Users/george/code/baa-conductor/tasks/`
71+- `/Users/george/code/baa-conductor/plans/`
72+
73+## 尽量不要修改
74+
75+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/instructions/`
76+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
77+- `/Users/george/code/baa-conductor/packages/db/`
78+- `/Users/george/code/baa-conductor/apps/status-api/`
79+
80+## 必须完成
81+
82+### 1. 完成 ChatGPT / Gemini 最终消息观察
83+
84+- 能判断最终 assistant message 何时完成
85+- 不能在 stream 半截就上报
86+- 同一条 assistant 最终消息不能重复上报多次
87+
88+### 2. 补 `browser.final_message` raw relay
89+
90+- 统一消息形态
91+- 至少带:
92+ - `platform`
93+ - `conversation_id`
94+ - `assistant_message_id` 或等价稳定字段
95+ - `raw_text`
96+ - `observed_at`
97+- raw text 必须是完整最终文本,不是 chunk
98+
99+### 3. 补 smoke 和文档
100+
101+- 补自动化验证,优先复用现有 browser smoke
102+- 文档同步说明这层只是“最终消息 raw relay”,不是 BAA parser
103+- 回写相关 `tasks/`、`plans/`、必要时 `docs/firefox/`
104+
105+## 需要特别注意
106+
107+- 不要在插件里做 `extractBaaBlocks()` / `parseBaaBlock()`
108+- 不要把 ChatGPT / Gemini 的页面自动化扩成更大任务
109+- 和 `T-S030` 并行时,尽量不要碰 conductor instruction center 文件;共享合同以 `plans/BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md` 为准
110+
111+## 验收标准
112+
113+- ChatGPT 最终消息能稳定产生一条 `browser.final_message`
114+- Gemini 最终消息能稳定产生一条 `browser.final_message`
115+- 不会在 streaming 半截触发 relay
116+- 同一条最终消息不会因重渲染 / 重放稳定重复上报
117+- `git diff --check` 通过
118+
119+## 推荐验证命令
120+
121+- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
122+- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
123+- `git -C /Users/george/code/baa-conductor diff --check`
124+
125+## 交付要求
126+
127+完成后请说明:
128+
129+- 最终消息是如何判定完成的
130+- `browser.final_message` 最终字段长什么样
131+- 跑了哪些测试
132+- 是否有平台特定边界
133+- 还有哪些剩余风险
+144,
-0
1@@ -0,0 +1,144 @@
2+# Task T-S030:收口 BAA 指令解析中心 Phase 1 与最小执行闭环
3+
4+## 直接给对话的提示词
5+
6+读 `/Users/george/code/baa-conductor/tasks/T-S030.md` 任务文档,完成开发任务。
7+
8+如需补背景,再读:
9+
10+- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_CENTER_REQUIREMENTS.md`
11+- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md`
12+- `/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/02-protocol-spec.md`
13+- `/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/04-execution-loop-state-machine.md`
14+- `/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/docs/06-integration-with-current-baa-conductor.md`
15+
16+## 当前基线
17+
18+- 仓库:`/Users/george/code/baa-conductor`
19+- 分支:`main`
20+- 提交:`3769b05`
21+- 开工要求:不要从其他任务分支切出;如需新分支,从当前 `main` 新切
22+
23+## 建议分支名
24+
25+- `feat/baa-instruction-center`
26+
27+## 目标
28+
29+把 BAA 指令的提取、解析、标准化、去重和最小执行闭环放进 conductor,先跑通 Phase 1 的服务端 instruction center。
30+
31+## 背景
32+
33+`BAA_INSTRUCTION_SYSTEM.md` 和 v5 文档已经把职责边界讲清楚了:插件不解析 BAA,conductor 才是唯一解释中心。当前真正缺的是把这套模型拆成 repo 内可运行的第一阶段工程实现。
34+
35+这张卡的目标不是一次性做完 artifact / upload barrier / 多 AI 路由,而是先把“完整 assistant text -> BAA 指令 -> 最小执行闭环”落到 conductor。
36+
37+## 涉及仓库
38+
39+- `/Users/george/code/baa-conductor`
40+
41+## 范围
42+
43+- ` ```baa ` 提取
44+- 四种参数形式解析
45+- instruction normalize / envelope / dedupe key
46+- 最小路由与执行闭环
47+- 对应测试与文档回写
48+
49+## 路径约束
50+
51+- 这张卡默认以 conductor 侧实现为主,不依赖插件 parser
52+- 应允许先用 synthetic complete assistant text / fixture 跑通,不要阻塞于 `T-S029`
53+- 首版先做精确 target,不做 `pool.*` / `role.*`
54+- 首版先做最小工具集,不要把 artifact / upload / download 全部并进来
55+
56+## 推荐实现边界
57+
58+建议优先做:
59+
60+- 新建 `apps/conductor-daemon/src/instructions/` 子目录
61+- 先把 extraction / parse / normalize / dedupe 做扎实
62+- 再把最小工具集映射到当前已有 conductor 能力
63+- 优先用单元测试和 conductor 侧集成测试证明闭环
64+
65+## 允许修改的目录
66+
67+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
68+- `/Users/george/code/baa-conductor/packages/schemas/src/`
69+- `/Users/george/code/baa-conductor/docs/baa-instruction-system-v5/`
70+- `/Users/george/code/baa-conductor/tasks/`
71+- `/Users/george/code/baa-conductor/plans/`
72+
73+## 尽量不要修改
74+
75+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
76+- `/Users/george/code/baa-conductor/tests/browser/`
77+- `/Users/george/code/baa-conductor/packages/db/`
78+- `/Users/george/code/baa-conductor/apps/status-api/`
79+
80+## 必须完成
81+
82+### 1. 完成提取与解析
83+
84+- 只提取 ` ```baa `
85+- 支持四种参数形式:
86+ - 单行字符串
87+ - 单行 JSON
88+ - 多行 body
89+ - 无参数
90+- 普通代码块必须忽略
91+
92+### 2. 完成标准化与去重
93+
94+- 生成稳定 instruction envelope
95+- 生成稳定 dedupe key
96+- 保留最小可审计字段:
97+ - `platform`
98+ - `conversation_id`
99+ - `assistant_message_id` 或等价消息身份
100+ - `block_index`
101+ - `target`
102+ - `tool`
103+ - `params`
104+
105+### 3. 跑通最小执行闭环
106+
107+- 首版至少支持:
108+ - `@conductor::describe`
109+ - `@conductor::status`
110+ - `@conductor::exec`
111+ - `@conductor::files/read`
112+ - `@conductor::files/write`
113+- 优先复用当前已有 conductor 能力,不要重新造一套平行执行器
114+
115+## 需要特别注意
116+
117+- 不要在这张卡里顺手改插件,让它长 parser
118+- 不要把 artifact 上传、下载、manifest、delivery plan 一次性全做进来
119+- 和 `T-S029` 并行时,默认把浏览器最终消息 relay 当成外部输入;这张卡必须允许先用 synthetic message / fixture 自证闭环
120+- 不要重新打开语法设计争论;v3 / v5 当前格式默认冻结
121+
122+## 验收标准
123+
124+- parser 能稳定提取 ` ```baa `,并忽略普通代码块
125+- 四种参数形式都有自动化测试
126+- dedupe key 稳定且可解释
127+- 最小工具集能通过标准化指令跑通执行闭环
128+- 插件侧仍没有 parser 逻辑
129+- `git diff --check` 通过
130+
131+## 推荐验证命令
132+
133+- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
134+- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
135+- `git -C /Users/george/code/baa-conductor diff --check`
136+
137+## 交付要求
138+
139+完成后请说明:
140+
141+- 提取 / 解析 / normalize / dedupe 是怎么设计的
142+- 最小执行闭环最终覆盖了哪些工具
143+- 跑了哪些测试
144+- 有没有刻意留到下一阶段的能力
145+- 还有哪些剩余风险
+14,
-0
1@@ -18,11 +18,15 @@
2 - `已完成`:`T-S001` 到 `T-S025`、`T-S027`、`T-S028`,以及 `T-BUG-011`、`T-BUG-012`、`T-BUG-014`
3 - `当前 TODO`:
4 - `T-S026` 真实 Firefox 手工 smoke 与验收记录
5+ - `T-S029` ChatGPT / Gemini 最终消息观察与 `browser.final_message` raw relay
6+ - `T-S030` BAA 指令解析中心 Phase 1 与最小执行闭环
7 - `待处理缺陷`:当前无 open bug backlog(见 `../bugs/README.md`)
8 - `低优先级 TODO`:`4318/status-api` 兼容层删旧与解耦
9
10 当前新的主需求文档:
11
12+- [`../plans/BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md`](../plans/BAA_BROWSER_FINAL_MESSAGE_RELAY_REQUIREMENTS.md)
13+- [`../plans/BAA_INSTRUCTION_CENTER_REQUIREMENTS.md`](../plans/BAA_INSTRUCTION_CENTER_REQUIREMENTS.md)
14 - [`../plans/BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md`](../plans/BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md)
15 - [`../plans/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md`](../plans/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md)
16
17@@ -66,6 +70,8 @@
18 ## 已准备的后续任务
19
20 - [`T-S026.md`](./T-S026.md):真实 Firefox 手工 smoke 与验收记录
21+- [`T-S029.md`](./T-S029.md):补 ChatGPT / Gemini 最终消息观察与 `browser.final_message` raw relay
22+- [`T-S030.md`](./T-S030.md):收口 BAA 指令解析中心 Phase 1 与最小执行闭环
23
24 当前主线已经额外收口:
25
26@@ -81,6 +87,8 @@
27
28 - 当前高优先级剩余任务按顺序是:
29 - [`T-S026.md`](./T-S026.md):真实 Firefox 手工 smoke 与验收记录
30+ - [`T-S029.md`](./T-S029.md):补 ChatGPT / Gemini 最终消息观察与 `browser.final_message` raw relay
31+ - [`T-S030.md`](./T-S030.md):收口 BAA 指令解析中心 Phase 1 与最小执行闭环
32 - 当前没有正在执行中的缺陷修复卡;如需继续推进工程改动,优先从残余风险或后续增强项开新卡
33
34 ## 当前主线收口情况
35@@ -126,6 +134,12 @@
36 - 当前 open bug backlog 已清空
37 - 当前主线剩余任务是:
38 - [`T-S026.md`](./T-S026.md):补真实 Firefox 手工 smoke 与验收记录
39+- BAA 下一波工程任务已拆成两个并行方向:
40+ - [`T-S029.md`](./T-S029.md):插件侧 ChatGPT / Gemini 最终消息观察与 `browser.final_message` raw relay
41+ - [`T-S030.md`](./T-S030.md):conductor 侧 BAA 指令解析中心与最小执行闭环
42+- 这两个方向默认并行推进,但边界要保持稳定:
43+ - `T-S029` 以插件侧最终消息 raw relay 为主,不把 parser 放回插件
44+ - `T-S030` 以 synthetic final message / fixture 先跑通,不阻塞于浏览器端 relay 完工
45 - `BUG-012` 这轮修复已补上 stale `inFlight` 自愈清扫;当前残余边界是“健康但长时间完全静默”的超长 buffered 请求,理论上仍可能被 `5min` idle 阈值误判
46 - ChatGPT 当前仍依赖浏览器里真实捕获到的有效登录态 / header,且没有 Claude 风格 prompt shortcut;这是当前正式支持面的已知边界,不是 regression
47 - `BUG-014` 的自动化验证目前覆盖的是 conductor 侧语义透传,不是 Firefox 扩展真实运行环境里的 reconnect 生命周期;真实“重连完成”仍依赖后续 `hello` / 状态同步