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 合同。