- commit
- 2dd5941
- parent
- b063524
- author
- im_wower
- date
- 2026-04-01 23:41:41 +0800 CST
docs: add conductor ui task breakdown
4 files changed,
+541,
-3
Raw patch view.
1diff --git a/tasks/T-S070.md b/tasks/T-S070.md
2new file mode 100644
3index 0000000000000000000000000000000000000000..520a6e9b389f2bb262f8a64c0ed5d6b596a2be0f
4--- /dev/null
5+++ b/tasks/T-S070.md
6@@ -0,0 +1,164 @@
7+# Task T-S070:Conductor UI 基础设施 — Vue 3 脚手架与 `/app` 静态托管
8+
9+## 状态
10+
11+- 当前状态:`待开始`
12+- 规模预估:`M`
13+- 依赖任务:无
14+- 建议执行者:`Codex`(涉及 monorepo 构建、静态资源托管和本地 API 路由接入)
15+
16+## 直接给对话的提示词
17+
18+读 `/Users/george/code/baa-conductor/tasks/T-S070.md` 任务文档,完成开发任务。
19+
20+如需补背景,再读:
21+
22+- `/Users/george/code/baa-conductor/plans/CONDUCTOR_UI_MODULE_REQUIREMENTS.md`
23+- `/Users/george/code/baa-conductor/plans/CONDUCTOR_UI_IMPLEMENTATION_PLAN.md`
24+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/local-api.ts`
25+
26+## 当前基线
27+
28+- 仓库:`/Users/george/code/baa-conductor`
29+- 分支基线:`main`
30+- 提交:`b063524`
31+
32+## 分支与 worktree(强制)
33+
34+- 分支名:`feat/conductor-ui-shell`
35+- worktree 路径:`/Users/george/code/baa-conductor-conductor-ui-shell`
36+
37+开工步骤:
38+
39+1. `cd /Users/george/code/baa-conductor`
40+2. `git worktree add ../baa-conductor-conductor-ui-shell -b feat/conductor-ui-shell main`
41+3. `cd ../baa-conductor-conductor-ui-shell`
42+
43+## 目标
44+
45+把 `conductor-ui` 的 Vue 3 前端壳和 `conductor-daemon` 的 `/app` 静态托管能力落地,使工作台可以作为正式同源入口加载。
46+
47+## 背景
48+
49+当前仓库只有:
50+
51+- 很窄的 `GET /v1/status/ui`
52+- Firefox 插件调试页 `controller.html`
53+
54+但还没有:
55+
56+- 正式的 `/app`
57+- 可持续演进的前端工程目录
58+- 前端资源的同源托管层
59+
60+如果这层不先做,后续登录页、Control 工作区和 Channels 工作区都只能停留在方案文档里。
61+
62+## 涉及仓库
63+
64+- `/Users/george/code/baa-conductor`
65+
66+## 范围
67+
68+- 新建 `apps/conductor-ui/` Vue 3 + Vite + TypeScript 脚手架
69+- 约定前端产物输出目录并接入 monorepo
70+- 在 `conductor-daemon` 增加 `/app` 静态资源托管
71+- 提供 SPA history fallback
72+
73+## 路径约束
74+
75+- 正式入口固定为 `GET /app`
76+- 保留 `GET /v1/status/ui` 为独立健康页,不混入新工作台
77+- 不要引入独立 UI daemon
78+- 首版不要求 UI 登录和业务页面功能完整,只要求能稳定加载应用壳
79+
80+## 推荐实现边界
81+
82+建议优先做:
83+
84+- `apps/conductor-ui/`
85+- `apps/conductor-daemon/src/local-api.ts`
86+- `apps/conductor-daemon/package.json`
87+
88+## 允许修改的目录
89+
90+- `/Users/george/code/baa-conductor/apps/conductor-ui/`
91+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
92+- `/Users/george/code/baa-conductor/apps/conductor-daemon/package.json`
93+- `/Users/george/code/baa-conductor/package.json`
94+- `/Users/george/code/baa-conductor/tasks/T-S070.md`
95+- `/Users/george/code/baa-conductor/tasks/TASK_OVERVIEW.md`
96+
97+## 尽量不要修改
98+
99+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
100+- `/Users/george/code/baa-conductor/packages/artifact-db/`
101+- `/Users/george/code/baa-conductor/apps/status-api/`
102+
103+## 必须完成
104+
105+### 1. Vue 3 前端脚手架
106+
107+- 建立 `apps/conductor-ui/` 基础目录
108+- 使用 `Vue 3 + Vite + TypeScript + Vue Router`
109+- 具备最小的 `App.vue`、路由壳和布局壳
110+
111+### 2. 构建与产物约定
112+
113+- 能在 monorepo 下单独构建 `conductor-ui`
114+- 产物输出稳定落到 `apps/conductor-ui/dist`
115+- 不要求先接完整 lint/test 体系,但至少保证 build 可跑通
116+
117+### 3. `/app` 静态托管
118+
119+- `conductor-daemon` 提供:
120+ - `GET /app`
121+ - `GET /app/`
122+ - `GET /app/assets/*`
123+ - `GET /app/*` history fallback
124+- `index.html` 用 `no-store`
125+- hashed assets 用长期缓存
126+
127+## 需要特别注意
128+
129+- 不要把 `/app` 和 Gemini 的业务 URL `/app/:conversation_id` 混淆;前者是 conductor 路由,后者只是平台页面解析逻辑
130+- 静态资源托管应独立于 artifact 托管,不要复用 `/artifact/*`
131+- 首版不做鉴权时,页面内应明确显示“未接登录态”的占位状态,避免误导为正式可用管理面
132+
133+## 验收标准
134+
135+- `pnpm -C apps/conductor-ui build` 可通过
136+- 启动 `conductor-daemon` 后可访问 `/app`
137+- 浏览器直接打开 `/app` 和 `/app/control` 都能返回同一个前端壳
138+- 现有 `/v1/status/ui`、`/artifact/*` 不被破坏
139+
140+## 推荐验证命令
141+
142+- `cd /Users/george/code/baa-conductor-conductor-ui-shell && pnpm -C apps/conductor-ui build`
143+- `cd /Users/george/code/baa-conductor-conductor-ui-shell && pnpm -C apps/conductor-daemon build`
144+- `cd /Users/george/code/baa-conductor-conductor-ui-shell && pnpm -C apps/conductor-daemon test`
145+
146+## 执行记录
147+
148+> 以下内容由执行任务的 AI 填写,创建任务时留空。
149+
150+### 开始执行
151+
152+- 执行者:
153+- 开始时间:
154+- 状态变更:`待开始` → `进行中`
155+
156+### 完成摘要
157+
158+- 完成时间:
159+- 状态变更:`进行中` → `已完成`
160+- 修改了哪些文件:
161+- 核心实现思路:
162+- 跑了哪些测试:
163+
164+### 执行过程中遇到的问题
165+
166+-
167+
168+### 剩余风险
169+
170+- 如果后续 UI 会话鉴权需要服务端注入运行时配置,可能还要在前端壳里补一层 `/app/config.json` 或内联 bootstrap 数据
171diff --git a/tasks/T-S071.md b/tasks/T-S071.md
172new file mode 100644
173index 0000000000000000000000000000000000000000..9edaa9be1b5965727df6eea25c4476356cd220a5
174--- /dev/null
175+++ b/tasks/T-S071.md
176@@ -0,0 +1,168 @@
177+# Task T-S071:Conductor UI 会话鉴权 — 登录页与浏览器 session
178+
179+## 状态
180+
181+- 当前状态:`待开始`
182+- 规模预估:`M`
183+- 依赖任务:`T-S070`
184+- 建议执行者:`Codex`(涉及 HTTP 鉴权边界、session cookie 和前后端联动)
185+
186+## 直接给对话的提示词
187+
188+读 `/Users/george/code/baa-conductor/tasks/T-S071.md` 任务文档,完成开发任务。
189+
190+如需补背景,再读:
191+
192+- `/Users/george/code/baa-conductor/plans/CONDUCTOR_UI_IMPLEMENTATION_PLAN.md`
193+- `/Users/george/code/baa-conductor/docs/auth/README.md`
194+- `/Users/george/code/baa-conductor/packages/auth/src/`
195+
196+## 当前基线
197+
198+- 仓库:`/Users/george/code/baa-conductor`
199+- 分支基线:`main`
200+- 提交:`b063524`
201+
202+## 分支与 worktree(强制)
203+
204+- 分支名:`feat/conductor-ui-session-auth`
205+- worktree 路径:`/Users/george/code/baa-conductor-conductor-ui-session-auth`
206+
207+开工步骤:
208+
209+1. `cd /Users/george/code/baa-conductor`
210+2. `git worktree add ../baa-conductor-conductor-ui-session-auth -b feat/conductor-ui-session-auth main`
211+3. `cd ../baa-conductor-conductor-ui-session-auth`
212+
213+## 目标
214+
215+为 `/app` 工作台接入最小浏览器会话鉴权,提供登录、登出和当前会话查询能力,使 UI 不再依赖匿名访问或 `localStorage` 长期 token。
216+
217+## 背景
218+
219+当前仓库的鉴权现状是:
220+
221+- host-ops 用 `BAA_SHARED_TOKEN`
222+- 大多数控制读写接口默认还是本地网络可访问
223+- `packages/auth` 已有角色和 bearer 模型,但还没有浏览器工作台 session 落地
224+
225+如果 UI 没有独立 session:
226+
227+- `/app` 会退化成匿名控制台
228+- 写接口无法区分 `browser_admin` 与 `readonly`
229+- 前端只能回到旧 `baa-server` 的 `localStorage token` 模式,这不符合当前仓库的安全方向
230+
231+## 涉及仓库
232+
233+- `/Users/george/code/baa-conductor`
234+
235+## 范围
236+
237+- 在 `conductor-daemon` 中新增最小 UI session 接口
238+- 支持 session cookie
239+- 新增 `/app/login`
240+- 前端在未登录时跳转登录页
241+- 首版至少支持 `browser_admin` 与 `readonly` 两种角色视图
242+
243+## 路径约束
244+
245+- UI 会话不复用 `BAA_SHARED_TOKEN`
246+- 不把浏览器会话直接暴露为前端可长期读取的 bearer token
247+- 首版可以是单用户最小实现,但接口形状要能继续扩成正式 session
248+
249+## 推荐实现边界
250+
251+建议优先做:
252+
253+- `apps/conductor-daemon/src/local-api.ts`
254+- `apps/conductor-daemon/src/index.ts`
255+- `packages/auth/`
256+- `apps/conductor-ui/src/auth/`
257+- `apps/conductor-ui/src/routes/`
258+
259+## 允许修改的目录
260+
261+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
262+- `/Users/george/code/baa-conductor/packages/auth/src/`
263+- `/Users/george/code/baa-conductor/apps/conductor-ui/src/`
264+- `/Users/george/code/baa-conductor/docs/auth/README.md`
265+- `/Users/george/code/baa-conductor/tasks/T-S071.md`
266+- `/Users/george/code/baa-conductor/tasks/TASK_OVERVIEW.md`
267+
268+## 尽量不要修改
269+
270+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
271+- `/Users/george/code/baa-conductor/packages/artifact-db/`
272+- `/Users/george/code/baa-conductor/apps/status-api/`
273+
274+## 必须完成
275+
276+### 1. UI session 接口
277+
278+- 新增:
279+ - `POST /v1/ui/session/login`
280+ - `POST /v1/ui/session/logout`
281+ - `GET /v1/ui/session/me`
282+- 使用 HttpOnly cookie 持有 session
283+
284+### 2. 最小角色模型
285+
286+- 至少区分:
287+ - `browser_admin`
288+ - `readonly`
289+- `me` 接口要返回前端做路由守卫所需的最小信息
290+
291+### 3. 登录页与前端守卫
292+
293+- 新增 `/app/login`
294+- 未登录时访问 `/app/*` 会跳登录页
295+- 已登录后能回到原始工作台路由
296+
297+## 需要特别注意
298+
299+- 不要把密码、token 或 session ID 持久化到 `localStorage`
300+- Cookie 要尽量设置:
301+ - `HttpOnly`
302+ - `SameSite=Lax`
303+ - `Path=/`
304+- 如果首版无法一口气把所有控制写接口接入角色校验,至少要保证 UI 会话自身完整闭环,并为后续保护 `/v1/browser/actions`、`/v1/system/*` 预留中间层
305+
306+## 验收标准
307+
308+- `/app/login` 可以完成登录
309+- 登录成功后 `GET /v1/ui/session/me` 返回当前身份
310+- 未登录访问 `/app/control` 会被前端或服务端正确拦截
311+- 登出后 session 立即失效
312+- 不引入前端可读长期 bearer token
313+
314+## 推荐验证命令
315+
316+- `cd /Users/george/code/baa-conductor-conductor-ui-session-auth && pnpm -C apps/conductor-daemon build`
317+- `cd /Users/george/code/baa-conductor-conductor-ui-session-auth && pnpm -C apps/conductor-daemon test`
318+- `cd /Users/george/code/baa-conductor-conductor-ui-session-auth && pnpm -C apps/conductor-ui build`
319+
320+## 执行记录
321+
322+> 以下内容由执行任务的 AI 填写,创建任务时留空。
323+
324+### 开始执行
325+
326+- 执行者:
327+- 开始时间:
328+- 状态变更:`待开始` → `进行中`
329+
330+### 完成摘要
331+
332+- 完成时间:
333+- 状态变更:`进行中` → `已完成`
334+- 修改了哪些文件:
335+- 核心实现思路:
336+- 跑了哪些测试:
337+
338+### 执行过程中遇到的问题
339+
340+-
341+
342+### 剩余风险
343+
344+- 首版如仍有部分 `/v1/*` 写接口未绑到 UI 角色授权,工作台需要先通过前端入口约束使用范围,后续还要补服务端强制校验
345diff --git a/tasks/T-S072.md b/tasks/T-S072.md
346new file mode 100644
347index 0000000000000000000000000000000000000000..84075f29ea7440e9a9c3ccd748eb9a4386f19f6f
348--- /dev/null
349+++ b/tasks/T-S072.md
350@@ -0,0 +1,191 @@
351+# Task T-S072:Conductor UI `Control` 工作区首版
352+
353+## 状态
354+
355+- 当前状态:`待开始`
356+- 规模预估:`L`
357+- 依赖任务:`T-S070`、`T-S071`
358+- 建议执行者:`Codex`(涉及多路现有 API 聚合、Vue 3 工作台布局和控制动作接线)
359+
360+## 直接给对话的提示词
361+
362+读 `/Users/george/code/baa-conductor/tasks/T-S072.md` 任务文档,完成开发任务。
363+
364+如需补背景,再读:
365+
366+- `/Users/george/code/baa-conductor/plans/CONDUCTOR_UI_IMPLEMENTATION_PLAN.md`
367+- `/Users/george/code/baa-conductor/plans/CONDUCTOR_UI_MODULE_REQUIREMENTS.md`
368+- `/Users/george/code/baa-conductor/docs/api/control-interfaces.md`
369+
370+## 当前基线
371+
372+- 仓库:`/Users/george/code/baa-conductor`
373+- 分支基线:`main`
374+- 提交:`b063524`
375+
376+## 分支与 worktree(强制)
377+
378+- 分支名:`feat/conductor-ui-control-workspace`
379+- worktree 路径:`/Users/george/code/baa-conductor-conductor-ui-control-workspace`
380+
381+开工步骤:
382+
383+1. `cd /Users/george/code/baa-conductor`
384+2. `git worktree add ../baa-conductor-conductor-ui-control-workspace -b feat/conductor-ui-control-workspace main`
385+3. `cd ../baa-conductor-conductor-ui-control-workspace`
386+
387+## 目标
388+
389+交付 `/app` 下的 `Control` 工作区首版,使人类可以不用插件页,直接在正式工作台完成系统状态查看和常见控制动作。
390+
391+## 背景
392+
393+当前正式控制能力已经主要存在于 `conductor-daemon` API 里:
394+
395+- `/v1/system/state`
396+- `/v1/browser`
397+- `/v1/browser/actions`
398+- `/v1/renewal/*`
399+- `/v1/tasks*`
400+- `/v1/runs*`
401+- `/v1/codex*`
402+- `/v1/messages`
403+- `/v1/executions`
404+- `/v1/sessions/latest`
405+
406+问题不在后端能力缺失,而在于这些能力还没有一个正式的人类入口。现在的人类操作面仍然偏向:
407+
408+- Firefox 插件调试页
409+- 手工 curl
410+- 分散的只读接口
411+
412+这不符合新工作台目标。
413+
414+## 涉及仓库
415+
416+- `/Users/george/code/baa-conductor`
417+
418+## 范围
419+
420+- 基于 Vue 3 工作台壳实现 `Control` 一级工作区
421+- 接现有只读和控制 API
422+- 覆盖 system、browser、renewal、tasks/runs、codex、artifacts 几个面板
423+- 提供最小控制动作入口
424+
425+## 路径约束
426+
427+- 首版只做 `Control`,不实现 `Channels`
428+- 首版以轮询为主,不要求先做统一 SSE 总线
429+- 正式入口放在 `/app/control`
430+
431+## 推荐实现边界
432+
433+建议优先做:
434+
435+- `apps/conductor-ui/src/features/control/`
436+- `apps/conductor-ui/src/api/`
437+- `apps/conductor-ui/src/routes/`
438+- `apps/conductor-ui/src/components/`
439+
440+## 允许修改的目录
441+
442+- `/Users/george/code/baa-conductor/apps/conductor-ui/src/`
443+- `/Users/george/code/baa-conductor/apps/conductor-ui/index.html`
444+- `/Users/george/code/baa-conductor/apps/conductor-daemon/src/`
445+- `/Users/george/code/baa-conductor/docs/api/control-interfaces.md`
446+- `/Users/george/code/baa-conductor/tasks/T-S072.md`
447+- `/Users/george/code/baa-conductor/tasks/TASK_OVERVIEW.md`
448+
449+## 尽量不要修改
450+
451+- `/Users/george/code/baa-conductor/plugins/baa-firefox/`
452+- `/Users/george/code/baa-conductor/packages/artifact-db/`
453+- `/Users/george/code/baa-conductor/apps/status-api/`
454+
455+## 必须完成
456+
457+### 1. Control 总览页
458+
459+- 展示:
460+ - mode
461+ - leader
462+ - queue depth
463+ - active runs
464+ - browser fresh/stale/lost 计数
465+- 形成稳定的工作台首页布局
466+
467+### 2. Browser 与 Renewal 面板
468+
469+- 展示浏览器 bridge clients、shell runtime、登录态记录
470+- 提供最小 browser actions 入口
471+- 展示 renewal conversations、active links、jobs
472+
473+### 3. Tasks / Runs / Codex / Artifacts 面板
474+
475+- 能查看任务列表、run 列表、Codex sessions、最近 artifact sessions/messages/executions
476+- 至少支持基础刷新、详情抽屉或次级面板
477+
478+### 4. 最小控制动作
479+
480+- `Pause`
481+- `Resume`
482+- `Drain`
483+- 常用 browser actions:
484+ - `tab_open`
485+ - `tab_focus`
486+ - `tab_reload`
487+ - `request_credentials`
488+
489+## 需要特别注意
490+
491+- 控制动作必须在 UI 上清楚展示进行中、成功、失败结果,不能只 fire-and-forget
492+- `GET /v1/browser` 返回的数据量较大,前端需要做结构化拆分,不要直接整块 JSON 粘贴上去
493+- 首版可以保留一个 raw JSON 抽屉作为诊断 fallback,但不能把整个页面做成“pre 标签控制台”
494+- 不要让 `Control` 页面重新变成 Firefox 插件页的镜像;插件页是诊断页,`/app/control` 是正式入口
495+
496+## 验收标准
497+
498+- 登录后可访问 `/app/control`
499+- 页面能稳定读取:
500+ - `/v1/system/state`
501+ - `/v1/browser`
502+ - `/v1/renewal/*`
503+ - `/v1/tasks*`
504+ - `/v1/runs*`
505+ - `/v1/codex*`
506+ - `/v1/sessions/latest`
507+- `Pause / Resume / Drain` 能从工作台触发
508+- 常用 browser actions 能从工作台触发
509+- 页面在桌面和移动宽度下都能正常加载
510+
511+## 推荐验证命令
512+
513+- `cd /Users/george/code/baa-conductor-conductor-ui-control-workspace && pnpm -C apps/conductor-ui build`
514+- `cd /Users/george/code/baa-conductor-conductor-ui-control-workspace && pnpm -C apps/conductor-daemon build`
515+- `cd /Users/george/code/baa-conductor-conductor-ui-control-workspace && pnpm -C apps/conductor-daemon test`
516+
517+## 执行记录
518+
519+> 以下内容由执行任务的 AI 填写,创建任务时留空。
520+
521+### 开始执行
522+
523+- 执行者:
524+- 开始时间:
525+- 状态变更:`待开始` → `进行中`
526+
527+### 完成摘要
528+
529+- 完成时间:
530+- 状态变更:`进行中` → `已完成`
531+- 修改了哪些文件:
532+- 核心实现思路:
533+- 跑了哪些测试:
534+
535+### 执行过程中遇到的问题
536+
537+-
538+
539+### 剩余风险
540+
541+- 首版如果仍采用轮询,browser action result 和 codex recent events 的“即时感”会弱于后续 SSE/WS 版本;这是可接受的第一阶段折中
542diff --git a/tasks/TASK_OVERVIEW.md b/tasks/TASK_OVERVIEW.md
543index 8cad4a30a468a0b013e8899f0cb228408c37870f..e8963f64dafbd294f5b96f748e0390c354f9fbd5 100644
544--- a/tasks/TASK_OVERVIEW.md
545+++ b/tasks/TASK_OVERVIEW.md
546@@ -97,9 +97,21 @@
547
548 ### 当前下一波任务
549
550-当前没有待开始任务卡,也没有 open bug / open opt。
551+建议下一波按 Web UI 工作台拆成 3 张任务卡推进:
552
553-如继续推进,建议先基于新的需求或 review 结果重新拆任务。看门狗方向如需重启,也应从最新 `main` 重新实现,不直接复用旧方案。
554+| 任务 | 标题 | 规模 | 依赖 | 建议 AI | 状态 |
555+|---|---|---|---|---|---|
556+| [`T-S070`](./T-S070.md) | Conductor UI 基础设施:Vue 3 脚手架与 `/app` 静态托管 | M | 无 | Codex | 待开始 |
557+| [`T-S071`](./T-S071.md) | Conductor UI 会话鉴权:登录页与浏览器 session | M | T-S070 | Codex | 待开始 |
558+| [`T-S072`](./T-S072.md) | Conductor UI `Control` 工作区首版 | L | T-S070, T-S071 | Codex | 待开始 |
559+
560+这三张任务卡对应:
561+
562+- Phase 0:前端壳与 `/app`
563+- Phase 0.5:浏览器工作台 session 鉴权
564+- Phase 1:正式 `Control` 工作区
565+
566+`Channels` 工作区和正式 `channel` 域模型暂未纳入这一轮 3 张任务卡,后续应在 `T-S072` 收口后再继续拆。
567
568 ### 已完成但保留作参考
569
570@@ -164,6 +176,8 @@
571
572 ## 当前活跃需求文档
573
574+- [`../plans/CONDUCTOR_UI_MODULE_REQUIREMENTS.md`](../plans/CONDUCTOR_UI_MODULE_REQUIREMENTS.md)
575+- [`../plans/CONDUCTOR_UI_IMPLEMENTATION_PLAN.md`](../plans/CONDUCTOR_UI_IMPLEMENTATION_PLAN.md)
576 - [`../plans/AUTOMATION_ARBITRATION_REQUIREMENTS.md`](../plans/AUTOMATION_ARBITRATION_REQUIREMENTS.md)
577 - [`../plans/UNIFIED_OVERLAY_AUTOMATION_CONTROL.md`](../plans/UNIFIED_OVERLAY_AUTOMATION_CONTROL.md)
578 - [`../plans/SYSTEM_LEVEL_PAUSE_REQUIREMENTS.md`](../plans/SYSTEM_LEVEL_PAUSE_REQUIREMENTS.md)
579@@ -186,7 +200,8 @@ Phase 1(浏览器主链)、Artifact 静态服务,以及 timed-jobs + 续
580 如果继续推进,建议:
581
582 - 远端 `baa-conductor-artifact` 已在 `2026-04-01` 应用 [`packages/d1-client/src/d1-setup.sql`](../packages/d1-client/src/d1-setup.sql) 的最新 schema;后续如新建或重置 D1 环境,仍需先执行同一脚本
583-- 再根据新的产品需求、代码审查结论或看门狗方向的重写意图重新拆任务
584+- 优先按 `T-S070 -> T-S071 -> T-S072` 顺序推进正式 Web UI 工作台
585+- `Channels` 工作区与正式 `channel` 模型留到 `Control` 首版落地后再拆下一轮任务
586
587 ## 现在该读什么
588