跳转至
ACTIVE

ADR-AIOS-08 · 用户验收清单(5 议题逐项检查)

背景:2026-05-31 10:37 用户反馈「ADR-08 改完之后到底改了什么?我只看到了一直加载中的 runtime target 右侧多了 dock 其他的貌似没有什么变化」 —— 用户需要的是验收清单,不是 commit hash。本文档把 ADR-08 §2.1~§2.5 五议题决议转译成「用户视角的可操作检查项」,用户照单跑 UI 一遍 = ADR-08 是否真的达标。

使用方式:打开 XiStudio app(04_development 主仓 build 出的二进制)· 进入 P1-xilink stage · 照下面 5 议题逐项检查 · 全部 ✅ 则 ADR-08 正式闭环。

关联:ADR-AIOS-08 §2.1~§2.5 + §5 验收(本文是 §5 的用户视角展开版)


🟢 全部 5 议题速查表

议题 简述 用户感知关键词 状态
右 dock 9→4 drawer 裁剪 + XiTest 四件套 "右侧 dock 变干净 + 4 个测量曲线" 待用户验收
链路错误检查 + 底部 Problems 联动 "断开连线时底部提示错误 + 点错误高亮模块" 待用户验收
性能监控 DrawerMetrics 实装 "右侧 Metrics 看到 CPU%/内存/延时 + 每模块详细统计" 待用户验收
引擎运行核心选择(对标 AWE Designer) "DrawerEngine 有 RuntimeTarget 下拉 7 选项" ⚠️ 用户已发现"一直加载中" — 见 §议题① 排查
子图(subgraph)创建画布 "Toolbar 有'新建子图'按钮 + 多选'封装为子图' + ModuleLibrary 有'我的子图'分类" 待用户验收

议题 ⑤ · 右 dock 9→4 drawer 裁剪 + XiTest 四件套

改了什么

  • 删除:DrawerInspector(属性检查)+ DrawerPropertyPanel(浮动属性 · 用户原话"不知道这个是干啥的")
  • 保留:DrawerEngine(引擎)+ DrawerLog(日志)+ DrawerMetrics(性能)
  • 新增:DrawerXiTest(独立 drawer 或在 DrawerMetrics 下作为 tab)· 含 4 子标签:
  • RMSMeter(实时电平表 · 复用 P0.K-shared-meter-dock)
  • FreqResponseChart(频响曲线)
  • PhaseChart(相位曲线)
  • RealtimeScope(实时 scope · 时域波形)

用户从哪进入

打开 XiStudio → 进入 P1-xilink stage → 看右侧 dock 区域(屏幕右边垂直排列的图标按钮)

验收检查项(逐项打勾)

  • C5-1:右 dock 图标数量 = 4 个 drawer + 1 个 XiTest(原 9 个减到 4 + 新增 1)
  • C5-2:点击「Inspector」/「PropertyPanel」相关按钮 · 应找不到入口(已删除 · 仅 1 周宽限期内可能有 stub 提示"已迁移到底部 BottomProperties")
  • C5-3:点击 XiTest drawer · 看到 4 个子标签(RMS / 频响 / 相位 / 实时 scope)
  • C5-4:在画布上选中一个 sink-pre 节点physical-input 节点 · XiTest 4 个曲线有数据流(复用 P0.K-shared-meter-dock · 不会显示 0 或一直 loading)
  • C5-5:RMS 表盘读数随音频变化(注入 1kHz 正弦 → RMS 应 ~ -3dB 而不是 -∞)
  • C5-6:频响曲线显示 1kHz 处有峰(注入 1kHz 正弦 → 频谱在 1000Hz 附近)

不通过怎么办

  • 看不到 XiTest drawer → 查 frontend_vue3/src/stages/xilink/drawers/ 目录是否有 DrawerXiTest.vue
  • XiTest 有但 4 子标签数据空 → 检查节点是否选中 sink-pre / physical-input(必须选这两类才能 tap)· 或 backend WS /ws/meter/stream 是否在跑
  • 看到 9 个原来的 drawer 还在 → 代码可能没 push 到主仓 04_development(让 ClaudeA 推一下)

议题 ② · 链路错误检查 + 底部 Problems 联动

改了什么

  • 新增 types/link-error.ts:7 类 LinkErrorCode(MODULE_NOT_CONNECTED / PORT_MISMATCH / PARAM_MISSING / CHAIN_CYCLE / ORPHAN_NODE / RUNTIME_PLATFORM_MISMATCH / SUBGRAPH_INTERFACE_INVALID)
  • linkStore.errors[] 数组 + validate() + clearErrors() + subscribeBackendErrors() 方法
  • BottomProblems.vue 数据绑定 · 按 severity(error/warning/info)分组三栏
  • 后端 /ws/errors WebSocket 推送 LinkError 帧

用户从哪进入

打开 XiStudio → 进入 P1-xilink stage → 在画布上故意制造错误(eg. 删除两个 module 之间的连线 · 或加入孤立节点)→ 看底部 BottomProblems 面板

验收检查项

  • C2-1:删除一条连线让某 module 失去 input → 底部 BottomProblems 面板红色 error 出现 1 条 · 内容含模块名 + MODULE_NOT_CONNECTED
  • C2-2:点击该 error → 画布自动高亮目标 module(边框变红或闪烁)
  • C2-3:双击该 error → 跳转到该 module 的 PropertyPanel(底部或右侧弹出参数面板)
  • C2-4:修复连线 → BottomProblems 面板该条 error 自动消失(不需要手动刷新)
  • C2-5:制造端口类型不匹配(eg. 把 audio output 连到 control input)→ BottomProblems 显示 MODULE_PORT_MISMATCH
  • C2-6:制造孤立节点(放一个 module 不连任何线)→ BottomProblems 显示 CHAIN_ORPHAN_NODE(severity = warning · 黄色)

不通过怎么办

  • BottomProblems 面板看不到 → 检查底部 dock 是否有 BottomProblems tab
  • 删连线后无错误 → 检查 linkStore.validate() 是否被触发(应该在 link 变化时自动调)
  • error 显示但点击无高亮 → BottomProblems.vuefocus-module emit 事件没接

议题 ③ · 性能监控 DrawerMetrics 实装

改了什么

Layer 1 · 概况(DrawerMetrics 默认视图): - CPU 算力占比(gauge 仪表盘 · 0~100%) - 内存(progress bar · MB) - 链路延时(数字 + 趋势线 · ms) - 缓冲区水位(progress bar · %) - Tick 频率(Hz)

Layer 2 · 详细(切换 tab "Per-Module"): - 表格:Module / Peak CPU / Avg CPU / Peak Mem / Tick - 排序:Peak CPU 降序(可切 Avg CPU / Peak Mem)

后端: - 新增 PerformanceService.cs + MetricsAggregator.cs - WS /ws/perf 1Hz 推送 PerfFrame - REST GET /api/perf/per-module 拉模块级数据

用户从哪进入

打开 XiStudio → 进入 P1-xilink stage → 点击右 dock 的 DrawerMetrics(性能图标)

验收检查项

  • C3-1:DrawerMetrics 默认显示 Layer 1 概况(5 个指标:CPU% / 内存 / 延时 / 缓冲区水位 / Tick)
  • C3-2:5 个指标有真实数值(不是 0 / 不是 "-" / 不是 loading)· 数值随时间变化(每秒刷新)
  • C3-3:CPU% gauge 仪表盘指针有动画 · 数值在合理范围(2%~80% · 不会卡 0% 或一直 100%)
  • C3-4:切换到 Per-Module tab → 显示当前链路所有 module 的统计表(行数 = 当前画布上 module 数)
  • C3-5:Per-Module 表格按 Peak CPU 降序 · 点击表头可切换排序(Avg CPU / Peak Mem)
  • C3-6:关闭 DrawerMetrics(切到其他 drawer)→ WS /ws/perf 应停止订阅(节约 0.5% CPU)· 重新打开恢复

不通过怎么办

  • DrawerMetrics 5 指标显示 "-" 或 loading → 后端 /ws/perf 没在跑(检查 P5 backend 是否启动)
  • Per-Module 表格空 → 后端 getModuleMetrics() C ABI 没暴露(dsp_algo dll 检查)
  • Layer 1 数据有 / Layer 2 没有 → REST GET /api/perf/per-module 没实装

议题 ① · 引擎运行核心选择(对标 AWE Designer)⚠️ 用户已发现问题

改了什么

  • types/runtime.ts:RuntimeKind = 'pc-native' | 'dsp-simulated' + RuntimeTarget interface
  • 7 个预定义 RuntimeTarget:
  • PC Native:pc-native-0 / pc-native-1 / pc-native-2 / pc-native-3(对应 CPU core 0~3)
  • DSP Simulated:dsp-21489(450 MIPS · 5MB SRAM · 48kHz)/ dsp-21569(800 MIPS · 16MB · 96kHz)/ hexagon-v73(2000 MIPS · 32MB · 192kHz)
  • DrawerEngine.vue 加 RuntimeTarget 下拉
  • 后端 RuntimeModeService 64 行重构为 RuntimeTargetService(枚举集合)
  • 新增 REST GET /api/runtime/available + POST /api/runtime/switch
  • LEGACY_RUNTIME_MODE_MAP:normal → pc-native-0 / legacy → pc-native-legacy
  • 删除 source 模块的 "PC 注入 vs DSP 直接生成" 控制变量

用户从哪进入

打开 XiStudio → 进入 P1-xilink stage → 点击右 dock 的 DrawerEngine(引擎图标)→ 找 RuntimeTarget 下拉框

验收检查项

  • C1-1:DrawerEngine 显示 RuntimeTarget 下拉框(标签 "运行核心" 或 "Runtime Target")
  • C1-2:下拉打开 → 看到 7 个选项(4 PC Native + 3 DSP Simulated)· 不是空 / 不是 loading
  • C1-3:每个选项显示完整信息(eg. "DSP-21569 · 800 MIPS · 16MB SRAM · 96kHz")
  • C1-4:不可用的 target 灰显并显示原因(eg. "Hexagon-V73 · 不可用 · 当前 SDK 未集成")
  • C1-5:切换 target → 链路状态保持(module 不消失 · 参数不丢)· 仅 module 重新初始化
  • C1-6:source 模块已删除"PC 注入 / DSP 生成"控制变量(在 source PropertyPanel 里找不到这个开关)
  • C1-7:旧 .xilink 文件加载(含 runtimeMode: "normal")→ 自动迁移到 pc-native-0(LEGACY_RUNTIME_MODE_MAP)

⚠️ 用户已发现的问题

用户原话:"runtime target 一直加载中"

可能原因(让 ClaudeA/B 排查): 1. 后端 /api/runtime/available 端点未启动:前端调 GET 拿不到 7 个选项 · 一直 loading - 排查:浏览器 DevTools Network → 看 /api/runtime/available 是否 200 OK · response 是否含 7 项数组 2. 前端 RuntimeTargetStore 订阅没初始化:WS event runtime:switched 没绑 3. 后端 RuntimeTargetService 实装不完整:只声明了 record · 没填 7 个预定义条目 4. commit 没推到主仓:用户跑的是旧 build · 让 ClaudeA/B push 到 04_development 主仓后重新 build

不通过怎么办

  • 一直 loading → 优先排查后端 /api/runtime/available REST 端点(让 ClaudeB 在 backend_csharp/Routes/ 检查)
  • 下拉空 → RuntimeTargetService 7 预定义条目可能没填(让 ClaudeB 在 RuntimeTargetService.cs 加 pc-native-0~3 + dsp-21489/21569/hexagon-v73)
  • source 模块还有 PC/DSP 开关 → ClaudeA 没删干净(让他 grep injectMode 全清)

议题 ④ · 子图(subgraph)创建画布

改了什么

  • types/subgraph.ts:SubgraphDefinition / SubgraphPort / SubgraphNodeInstance
  • LinkSchemasubgraphDefs: SubgraphDefinition[] 字段
  • LEGACY_LINK_FILE_MAP 扩展(旧 .xilink 文件无 subgraphDefs 自动注入 [])
  • 3 个创建/编辑入口:
  • 入口 1:Toolbar 按钮 "新建子图" → 弹空白子图画布(modal)
  • 入口 2:多选 ≥2 module → 右键 "封装为子图" → 自动推导接口端口
  • 入口 3:双击子图节点 → 切换到子图画布(面包屑 Main / SubgraphA)
  • 使用入口:ModuleLibrary 新增 "我的子图" 分类 · 拖拽到画布创建 SubgraphNodeInstance
  • cyclic 检查:子图内部不能引用自身 · 创建/保存时显式拒绝
  • MVP 限定 2 层嵌套(主画布 → 1 层子图)

用户从哪进入

打开 XiStudio → 进入 P1-xilink stage → 看 Toolbar(画布上方工具条)+ ModuleLibrary 面板(左侧或独立 panel)

验收检查项

入口 1 · Toolbar "新建子图"

  • C4-1:Toolbar 上有"新建子图"按钮(图标 + 文字)
  • C4-2:点击该按钮 → 弹出子图画布 modal(全屏或大尺寸)· 内部画布空白
  • C4-3:modal 顶部有面包屑 "Main / 新子图"
  • C4-4:modal 底部有 toolbar:保存子图 / 取消 / 命名输入框
  • C4-5:命名后保存 → modal 关闭 + ModuleLibrary "我的子图" 分类新增 1 项

入口 2 · 多选封装

  • C4-6:在父画布选中 ≥ 2 个 module(框选或 Ctrl+click)
  • C4-7:右键弹菜单 → 看到 "封装为子图" 选项
  • C4-8:点击 → 父画布这些 module 替换为 1 个 SubgraphNodeInstance(单一节点)· input/output 端口自动推导
  • C4-9:推导正确性:外部连到内部的线 = inputPorts · 内部连到外部的线 = outputPorts

入口 3 · 双击编辑

  • C4-10:双击画布上的 SubgraphNodeInstance(子图节点)
  • C4-11:画布切换到子图内部视图 · 面包屑显示 "Main / SubgraphA"
  • C4-12:点击面包屑 "Main" → 返回父画布

使用入口 · ModuleLibrary "我的子图"

  • C4-13:ModuleLibrary 面板有 "我的子图" 分类(独立 tab 或折叠组)
  • C4-14:已保存的 SubgraphDefinition 在该分类下显示(每项 = 1 子图缩略图 + 名称)
  • C4-15:拖拽到任意画布 → 创建 SubgraphNodeInstance(引用 SubgraphDefinition.id)

cyclic 检查 + MVP 限制

  • C4-16:在子图内部再加一个 SubgraphNodeInstance(尝试 2 层嵌套)→ 保存时ElMessage error 拒绝(MVP 限 2 层 · 不允许子图内嵌子图)
  • C4-17:序列化:含子图的链路保存 .xilink 文件 → 重启 app 加载 → 子图完整恢复(节点数 + 端口 + 内部连线)

不通过怎么办

  • Toolbar 没"新建子图"按钮 → ClaudeA 没改 Toolbar.vue(让他 grep <el-button.*新建子图)
  • 多选右键无菜单 → CanvasContextMenu.vue 没加该项
  • 双击子图节点无反应 → useSubgraph composable 的 openSubgraphEditor 没接 dblclick handler
  • ModuleLibrary 没"我的子图" → ModuleLibraryPanel.vue 没加新分类

🚨 验收完整路径(全部 5 议题逐项打勾)

按下面顺序跑一遍 UI · 全部 ✅ = ADR-08 正式闭环:

Step 1 · 启动应用

1. cd AlgoDepartment\04_development
2. git pull(确认 9 个 ADR-08 commit 都在主仓)
3. 启动 backend(dotnet run)
4. 启动 frontend(npm run dev)
5. 打开浏览器 → P1-xilink stage

Step 2 · 议题 ⑤ 右 dock 检查(C5-1 ~ C5-6 · 6 项)

→ 看右 dock 图标数 + 点 XiTest 看 4 子标签 + 选 sink-pre 看数据

Step 3 · 议题 ① RuntimeTarget 检查(C1-1 ~ C1-7 · 7 项)⚠️ 优先

→ 点 DrawerEngine 看下拉 · 必须不能"一直加载中"

Step 4 · 议题 ② 链路错误检查(C2-1 ~ C2-6 · 6 项)

→ 故意删连线 · 看底部 Problems · 点错误高亮

Step 5 · 议题 ③ 性能监控检查(C3-1 ~ C3-6 · 6 项)

→ 点 DrawerMetrics 看 5 指标 + Per-Module 表格

Step 6 · 议题 ④ 子图画布检查(C4-1 ~ C4-17 · 17 项)

→ Toolbar 新建子图 + 多选封装 + 双击编辑 + ModuleLibrary 我的子图 + cyclic 检查

Step 7 · 闭环判定

  • 全部 42 项 ✅ → ADR-08 正式闭环 · 用户告知 AIOS:"ADR-08 验收全过 · 标 fulfilled"
  • 部分 ❌ → 列出未通过项 · 让对应 worker(ClaudeA 前端 / ClaudeB 后端)修复 → 下一轮验收

📋 验收记录模板(用户使用)

议题 检查项 实测结果 通过? 备注
C5-1 右 dock = 4+1 drawer _
C5-2 Inspector/PropertyPanel 已删除 _
C5-3 XiTest 4 子标签可见 _
C5-4 选 sink-pre 后 4 曲线有数据 _
C5-5 RMS 表盘读数变化 _
C5-6 频响 1kHz 峰可见 _
C1-1 RuntimeTarget 下拉框可见 _ ⚠️ 一直 loading
C1-2 7 选项展开 _
... ... ... ... ...

(完整 42 项见上文 §议题 ⑤/②/③/①/④ 各节)


与 DASHBOARD §📋 状态的关系

DASHBOARD §📋 当前标的 9 个 ADR-08 ✅ zombie 是「worker 自己声称完成」状态 · 不等于「用户验收通过」状态。

完整状态机:

ready → dispatched → zombie(worker 完成 + 推主仓)→ ✅ user-verified(本清单全过)→ ADR fulfilled
                                              ❌ user-rejected(本清单部分失败)→ 修复 → 重验

本清单是 zombie → fulfilled 之间的关键验收节点。ADR-08 真正闭环 = DASHBOARD §📋 9 fork zombie + 本清单 42 项全过


历史

时间 版本 事件
2026-05-31 10:50 v1.0 用户反馈"ADR-08 改完到底改了什么" → AIOS 落盘本清单 · 把 §2.1~2.5 决议转译成 42 项用户视角检查项 · 标注议题 ① "一直加载中" 排查路径