baa-conductor

git clone 

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
A tasks/T-S021.md
+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+- 还有哪些剩余风险
A tasks/T-S022.md
+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+- 还有哪些剩余风险
A tasks/T-S023.md
+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+- 还有哪些剩余风险
A tasks/T-S024.md
+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+- 还有哪些残余风险
M tasks/TASK_OVERVIEW.md
+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