ADR-12 Phase 3 #11 未派 · 用户 2026-05-31 14:26 拍板方向 3 三 fork 全派(#10 + 本 fork + Recorder 真业务)。 ADR-12 §A.21 Bottom Dock 6 段(Console/Device/XRUN/Measure Log/Task Queue/Validation Result)+ Storage Engine 持久化全部缺失 · 本 fork 一次性补齐。 与 #10 P0.U-engine-session-snapshots(ClaudeC)文件正交可并行(本 fork 用 stages/xitest/bottomDock/ + storage/ · 不动 leftDock/)。 必须含全局红线 §2.11 第 8+9 项(响应式横竖屏 + 主题色系切换 design-token)。 estimated: 2.0d preempts: [] preempted_by: null unblocks: [#10 SnapshotsPanel in-memory → Storage Engine localStorage 切换 · ADR-12 §6.2 Phase 3 BottomDock 6 段全部可见] related_zombie: - P0.U-widget-workspace-framework (a7df354 · BottomDock 容器框架已就位) - P0.U-measurement-thd-snr (554ddd1 · design-token + 全局红线 e2e 标杆)
P0.U-bottom-dock-storage-engine · ADR-12 BottomDock 6 段 + Storage Engine 持久化实施
Worker:ClaudeD · 前端 / 部门:前端 P0-xishell / 预计:2.0d / 优先级:P1 / 状态:ready
🔍 触发与解锁链
- 触发:ADR-12 Phase 3 #11 未派 · 用户拍板方向 3(本 fork + #10 + Recorder 真业务 · 总 5.5d 最激进并行)。BottomDock 框架(
a7df354)已就位 · 但 6 段(Console/Device/XRUN/Measure Log/Task Queue/Validation Result)全部缺失。 - 解锁条件:本 fork zombie 后,ADR-12 §6.2 Phase 3 BottomDock 6 段全部可见达标 · #10 SnapshotsPanel in-memory store 自动切换到 Storage Engine localStorage/IndexedDB(无感升级)。
任务定义(基于 ADR-AIOS-12 v2.3 §5.3 #11 + §A.21 + §2.8 + §2.11 全局红线)
BottomDock 6 段(Console / Device Status / XRUN 计数器 / Measurement Log / Task Queue / Validation Result)+ Storage Engine 持久化引擎,本 fork 一次性补齐:
核心范围: 1. § Console(对齐 §A.21):INFO / WARNING / ERROR / DEVICE / SCRIPT 5 级日志 · 可折叠 · 用 ConsoleStore Pinia 管理 2. § Device Status(对齐 §A.21 + §2.8):Clock Lock / Sample Rate / Buffer / XRUN / CPU 实时显示 · WS 推送(P5 已就位) 3. § XRUN 计数器(对齐 §A.21):红色 badge · 累计 XRUN 次数 · 点击展开详情列表 4. § Measurement Log(对齐 §A.21):最近 N 次测量结果(可点击跳回 widget · 全局测量历史) 5. § Task Queue(对齐 §A.21):当前运行/排队的 Task Flow / Recording / Export 占位(stub · 不实施执行引擎) 6. § Validation Result(对齐 §A.21):最新一次 Pass/Fail 结果 + 链接(stub · validation 算法留下季度) 7. Storage Engine:localStorage / IndexedDB 双层持久化 · workspaceStore.widgets[] + 用户布局 + Snapshots(由 #10 切换调用)
🚨 全局红线对齐(ADR-12 §2.11 第 8+9 项):
- 响应式横竖屏:BottomDock 高度 22-32px(横屏 1 行)/ 60-80px(竖屏 2 行可滚动)· ResizeObserver
- 主题色系切换:用 var(--xs-bottomdock-*) design-token · Console 5 级日志颜色全部 token 化(info / warning / error / device / script 5 个独立 token)
完整 prompt(直接复制粘贴 worker 终端)
[U-thread]: P0.U-bottom-dock-storage-engine
[部门]: 前端 P0-xishell
[Worker CWD]: d:/work/25_claude/workspace/AlgoDepartment/04_development/
[Occupies]: P0.K-shared-meter-dock · P5.K-meter-tap(read)
[优先级]: P1 · 2.0d
[ADR]: docs/08-implementation/40-aios/ADR/ADR-AIOS-12-xitest-realtime-arch.md(v2.3)
[业务行为契约引用]: ADR-12 §5.3 Phase 3 #11 + §A.21 Bottom Dock + §2.8 BottomDock 状态栏 + §2.11 第 8+9 项全局红线 + v2.3 前后端责任边界
[参考文档]:
- ADR-AIOS-12 §5.3 Phase 3 实施清单 #11(本 fork 主依据)
- ADR-AIOS-12 §A.21 Bottom Dock(Console / Device Status / XRUN / Measurement Log / Task Queue / Validation Result · 6 段)
- ADR-AIOS-12 §2.8 子决议 · Bottom Dock 状态栏(高度 22-32px · DAW 风格)
- ADR-AIOS-12 §2.11 第 8+9 项全局红线(响应式横竖屏 + 主题色系切换)
- ADR-AIOS-12 §4.3 Non-Goals(Validation Engine 算法留下季度 · Task Engine 执行引擎留下季度 · 本 fork 严守 stub)
- 已就位 BottomDock 容器(a7df354):frontend_vue3/src/stages/xitest/bottomDock/(BottomDock.vue · 6 段路由 placeholder 已留)
- 已就位 P5 Device Status WS(48cf0ba · MeterTapService toolKind=device-status 推送 WASAPI 状态 + XRUN + CPU)
- 已就位 standout(8379de2 / 554ddd1):design-token --xs-* 模板 + 横竖屏 e2e 风格
【背景】
ADR-12 BottomDock 容器已就位(`a7df354` Phase 1 闭环)· 6 段路由 placeholder 已留 · 本 fork 一次性实装 6 段。
§ Console = 5 级日志(INFO/WARNING/ERROR/DEVICE/SCRIPT)· 用 Pinia ConsoleStore 管理 ring buffer 1000 条 · 可折叠 · 颜色用 design-token。
§ Device Status + XRUN = WS 推送(P5 已就位)· 实时显示 · 不写 P5(只读视图)。
§ Measurement Log = 全局测量历史 · 点击跳回 widget(emit focus-widget 事件 · workspaceStore 接收)。
§ Task Queue + Validation Result = 占位 stub(不实施执行引擎 / validation 算法 · §4.3 Non-Goals 明示)。
Storage Engine = localStorage(简单)+ IndexedDB(大数据 · Snapshots IR 数据)双层 · 自动选择 · workspaceStore.widgets[] 持久化是核心。
【执行步骤】(7 步)
Step 1 · types schema 扩展(0.2d)
- frontend_vue3/src/types/console.ts(新增):
type ConsoleLevel = 'info' | 'warning' | 'error' | 'device' | 'script'
interface ConsoleEntry { id: string; level: ConsoleLevel; source: string; message: string; timestamp: number; payload?: unknown }
- frontend_vue3/src/types/device-status.ts(新增):
interface DeviceStatus { clockLock: 'locked' | 'free' | 'unlocked'; sampleRate: number; bufferSize: number; xrunCount: number; cpuPercent: number; updatedAt: number }
- frontend_vue3/src/types/measurement-log.ts(新增):
interface MeasurementLogEntry { id: string; widgetId: string; measurementType: string; result: 'pass' | 'fail' | 'info'; details: string; timestamp: number }
- frontend_vue3/src/types/storage.ts(新增):
interface StorageEngine { saveWorkspace(ws: Workspace): Promise<void>; loadWorkspace(id: string): Promise<Workspace>; saveSnapshot(s: Snapshot): Promise<void>; loadSnapshots(): Promise<Snapshot[]> }
Step 2 · § Console + ConsoleStore(0.3d · ADR §A.21)
- 新增 stages/xitest/bottomDock/ConsolePanel.vue(可折叠)
- 新增 store/consoleStore.ts(Pinia · ring buffer 1000 条)
- 5 级颜色:info(灰)/ warning(黄)/ error(红)/ device(蓝)/ script(紫)· 全部 design-token
- useConsoleLogger.ts composable:暴露 logInfo/logWarning/logError/logDevice/logScript 给全 stage 调用
Step 3 · § Device Status + § XRUN(0.3d · ADR §A.21 + §2.8)
- 新增 stages/xitest/bottomDock/DeviceStatusBar.vue(单行紧凑)
- 显示:Clock badge(locked/free/unlocked 颜色)+ Sample Rate + Buffer + XRUN counter(红色 badge · 点击展开列表)+ CPU 进度条
- useDeviceStatus.ts composable:订阅 P5 Device Status WS · 自动 reactive 更新 · XRUN 增量推送时弹出 1s tooltip
Step 4 · § Measurement Log(0.2d · ADR §A.21)
- 新增 stages/xitest/bottomDock/MeasurementLogPanel.vue(可折叠)
- 列表渲染 · 行点击 emit focus-widget · workspaceStore.focusWidget(widgetId) 接收 · 主画布滚动到对应 widget
- useMeasurementLog.ts composable:全局订阅 widget 测量完成事件 · 自动 push log
Step 5 · § Task Queue + § Validation Result(0.1d · 占位 stub)
- 新增 stages/xitest/bottomDock/TaskQueueStub.vue · 灰显 + tooltip "执行引擎留下季度 · ADR-12 §4.3 Non-Goals + ADR-AIOS-13 候选"
- 新增 stages/xitest/bottomDock/ValidationResultStub.vue · 灰显 + tooltip "Validation 算法留下季度 · §4.3 Non-Goals"
- schema 已落 · UI 仅占位 · 不实装真业务
Step 6 · Storage Engine 双层实施(0.5d · 本 fork 主体)
- 新增 frontend_vue3/src/storage/storage-engine.ts:
- 接口 IStorageEngine(saveWorkspace / loadWorkspace / saveSnapshot / loadSnapshots / clear)
- 实现 1 · LocalStorageAdapter(workspaceStore + 简单字段 · < 5MB)
- 实现 2 · IndexedDBAdapter(Snapshots IR 数据 · 大对象 · 用 idb 库)
- 自动选择:数据量 < 100KB 走 localStorage · ≥ 100KB 走 IndexedDB
- workspaceStore 集成:Pinia plugin 自动 watch + persist · 1s 防抖
- 兼容 #10 SnapshotsPanel:暴露全局 storageEngine instance · #10 useSnapshots fallback 检测后自动切换
Step 7 · 响应式 + 主题 + e2e + commit(0.4d · 全局红线 + 自查)
- 响应式横竖屏(全局红线 #1):BottomDock 容器 ResizeObserver · 横屏 22-32px 单行 · 竖屏 60-80px 双行可滚动
- 主题色系(全局红线 #2):design-tokens.css 新增段:
--xs-bottomdock-bg / --xs-bottomdock-border / --xs-bottomdock-text
--xs-console-info / --xs-console-warning / --xs-console-error / --xs-console-device / --xs-console-script
--xs-device-clock-locked / --xs-device-clock-free / --xs-device-clock-unlocked / --xs-device-xrun-badge
--xs-task-queue-stub-disabled / --xs-validation-pass / --xs-validation-fail
- vitest case × 6(Console 5 级 + Device 时钟切换 + XRUN 增量 + Measurement Log 跳转 + Storage 自动选择 + 横竖屏)
- playwright e2e:浅色 / 深色 + viewport 1920×1080 / 1080×1920 各 1 截图
- npm run typecheck 全绿 · npm run test:unit 不退化(基线 356/3) · grep `#[0-9a-fA-F]{3,8}` 在 6 个 Panel.vue 中 0 命中
- commit subject: feat(P0.U-bottom-dock-storage-engine): implement BottomDock 6 sections + Storage Engine localStorage/IndexedDB (responsive landscape/portrait + design-token theme · ADR-12 §5.3 #11)
- commit trailer 三元组:[step=7/7] [pid=P0] [uid=U-bottom-dock-storage-engine] [occupies=P0.K-shared-meter-dock+P5.K-meter-tap-read] [files=stages/xitest/bottomDock/{Console,DeviceStatusBar,MeasurementLog,TaskQueueStub,ValidationResultStub}.vue,storage/storage-engine.ts,store/consoleStore.ts,types/{console,device-status,measurement-log,storage}.ts,composables/use{ConsoleLogger,DeviceStatus,MeasurementLog}.ts,styles/design-tokens.css]
【验收】(stop 前必跑)
形式合规:
☐ npm run typecheck 全绿
☐ npm run test:unit 不退化 + 新增 6 case 全过
☐ grep `#[0-9a-fA-F]{3,8}` 在 6 个 Panel.vue / DeviceStatusBar.vue 中 0 命中
☐ grep `audio-data|audio-buffer|fft|numpy` 在本 fork 改动文件 0 命中(沿用三层分工)
☐ design-tokens.css 已加 --xs-bottomdock-* / --xs-console-* / --xs-device-* / --xs-task-queue-* / --xs-validation-* token
业务行为契约(端到端真值 · 必跑):
☐ § Console 5 级日志注入 + 颜色正确 + ring buffer 1000 上限滚动
☐ § Device Status 时钟 badge 颜色随 WS 推送变化 + XRUN 增量 1s tooltip
☐ § Measurement Log 行点击 emit focus-widget + 主画布滚动到目标 widget
☐ § Task Queue + Validation Result 灰显 + tooltip 显示
☐ Storage Engine localStorage 写入 < 100KB workspace · IndexedDB 写入 ≥ 100KB Snapshot · 自动选择正确
☐ workspaceStore 改动 1s 后自动持久化 · F5 刷新后恢复
☐ 横屏 1920×1080 vs 竖屏 1080×1920 BottomDock 高度切换(全局红线 #1)
☐ 主题切换浅色 ↔ 深色 · BottomDock 颜色变化(全局红线 #2)
【commit】
- subject + 三元组 trailer 见 Step 7
- 7 天宽限期内三元组缺失仅 warning · 6/2 起 strict mode 硬拒
【禁止】(7 项红线)
1. ❌ 禁止在前端实装 audio 数据处理 / FFT / RMS 计算(沿用 ADR-07 §1.3.4 三层分工 · 数学全交 P7)
2. ❌ 禁止硬编码 hex 色值(必须 var(--xs-*) design-token · 全局红线 #2)
3. ❌ 禁止跳过响应式横竖屏 e2e(必须 viewport 1920×1080 vs 1080×1920 各跑一次 · 全局红线 #1)
4. ❌ 禁止实装 Validation Engine 算法 / Task Flow 执行引擎(留下季度 · ADR-12 §4.3 Non-Goals · stub 即可)
5. ❌ 禁止改 P5 后端任何接口(对齐 ADR-12 §2.11 v2.3 前后端责任边界 · 现有数据契约不变)
6. ❌ 禁止与并行 fork P0.U-engine-session-snapshots(#10)抢同一文件(本 fork 仅在 stages/xitest/bottomDock/ + storage/ + store/ + types/ + composables/ + styles/design-tokens.css)
7. ❌ 禁止跳过 e2e 真值(必须 8 个断言 + 全局红线 #1#2)
解锁链(本任务 zombie 后)
- ✅ #10 P0.U-engine-session-snapshots SnapshotsPanel in-memory store 自动切换到 Storage Engine localStorage/IndexedDB(无感升级)
- ✅ ADR-12 §6.2 Phase 3 BottomDock 6 段全部可见达标
- ✅ workspaceStore.widgets[] 持久化解锁 · 用户重启浏览器后布局恢复
风险评估
| 风险 | 缓解 |
|---|---|
| IndexedDB 浏览器兼容(Chrome/Firefox/Edge 都支持但 API 不一致) | Step 6 用 idb 库(MDN 推荐 · 跨浏览器 promise 封装)· 不直接用原生 API |
| Storage Engine 与 #10 in-memory 切换时机冲突 | Step 6 暴露全局 storageEngine instance · #10 useSnapshots fallback 自动检测 · 切换无感 |
| design-token 命名空间与 #10 LeftDock 冲突 | Step 7 BottomDock 用 --xs-bottomdock- 前缀 · LeftDock 用 --xs-leftdock- · 不重叠 |
| Console ring buffer 1000 条性能(频繁 push 触发 reactive) | Step 2 用 markRaw + 数组 splice · 不让 Pinia 深度 reactive · 性能 60fps |
| Measurement Log focus-widget 事件链(BottomDock → workspaceStore → 主画布) | Step 4 用 Pinia action focusWidget(widgetId) 统一入口 · 避免多事件源冲突 |
历史
| 时间 | 事件 | hash |
|---|---|---|
| 2026-05-31 14:28 | dispatched · 用户拍板方向 3 三 fork 全派 · 与 #10 文件正交可并行 | — |