baa-conductor

git clone 

commit
87c6087
parent
9f3ca77
author
im_wower
date
2026-03-28 02:41:54 +0800 CST
chore: archive completed Claude relay task
7 files changed,  +45, -116
M bugs/README.md
+1, -1
 1@@ -13,7 +13,6 @@ bugs/
 2 
 3 ## 待修复
 4 
 5-- `BUG-022`:[`BUG-022-final-message-claude-missing.md`](./BUG-022-final-message-claude-missing.md)
 6 - `MISSING-003`:[`MISSING-003-browser-target-blocked-in-phase1.md`](./MISSING-003-browser-target-blocked-in-phase1.md)
 7 - `OPT-002`:[`OPT-002-executor-timeout.md`](./OPT-002-executor-timeout.md)
 8 - `OPT-003`:[`OPT-003-policy-configurable.md`](./OPT-003-policy-configurable.md)
 9@@ -39,6 +38,7 @@ bugs/
10 | BUG-019 | FIXED | 未闭合 baa block 不再让整条消息失败 |
11 | BUG-020 | FIXED | in-memory deduper 已增加上限与淘汰 |
12 | BUG-021 | FIXED | buffered SSE full_text 只保留文本 |
13+| BUG-022 | FIXED | Claude final-message relay 已补齐 |
14 | MISSING-001 | FIXED | 执行结果已经接到 AI 对话 delivery 主链 |
15 | MISSING-002 | FIXED | 插件侧 delivery plan 执行器已落地 |
16 | OPT-001 | — | action_result 命名风格等代码质量建议 |
R bugs/BUG-022-final-message-claude-missing.md => bugs/archive/BUG-022-final-message-claude-missing.md
+11, -0
 1@@ -1,5 +1,16 @@
 2 # BUG-022: final-message.js 缺少 Claude 平台支持,有机回复永远不会被捕获
 3 
 4+## 状态
 5+
 6+- 已修复(2026-03-28,代码已合入主线)
 7+
 8+## 当前代码结论
 9+
10+- `isRelevantStreamUrl()` 现在已补齐 Claude `/completion` 识别
11+- `observeSse()` 和 `observeNetwork()` 都已显式支持 Claude final-message 提取
12+- Claude 的空 `completion` 事件不会再把元数据误拼进 `raw_text`
13+- 当前自动化验证覆盖了 SSE 和 buffered/network 两条 Claude relay 路径
14+
15 > 提交者:Claude(代码审查 + 实测验证)
16 > 日期:2026-03-27
17 
M bugs/archive/README.md
+2, -1
 1@@ -3,7 +3,7 @@
 2 本目录保留 `已关闭` 或 `已修复` 的 `BUG-*`、`FIX-BUG-*`、`MISSING-*` 和 `OPT-*` 文档。
 3 
 4 - 归档时间:`2026-03-28`
 5-- 最近新增归档:`BUG-018`、`BUG-019`、`BUG-020`、`BUG-021`
 6+- 最近新增归档:`BUG-018`、`BUG-019`、`BUG-020`、`BUG-021`、`BUG-022`
 7 
 8 最近归档的问题:
 9 
10@@ -11,3 +11,4 @@
11 - `BUG-019`:未闭合 baa block 不再让整条消息失败
12 - `BUG-020`:in-memory deduper 已增加上限与淘汰
13 - `BUG-021`:buffered SSE `full_text` 现在只保留文本
14+- `BUG-022`:Claude final-message relay 已补齐 SSE 与 buffered 路径
D tasks/T-BUG-018.md
+0, -111
  1@@ -1,111 +0,0 @@
  2-# Task T-BUG-018:补齐 Claude final-message relay 支持
  3-
  4-## 直接给对话的提示词
  5-
  6-读 `/Users/george/code/baa-conductor/tasks/T-BUG-018.md` 任务文档,完成开发任务。
  7-
  8-如需补背景,再读:
  9-
 10-- `/Users/george/code/baa-conductor/bugs/BUG-022-final-message-claude-missing.md`
 11-- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md`
 12-- `/Users/george/code/baa-conductor/tasks/TASK_OVERVIEW.md`
 13-
 14-## 当前基线
 15-
 16-- 仓库:`/Users/george/code/baa-conductor`
 17-- 分支基线:`main`
 18-- 提交:`6c0b602`
 19-- 开工要求:必须先从当前 `main` 新建任务分支,再开始开发;禁止直接在 `main` 上修改。功能任务分支名必须以 `feat/` 开头,缺陷任务分支名必须以 `bug/` 开头。
 20-
 21-## 必须创建的新分支名
 22-
 23-- `bug/bug-022-claude-final-message-relay`
 24-
 25-## 目标
 26-
 27-让 Firefox 插件的 `final-message` relay 正式支持 Claude,使 Claude 的有机最终回复能进入 `browser.final_message -> instruction_ingest` 主链。
 28-
 29-## 背景
 30-
 31-当前 `plugins/baa-firefox/final-message.js` 只对 `chatgpt` 和 `gemini` 做了 final-message 提取。Claude 没有 stream URL 识别,也没有 Claude SSE 文本提取器,导致用户在 Claude 页面里正常拿到回复时,conductor 仍然收不到 `platform=claude` 的 `browser.final_message`。这会直接让 Claude 平台上的 BAA 指令闭环失效。
 32-
 33-## 涉及仓库
 34-
 35-- `/Users/george/code/baa-conductor`
 36-
 37-## 范围
 38-
 39-- 补齐 Claude 的 final-message SSE 识别
 40-- 补齐 Claude 的 candidate 提取与 relay 构造
 41-- 补最小自动化回归测试
 42-
 43-## 路径约束
 44-
 45-优先在 Firefox 插件的 `final-message.js` 和现有 smoke / 单测入口内完成修复,不要顺手重写整个 network observer,也不要扩成新的 browser request / delivery 任务。
 46-
 47-## 推荐实现边界
 48-
 49-建议优先做:
 50-
 51-- 给 `isRelevantStreamUrl()` 增加 Claude `/completion` 识别
 52-- 新增 `extractClaudeCandidateFromText()`,从 Claude SSE `completion` 事件里提取 `completion`、`id`、`conversationId`
 53-- 在 `observeSse()` 和 `observeNetwork()` 里显式加 Claude 分支
 54-- 复用现有 `tests/browser/browser-control-e2e-smoke.test.mjs` 的 `final-message` 测试入口补回归
 55-
 56-## 允许修改的目录
 57-
 58-- `/Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
 59-- `/Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
 60-
 61-## 尽量不要修改
 62-
 63-- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
 64-- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
 65-- `/Users/george/code/baa-conductor/plugins/baa-firefox/delivery-adapters.js`
 66-- `/Users/george/code/baa-conductor/docs/`
 67-
 68-## 必须完成
 69-
 70-### 1. 补齐 Claude SSE 识别
 71-
 72-- Claude `/completion` 流量要能被 `isRelevantStreamUrl()` 识别
 73-- `observeSse()` 不能再对 Claude 直接 `return null`
 74-
 75-### 2. 补齐 Claude candidate 提取
 76-
 77-- 从 Claude SSE `completion` 事件里拼出完整 `rawText`
 78-- 优先提取真实 `assistantMessageId`
 79-- 从请求 URL 或页面 URL 中提取 `conversationId`
 80-
 81-### 3. 补自动化回归
 82-
 83-- 覆盖 Claude final-message relay 的正向场景
 84-- 验证 relay 结果里 `platform`、`conversation_id`、`assistant_message_id`、`raw_text` 合理
 85-- 保持现有 ChatGPT / Gemini final-message 测试不回归
 86-
 87-## 需要特别注意
 88-
 89-- 不要破坏现有 ChatGPT / Gemini 提取逻辑
 90-- Claude 的空 `completion` 事件不能把元数据误拼进最终文本
 91-- 这张卡只修 `final-message relay`,不要顺手扩 `browser.claude` target 或新的 delivery 逻辑
 92-
 93-## 验收标准
 94-
 95-- Claude 页面回复完成后,插件能产生 `platform: "claude"` 的 `browser.final_message`
 96-- Claude 的 `raw_text` 是完整回复文本,不混入 SSE 元数据
 97-- Claude 回复中包含 baa 代码块时,现有 `instruction_ingest` 主链具备被触发的前置条件
 98-
 99-## 推荐验证命令
100-
101-- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
102-- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
103-- `git diff --check`
104-
105-## 交付要求
106-
107-完成后请说明:
108-
109-- 修改了哪些文件
110-- 核心实现思路是什么
111-- 跑了哪些测试
112-- 还有哪些剩余风险
M tasks/TASK_OVERVIEW.md
+2, -2
 1@@ -17,7 +17,7 @@
 2 
 3 - `已完成`:见 [`./archive/README.md`](./archive/README.md)
 4 - `当前 TODO`:
 5-  - [`T-BUG-018.md`](./T-BUG-018.md):补齐 Claude final-message relay 支持
 6+  - 下一张主线任务卡待新建
 7 - `待处理缺陷`:见 [`../bugs/README.md`](../bugs/README.md)
 8 - `低优先级 TODO`:`4318/status-api` 兼容层删旧与解耦
 9 
10@@ -51,7 +51,7 @@
11   - upload / download / artifact route 已移除
12   - 默认超长策略改成前 `200` 行 + `超长截断`
13 - `2026-03-28`:`T-BUG-015`、`T-BUG-016`、`T-BUG-017` 已完成并归档到 [`./archive/README.md`](./archive/README.md)
14-- `2026-03-28`:当前活跃缺陷任务卡为 [`T-BUG-018.md`](./T-BUG-018.md),用于修复 Claude final-message relay 缺失
15+- `2026-03-28`:`T-BUG-018` 已完成并归档到 [`./archive/README.md`](./archive/README.md)
16 
17 ## 当前主线收口情况
18 
M tasks/archive/README.md
+1, -1
1@@ -10,7 +10,7 @@
2 - 基础收口:[`T-S001.md`](./T-S001.md)、[`T-S002.md`](./T-S002.md)、[`T-S003.md`](./T-S003.md)、[`T-S004.md`](./T-S004.md)、[`T-S005.md`](./T-S005.md)、[`T-S006.md`](./T-S006.md)、[`T-S007.md`](./T-S007.md)、[`T-S008.md`](./T-S008.md)、[`T-S009.md`](./T-S009.md)、[`T-S010.md`](./T-S010.md)、[`T-S011.md`](./T-S011.md)、[`T-S012.md`](./T-S012.md)、[`T-S013.md`](./T-S013.md)、[`T-S014.md`](./T-S014.md)、[`T-S015.md`](./T-S015.md)、[`T-S016.md`](./T-S016.md)
3 - 浏览器桥接主线:[`T-S017.md`](./T-S017.md)、[`T-S018.md`](./T-S018.md)、[`T-S019.md`](./T-S019.md)、[`T-S020.md`](./T-S020.md)、[`T-S021.md`](./T-S021.md)、[`T-S022.md`](./T-S022.md)、[`T-S023.md`](./T-S023.md)、[`T-S024.md`](./T-S024.md)、[`T-S025.md`](./T-S025.md)、[`T-S026.md`](./T-S026.md)、[`T-S027.md`](./T-S027.md)、[`T-S028.md`](./T-S028.md)
4 - BAA 主线:[`T-S029.md`](./T-S029.md)、[`T-S030.md`](./T-S030.md)、[`T-S031.md`](./T-S031.md)、[`T-S032.md`](./T-S032.md)、[`T-S033.md`](./T-S033.md)、[`T-S034.md`](./T-S034.md)、[`T-S035.md`](./T-S035.md)、[`T-S036.md`](./T-S036.md)
5-- 缺陷修复:[`T-BUG-011.md`](./T-BUG-011.md)、[`T-BUG-012.md`](./T-BUG-012.md)、[`T-BUG-014.md`](./T-BUG-014.md)、[`T-BUG-015.md`](./T-BUG-015.md)、[`T-BUG-016.md`](./T-BUG-016.md)、[`T-BUG-017.md`](./T-BUG-017.md)
6+- 缺陷修复:[`T-BUG-011.md`](./T-BUG-011.md)、[`T-BUG-012.md`](./T-BUG-012.md)、[`T-BUG-014.md`](./T-BUG-014.md)、[`T-BUG-015.md`](./T-BUG-015.md)、[`T-BUG-016.md`](./T-BUG-016.md)、[`T-BUG-017.md`](./T-BUG-017.md)、[`T-BUG-018.md`](./T-BUG-018.md)
7 
8 ## 当前仍在根目录的任务卡
9 
A tasks/archive/T-BUG-018.md
+28, -0
 1@@ -0,0 +1,28 @@
 2+# Task T-BUG-018:补齐 Claude final-message relay 支持
 3+
 4+## 当前状态
 5+
 6+- 已完成(2026-03-28,代码已合入主线)
 7+
 8+## 完成结果
 9+
10+- Firefox 插件的 `final-message` relay 已正式支持 Claude
11+- Claude `/completion` SSE 与 network buffered 响应现在都能提取最终文本
12+- Claude 的 `assistant_message_id` 与 `conversation_id` 会一起进入 `browser.final_message`
13+- 空 `completion` 事件不再把元数据误拼进 `raw_text`
14+
15+## 实际修改文件
16+
17+- `/Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
18+- `/Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
19+
20+## 实际验证
21+
22+- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
23+- `node --test --test-name-pattern='final message relay observer extracts Claude completion text and metadata only after stream completion|final message relay network observer extracts Claude buffered completion text without metadata pollution|final message relay observer extracts Gemini final text only after stream completion' /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
24+- `git diff --check`
25+
26+## 剩余风险
27+
28+- 这次没有做真实 Firefox + Claude 页面手工 smoke;当前验证覆盖的是仓库内现有测试入口
29+- 如果 Claude 后续修改 `/completion` URL 形状或 SSE 事件字段名,插件侧提取规则仍需要同步调整