baa-conductor


baa-conductor / tasks / archive
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- 还有哪些剩余风险