P0.U-measurement-electrical-recorder-stub · ADR-12 Phase 2 #7 · Electrical (APx500) + Recorder schema + UI stub
Worker:TBD(用户分配 · 建议 ClaudeC 主战场闲置接)· 部门:前端 (frontend_vue3) 预计:1.5d · 优先级:P1 · 状态:dispatched 隔离:文件隔离(widgets/{electrical,recorder}/ 全新 · 不升级 test-aux/meter/ · 与 #5/#6 三线正交)
🔍 触发与解锁链
- 触发:2026-05-30 08:35 #5 派发 + 08:48 #6 派发后 · Phase 2 收尾 stub · ClaudeC 主战场闲置可接(ADR-11 fork 1 v2 phase1-measure-v2 仍 ready 未派 · 本任务 1.5d 短工时不阻塞)
- 前置就位:
- 前端容器层:DashboardCanvas + WidgetContainer + 4 套 Preset 切换(
a7df354) - 前端 types:MeterFrame_Electrical(vrms/dbu/frequency/thd/thdN/sinad/snr/calibrated)+ RecordingSession(id/bufferMode/markers/preRollMs/triggerConfig) 已 9fc31c4 落地
- NodeFactory + LeftDock(
6050959)+ Inspector 6 段(77b7a50) - 本任务 zombie 后解锁:ADR-12 §3 7/7 类 MeasurementNode 类型全注册 · APx500 Workspace Preset 占位可用 · Recorder ring buffer 内存模式可用 · #5+#6+#7 合流即 ADR-12 Phase 2 整体闭环
- 本期 stub 范围(.clinerules v1.8 §业务行为契约 ②-⑤ 本期略 · ADR §3.6/§3.7 明确标 stub):
- ✅ MeterFrame_Electrical 字段全显示(vrms/dbu/frequency/thd 等 · 单位 V/dBu/Hz/%/dB)· 占位数值显示 "—" 或后端推什么显什么
- ✅ RecordingSession ring buffer 内存模式可起停(startedAt/stoppedAt/durationMs/markers · 不写文件)
- ❌ THD/SINAD/SNR 算法不实施(Phase 4 #12 P7.U-thd-sinad-snr)
- ❌ Recorder .wav 多轨文件持久化不实施(下季度)
- ❌ Validation Engine 算法不实施(threshold/mask/golden compare schema 已 occupy · 算法占位)
- ❌ 端到端真值 e2e 不强制(Phase 4 真值需 AP 测试夹具)
任务定义(基于 ADR-AIOS-12 §3.6 + §3.7)
按 ADR-12 §3.6 Electrical Meter Node(APx500 核心 · vrms/dbu/thd/sinad/snr 字段)+ §3.7 Recorder Node(ring buffer + markers + triggerConfig)各 ① 输入输出契约,仅落 widget 业务壳 + Inspector 6 段路由 stub + LeftDock 拖拽注册 + Workspace Preset 占位。不动 #5 widgets/{rms,fft,phase}/ 与 #6 widgets/{transfer,waveform}/ 与 test-aux/meter/* stub(本任务不升级 meter stub · 它们是 #5/#6 的范围)。
完整 prompt(直接复制粘贴 worker 终端)
[U-thread] P0.U-measurement-electrical-recorder-stub
[部门] 前端 (frontend_vue3) · 推荐 skill: vuejs-typescript-best-practices
[Worker CWD] d:/work/25_claude/workspace/AlgoDepartment/04_development/(由用户分配的 worker / worktree 决定)
[Occupies] P0.K-shared-meter-dock(写) · P0.K-shared-types(read) · P4.K1-page-layout(read)
[隔离] 文件隔离 · 仅写:
- frontend_vue3/src/stages/xitest/dashboard/widgets/{electrical,recorder}/*(全新)
- frontend_vue3/src/stages/xitest/dashboard/inspector/{ElectricalInspector,RecorderInspector}.vue(6 段路由 stub · 仿写 #5/#6 风格)
- frontend_vue3/src/stores/xiTestWorkspaceStore.ts(只读引用 · #2 actions 已实施 · 仅在 widget 路由表追加 2 type 注册)
- tests/* 新增
严禁动 widgets/{rms,fft,phase,transfer,waveform}/*(留 #5/#6)· 严禁动 test-aux/meter/*(本任务不升级 meter stub)· 严禁动 stages/xitest/modes/*(P4.U3 ceecccf 实装)
[优先级] P1 · 1.5d · ADR-12 Phase 2 #7 · 本期 stub(无端到端真值强制)
[ADR] docs/08-implementation/40-aios/ADR/ADR-AIOS-12-xitest-realtime-arch.md(必读 §3.6 + §3.7 + §4.3 §5.2)
[业务行为契约引用] ADR-AIOS-12 §3.6 Electrical Meter + §3.7 Recorder · 本期仅 ① 输入输出 schema(②-⑤ ADR 显式标 Phase 4 占位)· Phase 4 #12 P7 算法实施后再补 ②-⑤
[参考文档](绝对路径)
- d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-12-xitest-realtime-arch.md(主 ADR · §3.6 L840-869 + §3.7 L871-893 + §4.3 Non-Goals + §5.2 Phase 2 实施清单)
- d:/work/25_claude/workspace/AlgoDepartment/04_development/frontend_vue3/src/types/measurement-node.ts(MeasurementNode 7 子能力 schema · 9fc31c4)
- d:/work/25_claude/workspace/AlgoDepartment/04_development/frontend_vue3/src/types/meter-frame-electrical.ts + recording-session.ts(MeterFrame_Electrical 字段 vrms/dbu/frequency/thd/thdN/sinad/snr/calibrated/calibrationDate · RecordingSession 字段 id/startedAt/stoppedAt/durationMs/channels/sampleRate/bufferMode/bufferSizeMs/markers/preRollMs/triggerConfig · 9fc31c4 已落地 · 单位 V/dBu/Hz/%/dB/ms)
- d:/work/25_claude/workspace/AlgoDepartment/04_development/frontend_vue3/src/stages/xitest/dashboard/{DashboardCanvas,WidgetContainer,WorkspacePresetSwitcher}.vue(a7df354 · 容器层就位 · 本任务在 widget 路由表追加 2 type 注册)
- d:/work/25_claude/workspace/AlgoDepartment/04_development/frontend_vue3/src/stages/xitest/dashboard/inspector/RightInspector.vue + 6 段子组件(77b7a50 · 本任务追加 ElectricalInspector + RecorderInspector 路由)
- d:/work/25_claude/workspace/AlgoDepartment/04_development/frontend_vue3/src/stores/xiTestWorkspaceStore.ts(#2 actions 已实施 · 本任务 read-only 引用 measurementNodes/widgets/loadPreset · 仅在 widget 路由表追加)
- d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/active/P0.U-measurement-rms-fft-phase.md(#5 同 Phase 2 标本 · 严格仿写 frontmatter + 8 段格式)
- d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/active/P0.U-measurement-transfer-waveform.md(#6 同 Phase 2 标本 · 仿写隔离边界声明风格)
【背景】
ADR-12 Phase 2 收尾 stub · #5 RMS/FFT/Phase + #6 Transfer/Waveform 是真业务 + e2e 真值 · #7 Electrical/Recorder 是 schema + UI 入口 stub。Electrical 对标 APx500 电气测量(vrms/dbu/thd/sinad/snr)· 本期算法不实施(Phase 4 #12 P7 落地)· UI 仅展示后端推什么(占位 "—" 或字段值);Recorder 对标 ocenaudio 录制(ring buffer + markers + triggerConfig)· 本期内存 ring buffer 可起停 · .wav 多轨持久化留下季度。本任务 zombie 后 ADR-12 §3 7 类 MeasurementNode 类型注册全闭环 · APx500 Workspace Preset 占位可用 · Phase 2 三线合流(#5+#6+#7)整体 zombie。
【执行步骤】
Step 1 · read 已有基础(只读 · 必做)
- read ADR-AIOS-12 §3.6 L840-869 + §3.7 L871-893 + §4.3 Non-Goals + §5.2 Phase 2 实施清单
- read types/{meter-frame-electrical, recording-session, measurement-node}.ts 字段定义
- read stages/xitest/dashboard/{DashboardCanvas, WidgetContainer}.vue 容器接口 + widget 路由表风格(#5/#6 prompt 中描述)
- read stages/xitest/dashboard/inspector/RightInspector.vue + 6 段子组件 stub(77b7a50)
- read stores/xiTestWorkspaceStore.ts measurementNodes/widgets/loadPreset 现有 actions
Step 2 · 新建 widgets/electrical/ElectricalWidget.vue(business shell · stub 渲染)
- WidgetContainer 内层 · 接 props: DashboardWidget · 订阅 WS 帧(toolKind=electrical · 30fps · 但本期后端可能尚未推 · UI 占位 "—")
- 字段对齐 ADR §3.6 ① 输入输出契约(vrms[V] / dbu[dBu] / frequency[Hz] / thd[%] / thdN[%] / sinad[dB] / snr[dB] / calibrated / calibrationDate)
- 渲染 8 通道 grid(类似 demo HTML 8-channel RMS 网格风格)· 每通道显示 6 字段(Vrms / dBu / Freq / THD / SINAD / SNR)· 占位 "—" 时灰显
- calibrated === false 时顶栏显示 ⚠️ "未校准 · 请先在 Engine § Calibration 配校准"
Step 3 · 新建 inspector/ElectricalInspector.vue(6 段 stub)
- § Source:选 physical-input + 多通道(8 通道默认全选)
- § Measurement:占位 fftSize / averaging(本期算法未实施 · UI 灰显 + tooltip "Phase 4 实施")
- § Display:切 grid 8 通道 / list 单通道详情
- § Validation:占位 threshold ±dB · golden compare(本期算法未实施 · UI 灰显)
- § Automation:占位 sequence trigger(Phase 4 留)
- § Storage:[💾 Snapshot] 按钮 · 保存当前测量到 Workspace snapshots(MeterFrame_Electrical 全字段)
- 仿写 #5/#6 inspectorRouter 注册风格(77b7a50 · selectedWidget.measurementNode.type === 'electrical-meter' → 路由到本组件)
Step 4 · 新建 widgets/recorder/RecorderWidget.vue(business shell · ring buffer 内存模式)
- WidgetContainer 内层 · 接 props: DashboardWidget · 内存 ring buffer(bufferMode='ring' · bufferSizeMs 默认 5000)
- UI:[⏺ Record] / [⏸ Pause] / [⏹ Stop] / [📍 Add Marker] 4 按钮 + 时间轴 + markers 标记
- 字段对齐 ADR §3.7 ① 输入输出契约(id / startedAt / stoppedAt / durationMs / channels / sampleRate / bufferMode / bufferSizeMs / markers / preRollMs / triggerConfig)
- 状态:idle / recording / paused / stopped · 切状态后 UI 反馈 + 时间累计
- ⚠️ 不写文件 · ⚠️ markers 仅内存 · ⚠️ duration 累计后超过 bufferSizeMs 时旧数据丢弃(ring 模式)
Step 5 · 新建 inspector/RecorderInspector.vue(6 段 stub)
- § Source:选 sink-pre / physical-input / recording-replay + 通道(单/多通道)
- § Measurement:配 bufferMode(ring / continuous · ⚠️ continuous 本期不实施 · UI 显示但 disabled)+ bufferSizeMs(默认 5000)+ preRollMs(默认 1000)
- § Display:时间轴渲染样式 / markers 显示开关
- § Validation:占位(下季度)
- § Automation:占位 trigger config(可填 schema · 但本期不联动)
- § Storage:[💾 Save Session](本期内存 RecordingSession 对象保存到 Workspace snapshots · 不写 .wav 文件 · ⚠️ tooltip ".wav 持久化下季度落地")
Step 6 · 注册 + 单元测试(无 e2e 真值)
- 在 stages/xitest/dashboard/DashboardCanvas.vue widget 路由表追加 type='electrical-meter' → ElectricalWidget · type='recorder' → RecorderWidget(与 #5/#6 路由表合并不冲突)
- 在 inspectorRouter 追加 'electrical-meter' → ElectricalInspector · 'recorder' → RecorderInspector
- 在 LeftDock § Measurements 列表追加 2 节点(Electrical Meter / Recorder · 拖拽创建 widget)
- 新增 electrical-widget.test.ts / recorder-widget.test.ts(占位字段渲染 + ring buffer 状态机 idle→recording→paused→stopped + markers 添加)
- test:unit 基线 356/3 → 目标 ≥ 372(+16 用例 · 本任务为 stub · 不强制 e2e 真值)
【验收】
形式合规(本期 stub 验收以此为准):
- npm run typecheck → ✓ exit 0
- npm run build → ✓ 零错误
- npm run test:unit → ≥ 372/3
- 2 widget 业务壳 + 2 Inspector 子组件 stub + DashboardCanvas widget 路由表追加 + inspectorRouter 路由追加 + LeftDock § Measurements 节点追加 + Workspace Preset(Electrical / Recording)stub 注册
**ADR §3.6 + §3.7 ① 输入输出契约自查清单**(本期仅 ① · ②-⑤ ADR 显式标 Phase 4 占位):
- [ ] ① Electrical:vrms[V] / dbu[dBu] / frequency[Hz] / thd[%] / thdN[%] / sinad[dB] / snr[dB] / calibrated 8 字段全显示(占位 "—" 灰显 OK · 单位标注正确)
- [ ] ① Recorder:RecordingSession 11 字段全 schema 实装(id / startedAt / stoppedAt / durationMs / channels / sampleRate / bufferMode / bufferSizeMs / markers / preRollMs / triggerConfig)
- [ ] Inspector 6 段路由通(② Measurement / ④ Validation / ⑤ Automation 占位灰显 + tooltip 标 Phase 4 / 下季度)
- [ ] Recorder ring buffer 内存模式状态机:idle → recording → paused → stopped 4 状态可切 + markers 添加 + duration 累计 + ring 模式 bufferSizeMs 上限丢弃旧数据
- [ ] LeftDock § Measurements 拖拽创建 Electrical Widget + Recorder Widget · Workspace Preset(Electrical / Recording)切换正常加载默认 widget 布局
【commit】
- subject:`feat(P0.U-measurement-electrical-recorder-stub/widgets): Electrical APx500 schema + Recorder ring buffer stub · ADR-12 Phase 2 #7`
- trailer:`[step=6/6] [pid=P0] [uid=U-measurement-electrical-recorder-stub] [occupies=P0.K-shared-meter-dock+P0.K-shared-types+P4.K1] [files=stages/xitest/dashboard/widgets/{electrical,recorder}/*+inspector/{ElectricalInspector,RecorderInspector}.vue+tests/*]`
【禁止】
1. ❌ 不动 widgets/{rms,fft,phase,transfer,waveform}/*(留 #5/#6)
2. ❌ 不动 test-aux/meter/*(本任务不升级 meter stub · 它们是 #5/#6 的范围 · 本任务仅在 widgets/{electrical,recorder}/* 内部直渲)
3. ❌ 不动 stages/xitest/modes/*(P4.U3 ceecccf 实装)
4. ❌ 不动 dashboard 容器层(DashboardCanvas / WidgetContainer / WorkspacePresetSwitcher · #2 a7df354 已就位 · 仅追加 widget 路由表 + Workspace Preset 注册)
5. ❌ 不实施 THD/SINAD/SNR 算法(ADR §4.3 Non-Goals + Phase 4 #12 P7.U-thd-sinad-snr 留下季度)
6. ❌ 不实施 Recorder .wav 多轨文件持久化(ADR §4.3 + 下季度 · 本期内存 ring buffer 即可)
7. ❌ 不实施 Validation Engine 算法(threshold/mask/golden compare 仅 schema · UI 灰显 + tooltip 标 Phase 4)
8. ❌ 不嵌入完整 Vue SFC 骨架(.clinerules v1.6 §prompt 内容硬约束)· worker 自决具体实现风格
9. ❌ 不绑定 CPU(本 prompt frontmatter worker: TBD · 用户分配 · 建议 ClaudeC 主战场闲置接 · ADR-11 fork 1 v2 仍 ready 未派 · 本任务 1.5d 短工时不阻塞)
10. ❌ 不强制 e2e 真值(ADR §3.6/§3.7 ②-⑤ 显式标 Phase 4 占位 · 本期 stub 验收以"形式合规 + ① 字段全显示 + Inspector 6 段路由通 + ring buffer 状态机正常"为准 · 不要硬塞 e2e 真值断言)
解锁链(本任务 zombie 后)
- ✅ ADR-12 §3 7 类 MeasurementNode 类型注册全闭环(7/7)· APx500 Workspace Preset + Recording Workspace Preset 占位可用
- ✅ 与 #5(RMS/FFT/Phase)+ #6(Transfer/Waveform)合流后 ADR-12 Phase 2 整体 zombie · 解锁 Phase 3 #10 P0.U-engine-session-snapshots + #11 P0.U-bottom-dock-storage-engine
- ✅ Phase 4 #12 P7.U-thd-sinad-snr 算法落地后 · Electrical widget 占位 "—" 替换为真值(consumes 本期已落地 schema)
- ✅ 下季度 Recorder .wav 多轨持久化(consumes 本期已落地 RecordingSession schema)
风险评估
| 风险 | 缓解 |
|---|---|
| ⚠️ 后端 toolKind=electrical 帧本期可能未推送 | UI 占位 "—" 灰显 · 不强制后端配套 · Phase 4 P7 落地后自动激活 |
| ⚠️ Workspace Preset 切到 Electrical/Recording 后默认 widget 布局未配 | 本期可仅注册 type · 默认布局留 1×1 占位 · 用户手动拖拽组合 |
| ⚠️ Recorder ring buffer bufferSizeMs 上限旧数据丢弃易出 bug | 用环形索引 + 显式 markers 时间换算 · 单测覆盖 ring 边界场景 |
| ⚠️ Inspector ②④⑤ 段灰显 tooltip 文案不一致 | 统一文案 "Phase 4 实施" / "下季度落地" · 仿写 #5/#6 Inspector tooltip 风格 |
| ⚠️ widget 路由表合并冲突(与 #5/#6 commit 顺序无关) | DashboardCanvas dynamic component 注册表追加(不替换)· 各 fork 各自追加自己的 type · 顺序无关 |
历史
| 时间 | 事件 | hash |
|---|---|---|
| 2026-05-30 08:53 | dispatched · ADR-12 Phase 2 #7 stub · 与 #5(08:35)+ #6(08:48)文件正交三线并行 · 本期仅 schema + UI stub | — |