跳转至
PARTIALLY-SUPERSEDED

ADR-AIOS-21 · XiLink 右 Dock 通用化 + 控件增强 + Phase/Transfer Module 新增

⚠️ 状态:v0.1 partially-superseded · 2026-06-15 11:30 by ADR-AIOS-21-R1 被取代章节:§3.1 + §3.3 + §3.4 + §4 实施清单 F1/F4/F6 三 fork · 详见 R1 §0/§2/§3/§4 保留章节:§1 背景 / §2 决议主体 / §3.2 fft/scope 控件增强 / §5 风险 / §6 决议者签名 不动 保留 zombie:F2 4ed8699(控件)+ F3 8eaaf40(phase 算法)+ F5 eb84bab(transfer 算法) 触发:用户 2026-06-13 09:55 拍板"5 点新需求中 #1+#3+#4+#5 在 xilink 侧"· 双线并行决议 A · 12:51 用户 accept · 2026-06-15 10:24 用户实测纠错 → 11:30 拍板方向 B → R1 修订 范围:xilink 侧 4 大功能块 · 与 ADR-17-R1 R2(xitest 侧)完全正交 · 与 ADR-18 算法库 plugin 协议同源扩展


1. 背景与动机(Context & Motivation)

1.1 触发原话(2026-06-13 09:55 verbatim)

"ADR17 18 当前在 xilink 中添加 meter 检测模块都已经完成,并且可以在 xilink 中正常显示;接下来需要将所有右侧 dock 有接入 rms fft scope 的 stage 都接入关于 meter 的显示功能;原则如下,请确认是否和原本的 ADR17/18 一致 1. 右侧 dock 接入的 meterdrawer · 在可以显示信号的基础之上需要能够识别当前链路中的节点,并且进行切换,比如所有的 source · sink · 还有就是 log_module_v1;选择链路固定的节点后,可以正确显示该节点的通道数量,做到可以切换;关于界面设计横纵坐标的需要有可以放大缩小的刻度操作; 2. xitest 的 realtime 中的主界面需要基于当前的设计,完善所有测量组件,完善界面显示,按照 smaartsuite 和 apx500 的方向进行靠近;(→ 已分配 ADR-17-R1 R2 · 不在本 ADR) 3. 关于 xilink 中的 fft 和 scope 需要进一步完善,fft 界面上需要多几个当前显示方式的设定,bar 还是 line · both;peak hold;peak 追踪等基本的界面操作 4. xilink 中缺少 phase 分析的 module · 需要新实现;主要功能是显示所有通道的 phase · 类似 fft 的功能 5. xilink 中需要添加 transfer 功能,可以选择两个通道做对比的相位曲线和频响曲线差异 · 以及延时分析 上面 4 和 5 也需要作为右 dock 的插件注入"

1.2 现状盘点(ADR-18 落地基线 · 2026-06-13)

已落地组件 来源 ADR 状态
rms-meter-module plugin(算法库) ADR-18 F5 🏆 active running · xilink 内已实装
scope-module plugin(算法库) ADR-18 F6 🏆 active running · xilink 内已实装
fft-module plugin(算法库) ADR-18 F7 🏆 active running · xilink 内已实装
log_module_v1 plugin(数据源) ADR-17 F5 🏆 active running · 输出 PCM frame
右 dock host(基础) ADR-18 早期 fork 已就位 · 但节点切换 / 通道数自适应 / 刻度缩放 3 项尚未通用化
widget endpoint selector(4 类:physical-input/sink-pre/log-module/xitune-module) ADR-17 F6 🏆 active running · xitest 复用 · xilink 复用尚未落地

1.3 用户需求 4 项 vs 现有缺口

# 用户需求 现状缺口 本 ADR 范围
#1 右 dock meterdrawer 通用化(节点切换 source/sink/log_module_v1 + 通道数自适应 + 横纵刻度缩放) ADR-18 落地的 module 各自接入 dock 但 host 没做"节点 selector + 通道适配 + 刻度缩放"通用化 ✅ §3.1 DockHost 通用化
#3 xilink fft/scope 控件增强(bar/line/both / peak hold / peak 追踪) ADR-18 F6 scope / F7 fft 仅基础渲染 · 控件选项空 ✅ §3.2 控件增强
#4 xilink phase 分析 module(类 fft 多通道相位)+ 右 dock 插件 ADR-18 现有 3 个 module 不含 phase ✅ §3.3 phase-module 新增
#5 xilink transfer 功能(2 通道频响/相位/延时)+ 右 dock 插件 ADR-18 现有 3 个 module 不含 transfer ✅ §3.4 transfer-module 新增

1.4 与 ADR-17-R1 R2 边界(关键澄清 · 用户 2026-06-07 16:10 纠错铁律)

范畴 落点 实现位置
xilink 侧 算法库 plugin module(本 ADR-21) 04_development/xilink/src/modules/{phase,transfer}-module/ + DSP 算法在 dsp_algo/modules/
xitest 侧 可视化层 panel(ADR-17-R1 R2 · 已 accepted) 04_development/frontend/xitest/src/realtime/panels/{PhaseMeterPanel,TransferFunctionPanel}.vue
数据流 xilink module 输出 frame 协议 → xitest panel 消费(数据源 B 路径) 本 ADR §3.3 phase-module-frame schema 复用 ADR-12 §3.4 MeterFrame_Phase 字段 · §3.4 transfer-module-frame 复用 ADR-12 §3.3 MeterFrame_Transfer

铁律:phase / transfer 计算必须在 xilink module(算法库 / dsp_algo)中实现(L1 算法库 · 不在 P7 sidecar)· xitest panel 仅消费 frame 渲染(L3 前端零数学)。本 ADR 与 ADR-17-R1 R2 协作但不重叠。


2. 决议(Decision)

接受用户 2026-06-13 拍板 A · 起 ADR-AIOS-21 · 4 大功能块 · 6 fork 跨栈 · 总 ~12d:

2.1 §3.1 DockHost 通用化(#1)

复用 ADR-17 F6 widget endpoint selector(4 类 source/sink/log_module_v1/xitune)+ 接入所有 stage(xilink/xitune/xitest)右 dock · 通道数自适应(从所选节点 metadata 读 channelCount)+ 横纵刻度缩放(canvas 指针滚轮 + ResizeObserver)。

2.2 §3.2 fft/scope 控件增强(#3)

  • fft-module:加 displayMode(bar/line/both)+ peakHold(开关 + decay rate)+ peakTrack(显示前 N 个 peak 频率标注)
  • scope-module:加 trigger 模式(level/edge/freeze)+ persistence(余晖效果)+ time/div 横轴缩放

2.3 §3.3 phase-module 新增(#4)

类 fft 的多通道 phase 分析 module · 算法库 plugin 注册 + DSP 算法实装(dsp_algo/modules/phase_module/)· 输出 frame schema 复用 ADR-12 §3.4 MeterFrame_Phase(freqs/phaseWrapped/phaseUnwrapped/groupDelay 4 字段 + averagedCount/resolution)。

2.4 §3.4 transfer-module 新增(#5)

2 通道对比的 transfer function module · 算法库 plugin 注册 + DSP 算法实装(dsp_algo/modules/transfer_module/ · GCC-PHAT delay finder + cross-spectral density coherence + magnitude/phase 计算)· 输出 frame schema 复用 ADR-12 §3.3 MeterFrame_Transfer(magnitudeDb/phaseWrapped/coherence/delayLockedMs 等 7 字段)。

2.5 与 ADR-17-R1 R2 协作模式

协作点 说明
frame schema 复用 本 ADR §3.3/§3.4 直接复用 ADR-12 §3.3/§3.4 已锁定 schema · 不重写字段
数据源 B 路径融通 xilink phase-module / transfer-module 输出的 frame 是 ADR-17-R1 R2 F1/F2 panel "数据源 B"路径 · panel 通过 widget endpoint selector 选 xilink-module 消费此 frame
xilink 内独立显示(本 ADR 主战场) phase-module / transfer-module 在 xilink 右 dock 直接渲染(不依赖 xitest)· UI 风格类比现有 fft-module / scope-module

3. 业务行为契约(Business Behavior Contract · 5 必填段 × 4 块)

3.1 DockHost 通用化(#1)

① 输入/输出契约

// 节点 metadata(xilink 链路图节点统一 schema)
interface ChainNodeRef {
  nodeId: string;                              // 节点唯一 ID
  nodeKind: 'source' | 'sink' | 'log_module_v1' | 'fft_module' | 'phase_module' | 'transfer_module' | ...;
  channelCount: number;                        // 节点输出通道数(从 chain mixer 矩阵推导)
  sampleRate: number;                          // Hz
  position: { stage: 'pre' | 'post', index: number };  // 链路位置
}

// DockHost 接收的 module 输入
interface DockModuleInput {
  selectedNodeId: string;                      // 用户从 selector 选定的节点 ID
  channelMask: boolean[];                      // length === selectedNode.channelCount · 通道开关
  scaleX: { min: number; max: number };        // 横轴范围(单位由 module 决定:Hz / ms / sample)
  scaleY: { min: number; max: number };        // 纵轴范围(单位由 module 决定:dBFS / ° / V)
}

// DockModule 渲染输出(canvas)
interface DockModuleOutput {
  canvasRef: HTMLCanvasElement;
  fps: number;                                 // 30fps 节流
}

② 收敛/成功判据

判据 阈值 含义
节点切换响应 < 150ms 从 selector 选中 → canvas 重渲染 UX 流畅
通道数自适应 节点 channelCount 从 2 切到 8 · UI 自动显示 8 通道开关 自适应正确
刻度缩放比 滚轮 1 刻度 = 10% zoom · 上下限不破坏 缩放精度
FPS ≥ 30fps(scope/fft 渲染)≥ 60fps(meter 数字) 性能基线
多 module 并存 同 stage 右 dock 加载 ≥ 3 module 时 fps 不降 多 instance 性能

③ 失败回退路径(5 类)

失败 触发 UI 表现 恢复路径
节点不存在 selectedNodeId 在链路中已删除 DockHost 显示 "Node removed · please select another" + 自动 fallback 到 sink 用户重选
通道 mask 全关 channelMask all false canvas 显示 "No channel selected" UI 引导用户开至少 1 通道
刻度越界 scaleY.min > scaleY.max 自动 swap 无感恢复
Module 渲染异常 canvas paint throw DockHost 捕获 + 显示红色 X 占位符 + console.error 用户刷新或切节点
节点 channelCount 突变 用户改 mixer 矩阵导致 channelCount 8→2 DockHost 重置 channelMask · 提示 "Channel count changed" 自动恢复

④ 用户操作流(端到端 5 步)

  1. 用户在 xilink 右 dock 点 "+" 加载 fft-module(或 phase/transfer/scope)
  2. Module 顶部出现节点 selector 下拉 · 默认选中 sink-pre · 显示 channelCount = 2
  3. 用户点 selector 切到 log_module_v1 · UI 自动显示该 log_module 的 channelCount(若是 4)+ 4 个通道开关
  4. 用户滚轮缩放横轴(Hz)从 0-22kHz 缩到 100Hz-10kHz · canvas 即时重绘
  5. 用户拖拽 dock module 高度 · ResizeObserver 触发 canvas 重绘 · 30fps 保持

⑤ 端到端真值 e2e

// playwright e2e
test('DockHost 节点切换 + 通道自适应 + 刻度缩放', async ({ page }) => {
  await page.goto('/xilink');
  await page.click('[data-testid="dock-add-module"]');
  await page.click('[data-testid="module-fft"]');
  // selector 默认 sink-pre · 2ch
  expect(await page.locator('[data-testid="channel-toggle"]').count()).toBe(2);
  // 切到 log_module_v1(4ch)
  await page.selectOption('[data-testid="node-selector"]', 'log_module_v1_a');
  await expect(page.locator('[data-testid="channel-toggle"]')).toHaveCount(4);
  // 滚轮缩放
  await page.locator('[data-testid="fft-canvas"]').hover();
  await page.mouse.wheel(0, -300);
  expect(await page.locator('[data-testid="x-axis-min"]').textContent()).not.toBe('0');
});

3.2 fft/scope 控件增强(#3)

① 输入/输出契约

// fft-module 控件 props 扩展(ADR-18 F7 已就位的 props 上加新字段)
interface FftModuleControls {
  displayMode: 'bar' | 'line' | 'both';        // 新增 · 默认 'line'
  peakHold: { enabled: boolean; decayDbPerSec: number };  // 新增 · decay 默认 6dB/s
  peakTrack: { enabled: boolean; topN: number };  // 新增 · 默认 disabled · topN 默认 3
  windowFunction: 'hann' | 'hamming' | 'blackman' | 'rect';  // 已有(确认保留)
  fftSize: 512 | 1024 | 2048 | 4096 | 8192;    // 已有
  averaging: 'none' | 'rms' | 'peak' | 'exp';  // 已有
}

// scope-module 控件 props 扩展
interface ScopeModuleControls {
  triggerMode: 'auto' | 'level' | 'edge' | 'freeze';  // 新增
  triggerLevel: number;                        // -1.0~1.0 · level 模式时
  persistence: { enabled: boolean; alpha: number };  // 新增 · alpha 0~1 余晖透明度
  timePerDiv: number;                          // ms · 横轴缩放
  voltsPerDiv: number;                         // 纵轴缩放
}

② 收敛/成功判据

判据 阈值 含义
displayMode 切换 bar/line/both 三模式渲染均正确 + 切换 < 100ms UI 响应
peakHold 衰减 6dB/s 默认 decay · 打开后 peak 线在停止信号后 1 秒下降 6dB 算法正确
peakTrack topN topN=3 时显示前 3 个 peak 频率标注(Hz)+ 标签不重叠 标注正确
scope trigger level 1kHz sine 在 level=0 时锁定 zero crossing · 抖动 < 1 sample 触发精度
persistence alpha alpha=0.95 时余晖效果可见 · 30fps 不卡 视觉与性能
timePerDiv 缩放 10ms/div → 1ms/div 切换正确 · 数据连续 缩放正确

③ 失败回退路径(5 类)

失败 触发 UI 表现 恢复路径
peakHold 在静音信号下 RMS<-90dBFS peak 线缓慢衰减到底 noise floor 正常
peakTrack 没找到峰值 信号是平坦白噪 标注隐藏 + 提示 "No distinct peak" 正常
trigger level 永不触发 level 设过高 scope 显示 "Waiting trigger..." + 5s 后自动 fallback auto 用户调低 level
timePerDiv 越界 设到 < 0.001ms 或 > 10s clamp 到合法范围 自动恢复
persistence GPU 内存溢出 alpha=1.0 永不衰减 DockHost 检测内存 > 100MB 自动切回 alpha=0.95 防 OOM

④ 用户操作流

  1. 用户右键 fft-module 控件区 → 切 displayMode 到 'both'
  2. 启用 peakHold · 输入 1kHz sine · 看到 peak 线锁定 -3dB@1kHz
  3. 启用 peakTrack topN=3 · 输入混合信号 · 看到 3 个 peak 频率标注
  4. 切到 scope-module · 设 trigger level=0 · 看到 1kHz 方波锁定
  5. 启用 persistence alpha=0.9 · 看到余晖效果

⑤ 端到端真值 e2e

test('fft peakHold 6dB/s decay', async ({ page }) => {
  // 注入 1kHz sine -3dBFS · 持续 2s · 然后静音
  await injectSignal(page, { freq: 1000, amplitude: 0.707, durationMs: 2000 });
  await page.waitForTimeout(2000);
  const peakBeforeSilence = await page.locator('[data-testid="peak-1khz"]').textContent();
  expect(parseFloat(peakBeforeSilence!)).toBeCloseTo(-3, 0.5);
  // 静音 1s · peak 应下降 ~6dB
  await injectSilence(page, 1000);
  const peakAfter1s = await page.locator('[data-testid="peak-1khz"]').textContent();
  expect(parseFloat(peakAfter1s!)).toBeCloseTo(-9, 1);  // -3 - 6 = -9 ± 1dB
});

3.3 phase-module 新增(#4)

① 输入/输出契约

// xilink phase-module 注册(ADR-18 plugin 协议同源)
interface PhaseModuleManifest {
  moduleId: 'phase-module';
  version: 'v1.0';
  inputs: { pcm: ChannelBuffer[]; sampleRate: number };  // N 通道 PCM
  outputs: { phaseFrame: MeterFrame_Phase };             // 复用 ADR-12 §3.4 schema
  controls: {
    channelMask: boolean[];
    fftSize: 512 | 1024 | 2048 | 4096;
    windowFunction: 'hann' | 'hamming' | 'blackman';
    averaging: 'none' | 'rms' | 'exp';
    displayMode: 'wrapped' | 'unwrapped' | 'groupDelay';  // 类比 ADR-12 §3.4
  };
}

// 输出 frame schema(复用 ADR-12 §3.4 line 750-768)
interface MeterFrame_Phase {
  freqs: number[];          // Hz · length = fftSize/2+1
  phaseWrapped: number[][]; // [channel][bin] · ° in [-180, 180]
  phaseUnwrapped: number[][]; // [channel][bin] · ° unwrapped
  groupDelay: number[][];   // [channel][bin] · ms
  averagedCount: number;
  resolution: number;       // Hz/bin
  timestamp: number;        // ms epoch
}

② 收敛/成功判据

判据 阈值 含义
Phase 计算精度 1kHz sine · phaseWrapped@1kHz std < 5° 算法稳定
Unwrap 正确性 sweep 0-22kHz · phaseUnwrapped 单调 · 无 ±360° 跳变 unwrap 算法正确
GroupDelay 精度 4ms 延时 fixture · groupDelay 平均值 = 4ms ± 0.2ms 延时检测精度
FPS 30fps(同 fft-module 节奏) 性能
多通道 8 通道并行 · CPU < 30% 可扩展性

③ 失败回退路径(5 类)

失败 触发 UI 表现 恢复路径
信号过弱 RMS < -90dBFS phase 显示 "Signal too weak" 灰色虚线 等信号回
FFT 算法异常 NaN in input PCM 跳过该帧 + console.warn 自动恢复
Unwrap 失败 高频噪声导致 phase jump 自动 fallback 到 wrapped 模式 + UI 红字提示 用户切 wrapped
GroupDelay 不稳 信号无主频 groupDelay 字段 = null · UI 隐藏该模式 正常
通道 mask 全关 channelMask all false canvas 空白 UI 引导

④ 用户操作流

  1. 用户 xilink 右 dock 点 "+ phase-module"
  2. selector 默认选 sink-pre · 显示 2 通道开关
  3. 切到 log_module_v1 · 显示该 module 通道数
  4. 切 displayMode 到 'unwrapped' · 看到 sweep 单调下降曲线
  5. 切到 'groupDelay' · 看到 4ms 平均延时

⑤ 端到端真值 e2e

test('phase-module 4ms delay groupDelay 锁定', async ({ page }) => {
  await loadXilinkProject(page, 'phase-test-fixture.xilink');  // 含 4ms delay 节点
  await page.click('[data-testid="dock-add-phase-module"]');
  await page.selectOption('[data-testid="phase-display-mode"]', 'groupDelay');
  await page.waitForTimeout(2000);  // 等 averaging 收敛
  const gd = await page.locator('[data-testid="phase-gd-1khz"]').textContent();
  expect(parseFloat(gd!)).toBeCloseTo(4.0, 0.2);  // 4ms ± 0.2ms
});

3.4 transfer-module 新增(#5)

① 输入/输出契约

interface TransferModuleManifest {
  moduleId: 'transfer-module';
  version: 'v1.0';
  inputs: {
    refChannel: ChannelBuffer;
    measureChannel: ChannelBuffer;
    sampleRate: number;
  };
  outputs: { transferFrame: MeterFrame_Transfer };  // 复用 ADR-12 §3.3 schema
  controls: {
    refNodeId: string;        // 用户选 ref 节点
    refChannelIdx: number;
    measureNodeId: string;    // 用户选 measure 节点(可同节点不同通道)
    measureChannelIdx: number;
    fftSize: 1024 | 2048 | 4096 | 8192;
    averaging: 'rms' | 'exp';
    delayCompensation: 'auto' | 'manual';
    delayMs: number;          // manual 模式时
    coherenceThreshold: number;  // 0~1 · 默认 0.5 · 低于此 mag/phase 灰显
  };
}

// 输出 frame(复用 ADR-12 §3.3 line 642-669)
interface MeterFrame_Transfer {
  freqs: number[];
  magnitudeDb: number[];
  phaseWrapped: number[];
  phaseUnwrapped: number[];
  coherence: number[];
  delayLockedMs: number;
  delayFinderMs: number;
  averagedCount: number;
  resolution: number;
  timestamp: number;
}

② 收敛/成功判据

判据 阈值 含义
GCC-PHAT delay finder 4ms 延时 fixture · delayFinderMs = 4ms ± 0.1ms(sample-accurate) 延时检测精度
Magnitude 精度 PEQ -3dB@1kHz · magnitudeDb@1kHz = -3 ± 0.5dB 频响精度
Coherence 同 ref/measure 直连 · coherence > 0.95 全频段 coherence 算法正确
异步信号 ref 与 measure 不相关白噪 · coherence < 0.3 区分能力
FPS 30fps + averaging 收敛 < 3s 实时性
GCC-PHAT 算法 librosa.feature.gcc_phat 或 pyroomacoustics(Python 实现 + Rust/C++ FFI 选一) 工业标准

③ 失败回退路径(5 类)

失败 触发 UI 表现 恢复路径
Ref/measure 同信号 直连无延时 delayFinderMs ≈ 0 · 正常显示 正常
Coherence < threshold 噪声主导 mag/phase 曲线灰色 + 提示 用户加增益或降噪
GCC-PHAT 跳变 延时变化 delayFinder 平滑滤波 + 200ms 防抖 自动稳
Ref/measure 通道相同 用户误选 UI 警告 + 禁用启动 用户重选
FFT 算法 OOM fftSize=8192 + 8 通道 ref/measure 多 instance clamp 单 instance + 警告 防崩

④ 用户操作流

  1. 用户右 dock 点 "+ transfer-module"
  2. ref selector 选 source · ch 1 · measure selector 选 sink-pre · ch 1
  3. 启动 averaging · 等 3s 收敛
  4. 看 mag chart -3dB@1kHz · phase chart 单调 · coherence 全段 > 0.95 · delay 锁定 4ms
  5. 切 measure 到 ch 2 · 看右声道差异

⑤ 端到端真值 e2e

test('transfer-module PEQ -3dB@1kHz + 4ms delay 全锁定', async ({ page }) => {
  await loadXilinkProject(page, 'transfer-test-fixture.xilink');  // ref → PEQ -3dB@1kHz → 4ms delay → measure
  await page.click('[data-testid="dock-add-transfer-module"]');
  await page.selectOption('[data-testid="ref-node"]', 'source_ch1');
  await page.selectOption('[data-testid="measure-node"]', 'sink_pre_ch1');
  await page.click('[data-testid="transfer-start"]');
  await page.waitForTimeout(3000);  // averaging 收敛

  const mag1k = await page.locator('[data-testid="transfer-mag-1khz"]').textContent();
  expect(parseFloat(mag1k!)).toBeCloseTo(-3, 0.5);

  const delay = await page.locator('[data-testid="transfer-delay"]').textContent();
  expect(parseFloat(delay!)).toBeCloseTo(4.0, 0.1);

  const coh1k = await page.locator('[data-testid="transfer-coh-1khz"]').textContent();
  expect(parseFloat(coh1k!)).toBeGreaterThan(0.95);
});

4. 实施清单(Implementation · v1.9 fork 表)

F# UID 部门 CPU 工作量 描述
F1 P1.A21.F1-dock-host-generalize 前端 P1-xilink ClaudeA 2.0d DockHost 通用化:节点 selector(复用 ADR-17 F6 4 类 + 加 xilink-module 第 5 类)+ channelCount 自适应 + 横纵刻度滚轮缩放 + ResizeObserver · 影响所有现有 module(rms/scope/fft)接入 host · 6 e2e case
F2 P1.A21.F2-fft-scope-controls-enhance 前端 P1-xilink ClaudeA 1.5d fft-module 控件加 displayMode/peakHold/peakTrack · scope-module 控件加 trigger/persistence/timePerDiv · 复用现有 algorithm 不动 · 4 e2e case(peakHold 6dB/s decay 真值断言)· blocked-by-F1
F3 P_dsp.A21.F3-phase-module-algorithm DSP+P_dsp ClaudeB 2.0d dsp_algo/modules/phase_module/ 新增 · FFT + atan2 + numpy.unwrap + groupDelay = -d(phase)/d(omega) · 单测 ≥ 6 case(1kHz sine std<5° / sweep monotonic / 4ms delay groupDelay 等)· 输出 ADR-12 §3.4 MeterFrame_Phase
F4 P1.A21.F4-phase-module-frontend 前端 P1-xilink ClaudeA 1.5d xilink phase-module plugin 注册 + DockModule vue 组件(类比现有 fft-module UI 风格)+ wrapped/unwrapped/groupDelay 切换 + 多通道渲染 · 4 e2e case · blocked-by-F1+F3
F5 P_dsp.A21.F5-transfer-module-algorithm DSP+P_dsp ClaudeB 2.5d dsp_algo/modules/transfer_module/ 新增 · GCC-PHAT delay finder(librosa.feature.gcc_phat 或 pyroomacoustics)+ cross-spectral density coherence + magnitude/phase + averaging(rms/exp)· 单测 ≥ 8 case(PEQ -3dB / 4ms delay / coherence 阈值 / 异步信号 / 8 通道并行等)· 输出 ADR-12 §3.3 MeterFrame_Transfer
F6 P1.A21.F6-transfer-module-frontend 前端 P1-xilink ClaudeA 2.0d xilink transfer-module plugin 注册 + DockModule vue 组件(Smaart 风格 4 chart:mag/phase/coherence/delay)+ ref/measure 双 selector · 5 e2e case · blocked-by-F1+F5
F7(收尾) P_e2e.A21.F7-truth-e2e-xilink-dock-and-modules 测试编排 ClaudeC 1.5d playwright e2e 4 业务契约 ⑤ 段全跑(DockHost/控件增强/phase/transfer)· ≥ 15 case 真值断言 · 解锁 ADR-21 fulfilled 🏆 · blocked-by-F2+F4+F6
合计 13.0d ≈ 2-2.5 周 7 fork 跨栈(前端 P1 4 fork + DSP 2 fork + e2e 1 fork)

关键路径:F1 host → F2 控件增强(并)+ F3 phase 算法 → F4 phase 前端 + F5 transfer 算法 → F6 transfer 前端 → F7 e2e 并行路径:F2 与 F3 文件正交可并行(F2 是前端控件 / F3 是 dsp_algo)· F4 与 F5 文件正交可并行(F4 前端 / F5 dsp_algo)


5. 风险与缓解

风险 缓解
F1 DockHost 通用化破坏现有 module 接入 F1 prompt Step 0 强制 grep 现有 fft/scope/rms module 真签名 + e2e 回归测试 ADR-18 已锁定的 case · 不允许 break
F3 phase unwrap 算法易错(高噪信号导致 360° 跳) 直接用 numpy.unwrap(已工业标准)+ 单测覆盖 sweep / step / noise 三场景
F5 GCC-PHAT delay finder 复杂度(R1 v0.1 ADR-17-R1 已识别此风险) F5 给 ClaudeB 充足 2.5d · 优先用 librosa.feature.gcc_phat 库 · sample-accurate 单测 4ms fixture
xitest 数据源 B 路径联调风险(本 ADR module 输出 frame 是否能被 ADR-17-R1 R2 panel 消费) F4/F6 prompt 显式注明"输出 frame 必须复用 ADR-12 §3.3/§3.4 schema 字段不变" + e2e 跨 stage 联动 case(本 ADR §3.3/§3.4 ⑤ 已含)
dsp_algo 独立仓 commit(v4.0 教训沉淀) F3/F5 prompt 显式 git -C 04_development/dsp_algo 操作 master branch · 派发自查清单含此项
多 module 同 stage dock 性能(N=5 instance fps drop) F1 引入 RAF 节流 + ResizeObserver 共享 + canvas pool · 性能基线 5 instance @ 30fps
plugin 协议同源扩展兼容性 F3/F5 module manifest schema 必须复用 ADR-18 已锁定 plugin 注册接口 · grep 现有 fft-module manifest 对齐

6. 决议者签名

  • proposed by:Cline-AIOS(2026-06-13 10:30)
  • review by:user(2026-06-13 12:51 拍板 accept · 同时搁置 ADR-17-R1 R2 等 ADR-22)
  • accepted by:user(2026-06-13 12:51)

7. 状态流转

时间 事件 备注
2026-06-13 09:55 用户原话触发 5 点新需求 · #1+#3+#4+#5 在 xilink 侧
2026-06-13 10:23 accept ADR-17-R1 R2 + 拍板 A 双线并行 用户拍板起 ADR-21
2026-06-13 10:30 proposed v0.1 Cline-AIOS 起草 · 7 fork 13d 跨栈
2026-06-13 12:51 accepted v0.1 🆕 用户拍板 accept ADR-AIOS-21 · 同时搁置 ADR-17-R1 R2 等用户起 ADR-22 解决 xistage realtime 具体架构(可能与 R2 重叠)· F1 DockHost ready 解锁派发 · F2-F7 blocked-by-F1
(待) impl Phase 1 F1 DockHost 通用化(ClaudeA 2d)
(待) impl Phase 2-3 F2 控件增强 + F3 phase 算法(并行)→ F4 phase 前端
(待) impl Phase 4 F5 transfer 算法 → F6 transfer 前端
(待) impl Phase 5 F7 e2e 收尾 🏆
(待) fulfilled 🏆 xilink 4 大功能全锁 + ADR-17-R1 R2 数据源 B 路径联通

8. 关联文档

  • ADR-AIOS-17(F5 log_module_v1 + F6 widget endpoint selector 4 类 · 本 ADR §3.1 复用 selector 模型)
  • ADR-AIOS-18(xilink 算法库 plugin · F5/F6/F7 rms/scope/fft module · 本 ADR §3.2 控件增强 + §3.3/§3.4 plugin 协议同源扩展)
  • ADR-AIOS-17-R1(R2 accepted 2026-06-13 · xitest 可视化层 5 widget · 本 ADR module 输出 frame 是其数据源 B 路径)
  • ADR-AIOS-12(业务契约标杆 · §3.3 transfer + §3.4 phase 输出 schema 直接复用)
  • ADR-AIOS-07(三层分工 · L1 算法库 / L3 前端零数学 · 本 ADR §3.3/§3.4 严守)
  • DSP 算法仓 04_development/dsp_algo/modules/{phase_module,transfer_module}/(本 ADR F3+F5 真值仓)

9. 教训沉淀

(留待 fork 实施期间补充 · 暂无)


下一步:✅ accepted 2026-06-13 12:51 → Cline-AIOS 同步 DASHBOARD v5.0.1 → v5.0.2(§📋 加 7 fork ready/blocked 行 + §📅 加 1 行 + R2 5 fork 标 on-hold 等 ADR-22)→ 等用户 start P1.A21.F1-dock-host-generalize 派发 Phase 1(ClaudeA 2d)