P0.UA13-capture-toolbar-multi-widget · 顶栏 capture 弹框 + 多 widget 同 groupId 抓取 + 多曲线叠加渲染 + LeftDock § Workspace 扩展(议题 4 capture 类 Smaart 主体)
Worker:ClaudeA · 部门:前端 · 预计:1.5d · 优先级:P1 · 状态:ready
🔍 触发与解锁链
前置已就位:
- ✅ F4 0111d16 realtimeRunStore + 顶栏 ▶/■ 单按钮(已挂 📸/🔄 占位 emit · 留 fork 7)
- ✅ F6 92445f5 SmartStorageEngine v2 captures + testProjects store + LEGACY 迁移
- ✅ F1+F2+F3 后端 realtime/builtin-link/audio-device 三件套全 zombie
- ⚠️ F5 P0.UA13-input-output-device-config-panel 仍 dispatched(ClaudeA 在跑 LeftDock § Engine 扩展 · 本 fork 严禁动 EnginePanel.vue 范围)
本 fork 解锁:F8 P_e2e.UA13-truth(议题 4 e2e capture 真值)
任务定义(基于 ADR-13 §2.6+§2.7+§2.8+§3.4 议题 4 capture 类 Smaart)
落地 4 大子能力,严守 ADR-12 §3 7 widget 业务行为契约不动:
1. 顶栏 capture 弹框:📸 触发 → 弹框命名 + description + 勾选 widget(默认全选)+ Confirm → 多 widget 同 groupId 抓取 + 落 IDB v2 captures store + 物理目录
2. 顶栏 recapture 同名替换:🔄 触发 → 弹框确认 → 同 captureGroupId 数据更新 + modifiedAt 刷新
3. 多曲线叠加渲染:7 widget(rms / fft / phase / transfer / waveform / electrical / recorder)各自加 capture overlay 子能力 · 加载 capture 列表 · 显隐勾选驱动 trace 渲染
4. LeftDock § Workspace 扩展:在现有 WorkspacePresetPanel.vue(b4a8ea2 已就位)末尾追加 § Test Project + § Captures 两段(❌ 不动 § Layout Preset)
完整 prompt(直接复制粘贴 worker 终端)
[U-thread] P0.UA13-capture-toolbar-multi-widget · ADR-13 §5.3 fork 7
[部门] 前端 P0(xishell)
[Worker CWD] d:/work/25_claude/workspace/AlgoDepartment/04_development/
[Occupies] P0.K-shared-xitest + P0.K-storage-engine
[优先级] P1 · 🧵 file
[ADR] docs/08-implementation/40-aios/ADR/ADR-AIOS-13-xitest-realtime-dual-mode.md(必读 §2.6 § 2.7 §2.8 §3.4 §11)
[参考文档]
- ADR-13 §3.4 业务行为契约 5 项必填(① CaptureRecord/TestProject schema ② 收敛判据 4 项 ③ 失败回退 3 类 ④ 用户操作流 3 路径 ⑤ e2e 真值)
- ADR-13 §11 Ximind 兼容性(description 字段 + structured RealtimeError + audit log)
- ADR-12 §3 7 类 MeasurementNode 业务行为契约(❌ 不动)
- 范式参考 commit `92445f5` storage/storage-engine.ts v2 + `0111d16` realtimeRunStore + `b4a8ea2` WorkspacePresetPanel.vue(LeftDock 三段范式)
【背景】
ADR-13 议题 4 capture 类 Smaart · F6(`92445f5`)IDB v2 captures+testProjects store 已就位 · 8 个 IStorageEngineV2 方法可调。
F4(`0111d16`)realtimeRunStore + 顶栏 ▶/■ 已就位 · 顶栏 capture/recapture 留 emit hook · 本 fork 接入业务。
目标 = Smaart Suite + APX500 风格 capture · 用户操作流 = 跑 realtime → § Test Project + → 顶栏 📸 → 命名 + 勾选 → 4 widget 同 groupId 落盘 → § Captures 显隐勾选叠加显示。
【执行步骤】
Step 1 · 真值核查(F6 + F4 现状)
- read storage/storage-engine.ts(v2 IDB 接口 8 方法 · listCaptures/createCapture/updateCapture/deleteCapture 等签名)
- read stages/xitest/index.vue(F4 0111d16 顶栏 capture/recapture handler 占位位置)
- read stages/xitest/drawers/WorkspacePresetPanel.vue(b4a8ea2 三段 § Layout Preset 范式 · 不动)
- read 7 widget 现有结构(rms / fft / phase / transfer / waveform / electrical / recorder · 找到 trace 渲染位置 · 评估 overlay 注入点)
Step 2 · 顶栏 capture 弹框组件
- 新建 components/CaptureDialog.vue(props: open / mode='capture'|'recapture' / defaultName / availableWidgets / existingCaptureGroup)
- 字段:name(autocomplete 默认 `<YYYY-MM-DD-HHmm>__multi__<slug>`)+ description(textarea)+ widgetTypes 多选(默认全选)+ duplicateName 警告
- emit: confirm(payload) / cancel
- 严守:不嵌入完整 SFC > 60 行(参考 ADR-13 §2.6 弹框设计)· design-token 主题色 + 横竖屏响应式
Step 3 · 顶栏 capture handler 接入
- stages/xitest/index.vue · realtime-capture handler:① 获取 activeTestProject(若无 → 弹框引导新建)② 打开 CaptureDialog mode='capture' ③ confirm → 调 storageEngine.createCapture()×N(每个 widget 一个 record · 共享 captureGroupId = uuid)+ 4 文件落对应物理目录
- realtime-recapture handler:① 找当前 widget 的 captureGroup ② 打开 CaptureDialog mode='recapture' ③ confirm → updateCapture()×N 同 groupId
- 严守:不动 F4 0111d16 realtimeRunStore schema + 不动 F5 EnginePanel.vue 范围(❌ 不动 § Engine 三段 / § Device / § Signal Config 段)
Step 4 · LeftDock § Workspace 扩展(WorkspacePresetPanel.vue 追加)
- 在现有 § Layout Preset(b4a8ea2)下方追加 § Test Project + § Captures 两段
- § Test Project:Active dropdown + [+ New Project] / [Rename] / [Delete] 按钮 · 调 storageEngine testProjects API
- § Captures:按 widgetType 分组列表(▼ FFT (3) ☑ ☐ ☑ · ▶ RMS (2)..)· 勾选驱动 widget overlay 显隐 · design-token 区分颜色
- 严守:❌ 不动 § Layout Preset 段 · 仅在 panel 末尾追加 · 类似 b4a8ea2 风格
Step 5 · 7 widget 多曲线叠加渲染(子能力)
- 每个 widget 加 props: overlayCaptures?: CaptureRecord[] + computed traces(主 realtime trace + N 历史 trace)
- Canvas 离屏 + RAF 节流(历史 trace 静态 1 次 · 实时 trace 30fps 重画 · 见 ADR-13 §2.7 多曲线叠加渲染段)
- 严守:❌ 不改 7 widget 现有 trace 渲染逻辑 · 仅注入 overlay 子能力 · ADR-12 §3 业务行为契约不动
Step 6 · vitest 测试(≥ 12 cases · 覆盖核心)
- CaptureDialog.spec.ts(open/cancel/confirm/duplicateName)
- capture-handler.spec.ts(4 widget 同 groupId / recapture 同名替换 / 无 testProject 引导新建)
- WorkspacePresetPanel-captures.spec.ts(§ Test Project + § Captures 两段渲染 · 不动 § Layout Preset)
- widget-overlay.spec.ts(7 widget × overlay 子能力 trace 渲染)
- 验收:typecheck 0 errors + vitest 全过 · 测试基线 +12 用例(从 365 → 377+)
Step 7 · commit + 三元组 trailer
git add . && git commit -m "feat(xitest/realtime-capture): F7 P0.UA13-capture-toolbar-multi-widget · ADR-13 §5.3 fork 7
capture/recapture 弹框 + 多 widget 同 groupId 抓取 + LeftDock § Test Project/§ Captures + 7 widget overlay 子能力。
[step=7/7] [pid=P0] [uid=UA13-capture-toolbar-multi-widget]
[occupies=P0.K-shared-xitest+P0.K-storage-engine] [files=N]"
【验收】
☐ typecheck 0 errors · vitest 全过(基线 365 → 377+)
☐ ADR-13 §3.4 业务行为契约 5 项 e2e 真值(本 fork 实施 ④ 用户操作流 3 路径 + ⑤ 端到端 capture 4 widget 同 groupId 真值留 F8)
☐ 不动 F5 EnginePanel.vue / § Engine / § Device / § Signal Config 范围(grep diff 验证)
☐ 不动 ADR-12 §3 7 widget 现有 trace 业务逻辑(仅加 overlay 子能力)
☐ 不动 § Layout Preset(b4a8ea2)· 仅在 WorkspacePresetPanel 末尾追加两段
☐ description 字段全填(CaptureRecord + TestProject)Ximind 兼容
☐ design-token 主题色 + 横竖屏响应式(全局红线 #1 #2)
【禁止】
❌ 不实施 capture 跨 testProject 复制(ADR §4.3 Non-Goals)
❌ 不实施 capture 导出 CSV/WAV(本期仅 JSON · ADR §4.3)
❌ 不动 contract-v1.0(已 frozen)
❌ 不动 ADR-12 §3 7 widget 业务行为契约(已 e2e zombie `3a8d376`)
❌ 不嵌入完整 SFC > 60 行 / TS interface > 5 行(.clinerules v1.6 prompt 内容硬约束)
❌ 不动 F5 P0.UA13-input-output-device-config-panel 范围(EnginePanel.vue · § Engine/§ Device/§ Signal Config 段 · ClaudeA 内部串行避 race)
❌ 不主动联动 ADR-08 子图系统(realtime 用 builtin link · 不嵌 subgraph · ADR §4.3)
解锁链(本任务 zombie 后)
- ✅ F8 P_e2e.UA13-truth(ClaudeC · 0.5d · e2e 真值脚本 4 议题全验)→ ADR-13 整体闭环 🏆
风险评估
| 风险 | 缓解 |
|---|---|
| 与 F5 ClaudeA 内部 race(同 LeftDock) | F5 改 § Engine + § Device + § Signal Config(EnginePanel.vue)· F7 改 § Workspace(WorkspacePresetPanel.vue)· 文件正交 · prompt 显式禁止 |
| 7 widget overlay 子能力工作量大 | 复用 Canvas 离屏 + RAF 节流 · 历史 trace 静态 1 次 · 不改现有业务逻辑 |
| IDB v2 写入延迟(4 widget 同时 capture) | F6 已实装双层 SmartStorageEngine(<100KB localStorage · ≥100KB IDB)· 异步写 · UI 不阻塞 |
| 多曲线渲染 30fps 卡顿 | 历史 trace 不重画 · 仅主实时 trace 重画 · design-token 颜色区分(限 5-8 trace) |
历史
| 时间 | 事件 | hash |
|---|---|---|
| 2026-06-02 14:35 | dispatched(ADR-13 fork 6 zombie 解锁 · F7 起 · v1.9 沿用旧 UID 因 ADR-13 沿用 UA13 命名) | — |