- commit
- 5d4febb
- parent
- 0f218b9
- author
- codex@macbookpro
- date
- 2026-03-26 17:22:59 +0800 CST
docs: add browser bridge development tasks
5 files changed,
+620,
-6
+156,
-0
1@@ -0,0 +1,156 @@
2+# Task T-S021:收口 conductor describe 与通用 browser HTTP 合同
3+
4+## 直接给对话的提示词
5+
6+读 `/Users/george/code/baa-conductor/tasks/T-S021.md` 任务文档,完成开发任务。
7+
8+如需补背景,再读:
9+
10+- `/Users/george/code/baa-conductor/plans/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md`
11+- `/Users/george/code/baa-conductor/plans/BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md`
12+- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-FIREFOX-BRIDGE-CONTROL.md`
13+- `/Users/george/code/baa-conductor/docs/api/README.md`
14+- `/Users/george/code/baa-conductor/docs/api/business-interfaces.md`
15+- `/Users/george/code/baa-conductor/docs/api/control-interfaces.md`
16+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
17+
18+## 当前基线
19+
20+- 仓库:`/Users/george/code/baa-conductor`
21+- 分支:`main`
22+- 提交:`0f218b9`
23+- 开工要求:如需新分支,从当前 `main` 新切
24+
25+## 当前状态
26+
27+- `TODO`
28+
29+## 建议分支名
30+
31+- `feat/browser-agent-surface`
32+
33+## 目标
34+
35+把 `conductor` 的 AI 调用面收口成稳定的两层 describe,并定义通用 browser HTTP 合同,同时保留现有 Claude 专用路径兼容。
36+
37+## 背景
38+
39+当前 `conductor` 已有:
40+
41+- `/describe`
42+- `/describe/business`
43+- `/describe/control`
44+- `/v1/browser/claude/*`
45+
46+但浏览器能力仍偏 Claude 专用路径,通用 browser 请求和插件管理能力还没有正式并入现有两层 describe。
47+
48+本任务不新增第三层 `browser describe`,而是把浏览器能力并入现有:
49+
50+- `business`
51+- `control`
52+
53+## 涉及仓库
54+
55+- `/Users/george/code/baa-conductor`
56+
57+## 范围
58+
59+- 收口 `/describe`、`/describe/business`、`/describe/control`
60+- 为通用 browser 接口定义稳定 HTTP 合同
61+- 保留现有 `/v1/browser/claude/*` 兼容位次
62+- 更新对应 API 文档和最小测试
63+
64+## 路径约束
65+
66+- 不新增 `/describe/browser`
67+- 不新增 `/describe/plugin`
68+- `GET /describe` 只保留为入口索引
69+- 通用 browser 路由以:
70+ - `GET /v1/browser`
71+ - `POST /v1/browser/actions`
72+ - `POST /v1/browser/request`
73+ - `POST /v1/browser/request/cancel`
74+ 为目标模型
75+
76+## 推荐实现边界
77+
78+建议优先做:
79+
80+- `local-api.ts` 路由定义与 describe 输出
81+- `docs/api/*` 的正式合同更新
82+- 现有 Claude 专用接口到通用接口的 legacy 标记
83+- 最小 route / describe 测试
84+
85+## 允许修改的目录
86+
87+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
88+- `/Users/george/code/baa-conductor/docs/api/`
89+- `/Users/george/code/baa-conductor/tests/`
90+
91+## 尽量不要修改
92+
93+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
94+- `/Users/george/code/baa-conductor/packages/db/`
95+- `/Users/george/code/baa-conductor/README.md`
96+- `/Users/george/code/baa-conductor/docs/firefox/`
97+
98+## 必须完成
99+
100+### 1. 收口 describe 分层
101+
102+- 保持 `conductor` 只有:
103+ - `/describe`
104+ - `/describe/business`
105+ - `/describe/control`
106+- `/describe/business` 要纳入浏览器功能类能力
107+- `/describe/control` 要纳入插件管理类能力
108+
109+### 2. 定义通用 browser HTTP 合同
110+
111+- 增加或明确通用 browser 路由合同:
112+ - `POST /v1/browser/actions`
113+ - `POST /v1/browser/request`
114+ - `POST /v1/browser/request/cancel`
115+- 路由命名、参数约束、错误语义要写进 describe 或 API 文档
116+
117+### 3. 保持兼容与最小验证
118+
119+- 现有 `/v1/browser/claude/open`
120+- 现有 `/v1/browser/claude/send`
121+- 现有 `/v1/browser/claude/current`
122+- 现有 `/v1/browser/claude/reload`
123+
124+这些路径要继续可用,并标记为 legacy 包装层或过渡路径。
125+
126+## 需要特别注意
127+
128+- 不要把插件 WS bridge message 直接暴露成 AI-facing describe 主模型
129+- 不要在这个任务里顺手实现整套 SSE 执行链路
130+- 浏览器功能类归 `business`,插件管理类归 `control`
131+- 与并行任务边界:
132+ - 本任务不负责 Firefox 插件 runtime 细节
133+ - 本任务不负责浏览器侧 SSE 执行实现
134+
135+## 验收标准
136+
137+- `conductor` 的 describe 模型只剩两层:`business/control`
138+- 通用 browser HTTP 合同在代码和文档中存在
139+- Claude 专用路径仍然可用
140+- 相关 describe / route 测试通过
141+- `git diff --check` 通过
142+
143+## 推荐验证命令
144+
145+- `node --test /Users/george/code/baa-conductor/apps/conductor-daemon/src/index.test.js`
146+- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
147+- `git -C /Users/george/code/baa-conductor diff --check`
148+
149+## 交付要求
150+
151+完成后请说明:
152+
153+- 调整了哪些 route 和 describe 输出
154+- 通用 browser HTTP 合同最终如何命名
155+- 现有 Claude 路径如何兼容
156+- 跑了哪些验证
157+- 还有哪些剩余风险
+148,
-0
1@@ -0,0 +1,148 @@
2+# Task T-S022:实现 Firefox 空壳页 runtime 与插件管理动作
3+
4+## 直接给对话的提示词
5+
6+读 `/Users/george/code/baa-conductor/tasks/T-S022.md` 任务文档,完成开发任务。
7+
8+如需补背景,再读:
9+
10+- `/Users/george/code/baa-conductor/plans/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md`
11+- `/Users/george/code/baa-conductor/plans/BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md`
12+- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-FIREFOX-BRIDGE-CONTROL.md`
13+- `/Users/george/code/baa-conductor/plugins/baa-firefox/README.md`
14+- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
15+- `/Users/george/code/baa-conductor/plugins/baa-firefox/content-script.js`
16+- `/Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
17+
18+## 当前基线
19+
20+- 仓库:`/Users/george/code/baa-conductor`
21+- 分支:`main`
22+- 提交:`0f218b9`
23+- 开工要求:如需新分支,从当前 `main` 新切
24+
25+## 当前状态
26+
27+- `TODO`
28+
29+## 建议分支名
30+
31+- `feat/firefox-shell-runtime`
32+
33+## 目标
34+
35+让 Firefox 插件正式实现空壳页 runtime、desired/actual tab 状态模型和插件管理动作,为后续通用 browser API 链路提供稳定执行环境。
36+
37+## 背景
38+
39+浏览器桥接下一阶段不再把页面对话 UI 当主能力,而是以:
40+
41+- 空壳页
42+- 本地登录态
43+- 本地请求代发
44+- SSE 拦截
45+
46+作为主模型。
47+
48+这要求 Firefox 插件自己先把 runtime 管理能力做稳,包括:
49+
50+- 空壳页存在性
51+- WS 重连
52+- 页面重载
53+- tab 恢复
54+- 实际状态上报
55+
56+## 涉及仓库
57+
58+- `/Users/george/code/baa-conductor`
59+
60+## 范围
61+
62+- Firefox 插件管理页和 runtime 管理
63+- 平台空壳页的 desired/actual 状态模型
64+- 插件管理类动作
65+- 插件侧健康检查和状态上报
66+
67+## 路径约束
68+
69+- 首版每个平台最多一个空壳页
70+- 空壳页必须是目标平台一方页面,不能是 `about:blank`
71+- 默认健康检查至少覆盖:
72+ - tab 生命周期事件
73+ - `30s` 周期巡检
74+
75+## 推荐实现边界
76+
77+建议优先做:
78+
79+- `controller.js` 的 runtime 状态模型
80+- tab desired/actual 对比与恢复
81+- 管理页重载 / WS 重连 / tab 打开聚焦重载恢复
82+- 状态回报 payload
83+
84+## 允许修改的目录
85+
86+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
87+
88+## 尽量不要修改
89+
90+- `/Users/george/code/baa-conductor/apps/conductor-daemon/`
91+- `/Users/george/code/baa-conductor/docs/api/`
92+- `/Users/george/code/baa-conductor/packages/db/`
93+- `/Users/george/code/baa-conductor/tests/`
94+
95+## 必须完成
96+
97+### 1. 实现空壳页 runtime
98+
99+- 每个平台最多维护一个空壳页
100+- 区分 `desired` 和 `actual`
101+- 能检测页被关闭、失效或不可用
102+
103+### 2. 实现插件管理动作
104+
105+- 支持:
106+ - `plugin_status`
107+ - `ws_reconnect`
108+ - `controller_reload`
109+ - `tab_open`
110+ - `tab_focus`
111+ - `tab_reload`
112+ - `tab_restore`
113+
114+### 3. 上报真实状态
115+
116+- 插件上报的状态要反映实际页面状态
117+- `tab_restore` 语义要明确:
118+ - 重建 `desired` 中存在但 `actual` 中缺失的空壳页
119+
120+## 需要特别注意
121+
122+- 本任务不负责 `conductor` 的 describe 和 HTTP 合同
123+- 本任务不负责最终通用 SSE 协议集成
124+- 不要把真实对话 UI 重新拉回主能力模型
125+- 如果必须动到页面代发逻辑,只做最小支撑,不扩散范围
126+
127+## 验收标准
128+
129+- 插件具备空壳页 runtime 与 tab 恢复能力
130+- 插件具备管理类动作处理能力
131+- 插件状态上报能区分 `desired/actual`
132+- `git diff --check` 通过
133+
134+## 推荐验证命令
135+
136+- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
137+- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/content-script.js`
138+- `node --check /Users/george/code/baa-conductor/plugins/baa-firefox/page-interceptor.js`
139+- `git -C /Users/george/code/baa-conductor diff --check`
140+
141+## 交付要求
142+
143+完成后请说明:
144+
145+- 空壳页 runtime 如何建模
146+- 管理类动作如何落到插件侧
147+- `desired/actual` 如何同步
148+- 跑了哪些验证
149+- 还有哪些剩余风险
+160,
-0
1@@ -0,0 +1,160 @@
2+# Task T-S023:打通通用 browser request/SSE 链路与 conductor 风控策略
3+
4+## 直接给对话的提示词
5+
6+读 `/Users/george/code/baa-conductor/tasks/T-S023.md` 任务文档,完成开发任务。
7+
8+如需补背景,再读:
9+
10+- `/Users/george/code/baa-conductor/plans/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md`
11+- `/Users/george/code/baa-conductor/plans/BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md`
12+- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-FIREFOX-BRIDGE-CONTROL.md`
13+- `/Users/george/code/baa-conductor/tasks/T-S021.md`
14+- `/Users/george/code/baa-conductor/tasks/T-S022.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+- 提交:`0f218b9`
22+- 开工要求:如需新分支,从当前 `main` 新切
23+
24+## 当前状态
25+
26+- `TODO`
27+
28+## 建议分支名
29+
30+- `feat/browser-request-stream`
31+
32+## 目标
33+
34+把 `conductor` 和 Firefox 插件打通成通用 browser request/SSE 主链路,并补首版风控策略与 legacy Claude wrapper 兼容。
35+
36+## 背景
37+
38+在 `T-S021` 和 `T-S022` 完成后,系统需要正式支持:
39+
40+- `POST /v1/browser/request`
41+- `POST /v1/browser/request/cancel`
42+- `stream_open`
43+- `stream_event`
44+- `stream_end`
45+- `stream_error`
46+
47+同时要把首版的浏览器风控策略放到 `conductor`,包括:
48+
49+- 单 `client_id` 执行
50+- 抖动
51+- 限流
52+- 退避
53+- 熔断
54+
55+## 涉及仓库
56+
57+- `/Users/george/code/baa-conductor`
58+
59+## 范围
60+
61+- `conductor` 侧通用 browser request/cancel 路径
62+- Firefox 插件侧请求执行与 SSE 事件回传
63+- `stream_id` / `seq` / timeout / partial 语义
64+- 首版风控策略与默认参数
65+- Claude 专用路径兼容包装
66+
67+## 路径约束
68+
69+- 首版执行目标以 `client_id` 为唯一键
70+- 默认策略:
71+ - 抖动:`mu=2s`、`sigma=0.5s`、夹到 `[1s,5s]`
72+ - 限流:`10 req/min/platform`
73+ - 并发:`1 in-flight/client/platform`
74+ - 退避:`base=1s`、`max=60s`
75+ - 熔断:连续 `5` 次失败后打开
76+- 默认 SSE:
77+ - `stream_open` 超时 `10s`
78+ - 空闲超时 `30s`
79+ - 缓冲上限 `256 events` 或 `512KB`
80+
81+## 推荐实现边界
82+
83+建议优先做:
84+
85+- 通用 request/cancel 路径
86+- SSE 事件模型和 `seq`
87+- timeout / partial / error 语义
88+- `conductor` 风控与执行目标选择
89+- Claude wrapper 到通用路径的映射
90+
91+## 允许修改的目录
92+
93+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
94+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
95+- `/Users/george/code/baa-conductor/tests/browser/`
96+- `/Users/george/code/baa-conductor/docs/api/`
97+
98+## 尽量不要修改
99+
100+- `/Users/george/code/baa-conductor/packages/db/`
101+- `/Users/george/code/baa-conductor/tasks/`
102+- `/Users/george/code/baa-conductor/plans/`
103+
104+## 必须完成
105+
106+### 1. 打通通用 request/cancel
107+
108+- `POST /v1/browser/request` 可走通
109+- `POST /v1/browser/request/cancel` 可走通
110+- 现有 Claude wrapper 继续可用
111+
112+### 2. 打通正式 SSE
113+
114+- 回传:
115+ - `stream_open`
116+ - `stream_event`
117+ - `stream_end`
118+ - `stream_error`
119+- 每个 `stream_event` 带递增 `seq`
120+- 断连、超时或失败时正确交付 partial 结果
121+
122+### 3. 落首版风控
123+
124+- 单 `client_id` 调度
125+- 平台级限流
126+- 平台级并发
127+- 指数退避
128+- 熔断与恢复
129+
130+## 需要特别注意
131+
132+- 不要在这个任务里重新引入页面对话 UI 主模型
133+- 不要让 `conductor` 直接持有原始凭证
134+- 不要 silently drop SSE event;宁可显式失败
135+- 本任务默认依赖 `T-S021`、`T-S022` 已经提供 describe 合同和插件 runtime 基础
136+
137+## 验收标准
138+
139+- 通用 browser request/cancel 可用
140+- SSE 正式事件链路可用
141+- 风控策略按默认值可观察
142+- Claude wrapper 保持兼容
143+- browser e2e smoke 通过
144+- `git diff --check` 通过
145+
146+## 推荐验证命令
147+
148+- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
149+- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
150+- `git -C /Users/george/code/baa-conductor diff --check`
151+
152+## 交付要求
153+
154+完成后请说明:
155+
156+- 通用 request/cancel 如何落地
157+- SSE 事件模型最终长什么样
158+- 风控策略如何实现和配置
159+- 兼容了哪些 Claude 旧路径
160+- 跑了哪些验证
161+- 还有哪些剩余风险
+142,
-0
1@@ -0,0 +1,142 @@
2+# Task T-S024:回写文档、补 smoke 并同步主线状态
3+
4+## 直接给对话的提示词
5+
6+读 `/Users/george/code/baa-conductor/tasks/T-S024.md` 任务文档,完成开发任务。
7+
8+如需补背景,再读:
9+
10+- `/Users/george/code/baa-conductor/plans/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md`
11+- `/Users/george/code/baa-conductor/plans/BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md`
12+- `/Users/george/code/baa-conductor/tasks/T-S021.md`
13+- `/Users/george/code/baa-conductor/tasks/T-S022.md`
14+- `/Users/george/code/baa-conductor/tasks/T-S023.md`
15+- `/Users/george/code/baa-conductor/README.md`
16+- `/Users/george/code/baa-conductor/docs/api/README.md`
17+- `/Users/george/code/baa-conductor/docs/firefox/README.md`
18+- `/Users/george/code/baa-conductor/plugins/baa-firefox/README.md`
19+
20+## 当前基线
21+
22+- 仓库:`/Users/george/code/baa-conductor`
23+- 分支:`main`
24+- 提交:`0f218b9`
25+- 开工要求:如需新分支,从当前 `main` 新切
26+
27+## 当前状态
28+
29+- `TODO`
30+
31+## 建议分支名
32+
33+- `docs/browser-agent-surface-finalize`
34+
35+## 目标
36+
37+在 `T-S021`、`T-S022`、`T-S023` 完成后,把正式文档、smoke 和任务状态视图同步到新的浏览器桥接主模型。
38+
39+## 背景
40+
41+浏览器桥接主线一旦完成实现,文档必须统一到:
42+
43+- 两层 describe:`business/control`
44+- 通用 browser request/cancel
45+- 插件管理类动作
46+- 正式 SSE
47+- 空壳页和持久化登录态模型
48+
49+否则后续 AI 调用方仍会按旧的 Claude 专用路径或页面对话模型理解系统。
50+
51+## 涉及仓库
52+
53+- `/Users/george/code/baa-conductor`
54+
55+## 范围
56+
57+- 更新 README 和 docs
58+- 更新 browser smoke 或等价回归检查
59+- 同步 tasks / plans 状态
60+
61+## 路径约束
62+
63+- 本任务默认在 `T-S021`、`T-S022`、`T-S023` 基础上收尾
64+- 不再大改核心协议或数据库模型
65+- 如需补 smoke 钩子,只做最小补充
66+
67+## 推荐实现边界
68+
69+建议优先做:
70+
71+- README 与 docs 收口
72+- smoke 覆盖通用 browser request/SSE
73+- 清理旧文案里的“页面对话主能力”表述
74+- 同步 `tasks/`、`plans/` 状态
75+
76+## 允许修改的目录
77+
78+- `/Users/george/code/baa-conductor/README.md`
79+- `/Users/george/code/baa-conductor/docs/`
80+- `/Users/george/code/baa-conductor/plugins/baa-firefox/README.md`
81+- `/Users/george/code/baa-conductor/tests/browser/`
82+- `/Users/george/code/baa-conductor/tasks/`
83+- `/Users/george/code/baa-conductor/plans/`
84+
85+## 尽量不要修改
86+
87+- `/Users/george/code/baa-conductor/apps/conductor-daemon/`
88+- `/Users/george/code/baa-conductor/plugins/baa-firefox/controller.js`
89+- `/Users/george/code/baa-conductor/packages/db/`
90+
91+## 必须完成
92+
93+### 1. 回写正式口径
94+
95+- 文档明确只有 `business/control` 两层 describe
96+- 文档明确通用 browser request/cancel 和 SSE 是正式能力
97+- 文档明确 Claude 专用路径是兼容包装或 legacy
98+
99+### 2. 更新 smoke / 验收说明
100+
101+- smoke 覆盖:
102+ - 通用 browser request
103+ - 正式 SSE
104+ - 插件管理动作
105+ - 凭证不泄露
106+ - legacy Claude wrapper 兼容
107+
108+### 3. 同步任务状态
109+
110+- `tasks/` 和 `plans/` 里的当前 TODO 状态与新任务进度一致
111+- 不让旧 backlog 看起来像当前主线
112+
113+## 需要特别注意
114+
115+- 不要让 README 和 docs 再出现第三层 browser describe
116+- 不要模糊:
117+ - AI-facing Agent Surface
118+ - Firefox Bridge Protocol
119+ - 本地空壳页 runtime
120+- 如果文档口径和实际实现不一致,以实际实现为准,再回写文档和 smoke
121+
122+## 验收标准
123+
124+- README / docs 与新正式模型一致
125+- smoke 与新正式模型一致
126+- tasks / plans 状态同步
127+- `git diff --check` 通过
128+
129+## 推荐验证命令
130+
131+- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
132+- `pnpm -C /Users/george/code/baa-conductor smoke`
133+- `git -C /Users/george/code/baa-conductor diff --check`
134+
135+## 交付要求
136+
137+完成后请说明:
138+
139+- 修改了哪些文档和 smoke
140+- 正式口径现在如何表述
141+- 哪些旧文案被删除、降级或标为 legacy
142+- 跑了哪些验证
143+- 还有哪些残余风险
+14,
-6
1@@ -9,17 +9,18 @@
2 - `control-api.makefile.so`、Cloudflare Worker、D1 只剩迁移期 legacy 兼容残留和依赖盘点用途
3 - `baa-hand` / `baa-shell` 只保留为接口语义参考,不再作为主系统维护
4 - 当前任务卡都放在本目录
5-- 当前任务基线:`main@4796db4`
6+- 当前任务基线:`main@0f218b9`
7
8 ## 状态分类
9
10 - `已完成`:`T-S001` 到 `T-S020`
11-- `当前 TODO`:`无`
12+- `当前 TODO`:`T-S021` 到 `T-S024`
13 - `低优先级 TODO`:`4318/status-api` 兼容层删旧与解耦
14
15 当前新的主需求文档:
16
17 - [`../plans/BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md`](../plans/BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md)
18+- [`../plans/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md`](../plans/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md)
19
20 ## 最近完成任务
21
22@@ -57,27 +58,34 @@
23
24 ## 当前活动任务
25
26-- 当前无进行中的主线任务
27-- 最近完成任务:[`T-S020.md`](./T-S020.md)
28+- 当前主线已切到浏览器桥接第二阶段开发
29+- 当前首批任务:[`T-S021.md`](./T-S021.md)、[`T-S022.md`](./T-S022.md)、[`T-S023.md`](./T-S023.md)、[`T-S024.md`](./T-S024.md)
30
31 ## 当前 TODO
32
33-当前浏览器桥接主线已进入集成阶段:
34+当前浏览器桥接主线已进入正式开发阶段:
35
36 1. [`T-S017.md`](./T-S017.md):已完成,提供浏览器登录态持久化模型与仓储
37 2. [`T-S018.md`](./T-S018.md):已完成,Firefox 插件已收口到空壳标签页并开始上报账号/指纹/端点
38 3. [`T-S019.md`](./T-S019.md):已完成,`conductor` 已接上仓储、读接口和状态老化逻辑
39 4. [`T-S020.md`](./T-S020.md):已完成,文档、browser smoke 和任务状态视图已同步到正式模型
40+5. [`T-S021.md`](./T-S021.md):收口 `conductor` describe 与通用 browser HTTP 合同
41+6. [`T-S022.md`](./T-S022.md):实现 Firefox 空壳页 runtime 与插件管理动作
42+7. [`T-S023.md`](./T-S023.md):打通通用 browser request/SSE 链路与 `conductor` 风控策略
43+8. [`T-S024.md`](./T-S024.md):回写文档、补 smoke 并同步主线状态
44
45 建议并行关系:
46
47 - `T-S017` 与 `T-S018` 已并行完成
48 - `T-S019` 已完成集成和验收收口
49 - `T-S020` 已在 `T-S019` 之后完成收尾
50+- `T-S021` 与 `T-S022` 可并行
51+- `T-S023` 在 `T-S021`、`T-S022` 之后做集成
52+- `T-S024` 在 `T-S023` 之后做收尾
53
54 当前已知主线遗留:
55
56-- 当前主线开发任务已经清空
57+- 当前主线开发任务已切到 `T-S021` 到 `T-S024`
58 - runtime smoke 仍依赖仓库根已有 `state/`、`runs/`、`worktrees/`、`logs/launchd/`、`logs/codexd/`、`tmp/` 等本地运行目录;这是现有脚本前提,不是本轮功能回归
59 - 本地工作树里仍存在与本轮并行任务无关的 `plugins/baa-firefox/controller.js` 改动;后续开发继续避免覆盖它
60