跳转至

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)