baa-conductor

git clone 

baa-conductor / tasks / archive
im_wower  ·  2026-03-28

T-S025.md

  1# Task T-S025:收口插件管理闭环与真实 Firefox 验收
  2
  3## 直接给对话的提示词
  4
  5`/Users/george/code/baa-conductor/tasks/archive/T-S025.md` 任务文档,完成开发任务。
  6
  7如需补背景,再读:
  8
  9- `/Users/george/code/baa-conductor/plans/archive/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md`
 10- `/Users/george/code/baa-conductor/tasks/archive/T-S022.md`
 11- `/Users/george/code/baa-conductor/tasks/archive/T-S023.md`
 12- `/Users/george/code/baa-conductor/tasks/archive/T-S024.md`
 13- `/Users/george/code/baa-conductor/docs/api/control-interfaces.md`
 14- `/Users/george/code/baa-conductor/docs/api/firefox-local-ws.md`
 15- `/Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
 16
 17## 当前基线
 18
 19- 仓库:`/Users/george/code/baa-conductor`
 20- 分支:`main`
 21- 提交:`07895cd`
 22- 开工要求:如需新分支,从当前 `main` 新切
 23
 24## 当前状态
 25
 26- `已完成(2026-03-26)`
 27- `2026-03-26`:代码闭环已接通;`shell_runtime`、结构化 `action_result`、`/v1/browser` 与 `/describe/control` 已同步落地。
 28- `2026-03-26`:自动化验证已通过,包括 `apps/conductor-daemon/src/index.test.js``tests/browser/browser-control-e2e-smoke.test.mjs` 29- `2026-03-26`:当日的真实 Firefox 手工 smoke 在当前机器上受阻;未发现 `Firefox.app`(已检查 `/Applications``~/Applications`),因此当日无法在本环境完成“真实 Firefox 手工验收”。
 30- `2026-03-27`:后续代码跟进已补上“插件管理页启动 / 浏览器重开 / 扩展重载后自动恢复 desired shell tabs”,并支持把平台根页收进受管理 shell 集合。
 31- `2026-03-27`:后续缺陷修复已补上 `ws_reconnect` 的 deferred 结果语义;当前 `action_result.completed` 不再在真正重连前提前为 `true` 32- `2026-03-27`:后续拆卡 `T-S026` 已在真实 `Firefox.app` 上完成手工 smoke;`plugin_status`、`tab_open`、`tab_restore`、`ws_reconnect` 和“扩展重载后自动恢复”均已通过。
 33
 34## 建议分支名
 35
 36- `feat/browser-control-runtime-closure`
 37
 38## 目标
 39
 40把 Firefox 插件管理闭环真正接进 `conductor`:消费 `shell_runtime`、收口 richer 插件动作结果合同,并完成一轮真实 Firefox 手工 smoke。
 41
 42## 背景
 43
 44`T-S021``T-S024` 已经把通用 browser request / cancel / SSE 和插件管理动作接入主线,但还剩两条实际残余风险:
 45
 46- `conductor` 还不会消费新增的 `shell_runtime` 字段,也没有 richer 的插件管理动作结果合同
 47- 真实 Firefox 手工 smoke 还没跑,因此“手动关 tab -> tab_restore -> WS 重连后状态回报”的浏览器端闭环仍未实测
 48
 49这两项都属于浏览器管理面的最后一公里。如果不收口,当前管理动作虽然已进入主线合同,但仍偏“代码就绪”,还不是“运行闭环已验收”。
 50
 51## 涉及仓库
 52
 53- `/Users/george/code/baa-conductor`
 54
 55## 范围
 56
 57- `conductor` 侧消费 `shell_runtime`
 58- 插件管理动作的 richer 结果合同
 59- `/v1/browser``/describe/control` 的控制读面同步
 60- browser-control 回归测试
 61- 真实 Firefox 手工 smoke 记录
 62
 63## 路径约束
 64
 65- 继续保留两层 describe:
 66  - `/describe/business`
 67  - `/describe/control`
 68- 不新增 `browser describe``plugin describe`
 69- 不改变当前通用 browser request / cancel / SSE 主合同
 70- 不把风控状态持久化并入本任务
 71- 不把多平台 relay 扩展并入本任务
 72
 73## 推荐实现边界
 74
 75建议优先做:
 76
 77- `conductor` 接入并持有 `shell_runtime` 的当前视图
 78- 浏览器管理动作返回结构化结果:
 79  - 动作是否接受
 80  - 动作是否完成
 81  - 失败原因
 82  - 关联平台 / client / tab 摘要
 83  - 新的 runtime 快照或最小状态摘要
 84- `/v1/browser` 和控制读面暴露新的 runtime / 动作结果信息
 85- 补自动化测试,并留出真实 Firefox 手工 smoke 记录位
 86
 87## 允许修改的目录
 88
 89- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
 90- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
 91- `/Users/george/code/baa-conductor/tests/browser/`
 92- `/Users/george/code/baa-conductor/docs/api/`
 93- `/Users/george/code/baa-conductor/docs/firefox/`
 94- `/Users/george/code/baa-conductor/tasks/`
 95- `/Users/george/code/baa-conductor/plans/`
 96
 97## 尽量不要修改
 98
 99- `/Users/george/code/baa-conductor/packages/db/`
100- `/Users/george/code/baa-conductor/apps/status-api/`
101- `/Users/george/code/baa-conductor/packages/host-ops/`
102
103## 必须完成
104
105### 1. 接入 `shell_runtime`
106
107- `conductor` 能消费插件上报的 `shell_runtime`
108- `/v1/browser` 能返回当前 shell runtime 视图或等价摘要
109- `/describe/control` 能描述这部分新的控制读面
110
111### 2. 收口插件动作结果合同
112
113- 浏览器管理动作不再只返回粗略 ack
114- 至少要有结构化结果:
115  - `accepted`
116  - `completed`
117  - `failed`
118  - `reason`
119  - 关联目标摘要
120  - 结果状态摘要
121- `conductor` 与插件侧合同保持一致
122
123### 3. 完成真实 Firefox 验收
124
125- 补一轮真实 Firefox 手工 smoke
126- 至少覆盖:
127  - 手动关闭平台 tab
128  - `tab_restore`
129  - WS 重连
130  - 状态回报恢复
131- 把结果写回任务卡或状态文档
132
133## 需要特别注意
134
135- 不要新增第三层 describe
136- 不要在这个任务里顺手做风控状态持久化
137- 不要把其它平台 request / SSE 接入并进来
138- 如果插件侧已有 payload,优先让 `conductor` 兼容消费,不要重做一套协议
139
140## 验收标准
141
142- `shell_runtime` 已进入 `conductor` 控制读面
143- 浏览器管理动作有结构化结果合同
144- browser-control 自动化测试通过
145- 真实 Firefox 手工 smoke 已完成并有结论记录
146- `git diff --check` 通过
147
148## 推荐验证命令
149
150- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
151- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
152- `pnpm -C /Users/george/code/baa-conductor smoke`
153- `git -C /Users/george/code/baa-conductor diff --check`
154
155## 实施结果
156
157- `conductor-daemon` 现在会从 Firefox 插件 `credentials`、`api_endpoints` 和 `action_result` payload 中消费 `shell_runtime`,并把它挂进当前 client 视图、Claude 读面和 merged browser records。
158- `POST /v1/browser/actions` 不再只返回 dispatch ack;现在会等待插件回传结构化 `action_result`,并统一暴露:
159  - `accepted`
160  - `completed`
161  - `failed`
162  - `reason`
163  - `target`
164  - `result`
165  - `results`
166  - `shell_runtime`
167- Firefox 插件侧现在会为正式 browser/plugin 管理动作回传结构化 `action_result`;legacy `reload` 也会按是否带 `platform` 区分 `controller_reload``tab_reload`168- `/v1/browser` 现已带出:
169  - `current_client.shell_runtime`
170  - `current_client.last_action_result`
171  - `claude.shell_runtime`
172  - `records[].live.shell_runtime`
173- Firefox 插件现在会在管理页启动、浏览器重开或扩展重载后自动执行一次后台 `tab_restore`,恢复之前明确启用过、但当前缺失的 shell tab;如果用户手工打开 Claude `new`、ChatGPT 根页或 Gemini `app`,插件也会把它们纳入受管理 shell 集合。
174
175## 后续代码跟进
176
177- `2026-03-27`:提交 `25be868` 已补上启动时的受管 shell tab 自动恢复逻辑,收口了“插件重启后 desired 仍在、actual 丢失但没有自动调和”的空窗。
178- `2026-03-27`:同一轮跟进里,`verify-mini.sh` 的 wrapper 调用也改成数组参数拼装,降低空参数场景下的脚本调用风险。
179- `2026-03-27`:后续缺陷任务已修复 `BUG-014`,并补上 `ws_reconnect.completed === false` 的 smoke 断言;同日真机手工验收也已完成,剩余主线风险已转到 `T-S035` / `T-S036`180- `2026-03-27`:真实 Firefox 手工 smoke 的执行流程和记录模板已拆到 `/Users/george/code/baa-conductor/tasks/archive/T-S026.md`;同日已在真机完成验收并回写结果。
181- `2026-03-27`:其余两项工程化后续任务也已拆卡:
182  - `/Users/george/code/baa-conductor/tasks/archive/T-S027.md`:补 `browser-request-policy` stale `inFlight` 自愈清扫
183  - `/Users/george/code/baa-conductor/tasks/archive/T-S028.md`:把 ChatGPT browser relay 收口到正式合同
184
185## 自动化验证
186
187- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
188- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
189- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
190
191## 真实 Firefox 手工 Smoke 记录
192
193- 日期:`2026-03-26`、`2026-03-27`
194- 目标步骤:
195  - 手动关闭平台 tab
196  - `tab_restore`
197  - WS 重连
198  - 状态回报恢复
199- `2026-03-26` 结果:阻塞,未执行
200- `2026-03-26` 阻塞原因:当日机器未发现可启动的 `Firefox.app`(已检查 `/Applications`、`~/Applications` 和 Spotlight `org.mozilla.firefox` bundle id)。
201- `2026-03-27` 结果:通过
202- `2026-03-27` 记录来源:后续拆卡 `/Users/george/code/baa-conductor/tasks/archive/T-S026.md`
203- `2026-03-27` 结论:真实 Firefox 手工 smoke 已覆盖 `plugin_status`、`tab_open`、`tab_restore`、`ws_reconnect`、扩展重载自动恢复;其中 `ws_reconnect` 还额外完成了 `disconnect_ms=3000`、`repeat_count=3`、`repeat_interval_ms=500` 的 3 轮稳定性验证。
204
205## 交付要求
206
207完成后请说明:
208
209- `shell_runtime` 最终如何进入 `conductor`
210- 插件动作结果合同最终长什么样
211- 跑了哪些自动化验证
212- 真实 Firefox 手工 smoke 覆盖了哪些步骤
213- 还有哪些剩余风险