P1.A21.F6-transfer-module-frontend · XiLink Transfer Module 前端实装(Smaart 风格 4 chart + ref/measure 双 selector + IP 库入口)
Worker:ClaudeA · 部门:前端 P1-xilink · 预计:2.0d · 优先级:P0 · 状态:dispatched · isolation:🧵 file(同 worktree 同 branch · 与 F4 phase-module-frontend / F2 fft-scope-controls-enhance 文件正交可并行)
🔍 触发与解锁链
触发:用户 2026-06-13 18:09 三连 stop F1+F3+F5 算法层闭环 → 18:18 反馈"前端 IP 库还是没看到 phase/transfer 组件" → 18:26 拍板三连 start F4+F6+F2。
用户原话(verbatim · ADR-21 §1.1):
"5. 然后是 transfer 控件 · 是 smaart 中类似 transfer 的双通道传递函数控件 · 输入两个通道 · 一个是参考通道 · 一个是测量通道 · 显示频响 + 相位 + 延时 + 相干性 · 用 GCC-PHAT 找延时 · 然后做 H(f) = Y/X · 显示 mag 和 phase · 同时显示 coherence 用于评估可信度"
解锁条件(双解锁已满足):
- ✅ F1 a5b52de zombie · DockHost.vue + DockNodeSelector.vue + 5 类节点 selector(含 xilink-module)+ useDockScale + useDockChannelMask + useChainNodeMetadata
- ✅ F5 eb84bab zombie · dsp_algo/modules/analysis/transfer_module + dspalgo_dll.c export transfer_module_get_transfer(10 参数 P/Invoke 签名)+ 8 单测 16/16 · 502/508 + 72/72 integration 零回归
架构契约(ADR-21 §3.4 · 业务契约 5 必填段全填):
- 输入:用户在 IP 库拖拽 transfer-module 节点到 chain · DockHost 顶部 ref/measure 双 selector(区别于 F4 单 selector)
- DLL 调用:transfer_module_get_transfer(refInstanceId, measureInstanceId, refChannel, measureChannel, fftSize, averaging, delayCompensationMs, sampleRateHz, coherenceThreshold, pOutFrame)
- 输出 schema(MeterFrame_Transfer · 复用 ADR-12 §3.3):{freqs[], magnitudeDb[], phaseDeg[], coherence[], delayLockedMs, delayFinderMs, isReliable, averagedCount}
- 性能基线:30fps · 1024 fftSize · canvas 4 chart 联动重绘 < 33ms
- 5 类失败回退:DLL 调用失败 fallback 红 X / coherence < 阈值 isReliable=0 显示灰底 + "Low coherence" / refChannel === measureChannel 警告 / GCC-PHAT 找不到 peak fallback delayLockedMs=0 / NaN/Inf clamp 红 X
Smaart 风格 4 chart 布局(ADR-21 §3.4 ④):
┌──────────────────────────────────────────┐
│ [Magnitude (dB)] [Phase (°)] │ 上半 row
│ ───────────────────── ───────────────── │
│ logfreq + dB logfreq + ±180° │
├──────────────────────────────────────────┤
│ [Coherence] [Delay Panel] │ 下半 row
│ ───────────────────── ───────────────── │
│ logfreq + 0-1 数显 finder/locked │
└──────────────────────────────────────────┘
解锁链(本任务 zombie 后): - F7 e2e 部分解锁(blocked-by-F2+F4+F6 · 还需 F2 zombie 才完整 ready)
任务定义(基于 ADR-21 §3.4)
子任务 ① · useTransferFrame.ts composable + DLL P/Invoke(0.4d)
Step 1.1:NEW frontend_vue3/src/stages/xilink/modules/transfer/useTransferFrame.ts:
- 接口:useTransferFrame(refNodeId: Ref<string>, measureNodeId: Ref<string>, options: { refChannel: Ref<number>; measureChannel: Ref<number>; fftSize: Ref<number>; averaging: Ref<number>; delayCompensationMs: Ref<number>; sampleRateHz: number; coherenceThreshold: Ref<number> }) → reactive { frame: MeterFrame_Transfer | null; error: string | null; isReliable: boolean }
- WS 订阅 /api/dspalgo/frame?moduleType=0x100E0005&refInstanceId=${refNodeId}&measureInstanceId=${measureNodeId} 拉取 transfer frame
- 30fps 节流 · refChannel === measureChannel 警告 toast(不阻断订阅)
- isReliable 由 frame.coherence 平均值与 coherenceThreshold 比对决定
Step 1.2:类型扩展 frontend_vue3/src/types/meterFrame.ts(append-only):
- 新增 MeterFrame_Transfer 接口(对齐 ADR-12 §3.3 ① schema · 不破坏现有 RMS/FFT/Scope/Phase frame 类型)
- 字段:freqs: number[] / magnitudeDb: number[] / phaseDeg: number[] / coherence: number[] / delayLockedMs: number / delayFinderMs: number / isReliable: boolean / averagedCount: number
子任务 ② · 4 chart 子组件(0.7d)
Step 2.1:NEW TransferMagChart.vue(0.2d):
- props:{ frame: MeterFrame_Transfer | null; scaleX: {min,max}; scaleY: {min,max} }
- canvas log 频率 X 轴(20Hz-20kHz)+ dB Y 轴(-40 ~ +20 默认)+ line chart
- 性能:RAF 节流 + redrawKey 触发重绘
Step 2.2:NEW TransferPhaseChart.vue(0.2d):
- props 同 mag chart
- canvas log 频率 X 轴 + ±180° Y 轴 + wrapped 模式跨边界 line break(参考 F4 phase wrapped 实现)
- 与 mag chart X 轴联动(共享 scaleX prop)
Step 2.3:NEW TransferCoherenceChart.vue(0.15d):
- props:{ frame: MeterFrame_Transfer | null; scaleX: {min,max}; threshold: number }
- canvas log 频率 X 轴 + 0-1 Y 轴 + 阈值横线(threshold)+ 阈值以下 dim 配色
Step 2.4:NEW TransferDelayPanel.vue(0.15d):
- props:{ frame: MeterFrame_Transfer | null; isReliable: boolean }
- 数显面板:Finder = frame.delayFinderMs.toFixed(2) ms · Locked = frame.delayLockedMs.toFixed(2) ms
- isReliable=false 时灰底 + "Low coherence (< threshold)"
子任务 ③ · TransferDockModule.vue 接入 DockHost(0.4d)
Step 3.1:NEW frontend_vue3/src/stages/xilink/modules/transfer/TransferDockModule.vue:
- 模板用 F1 DockHost 但需双 selector:<DockHost :module-id="instanceId" :supported-node-kinds="['source','sink','log_module_v1','xilink-module']" :default-node-id="props.defaultRefNodeId" :unit="'log Hz'">
- 关键 patch:F1 DockHost 单 selector → 本任务在 controls 插槽内额外加一组"Measure Node Selector"复用 DockNodeSelector 组件
- <template #canvas="{ scaleX, scaleY }"> → 4 chart 2×2 grid layout(CSS grid · mag/phase/coherence/delay)
- <template #controls> → measure node selector + refChannel/measureChannel 双数字输入 + fftSize 下拉(512/1024/2048/4096)+ averaging slider(0/4/16/64)+ coherenceThreshold slider(0-1 · 默认 0.7)+ delayCompensationMs 数字输入(默认 0)
- 内部:useChainNodeMetadata(refNodeId) + useChainNodeMetadata(measureNodeId) 双调用 · useTransferFrame(refNodeId, measureNodeId, options)
Step 3.2:刻度联动 — mag/phase/coherence 三 chart X 轴 scaleX 共享(滚轮缩放任一 chart 触发三 chart 同步重绘)
子任务 ④ · plugin 注册 + IP 库入口(0.2d) 🔥 用户痛点直接修复
Step 4.1:frontend_vue3/src/stages/xilink/modules/transfer/index.ts:
- export transferModulePlugin: XiLinkModulePlugin = { typeId: 0x100E0005, name: 'transfer', displayName: 'Transfer (H/φ)', icon: 'H', component: TransferDockModule, defaultNodeKind: 'sink-pre', category: 'analysis' }
Step 4.2:更新 frontend_vue3/src/stages/xilink/registry/moduleRegistry.ts(append-only · 与 F4 同时 push 时 git pull --no-rebase 自动合并):
- 加 import { transferModulePlugin } from '@/stages/xilink/modules/transfer'
- 加 register(transferModulePlugin) 到 default exports
Step 4.3:确认 plugin 在 IP 库面板 'analysis' 类目可见 + 拖拽到 chain 后右 dock 自动加 TransferDockModule(F1 DockHost 流程)
子任务 ⑤ · 测试(0.3d)
Step 5.1:vitest 加 ≥ 5 case(ADR-21 §3.4 ⑤ playwright e2e 模板对齐): - useTransferFrame WS 订阅 + ref/measure 双订阅 + isReliable 由 coherence 决定 - TransferMagChart log 频率 + dB 渲染正确(注入 1kHz 单位增益 · mag 0dB ± 0.001 误差) - TransferPhaseChart wrapped 边界 line break(±180° 不连线) - TransferCoherenceChart 阈值横线 + 阈值以下 dim 配色 - TransferDelayPanel finder/locked 数显 + isReliable=false 灰底 - e2e:plugin 注册到 IP 库可见 + 拖拽生成 chain 节点 + 双 selector 操作 + GCC-PHAT 4ms 延时锁定测试(注入物理 4ms delayed PEQ 信号)
Step 5.2:vue-tsc + build + 全测试基线零回归(F1 11 case + ADR-18 F5 152 case + ADR-17 F6 基线 + 若 F4 已 zombie 则其 4 case 也基线)
完整 prompt(直接复制粘贴 ClaudeA 终端)
[U-thread] P1.A21.F6-transfer-module-frontend · ADR-21 §3.4 transfer-module 前端实装(Smaart 风格 4 chart + IP 库添加 transfer 节点)
[部门] 前端 P1-xilink
[Worker CWD] d:/work/25_claude/workspace/AlgoDepartment/04_development/
[Occupies] P1.K-shared-xilink-dock + P0.K-shared-types
[优先级] P0(2.0d · 解锁 F7 e2e 1/3 路径 · 用户痛点直接修复)
[ADR] docs/08-implementation/40-aios/ADR/ADR-AIOS-21-xilink-dock-and-analysis-modules.md(必读 §3.4 transfer 业务契约 + §1.4 边界铁律)
[isolation] file(同 worktree 同 branch · 与 F4 phase / F2 fft-scope 文件正交可并行)
[参考文档绝对路径]
- 业务契约:ADR-21 §3.4 完整 5 必填段(① MeterFrame_Transfer schema + DLL P/Invoke 10 参数 / ② 30fps + < 33ms 4 chart 重绘 / ③ 5 类失败回退 / ④ Smaart 4 chart 布局 + 5 步操作流 / ⑤ playwright e2e 模板)
- 用户 2026-06-13 09:55 拍板原话(ADR-21 §1.1):双通道传递函数 ref/measure + GCC-PHAT 延时 + H(f) mag/phase + coherence
- 范式 commits(worker 必读 · 强制 read 全文):
* a5b52de P1.A21.F1 DockHost 通用化(本任务接入此 host 插槽 + 双 selector 模式)
* eb84bab P_dsp.A21.F5 transfer_module 算法 + dspalgo_dll.c transfer_module_get_transfer export(本任务 P/Invoke 调用此 10 参数 export)
* 769405a P0.A18.F5 IP 库 + 4 popup(本任务 plugin 注册到此 IP 库体系 · 类目 'analysis')
* 78dc17c P0.A17.F6 widget endpoint selector(F1 已扩 5 类 · 本任务复用 selector × 2 选 ref + measure 节点)
- 现状参考:
* frontend_vue3/src/stages/xilink/dock/DockHost.vue(F1 a5b52de · 本任务接入插槽 + controls 槽加二号 selector)
* frontend_vue3/src/stages/xilink/dock/DockNodeSelector.vue(F1 a5b52de · 本任务用两次 · ref + measure)
* frontend_vue3/src/stages/xilink/registry/moduleRegistry.ts(plugin 注册中心 · append-only 加 transferModulePlugin · 与 F4 同时 push 兼容)
* frontend_vue3/src/components/popups/FftModulePopup.vue(F5 769405a · canvas 渲染 + WS 订阅范式参考)
* frontend_vue3/src/types/meterFrame.ts(扩 MeterFrame_Transfer 类型 · 与 F4 MeterFrame_Phase append-only 兼容)
* dsp_algo/dll/dspalgo_dll.c(F5 eb84bab · transfer_module_get_transfer export 10 参数 · P/Invoke 签名真值源)
- 三层分工:ADR-07 §1.3.4(L3 前端零数学 · 本任务纯 P/Invoke + canvas 渲染 · 不做 GCC-PHAT/Coherence/H(f) 计算)
[文件正交策略](.clinerules §任务隔离类型分配准则 v1.4):
isolation: file · 同 worktree 同 branch · 与 F4 / F2 并行 push 拉合并
本任务文件:frontend_vue3/src/stages/xilink/modules/transfer/* (7 文件 NEW) + registry/moduleRegistry.ts(append-only 注册 1 plugin)+ types/meterFrame.ts(append-only 加 MeterFrame_Transfer 类型)
F4 文件:frontend_vue3/src/stages/xilink/modules/phase/* + 同 registry/moduleRegistry.ts + 同 meterFrame.ts(都是 append-only · 不冲突)
F2 文件:frontend_vue3/src/stages/xilink/modules/fft/* + scope/* 控件增强(displayMode/peakHold/trigger/persistence · 不动 phase/transfer)
⚠️ moduleRegistry.ts + meterFrame.ts 是 F4/F6 共享文件 · 但都是 append-only 模式(各 export 独立 const + 各自加注册行)· git pull --no-rebase 可自动合并 · 若冲突由 worker 手动 resolve(简单 + 拼接)· 推荐顺序:F4 先 push · F6 后 pull --rebase 拿 F4 改动再 push
【背景】
用户 2026-06-13 18:09 三连 stop F1+F3+F5(a5b52de+8eaaf40+eb84bab)算法层闭环。
18:18 用户反馈"前端 xilink IP 库还是没看到 phase/transfer 组件" · Cline 真值核查证实是预期(F1+F3+F5 仅完成底座+算法 · F4+F6 才注册到 IP 库)· 用户 18:26 拍板三连 start F4+F6+F2 直接修复。
F6 本任务核心:① useTransferFrame composable 调 F5 DLL 10 参数 export ② 4 chart 子组件(mag/phase/coherence/delay)③ TransferDockModule 接入 F1 DockHost 插槽 + controls 加二号 selector(measure node)④ plugin 注册到 IP 库(用户痛点直接修复点 🔥)
【架构关键约束】
⚡ DLL P/Invoke 10 参数严格对齐 F5 eb84bab dspalgo_dll.c transfer_module_get_transfer 签名(refInstanceId/measureInstanceId/refChannel/measureChannel/fftSize/averaging/delayCompensationMs/sampleRateHz/coherenceThreshold/pOutFrame)· P0.K-shared-types 共享 schema
🎨 canvas 渲染 4 chart 2×2 grid:① TransferMagChart(logfreq + dB)② TransferPhaseChart(logfreq + ±180° wrapped + 边界 line break)③ TransferCoherenceChart(logfreq + 0-1 + 阈值横线 + 阈值以下 dim)④ TransferDelayPanel(数显 finder/locked + isReliable 灰底)· 三 chart X 轴 scaleX 共享联动
📋 双 selector:ref node + measure node(区别于 F4 phase 单 selector)· F1 DockHost 单 selector + controls 槽再加一个 DockNodeSelector(measure)· refChannel === measureChannel 警告 toast(不阻断订阅)
📋 三层分工:L3 前端零数学(纯 P/Invoke 接收 frame + canvas 渲染 · 不做 GCC-PHAT/Coherence/H(f) 计算)· F5 已在 dsp_algo 完成
⚡ ADR-21 §3.4 ① schema 锁定:MeterFrame_Transfer 字段 freqs/magnitudeDb/phaseDeg/coherence/delayLockedMs/delayFinderMs/isReliable/averagedCount · 复用 ADR-12 §3.3 ① 标杆
📋 plugin 注册:typeId=0x100E0005(F5 已锁)· category='analysis'(IP 库面板分组 · 与 F4 phase 同 category)· defaultNodeKind='sink-pre'
📋 GCC-PHAT 延时锁定:isReliable=true 时 delayLockedMs(锁定值)· isReliable=false 时只显 delayFinderMs(实时探测值 · 不锁)· 用户操作流第 5 步 F5 已实测 4ms ± 0 sample-accurate
🔥 IP 库添加 transfer 节点是用户实际痛点(18:18 反馈)· 本任务必须确保 plugin 在 IP 库面板可见 + 拖拽生成节点正确
【执行步骤】
Step 0 · 文件注入真值核查(强制门槛 · F1/F4 教训承接)
- read frontend_vue3/src/stages/xilink/dock/DockHost.vue(F1 a5b52de · 确认 supportedNodeKinds + 3 插槽 props 真签名)
- read frontend_vue3/src/stages/xilink/dock/DockNodeSelector.vue(F1 a5b52de · 复用 × 2 · ref + measure)
- read dsp_algo/dll/dspalgo_dll.c transfer_module_get_transfer export 10 参数(F5 eb84bab · P/Invoke 真签名)
- read frontend_vue3/src/stages/xilink/registry/moduleRegistry.ts(F5 769405a · plugin 注册接口 + 现有 4 plugin 范式 · 与 F4 同时 append-only)
- read frontend_vue3/src/components/popups/FftModulePopup.vue(F5 769405a · canvas 渲染范式参考)
- read frontend_vue3/src/composables/useChainNodeMetadata.ts(F1 a5b52de · channelCount 字段查询)
- read frontend_vue3/src/types/meterFrame.ts(现有 MeterFrame_RMS/FFT/Scope · F4 加 Phase · 本任务加 Transfer)
- 留 commit log:Step 0 七层核查记录(ADR + DLL + DockHost + DockNodeSelector + registry + popup + composable + type)
Step 1 · useTransferFrame composable + 类型 0.4d(子任务 ①)
- NEW useTransferFrame.ts · WS 订阅(双 instanceId)+ 30fps 节流 + isReliable 由 coherence 决定
- 扩 MeterFrame_Transfer 类型(append-only · 与 F4 MeterFrame_Phase 不冲突)
- DLL P/Invoke 10 参数对齐 F5 dspalgo_dll.c 真签名
- refChannel === measureChannel 警告 toast
Step 2 · 4 chart 子组件 0.7d(子任务 ②)
- TransferMagChart.vue(logfreq + dB)
- TransferPhaseChart.vue(logfreq + ±180° wrapped + 边界 line break · 参考 F4 phase 实现)
- TransferCoherenceChart.vue(logfreq + 0-1 + 阈值横线 + 阈值以下 dim)
- TransferDelayPanel.vue(数显 finder/locked + isReliable 灰底 "Low coherence")
- 性能:三 chart 共享 scaleX + RAF 节流
Step 3 · TransferDockModule.vue 接入 DockHost 0.4d(子任务 ③)
- 模板用 F1 DockHost · supportedNodeKinds 4 类(去掉 xitune-module · transfer 不需要)
- canvas 插槽 → 4 chart 2×2 grid layout(CSS grid)
- controls 插槽 → measure node selector(F1 DockNodeSelector 复用)+ refChannel/measureChannel 数字输入 + fftSize 下拉 + averaging slider + coherenceThreshold slider + delayCompensationMs 数字输入
- useChainNodeMetadata × 2(ref + measure)+ useTransferFrame
- 三 chart X 轴 scaleX 共享联动
Step 4 · plugin 注册 + IP 库入口 0.2d 🔥(子任务 ④)
- NEW index.ts · export transferModulePlugin = { typeId: 0x100E0005, name: 'transfer', displayName: 'Transfer (H/φ)', icon: 'H', component, defaultNodeKind: 'sink-pre', category: 'analysis' }
- 更新 moduleRegistry.ts · append-only register(transferModulePlugin)
- 浏览器实测:IP 库面板 'analysis' 类目可见 transfer + 拖拽到 chain 后右 dock 自动加 TransferDockModule
Step 5 · 测试 0.3d(子任务 ⑤)
- vitest +5 case
- vue-tsc --noEmit 0 errors
- npm run build 0 errors
- npm run test 全过(基线 + 5 新增)
Step 6 · 浏览器实测 + commit
- 启动 backend(dotnet run · 加载 F5 eb84bab dspalgo_dll.c transfer export)+ frontend(npm run dev)
- 验收点(ADR-21 §3.4 ④ 用户操作流):
☐ 进入 xilink stage · IP 库面板 "analysis" 类目可见 "Transfer (H/φ)" 节点(图标 H)🔥
☐ 拖拽 Transfer 到 chain · 右 dock 自动加 TransferDockModule
☐ Module 顶部 ref selector 默认 sink-pre · controls 槽内 measure selector 可独立选(默认同 ref · 警告 toast)
☐ 切换 measure 到不同 source/log_module_v1 · 4 chart 联动重绘
☐ 注入物理 4ms delayed PEQ -3dB@1kHz · DelayPanel.locked 显 4.00ms ± 0.1ms · MagChart 显 1kHz -3dB ± 0.5dB · PhaseChart 显 1kHz 对应相位
☐ CoherenceChart 显示 ≥ 0.95 高相干带 + 阈值 0.7 横线 + 阈值以下灰 dim
☐ averaging slider 切 0/4/16/64 · 抖动随平均次数减小
☐ coherenceThreshold slider 调 0-1 · isReliable 实时切换 · CoherenceChart 阈值横线移动
☐ refChannel = measureChannel 时 toast 警告(不阻断订阅 · 仅提醒)
- git add . && git commit -m "feat(xilink/transfer): P1.A21.F6 transfer-module 前端实装(Smaart 风格 4 chart + ref/measure 双 selector + IP 库入口)
用户 2026-06-13 18:09 三连 stop F1+F3+F5 算法层闭环 · 18:18 反馈 IP 库无 phase/transfer · 18:26 拍板三连 start F4+F6+F2。
F6 本任务(ADR-21 §3.4):
① useTransferFrame.ts WS 双 instanceId 订阅 + 30fps + isReliable + DLL P/Invoke 10 参数(对齐 F5 eb84bab)
② MeterFrame_Transfer 类型(append-only · 与 F4 MeterFrame_Phase 共存)
③ 4 chart 子组件:TransferMagChart(dB)+ TransferPhaseChart(° wrapped + 边界 break)+ TransferCoherenceChart(0-1 + 阈值横线 + dim)+ TransferDelayPanel(finder/locked + 灰底)
④ TransferDockModule.vue 接入 F1 DockHost + controls 槽加二号 measure selector + 6 控件(refCh/measureCh/fftSize/averaging/threshold/delayComp)+ 三 chart X 轴联动
⑤ plugin 注册 typeId=0x100E0005 + category='analysis' + IP 库 'Transfer (H/φ)' 'H' 图标可见 🔥
⑥ vitest +5 case · vue-tsc + build 全绿 · F1 11 + ADR-18 F5 152 + ADR-17 F6 + F4 4 case 基线零回归
解锁 F7 e2e 部分(还需 F2 zombie · 三齐后 F7 ready)
[step=6/6] [pid=P1] [uid=P1.A21.F6-transfer-module-frontend] [type=fork] [isolation=file]
[occupies=P1.K-shared-xilink-dock+P0.K-shared-types] [files=9] [ipc=rest+ws]
[adr=ADR-AIOS-21 §3.4 transfer-module 前端实装(#5 双通道频响/相位/延时 + GCC-PHAT)]"
【验收】
☐ Step 0 文件注入真值核查通过(read 7 真值源 + commit log 留痕)
☐ Step 1 useTransferFrame 双 instanceId 订阅 + 30fps + isReliable + DLL 10 参数对齐 F5
☐ Step 2 4 chart 子组件全实装 · TransferPhaseChart 边界 line break + TransferCoherenceChart 阈值横线 + dim + TransferDelayPanel finder/locked + 灰底
☐ Step 3 TransferDockModule 接入 F1 DockHost + controls 加二号 selector + 6 控件 + 三 chart X 轴联动
☐ Step 4 transferModulePlugin 注册 typeId=0x100E0005 + IP 库 'analysis' 类目 'Transfer (H/φ)' 'H' 可见 🔥
☐ Step 5 vitest +5 case 全过 · vue-tsc + build 0 errors · 基线零回归(若 F4 已 zombie 含其 4 case)
☐ Step 6 浏览器实测 9 验收点全过(IP 库可见 + 拖拽 + 双 selector + 4ms 延时锁定 + 1kHz -3dB 频响 + coherence + averaging + threshold + refCh=measureCh 警告)
☐ commit message 含 7 元组 trailer + ADR §3.4 引用
【禁止】
❌ 禁止跳过 Step 0 文件注入核查(F1/F4 教训:派发前必须 read 7 真值源)
❌ 禁止在前端做 GCC-PHAT/Coherence/H(f) 计算(三层分工 · 这些都在 F5 dsp_algo · 本任务仅 P/Invoke + canvas 渲染)
❌ 禁止偏离 F5 dspalgo_dll.c transfer_module_get_transfer 10 参数 P/Invoke 签名(typeId 0x100E0005 严格)
❌ 禁止破坏 ADR-12 §3.3 MeterFrame_Transfer schema(只能 append-only 加新字段 · 不能改现有字段语义)
❌ 禁止破坏 F1 11 + ADR-18 F5 152 + ADR-17 F6 + F4 4 case 已锁基线(零回归是硬门槛)
❌ 禁止跳过 vitest +5 case(验收硬门槛 · 含 GCC-PHAT 4ms 延时锁定真值断言)
❌ 禁止 commit 缺三元组 trailer(.clinerules v1.6 铁律)
❌ 禁止嵌入完整 SFC > 60 行 / TS interface > 5 行(.clinerules v1.6)· 4 chart 必须各自拆独立 child component · TransferDockModule 仅做 layout 编排
解锁链(本任务 zombie 后)
- ✅ xilink IP 库面板 'analysis' 类目可见 Transfer (H/φ) 'H' 节点(用户 18:18 痛点直接修复 🔥)
- ✅ 拖拽 Transfer 节点到 chain 后右 dock 自动加 TransferDockModule(F1 DockHost 流程)
- ✅ Smaart 风格 4 chart 实装(mag + phase + coherence + delay)+ ref/measure 双 selector 操作
- ✅ MeterFrame_Transfer 类型契约固化(F7 e2e 有 schema 真值源 · 与 F4 MeterFrame_Phase 共存 · ADR-12 §3.3 标杆对齐)
- ✅ GCC-PHAT 4ms 延时锁定 + 1kHz -3dB 频响真值断言(F5 算法层 + 本任务前端联调验证)
- ⏳ F7 e2e 解锁 ⅓ 路径(还需 F2 fft-scope-controls-enhance zombie · 三齐后 F7 ready)
风险评估
| 风险 | 缓解 |
|---|---|
| F5 dspalgo_dll.c transfer_module_get_transfer 10 参数与现有前端 P/Invoke 框架不兼容 | Step 0 强制 read F5 eb84bab dspalgo_dll.c 真签名 + grep 现有 RMS/FFT P/Invoke 范式 · 若框架不对齐则 fork 内补丁(append-only) |
| MeterFrame_Transfer schema 与 ADR-12 §3.3 ① 不一致 | Step 1.2 严格对齐 ADR-12 §3.3 ① schema + ADR-21 §3.4 ① · 不允许字段重写 |
| 4 chart 联动重绘性能不达 30fps(< 33ms) | Step 2 共享 scaleX + RAF 节流 + redrawKey 触发(参考 ADR-18 F5 FftChart 30fps 经验)· 性能基线测试 1024 fftSize 4 通道 |
| TransferPhaseChart wrapped 边界 line break 与 F4 phase wrapped 实现差异 | Step 2.2 直接 read F4(若已 zombie)PhaseChart.vue 真实现 · 复用同款 sample-to-sample diff > π 检测 |
| 双 selector(ref + measure)F1 DockHost 单 selector 设计不兼容 | F1 DockHost 顶部 selector 仅放 ref · controls 槽再加一个 DockNodeSelector 作为 measure · F1 设计支持(controls 是自由插槽) |
| GCC-PHAT delay finder ↔ frontend delayPanel 单位转换错误(samples vs ms) | F5 eb84bab dspalgo_dll.c 已确认输出 ms · 本任务 frontend 直接显 ms · 单测覆盖 4ms 锁定真值断言(浏览器实测注入 4ms delayed signal · 验 DelayPanel.locked = 4.00ms ± 0.1) |
| coherenceThreshold slider 0-1 范围与 isReliable 切换防抖问题 | composable 内 watch debounce 200ms · UI 即时反馈 + 数据流防抖 · 单测验证 |
| moduleRegistry.ts + meterFrame.ts 与 F4 phase 同时 push 冲突 | append-only 模式(各加各的 const + register)+ git pull --no-rebase 自动合并 · 推荐顺序:F4 先 push(estimate 1.5d)· F6 后 pull --rebase 拿 F4 改动再 push(estimate 2.0d 串行总 3.5d) |
| F1 DockHost.vue 插槽签名变更与本任务接入不兼容 | Step 0 强制 read F1 a5b52de DockHost.vue 真签名 + 严格用 supportedNodeKinds + 3 插槽 props · 不允许修改 F1 文件 |
| ClaudeA 三连 dispatched 排队膨胀(F4 1.5 + F6 2.0 + F2 1.5 = 5.0d 串行) | F4/F6/F2 文件正交 · 可同时 dispatched · ClaudeA 自行排期(推荐顺序:F4 1.5d → F6 2.0d → F2 1.5d 总 5.0d) |
| dsp_algo backend 加载 F5 eb84bab transfer export 失败 | Step 6 浏览器实测前必须 backend(dotnet run)启动正常 + 后端日志确认 transfer_module_get_transfer 加载成功(对齐 F5 dumpbin 验证 export 在) |
历史
| 时间 | 事件 | hash |
|---|---|---|
| 2026-06-13 18:26 | dispatched(用户 18:26 拍板三连 start F4+F6+F2 · ClaudeA 2.0d · F1+F5 双解锁满足 · IP 库添加 transfer 直接修复用户 18:18 反馈痛点 · Smaart 风格 4 chart + ref/measure 双 selector) | — |