跳转至
FULFILLED

ADR-AIOS-21-R1 · 右 Dock 3 类固定节点 selector + Phase/Transfer 双击悬浮窗入口

状态:v0.1 accepted · 2026-06-15 12:04(用户拍板 accept ADR-AIOS-21-R1 · 4 R1 hotfix 解锁派发) 修订对象:ADR-21 §3.1 + §3.3 + §3.4 + §4 实施清单 F1/F4/F6 三 fork 保留对象:ADR-21 §1 §2 §3.2 §5 §6 决议主体不动 + F2/F3/F5 三 zombie 不动


§0 修订记录(Revision History)

时间 版本 事件
2026-06-13 09:55 ADR-21 v0.1 proposed 用户拍板 5 点新需求
2026-06-13 12:51 ADR-21 v0.1 accepted 7 fork ready
2026-06-15 09:32~09:42 F2/F4/F6 三连 zombie 4ed8699 / 2d5de9c / 50834d7
2026-06-15 09:45 F7 e2e dispatched DASHBOARD v5.1.1
2026-06-15 10:24 ⛔ 用户反馈框架错误 见 §1.1 verbatim
2026-06-15 10:44~10:49 4 路真值核查 ADR §3.3/§3.4 0 处"双击悬浮窗" + F4/F6 严格落地错 ADR + FFT popup 标杆已存在
2026-06-15 10:50 用户拍板方向 B ADR-21-R1 修订
2026-06-15 11:00 F7 e2e abort 文件 move
2026-06-15 11:21 用户二次澄清 见 §1.2 verbatim · 3 类 selector + 5 meter 整理
2026-06-15 11:30 R1 v0.1 proposed 4 R1 hotfix(F1/F2/F4/F6)
2026-06-15 12:04 R1 v0.1 accepted 🆕 用户拍板 accept ADR-AIOS-21-R1 · F1-R1 ready 解锁起手 · F2-R1 blocked-by-F1-R1 · F4-R1/F6-R1 file isolation 可与 F2-R1 三并行

§1 修订触发与用户原话

§1.1 6/15 用户纠错原话(verbatim · 10:24)

执行F7之前我有需要纠正你一个十分严重的理解错误 1. xilink中新增的phase和transfer 功能要和当前已经是先的fft module对标;当前是双击直接悬浮弹窗fft窗体,而不是你现在做的再右侧dock中弹出窗体; 2. 右侧dock的fft rms 等可以基于当前的这个悬浮窗改造,区别是右侧dock可以监控链路中所有的固定节点,比如source的输出,sink的数据,log module等特定节点的数据; 3. 当前所有右侧dock都没有数据更新 4. 请做hotfix来修正这个框架设计错误

§1.2 6/15 用户二次澄清原话(verbatim · 11:21)

selector 保留三类,输入设备/source 都属于输入 ,输出设备sink属于输出,logmodule 输入节点监控 右侧dock主要对应xilink中的meter module 一共目前有五种,当前实现中有重复,请重新整理右侧dock,scope,fft,phase,rms,transfer;

§1.3 误读分析(ADR-21 起草病根)

ADR-21 起草时(6/13)Cline-AIOS 选择了用户原话「4 和 5 也需要作为右 dock 的插件注入」的"dock 容器"义,而忽略了「类似 fft 的功能」的"双击悬浮窗范式"义 · 起草时未 read components/popups/FftModulePopup.vue 现存范式 → 6/15 用户实测后纠错。

§1.4 4 路真值核查关键证据

证据 结论
E1 ADR-21 全文 grep 双击 / dblclick / 悬浮 / floating / Popup 出现 0 次
E2 F4/F6 commit show --stat 实际文件 DrawerDockPhase.vue / DrawerDockTransfer.vue · 0 处 dblclick
E3 popups/ 目录 FFT 范式标杆 FftModulePopup.vue(374 行) + xilink LinkEditor.vue 行 129/353 双击骨架已存在 + 全局管理器 usePopupModuleManager.ts
E4 F1 5 类 selector 后 2 类(xilink-module/xitune-module)语义错位

§2 修订决议(Decision Revision)

§2.1 三个核心修订点

修订点 原 ADR-21 R1 修订后
§3.1 Dock selector 5 类 3 类:input(物理输入 + source)/ output(物理输出 + sink)/ log_module
§3.3 Phase UX 仅 DrawerDockPhase 双路径:① 双击 mini-node → PhaseModulePopup(主入口)② Dock(辅助)
§3.4 Transfer UX 仅 DrawerDockTransfer 双路径:① TransferModulePopup(双击主入口)② Dock(辅助)

§2.2 5 种 dock meter 整理

右 Dock 是独立辅助插件 · 显示 5 种 meter:scope / fft / rms / phase / transfer · 每种共用 3 类 selector + chart 渲染。useDockMeterFrame.ts composable 统一 WS 订阅 + 节点切换 + channelMask · 5 个 Drawer 组件薄壳化(只保留 chart 渲染差异)。

§2.3 数据 tap 通路修复

用户实测「所有右 dock 无数据更新」→ F1 a5b52de 引入的 nodeRef → WS endpoint 订阅通路有 bug · R1 F1-R1 hotfix 必修。

§2.4 §3.2 fft/scope 控件(F2 4ed8699)关系

F2 控件增强(displayMode/peakHold/peakTrack/trigger/persistence/timePerDiv 9 控件)完全保留 · R1 后用 useFftScopeControls.ts composable 统一在 popup + dock 双端共享。


§3 业务行为契约修订

§3.1-R1 DockHost 通用化(superseding ADR-21 §3.1)

① 输入/输出契约

// R1 修订:selector 3 类
type DockNodeKind =
  | 'input'        // 物理输入设备 + source 链路源(归并: ADR-17 F6 physical-input + xilink chain source)
  | 'output'       // 物理输出设备 + sink 链路宿(归并: sink-pre + xilink chain sink)
  | 'log_module';  // ADR-17 F5 log_module_v1 关键监控点

interface DockNodeRef {
  nodeId: string;
  nodeKind: DockNodeKind;
  channelCount: number;
  sampleRate: number;
  endpointUrl: string;  // R1 显式锁定 WS endpoint(修数据 tap bug)
}

// 5 种 meter 共用输入
interface DockMeterInput {
  meterKind: 'scope' | 'fft' | 'rms' | 'phase' | 'transfer';
  selectedNodeId: string;
  channelMask: boolean[];
  scaleX: { min: number; max: number };
  scaleY: { min: number; max: number };
}

② 收敛/成功判据

判据 阈值
selector 仅 3 类 dropdown 含 input/output/log_module · 不含 xilink-module/xitune-module
数据 tap 通路 节点选定 ≤ 500ms WS 帧首达 + chart 刷新 ✅ R1 必修
5 meter 共用 selector scope/fft/rms/phase/transfer 切节点行为一致
FPS ≥ 30fps

③ 失败回退(沿用 ADR-21 §3.1 ③ + R1 新增)

  • WS endpoint 路由错(R1 修复目标):nodeRef 绑定 5s 内 0 帧 → dock 显示 "Data tap timeout · check WS endpoint"

④ 用户操作流

  1. 右 dock 点 "+ fft"(或 scope/rms/phase/transfer)
  2. 顶部 selector 出 3 类 · 默认 input(链路 source)
  3. output → sink 数据 chart 刷新
  4. log_module → 链路 N 个 log_module 实例选定后刷新
  5. 滚轮缩放(沿用 ADR-21)

⑤ 端到端真值 e2e

test('R1 · 3 类 selector + 数据 tap', async ({ page }) => {
  await page.goto('/xilink');
  await page.click('[data-testid="dock-add-fft"]');
  const opts = await page.locator('[data-testid="node-selector"] option').allTextContents();
  expect(opts).toEqual(['input', 'output', 'log_module']);
  await page.selectOption('[data-testid="node-selector"]', 'output');
  await page.waitForFunction(() => {
    const c = document.querySelector('[data-testid="fft-canvas"]') as HTMLCanvasElement;
    return c && c.toDataURL().length > 1000;
  }, { timeout: 500 });
});

§3.3-R1 Phase Module(superseding ADR-21 §3.3)

① 双路径契约

// 路径 A · components/popups/PhaseModulePopup.vue(R1 新建 · 对标 FftModulePopup)
interface PhaseModulePopupProps {
  config: PhaseModuleConfig;  // 复用 ADR-21 §3.3 controls schema
  x: number; y: number; zIndex: number;
}
type PhaseModulePopupEmits = {
  close: []; bringToFront: []; move: [x: number, y: number];
};

// 路径 B · stages/xilink/drawers/DrawerDockPhase.vue(R1 改造保留)
interface DrawerDockPhaseProps {
  selectedNodeId: string;     // 来自 3 类 selector
  channelMask: boolean[];
  // chart 渲染与 PhaseModulePopup 共享(useDockMeterFrame composable)
}

// 算法层 frame schema 不变(ADR-12 §3.4 MeterFrame_Phase)

② 收敛判据(R1 新增)

判据 阈值
双击 mini-node → popup ≤ 200ms · 浮窗在 viewport 内 · 可拖拽 · 可关闭
三段图(wrapped/unwrapped/groupDelay) popup 与 dock 渲染一致
popup ↔ dock 状态独立 popup 关闭不影响 dock

③ 失败回退(R1 新增)

  • popup 加载失败 → LinkEditor 捕获 + console.warn + UI 提示 + fallback 不阻塞链路

④ 用户操作流(双路径)

路径 A(主):链路图找 phase mini-node → 双击 → PhaseModulePopup 浮现 → 切 displayMode

路径 B(辅助):右 dock 点 "+ phase" → 顶部 selector 默认 input → 切 output/log_module 看不同节点 phase

⑤ e2e

test('R1 · Phase popup 双击 + dock 双路径独立', async ({ page }) => {
  await loadXilinkProject(page, 'phase-test-fixture.xilink');
  await page.locator('[data-testid="mini-node-phase-v1"]').dblclick();
  await expect(page.locator('[data-testid="phase-module-popup"]')).toBeVisible({ timeout: 200 });
  await page.click('[data-testid="dock-add-phase"]');
  await page.selectOption('[data-testid="node-selector"]', 'output');
  await page.click('[data-testid="phase-module-popup"] [data-testid="close-btn"]');
  await expect(page.locator('[data-testid="dock-phase-canvas"]')).toBeVisible();
});

§3.4-R1 Transfer Module(superseding ADR-21 §3.4)

修订模式与 §3.3-R1 一致:加 TransferModulePopup.vue(双击主入口)+ DrawerDockTransfer.vue 改造保留(辅助入口)。

// 路径 A · components/popups/TransferModulePopup.vue(R1 新建)
interface TransferModulePopupProps { config: TransferModuleConfig; x: number; y: number; zIndex: number; }
type TransferModulePopupEmits = { close: []; bringToFront: []; move: [x: number, y: number]; };

// 路径 B · stages/xilink/drawers/DrawerDockTransfer.vue(R1 改造保留)
// Smaart 4 chart(Mag/Phase/Coherence/Delay)双路径共享(useTransferFrame composable 沿用 F6 50834d7)

收敛判据 + 失败回退 + 操作流 + e2e 同 §3.3-R1 模板(双击触发 ≤ 200ms · popup ↔ dock 独立 · 沿用 ADR-21 §3.4 ②③④⑤ 算法验收 + 加 R1 双击触发 e2e case)。


§4-R1 实施清单(superseding ADR-21 §4 · F1+F4+F6 supersede)

§4.1 supersede 矩阵

原 fork 状态 R1 处理
F1 dock-host-generalize a5b52de zombie ❌ supersede by F1-R1
F2 fft-scope-controls-enhance 4ed8699 zombie ✅ 保留
F3 phase-module-algorithm 8eaaf40(dsp_algo) zombie ✅ 保留(算法层与 UI 解耦)
F4 phase-module-frontend 2d5de9c zombie ❌ supersede by F4-R1
F5 transfer-module-algorithm eb84bab(dsp_algo) zombie ✅ 保留
F6 transfer-module-frontend 50834d7 zombie ❌ supersede by F6-R1
F7 e2e aborted 11:00 ⛔ 已 abort · R1 闭环后另起 P_e2e.A21R1.F7

§4.2 R1 hotfix fork 表

F# UID 部门 Worker 工作量 描述 blocked-by
F1-R1 P1.UA21R1.F1-dock-selector-3-categories-and-data-tap 前端 P1-xilink ClaudeA 1.0d DockHost selector 5→3 类(input/output/log_module · source/sink 归并语义)+ 修 nodeRef WS endpoint 数据 tap bug · grep 现有 fft/rms/scope dock 不破回归 无(ready)
F2-R1 P1.UA21R1.F2-dock-5-meters-cleanup 前端 P1-xilink ClaudeA 1.5d 整理 5 种 meter dock(scope/fft/rms/phase/transfer)消除重复 + 抽 useDockMeterFrame.ts composable + 5 Drawer 组件薄壳化(chart 渲染差异保留) F1-R1
F4-R1 P1.UA21R1.F4-phase-popup-frontend 前端 P1-xilink ClaudeA 0.5d 新建 components/popups/PhaseModulePopup.vue 对标 FftModulePopup · 注册 LinkEditor onModuleDoubleClick phase 路由(已有 mini-node 行 129/353 骨架)· usePopupModuleManager.openModulePopup('phase-module', instanceId) F1-R1(可与 F2-R1 并行)
F6-R1 P1.UA21R1.F6-transfer-popup-frontend 前端 P1-xilink ClaudeA 0.8d 新建 components/popups/TransferModulePopup.vue · Smaart 4 chart 移到 popup · transfer mini-node 双击路由 · ref/measure 双 selector 在 popup 内 F1-R1(可与 F4-R1 并行)
F7-R1(后续) P_e2e.A21R1.F7-truth-e2e-popup-and-fixed-nodes 测试编排 ClaudeC 1.5d 4 R1 hotfix 闭环后 · playwright e2e 双路径(popup 双击 + dock 3 类 selector)+ 5 meter cleanup 真值断言 ≥ 12 case F1-R1 + F2-R1 + F4-R1 + F6-R1
合计 3.8d 4 hotfix + 1.5d e2e = 5.3d 4 R1 hotfix(全前端 P1-xilink · ClaudeA)+ 1 e2e

关键路径:F1-R1 → (F2-R1 || F4-R1 || F6-R1 三并行)→ F7-R1 e2e

isolation:全部 file isolation(同 worktree 同 branch · 04_development/frontend_vue3/ · 与同期 active fork 文件正交)


§5 风险与缓解

风险 缓解
F1-R1 数据 tap 通路修复需深入定位 WS endpoint 路由 F1-R1 prompt Step 0 强制 read DockHost.vue + useChainNodeMetadata + grep 后端 WS endpoint 真实路径 + 端到端 5s timeout 自检
F2-R1 5 meter cleanup 抽 composable 风险破坏现有 fft/scope dock F2-R1 prompt 强制 vitest 基线零回归(356/3 已知 fail 不增)+ 端到端 dock 5 种 meter 都能拿到数据
F4-R1 / F6-R1 popup 与 dock 双路径状态独立性 popup usePopupModuleManager 全局管理 · dock useDockMeterFrame 节点订阅 · 两套独立 store · e2e 必跑独立性 case
ADR-23 mini-node 双击协议复用兼容性 F4-R1 / F6-R1 必读 ADR-23 mini-node 双击 + LinkEditor.vue 行 129/353/1610 现有协议骨架
Phase/Transfer 算法层 frame 字段在 popup vs dock 双路径渲染一致性 useDockMeterFrame + PhaseModulePopup 共用同一 frame schema(ADR-12 §3.3/§3.4 已锁)· 不允许字段漂移
F7-R1 e2e 待 4 hotfix 全 zombie 才能起 DASHBOARD §📋 显式 blocked-by F1-R1+F2-R1+F4-R1+F6-R1 · 4 zombie 后自动 ready

§6 决议者签名

  • proposed by:Cline-AIOS(2026-06-15 11:30)
  • revision trigger:user(2026-06-15 10:24 + 11:21 二次澄清 + 11:30 拍板方向 B)
  • review by:user(待 accept)
  • accepted by:(待用户 accept ADR-AIOS-21-R1)

§7 状态流转

时间 事件 备注
2026-06-15 11:30 R1 v0.1 proposed 4 R1 hotfix(F1/F2/F4/F6)+ F7-R1 e2e
(待) R1 v0.1 accepted 等用户 accept 派发 F1-R1
(待) F1-R1 zombie dock selector 3 类 + 数据 tap 修复
(待) F2-R1 / F4-R1 / F6-R1 三并行 zombie 5 meter cleanup + phase popup + transfer popup
(待) F7-R1 e2e zombie 双路径 + 5 meter 全矩阵真值
(待) R1 fulfilled 🏆 ADR-21 整体闭环(含 R1)

§8 关联文档

  • ADR-AIOS-21(父 ADR · 本 R1 修订 §3.1+§3.3+§3.4)
  • ADR-AIOS-17(F5 log_module_v1 · 本 R1 §3.1 复用)
  • ADR-AIOS-18(F7 fft-module · components/popups/FftModulePopup.vue 双击悬浮窗范式)
  • ADR-AIOS-23(mini-node 双击协议 · 本 R1 phase/transfer popup 复用)
  • F7 abort 历史:prompts/done/ADR-AIOS-21/P_e2e.A21.F7-...aborted-2026-06-15-1100-superseded-by-ADR-21-R1.md

§9 教训沉淀(R1 修订专属)

§9.1 ADR 起草未 read 现存范式标杆教训

ADR-21 起草时(6/13)Cline-AIOS Plan 模式起草 §3.3 Phase / §3.4 Transfer · 未 read 项目内现有 components/popups/FftModulePopup.vue 双击悬浮窗范式标杆 · 直接凭"右 dock 容器"思路自创 · 与项目既有约定背离 · 6/15 用户实测后纠错 · 走 R1 修订路径。

沉淀到 .clinerules/aios-orchestration.md 候选条目:Plan 模式起 ADR 前必 search_files 关键词 Popup|@dblclick|usePopupModuleManager 找现存范式 · 核查"已存在范式优先约束" Hard Constraint。

§9.2 ADR §3 Constraints 缺"已存在范式优先"checklist

ADR-21 §3 Constraints 没列「必须对标项目内现有 module UX 范式」硬约束 · 导致对标方向漂移。

沉淀:.clinerules ADR 11 节模板 §3 Constraints 加"已存在范式优先约束"checklist: - [ ] 已 search_files 现有 popup/widget/dock 范式标杆 - [ ] 已确认本 ADR 引入的 UX 路径与现有约定一致 / 显式说明背离理由 - [ ] 已识别现有 LinkEditor / Shell / 全局管理器 API 复用点

§9.3 派发前 v1.1 铁律 ≠ 业务契约核查

F7 派发时严格对齐 e2e prompt 标本(P_e2e.A17.F7-8fe8d00)+ 4 维度对齐 · 但没核查"业务契约本身被 worker 落地是否正确"(F4/F6 commit diff 当时未 git show --stat 验证 vs ADR §3.3/§3.4 + FFT popup 标杆三方一致)。

沉淀:派发 e2e prompt 前必查"e2e 待测目标的源契约是否真实落地" · §0 真值核查段补 read ADR §3.x + 现有范式标杆 + worker 实际 commit diff 三方一致。


下一步:proposed 2026-06-15 11:30 → 等用户 accept ADR-AIOS-21-R1 → Cline-AIOS 同步 DASHBOARD v5.1.1→v5.1.2(F7 abort + 4 R1 hotfix ready 入 §📋)→ 用户 start P1.UA21R1.F1-dock-selector-3-categories-and-data-tap 派发 Phase 1(ClaudeA 1.0d)