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 步)
- 用户在 xilink 右 dock 点 "+" 加载 fft-module(或 phase/transfer/scope)
- Module 顶部出现节点 selector 下拉 · 默认选中 sink-pre · 显示 channelCount = 2
- 用户点 selector 切到 log_module_v1 · UI 自动显示该 log_module 的 channelCount(若是 4)+ 4 个通道开关
- 用户滚轮缩放横轴(Hz)从 0-22kHz 缩到 100Hz-10kHz · canvas 即时重绘
- 用户拖拽 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 |
④ 用户操作流
- 用户右键 fft-module 控件区 → 切 displayMode 到 'both'
- 启用 peakHold · 输入 1kHz sine · 看到 peak 线锁定 -3dB@1kHz
- 启用 peakTrack topN=3 · 输入混合信号 · 看到 3 个 peak 频率标注
- 切到 scope-module · 设 trigger level=0 · 看到 1kHz 方波锁定
- 启用 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 引导 |
④ 用户操作流
- 用户 xilink 右 dock 点 "+ phase-module"
- selector 默认选 sink-pre · 显示 2 通道开关
- 切到 log_module_v1 · 显示该 module 通道数
- 切 displayMode 到 'unwrapped' · 看到 sweep 单调下降曲线
- 切到 '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 + 警告 |
防崩 |
④ 用户操作流
- 用户右 dock 点 "+ transfer-module"
- ref selector 选 source · ch 1 · measure selector 选 sink-pre · ch 1
- 启动 averaging · 等 3s 收敛
- 看 mag chart -3dB@1kHz · phase chart 单调 · coherence 全段 > 0.95 · delay 锁定 4ms
- 切 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)