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/errorsWebSocket 推送 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 是否有
BottomProblemstab - 删连线后无错误 → 检查
linkStore.validate()是否被触发(应该在 link 变化时自动调) - error 显示但点击无高亮 →
BottomProblems.vue的focus-moduleemit 事件没接
议题 ③ · 性能监控 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'+RuntimeTargetinterface- 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 下拉- 后端
RuntimeModeService64 行重构为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/availableREST 端点(让 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/SubgraphNodeInstanceLinkSchema加subgraphDefs: 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 项用户视角检查项 · 标注议题 ① "一直加载中" 排查路径 |