baa-conductor


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

T-S023.md

  1# Task T-S023:打通通用 browser request/SSE 链路与 conductor 风控策略
  2
  3## 直接给对话的提示词
  4
  5`/Users/george/code/baa-conductor/tasks/archive/T-S023.md` 任务文档,完成开发任务。
  6
  7如需补背景,再读:
  8
  9- `/Users/george/code/baa-conductor/plans/archive/FIREFOX_BRIDGE_CONTROL_REQUIREMENTS.md`
 10- `/Users/george/code/baa-conductor/plans/archive/BROWSER_BRIDGE_PERSISTENCE_REQUIREMENTS.md`
 11- `/Users/george/code/baa-conductor/plans/discuss/DISCUSS-FIREFOX-BRIDGE-CONTROL.md`
 12- `/Users/george/code/baa-conductor/tasks/archive/T-S021.md`
 13- `/Users/george/code/baa-conductor/tasks/archive/T-S022.md`
 14- `/Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
 15
 16## 当前基线
 17
 18- 仓库:`/Users/george/code/baa-conductor`
 19- 分支:`main`
 20- 提交:`0f218b9`
 21- 开工要求:如需新分支,从当前 `main` 新切
 22
 23## 当前状态
 24
 25- `已完成(2026-03-26)`
 26
 27## 建议分支名
 28
 29- `feat/browser-request-stream`
 30
 31## 目标
 32
 33`conductor` 和 Firefox 插件打通成通用 browser request/SSE 主链路,并补首版风控策略与 legacy Claude wrapper 兼容。
 34
 35## 背景
 36
 37`T-S021``T-S022` 完成后,系统需要正式支持:
 38
 39- `POST /v1/browser/request`
 40- `POST /v1/browser/request/cancel`
 41- `stream_open`
 42- `stream_event`
 43- `stream_end`
 44- `stream_error`
 45
 46同时要把首版的浏览器风控策略放到 `conductor`,包括:
 47
 48-`client_id` 执行
 49- 抖动
 50- 限流
 51- 退避
 52- 熔断
 53
 54## 涉及仓库
 55
 56- `/Users/george/code/baa-conductor`
 57
 58## 范围
 59
 60- `conductor` 侧通用 browser request/cancel 路径
 61- Firefox 插件侧请求执行与 SSE 事件回传
 62- `stream_id` / `seq` / timeout / partial 语义
 63- 首版风控策略与默认参数
 64- Claude 专用路径兼容包装
 65
 66## 路径约束
 67
 68- 首版执行目标以 `client_id` 为唯一键
 69- 默认策略:
 70  - 抖动:`mu=2s`、`sigma=0.5s`、夹到 `[1s,5s]`
 71  - 限流:`10 req/min/platform`
 72  - 并发:`1 in-flight/client/platform`
 73  - 退避:`base=1s`、`max=60s`
 74  - 熔断:连续 `5` 次失败后打开
 75- 默认 SSE:
 76  - `stream_open` 超时 `10s`
 77  - 空闲超时 `30s`
 78  - 缓冲上限 `256 events``512KB`
 79
 80## 推荐实现边界
 81
 82建议优先做:
 83
 84- 通用 request/cancel 路径
 85- SSE 事件模型和 `seq`
 86- timeout / partial / error 语义
 87- `conductor` 风控与执行目标选择
 88- Claude wrapper 到通用路径的映射
 89
 90## 允许修改的目录
 91
 92- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
 93- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
 94- `/Users/george/code/baa-conductor/tests/browser/`
 95- `/Users/george/code/baa-conductor/docs/api/`
 96
 97## 尽量不要修改
 98
 99- `/Users/george/code/baa-conductor/packages/db/`
100- `/Users/george/code/baa-conductor/tasks/`
101- `/Users/george/code/baa-conductor/plans/`
102
103## 必须完成
104
105### 1. 打通通用 request/cancel
106
107- `POST /v1/browser/request` 可走通
108- `POST /v1/browser/request/cancel` 可走通
109- 现有 Claude wrapper 继续可用
110
111### 2. 打通正式 SSE
112
113- 回传:
114  - `stream_open`
115  - `stream_event`
116  - `stream_end`
117  - `stream_error`
118- 每个 `stream_event` 带递增 `seq`
119- 断连、超时或失败时正确交付 partial 结果
120
121### 3. 落首版风控
122
123-`client_id` 调度
124- 平台级限流
125- 平台级并发
126- 指数退避
127- 熔断与恢复
128
129## 需要特别注意
130
131- 不要在这个任务里重新引入页面对话 UI 主模型
132- 不要让 `conductor` 直接持有原始凭证
133- 不要 silently drop SSE event;宁可显式失败
134- 本任务默认依赖 `T-S021`、`T-S022` 已经提供 describe 合同和插件 runtime 基础
135
136## 验收标准
137
138- 通用 browser request/cancel 可用
139- SSE 正式事件链路可用
140- 风控策略按默认值可观察
141- Claude wrapper 保持兼容
142- browser e2e smoke 通过
143- `git diff --check` 通过
144
145## 推荐验证命令
146
147- `node --test /Users/george/code/baa-conductor/tests/browser/browser-control-e2e-smoke.test.mjs`
148- `pnpm -C /Users/george/code/baa-conductor -F @baa-conductor/conductor-daemon build`
149- `git -C /Users/george/code/baa-conductor diff --check`
150
151## 交付要求
152
153完成后请说明:
154
155- 通用 request/cancel 如何落地
156- SSE 事件模型最终长什么样
157- 风控策略如何实现和配置
158- 兼容了哪些 Claude 旧路径
159- 跑了哪些验证
160- 还有哪些剩余风险
161
162## 当前残余风险
163
164- 风控状态当前仍是进程内内存态;`conductor` 重启后,限流、退避和熔断计数会重置。
165- 正式 browser HTTP relay 当前仍只支持 Claude;其它平台目前只有空壳页和元数据链路,还没有接入通用 request / SSE 合同。