im_wower
·
2026-03-28
T-BUG-019.md
1# Task T-BUG-019:修复 Claude final-message 在真实 Firefox 中未被捕获
2
3## 直接给对话的提示词
4
5读 `/Users/george/code/baa-conductor/tasks/T-BUG-019.md` 任务文档,完成开发任务。
6
7如需补背景,再读:
8
9- `/Users/george/code/baa-conductor/bugs/BUG-023-claude-final-message-not-captured-in-practice.md`
10- `/Users/george/code/baa-conductor/tasks/TASK_OVERVIEW.md`
11- `/Users/george/code/baa-conductor/plans/BAA_INSTRUCTION_SYSTEM.md`
12
13## 当前基线
14
15- 仓库:`/Users/george/code/baa-conductor`
16- 分支基线:`main`
17- 提交:`fa6290a`
18- 开工要求:必须先从当前 `main` 新建任务分支,再开始开发;禁止直接在 `main` 上修改。功能任务分支名必须以 `feat/` 开头,缺陷任务分支名必须以 `bug/` 开头。
19
20## 必须创建的新分支名
21
22- `bug/bug-023-claude-runtime-final-message`
23
24## 目标
25
26让 Claude 的真实聊天页在 Firefox 实际运行环境中,稳定产出 `browser.final_message`,不再只在仓库内测试里通过。
27
28## 背景
29
30当前 `final-message.js` 的 Claude 解析逻辑已经补齐,自动化测试也通过,但真实 Firefox 环境里 Claude 聊天页仍然没有 final-message 进入 conductor。代码核对后,至少存在两个运行时层面的缺口:
31
32- 插件 reload 后,没有任何显式的脚本 reinject 逻辑把新版 `content-script.js` / `page-interceptor.js` 注入到已经打开的 Claude 聊天 tab
33- `tab_reload` 只会 reload 受管 shell tab(`#baa-shell`),不会 reload 用户实际聊天的 `claude.ai/chat/...` tab
34
35另外,`controller.js` 的 `ensureTrackedTabId()` 也会拒绝非 shell URL 的 sender,因此非 shell 聊天页的 page activity 无法进入受管状态读面。这至少会让 `lastActivityAt`、busy 状态和一些诊断字段失真。
36
37## 涉及仓库
38
39- `/Users/george/code/baa-conductor`
40
41## 范围
42
43- 修复 Claude 聊天页的运行时注入 / 观察链,让真实页能把 final-message 送进 controller
44- 修复或收口 `tab_reload` / 扩展 reload 后“用户聊天 tab 仍跑旧脚本”的问题
45- 补最小自动化回归测试
46
47## 路径约束
48
49优先在 Firefox 插件运行时层解决,不要顺手修改 conductor、instruction center 或 browser request 协议。重点范围应放在“脚本注入、tab 选择、页面消息接收”三件事。
50
51## 推荐实现边界
52
53建议优先做:
54
55- 为已打开的 Claude / ChatGPT / Gemini 页面补一条显式 reinject 路径,至少覆盖 Claude
56- 或者确保 `tab_reload` 能 reload 实际聊天页,而不是只 reload shell tab
57- 重新梳理 `ensureTrackedTabId()` / `getSenderContext()` 对非 shell 聊天页的处理,避免真实聊天页的观测消息被静默丢弃
58- 在 `tests/browser/browser-control-e2e-smoke.test.mjs` 补能覆盖该运行时语义的最小回归
59
60## 允许修改的目录
61
62- `/Users/george/code/baa-conductor/plugins/baa-firefox/background.js`
63- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
64- `/Users/george/code/baa-conductor/plugins/baa-firefox/content-script.js`
65- `/Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
66- `/Users/george/code/baa-conductor/plugins/baa-firefox/manifest.json`
67- `/Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
68
69## 尽量不要修改
70
71- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
72- `/Users/george/code/baa-conductor/plugins/baa-firefox/final-message.js`
73- `/Users/george/code/baa-conductor/plugins/baa-firefox/delivery-adapters.js`
74- `/Users/george/code/baa-conductor/docs/`
75
76## 必须完成
77
78### 1. 修复真实聊天页注入 / reload 问题
79
80- 扩展 reload 后,已打开的 Claude 聊天页要有明确方式拿到当前版本的 observer 逻辑
81- `tab_reload` 不能再只对 shell tab 生效而对实际聊天页无效
82
83### 2. 修复页面观测消息被静默丢弃的问题
84
85- Claude 聊天页发出的 page net / page sse 观测消息不能因为“不是 shell URL”被全部静默丢弃
86- 至少要保证 final-message 相关链路和必要的运行态诊断字段能更新
87
88### 3. 补回归
89
90- 覆盖“真实聊天页 / 非 shell 页”观测消息不再被错误过滤
91- 覆盖扩展 reload 或 tab reload 后,Claude final-message 观察链仍可工作
92
93## 需要特别注意
94
95- 不要破坏当前 `#baa-shell` 受管模型和 `desired/actual/drift` 语义
96- 不要把这张卡扩成完整多 tab 管理重构
97- 不要回退 BUG-022 已修好的 Claude final-message 解析逻辑
98- 如果引入 reinject,要保持实现可解释、可测试,并尽量限制到必要 host / 文件
99
100## 验收标准
101
102- 在真实 Claude 聊天页里,扩展 reload 后无需手工重开所有页面,也能重新拿到 final-message 观察能力
103- Claude 聊天完成后,controller / conductor 能收到 `platform: "claude"` 的 `browser.final_message`
104- 与 `Gemini`、`ChatGPT` 的现有 observer 行为不回归
105
106## 推荐验证命令
107
108- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
109- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
110- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
111- `git diff --check`
112
113## 交付要求
114
115完成后请说明:
116
117- 修改了哪些文件
118- 核心实现思路是什么
119- 跑了哪些测试
120- 还有哪些剩余风险