ADR-AIOS-25 · xitune stage 加载并显示 xilink 工程的子图(范围迁移自 ADR-23)
status:⚠️ partially-superseded by ADR-25-R1 · 2026-06-15 16:45(§3.2 + §3.3 + §4 F2/F3 二 fork 由 R1 修订 · §1 + §2 + §3.1 + §5 + §6 主体保留) 原始 status:accepted · 2026-06-15 13:42(用户 1.5h 内拍板 · 4 fork ready 解锁 · F1+F2 13:50 双连 dispatched · F1 d9a2e1c 部分保留 / F2 bff2fc2 整体 superseded) supersedes:ADR-AIOS-23(范围错误 · 三 zombie 已 revert 27ec16d · F4+F3 已 abort) superseded by:ADR-AIOS-25-R1(§3.2+§3.3+§4 二 fork · 16:45 accepted · 同时启用 .clinerules v3.0) 触发:用户 2026-06-15 11:30 verbatim 纠正 → 12:00 拍板方案 1(立即执行) 关键路径:解决 xitune stage 中"无法显示和打开 xilink 工程中的子图"盲区(R1 重定:完善 FlowReadonlyDock SVG + xitune doc tabs 多 tab 路由)
1. 背景与动机
1.1 用户反馈链(verbatim)
2026-06-13 17:45(原 ADR-23 触发):
"新起ADR 主要解决 xitune stage 中的未完成功能:1. 链路加载,目前无法加载 xilink 的子图,要求 xilink 有子图的,需要在左侧 dock 中显示子图,并且在定 mini-node 链路中显示缩略图..."
2026-06-15 11:30(范围纠正):
"我说的是在 xitune 中无法显示和打开 xilink 工程中的子图 · mini node 的结构都是针对 xitune stage 的 · 你为何去改 xilink 呢"
2026-06-15 12:00(处置方案 1 拍板):
"方案 C+ 增强:先起 ADR-25 + 调研 xitune 现状 · 复用价值低则全 revert"
1.2 ADR-23 失败教训(教训沉淀)
| 失败点 | 根因 | ADR-25 校正 |
|---|---|---|
| 范围方向错(xilink stage 改造) | Cline-AIOS 起 ADR-23 时未 grep xitune/index.vue 现有 chain-mini-bar 实现 · 默认按"xilink 子图入口"理解 |
Step 0 强制 grep xitune 现状 + 确认目标 stage |
| 三 zombie 在 xitune 零复用 | 设计 80×60 svg 缩略 + Tarjan SCC fan-out 算法 + 折叠面板风格 · 与 xitune 文字+emoji 风格 mini-bar + BFS 拉平 + drawer 体系不匹配 | ADR-25 严格仿写 xitune 现有 chain-mini-bar 视觉风格 · 不引入新 svg/算法 |
| 双击行为方向错 | ADR-23 设计"双击新开 LinkEditor tab" · 但 xitune 双击是 floating.openDialog 弹悬浮调音 |
ADR-25 双击行为 = 进入子图详情(展开 inline 或路由内层 mini-bar) |
1.3 xitune 现状调研(2026-06-15 11:45)
✅ 已实现:
- xitune/index.vue chain-mini-bar(line 7-58 · 多源源组堆叠 + → 单源线性)
- mini-node 单击 200ms 延迟切主区(activeInstanceId.value = instanceId)
- mini-node 双击弹悬浮调音(floating.openDialog(instanceId, moduleId))
- xitune/drawers/FlowReadonlyDock.vue 单层 SVG 流图(只读)
- 12 drawer 体系(LEFT 5 + RIGHT 7)· 复用 xilink DrawerConnection/DrawerEngine
- BFS 拉平拓扑(line 287-320 · 多 source 同步推进 · sink 兜底后置)
❌ 缺失:
- 完全不引用 linkStore.subgraphDefs(只读 modules + connections 扁平链路)
- chain-mini-bar 遇到 SubgraphInstance(子图实例)无特殊渲染 · 当作普通 module 拉平
- 左 dock 没有"子图列表"入口
- 双击子图节点没有"进入子图查看"行为 · 仅弹 GenericTuningDialog
1.4 边界铁律(本 ADR 范围)
- ✅ 本 ADR 仅动
xitune/命名空间 ·xilink/完全不动 - ✅ 仅消费
linkStore.subgraphDefsAPI(ADR-08-R1 + ADR-16 SubgraphRuntime 已就位)· 不动 store schema - ❌ 不重做 xitune 现有 chain-mini-bar(line 7-58)· 仅在其上追加子图识别逻辑
- ❌ 不引入 svg 缩略图 / Tarjan 算法 / 折叠面板(那是 ADR-23 错误方向 · 已 revert)
- ❌ 不动 ADR-16 SubgraphRuntime / ADR-08-R1 子图定义
2. 决议
Cline-AIOS 决议:在 xitune stage 加载并显示 xilink 工程中已定义的子图 · 走 4 fork 闭环:
- F1 chain-mini-bar 子图识别 · 在现有 mini-bar 中识别 SubgraphInstance + 加 📦 图标 + 高亮 + tooltip 含子图内 module 数
- F2 SubgraphsDock 左 dock 第 6 项 · 新增
📦 子图列表drawer · 读linkStore.subgraphDefs· 单击 → 切 activeInstanceId · 双击 → 进入子图详情 - F3 子图详情进入路径 · 双击子图节点 → 切换主区为"子图内部 mini-bar"(嵌套展示)+ 顶部面包屑
Main > [子图名]+ 返回按钮 - F4 e2e 真值验证 · 加载有 1 个子图(EQ_A 含 3 modules)的 .xitune fixture · 断言左 dock 列表 + mini-bar 子图节点 📦 + 双击进入子图 + 面包屑导航
3. 业务行为契约 5 必填段
3.1 子任务 A · chain-mini-bar 子图识别(F1)
① 输入/输出契约
// 子图实例识别(linkStore.modules 中的 SubgraphInstance · ADR-16 SubgraphRuntime)
interface SubgraphInstance extends ModuleInstance {
isSubgraph: true // 区分普通 module
subgraphDefId: string // 关联 linkStore.subgraphDefs[id]
// 复用 ModuleInstance 现有字段:instanceId / moduleId / name / moduleDef
}
// chain-mini-bar 渲染契约(xitune/index.vue computed 派生)
interface ChainMiniNode {
instanceId: string
moduleId: string
isSubgraph: boolean // F1 新增字段(派生 · 非 store 入侵)
subgraphMeta?: {
defId: string
moduleCount: number // 子图内 module 数(显示 tooltip)
name: string // 子图名(显示主标题)
}
}
// 视觉契约(在现有 chain-mini-bar line 30-34 基础上)
// - 普通 module:🎵/🔊/🎚 emoji + name(单层)
// - 子图实例:📦 + name(主)+ ` (${moduleCount}个)` 副(灰色小字)+ class="mini-node--subgraph" 高亮边框(蓝色 1px solid)
② 收敛/成功判据
| 判据 | 阈值 | 含义 |
|---|---|---|
| 子图识别准确率 | 100% | 所有 subgraphDefId 不为空的 instance 都识别为子图 · 普通 module 不误识别 |
| 📦 图标渲染延迟 | ≤ 16ms (1 帧) | computed 派生 + emoji 文字渲染 · 无性能开销 |
| tooltip 显示子图内 module 数 | 100% 准确 | subgraphDefs[defId].nodes.length 派生 · 与 xilink 工程定义同步 |
| 高亮边框点击响应 | 与普通 module 一致 200ms | 复用 onMiniNodeClickWithDelay 逻辑 · 不分叉 |
| chain-mini-bar 整体性能 | 50 modules 渲染 ≤ 30ms | 派生 isSubgraph + meta 是 O(N) · 不引入 svg/algo 性能开销 |
③ 失败回退路径(5 类)
| 失败 | 触发 | UI 表现 | 恢复路径 |
|---|---|---|---|
subgraphDefId 引用了不存在的 def |
xilink 工程导出后 def 被删 | 📦 图标变为 ⚠️ + tooltip "子图定义缺失" | 用户从 xilink 重新导入工程 |
subgraphDefs 还没加载完(loading) |
工程加载中 | 子图节点先按普通 module 渲染 + 加载完后 reactive 切换 📦 | 自动恢复(reactive watcher) |
moduleCount 派生异常(nodes 字段为空) |
xilink 工程 schema 异常 | 📦 + name 但隐藏 (N个) 副字 |
提示 toast "子图 [name] 内容为空" |
| 同 def 多实例 instanceId 冲突 | xilink 工程多次实例化同子图 | 各实例独立显示 📦 + name#1/#2 后缀 | 复用现有 shortName(mod) 截断逻辑 |
| 子图嵌套(子图内含子图) | ADR-16 SubgraphRuntime 支持 | xitune chain-mini-bar 仅展示顶层子图 · 内部嵌套靠 F3 进入查看 | 不破坏 xitune 现有 BFS 拉平逻辑 |
④ 用户操作流(端到端 5 步)
- 用户在 xilink 创建工程 + 定义 1 个子图 EQ_A(3 modules:peq + gain + delay)+ 在主链路放 1 个 EQ_A 实例
- 用户切到 xitune stage(同一 linkStore)
- xitune chain-mini-bar 显示:🎵 source → 📦 EQ_A (3个) → 📤 sink(线性)
- 用户 hover 📦 EQ_A → tooltip 显示"子图 EQ_A · 含 3 module · 双击查看内部"
- 用户单击 📦 EQ_A → mini-node 高亮 + activeInstanceId 切到该子图实例(主区显示子图实例摘要 placeholder · 由 F3 接管详情)
⑤ 端到端真值 e2e
// frontend_vue3/e2e/scenarios/xitune-subgraph-load/scene-1-mini-bar-icon.spec.ts
test('xitune chain-mini-bar 显示子图节点 📦 图标 + tooltip', async ({ page }) => {
await loadFixture('subgraph-eq-a-with-3-modules.xitune')
await page.goto('/xitune')
// 断言 mini-bar 子图节点
const subgraphNode = page.locator('.mini-node--subgraph[data-instance-id="eq-a-001"]')
await expect(subgraphNode).toBeVisible()
await expect(subgraphNode.locator('.mn-icon')).toHaveText('📦')
await expect(subgraphNode.locator('.mn-text')).toHaveText('EQ_A')
await expect(subgraphNode.locator('.mn-meta')).toContainText('3个')
// 断言 tooltip
await subgraphNode.hover()
await expect(page.locator('[role="tooltip"]')).toContainText('子图 EQ_A · 含 3 module · 双击查看内部')
})
3.2 子任务 B · SubgraphsDock 左 dock 第 6 项(F2)
① 输入/输出契约
// SubgraphsDock props(LEFT_DOCK 注册第 6 项)
const LEFT_DOCK: DockPane[] = [
// ... 现有 5 项 ...
{ key: 'xt-subgraph', icon: '📦', tip: '子图列表 · 查看 xilink 工程定义的子图' }, // F2 新增
]
// SubgraphListItem 渲染契约
interface SubgraphListItem {
defId: string // linkStore.subgraphDefs[id]
name: string // 子图名
moduleCount: number // 子图内 module 数
instanceCount: number // 主链路中实例化次数(0 表示未使用)
hasError: boolean // ADR-08-R1 R1.5 dirty / 引用错误标记
}
// 单击 → 切 activeInstanceId(若 instanceCount=1 直接切;>1 弹下拉选)
// 双击 → emit 'open-subgraph' · F3 接管进入子图详情
② 收敛/成功判据
| 判据 | 阈值 | 含义 |
|---|---|---|
| dock 加载延迟 | ≤ 50ms | 复用现有 drawer 懒加载机制(同 ProjectDock) |
| 列表项渲染 | 子图数 ≤ 20 时 ≤ 16ms | 用 v-for + 简单 div · 不引入虚拟列表 |
| instanceCount 实时同步 | 100% | watch linkStore.modules · subgraph 增删时 reactive 更新 |
| 单击响应 | ≤ 100ms | activeInstanceId.value 设置 · eventBus.emit |
| 与现有 dock 视觉一致 | 100% | 仿写 ProjectDock / FlowReadonlyDock 风格(头部 + 列表) |
③ 失败回退路径(5 类)
| 失败 | 触发 | UI 表现 | 恢复路径 |
|---|---|---|---|
subgraphDefs 为空 |
xilink 工程未定义子图 | 显示空占位 "暂无子图 · 请在 XiLink 创建" | 用户去 xilink 创建后切回 |
instanceCount=0 |
子图定义了但主链路未实例化 | 列表项灰显 + 副字"未在主链路使用" | 用户在 xilink 添加实例 |
instanceCount>1 单击 |
多实例选哪个 | 弹下拉菜单选 instance(name#1/#2)+ 单击对应项切 active | 用户从下拉选 |
hasError=true |
子图定义损坏 / 引用循环 | 列表项 ⚠️ 红字"定义错误" + 禁用单击 | 用户回 xilink 修复 |
| dock 切换时 | 用户从其他 drawer 切到 xt-subgraph | 复用现有 drawer 体系 · 无特殊处理 | 自动 |
④ 用户操作流(端到端 5 步)
- 用户切到 xitune · 左 dock 看到 📦 图标(第 6 项)
- 单击 📦 → SubgraphsDock 展开 · 显示子图列表(EQ_A · 3个 module · 主链路使用 1 次)
- 单击 EQ_A 列表项 → 主区 chain-mini-bar 中 📦 EQ_A 节点高亮(active)+ 主区显示该子图实例摘要(placeholder · F3 接管)
- 双击 EQ_A 列表项 → 进入子图详情(F3 接管 · 顶部面包屑
Main > EQ_A) - 用户回到 Main · 关闭 dock 或切其他 drawer · subgraph 列表保持状态
⑤ 端到端真值 e2e
test('xitune 左 dock 子图列表 + 单击/双击行为', async ({ page }) => {
await loadFixture('subgraph-eq-a-with-3-modules.xitune')
await page.goto('/xitune')
// 打开 dock
await page.click('[data-dock-key="xt-subgraph"]')
await expect(page.locator('.subgraphs-dock-list')).toBeVisible()
await expect(page.locator('.subgraph-item[data-def-id="eq-a-def"]')).toContainText('EQ_A')
await expect(page.locator('.subgraph-item .module-count')).toContainText('3个')
await expect(page.locator('.subgraph-item .instance-count')).toContainText('1次')
// 单击 → mini-bar 高亮
await page.click('.subgraph-item[data-def-id="eq-a-def"]')
await expect(page.locator('.mini-node--subgraph[data-instance-id="eq-a-001"].active')).toBeVisible()
// 双击 → F3 进入子图详情(面包屑出现)
await page.dblclick('.subgraph-item[data-def-id="eq-a-def"]')
await expect(page.locator('.subgraph-breadcrumb')).toContainText('Main > EQ_A')
})
3.3 子任务 C · 子图详情进入路径(F3)
① 输入/输出契约
// 子图详情视图状态(xitune/index.vue 顶层 state)
interface SubgraphViewState {
currentSubgraphId: string | null // null = Main(顶层链路)· 否则 = 子图 defId
breadcrumb: Array<{ id: string | null; name: string }> // [{ null, 'Main' }, { 'eq-a-def', 'EQ_A' }]
}
// chain-mini-bar 行为契约
// - currentSubgraphId === null:渲染 linkStore.modules 顶层链路(现有逻辑不变)
// - currentSubgraphId !== null:渲染 linkStore.subgraphDefs[id].nodes 子图内部 modules(嵌套 mini-bar)
// 触发源(双击源统一进入 enterSubgraph)
// - F1 chain-mini-bar 双击 📦 子图节点 → enterSubgraph(node.subgraphDefId, node.name)
// - F2 SubgraphsDock 双击列表项 → enterSubgraph(item.defId, item.name)
// - 面包屑点击 'Main' → exitSubgraph()(返回顶层)
② 收敛/成功判据
| 判据 | 阈值 | 含义 |
|---|---|---|
| enterSubgraph 切换延迟 | ≤ 100ms | currentSubgraphId 设置 · 主区 mini-bar 重渲染 |
| 面包屑高度 | 32px(标准 toolbar 风格) | 与 xitune 整体设计语言一致 |
| 嵌套子图(子图内含子图) | 支持任意深度(理论上限 5 · 防爆栈) | breadcrumb 累积 · 超 5 层 toast 警告 |
| 退出子图(点击 Main) | ≤ 50ms | currentSubgraphId 设回 null · activeInstanceId 不动(Main 之前选择保留) |
| 子图内调音(单击内部 module) | 与 Main 行为一致 | 复用 onMiniNodeClickWithDelay · 不分叉 |
③ 失败回退路径(5 类)
| 失败 | 触发 | UI 表现 | 恢复路径 |
|---|---|---|---|
| 进入不存在的子图 ID | def 被删但 instance 还在 | toast "子图定义已不存在" + 不进入 + 保持 Main | 用户去 xilink 修复 |
| 嵌套深度 > 5 | 子图嵌套循环 | toast "嵌套深度超限 · 检查子图定义循环" + 阻止再深入 | 用户去 xilink 检查 |
| 子图内 module 数 = 0 | 空子图 | 主区显示空占位 "子图 [name] 暂无 module" + 面包屑可返回 | 用户从 Main 退出 |
| 浏览器刷新丢失子图状态 | F5 刷新 | currentSubgraphId 重置为 null(回 Main · 不持久化) | 用户重新点击进入 |
| 子图内单击 module 切 activeInstanceId | 子图内调音 | activeInstanceId 切到子图内 instanceId · 主区右侧调音对话框正常加载 | 复用现有 GenericTuningDialog 路由 |
④ 用户操作流(端到端 5 步)
- 用户在 xitune Main 双击 📦 EQ_A 子图节点
- 顶部出现面包屑
Main > EQ_A· 主区 chain-mini-bar 切换为子图内部:🎚 peq → 🔊 gain → ⏱ delay - 用户单击 🎚 peq → activeInstanceId 切到 peq 实例 · 主区右侧加载 GEQTuningDialog inline 调音
- 用户调完 peq · 点击面包屑
Main→ 主区切回顶层 chain-mini-bar(🎵 source → 📦 EQ_A → 📤 sink) - activeInstanceId 自动恢复到 Main 之前选择(若有)· 否则保持空
⑤ 端到端真值 e2e
test('xitune 进入子图 + 调音 + 返回 Main', async ({ page }) => {
await loadFixture('subgraph-eq-a-with-3-modules.xitune')
await page.goto('/xitune')
// 进入子图
await page.dblclick('.mini-node--subgraph[data-instance-id="eq-a-001"]')
await expect(page.locator('.subgraph-breadcrumb')).toContainText('Main > EQ_A')
await expect(page.locator('.mini-node[data-module-id^="peq"]')).toBeVisible()
await expect(page.locator('.mini-node[data-module-id^="gain"]')).toBeVisible()
await expect(page.locator('.mini-node[data-module-id^="delay"]')).toBeVisible()
// 子图内调音
await page.click('.mini-node[data-module-id^="peq"]')
await expect(page.locator('.tuning-dialog-peq')).toBeVisible()
// 返回 Main
await page.click('.subgraph-breadcrumb-item[data-id="null"]')
await expect(page.locator('.subgraph-breadcrumb')).not.toBeVisible()
await expect(page.locator('.mini-node--subgraph[data-instance-id="eq-a-001"]')).toBeVisible()
})
3.4 子任务 D · e2e 真值验证(F4)
复合 F1+F2+F3 端到端场景 · 已在 §3.1/§3.2/§3.3 ⑤ 中分别给出 · F4 fork 整合为 1 个 spec 文件 · 含上述 3 test + fixture 创建 + DSP 注入断言(若需要 · 见 §3.4 ⑤)
⑤ 端到端真值 e2e(整合 spec)
// frontend_vue3/e2e/scenarios/xitune-subgraph-load/integration.spec.ts
test.describe('ADR-25 xitune 加载 xilink 子图(整合)', () => {
test('F1 mini-bar 子图节点 📦', ...) // §3.1 ⑤
test('F2 左 dock 子图列表 + 单击/双击', ...) // §3.2 ⑤
test('F3 进入子图 + 调音 + 返回', ...) // §3.3 ⑤
test('真值断言:子图内 peq 调音影响实际 audio 输出', async ({ page }) => {
// 注入 1kHz @ -10dBFS · 进入 EQ_A 子图 · 调 peq +6dB @ 1kHz · 断言 sink 输出 -4dBFS ± 0.5dB
// (此 case 需要 backend audio engine 启动 · 由 ClaudeC e2e 部门负责)
})
})
4. 实施清单(fork 表)
| F# | UID | 部门 | CPU(worker) | 工作量 | 描述 |
|---|---|---|---|---|---|
| F1 | P3.A25.F1-xitune-mini-bar-subgraph-icon |
前端 P3-xitune | ClaudeA | 0.5d | xitune/index.vue chain-mini-bar 识别 SubgraphInstance + 📦 图标 + tooltip + 高亮边框 |
| F2 | P3.A25.F2-xitune-subgraphs-dock |
前端 P3-xitune | ClaudeA | 0.7d | xitune/drawers/SubgraphsDock.vue + SubgraphListItem.vue + LEFT_DOCK 第 6 项注册 + composable |
| F3 | P3.A25.F3-xitune-subgraph-detail-view |
前端 P3-xitune | ClaudeA | 1.0d | currentSubgraphId 状态 + 面包屑 + chain-mini-bar 嵌套渲染 + enterSubgraph/exitSubgraph + F1+F2 双击接管 |
| F4 | P3.A25.F4-xitune-subgraph-e2e |
跨栈+测试编排 | ClaudeC | 0.5d | playwright e2e 整合 spec(F1+F2+F3 4 test)+ subgraph-eq-a-with-3-modules.xitune fixture + 真值断言 |
总工作量:2.7d · 关键路径 F1 → F3(F1 zombie 解锁 F3)· F2 与 F1 文件正交可并行
注:UID 中用 P3 表示 P3-xitune 部门(对应 04_development/frontend_vue3/src/stages/xitune/)· 区别于 ADR-23 用 P1 (xilink)· 反映范围迁移。
5. 风险与缓解
| 风险 | 缓解 |
|---|---|
linkStore.subgraphDefs schema 与本 ADR 假设不一致 |
F1 Step 0 强制 grep + read linkStore.ts 确认真签名 · 不猜 |
| ADR-16 SubgraphRuntime API 接口已变 | F1 Step 0 grep "SubgraphRuntime|activeSubgraphId" · 沿用真接口 · 不重写 |
| xitune 现有 chain-mini-bar BFS 算法对子图节点处理特殊 | F1 仅追加 isSubgraph 派生字段 · BFS 视子图为黑盒 module · 不改 BFS 逻辑 |
| 子图嵌套循环检测开销 | breadcrumb 长度限 5 + 进入前 visited set 检查 · O(1) 防爆栈 |
| 用户期望"双击进入新 doc tab"(ADR-23 设计) vs 本 ADR"嵌套展示+面包屑" | 用户已 12:00 拍板方案 1 · 本 ADR 不支持新 doc tab · 若用户后续要求再修订 R1 |
| F2 SubgraphsDock 与 ProjectDock/FlowReadonlyDock 视觉风格不一致 | F2 Step 0 read ProjectDock + 仿写头部 + 列表 + 折叠风格 |
6. 决议者签名
- 起草:Cline-AIOS · 2026-06-15 12:12
- 待 accept:用户拍板
7. 状态流转
| 时间 | 状态 | 备注 |
|---|---|---|
| 2026-06-15 12:12 | proposed | Cline-AIOS 起草 · supersedes ADR-23 · 三 zombie 已 revert(27ec16d)· F4+F3 已 abort |
| 2026-06-15 13:42 | ✅ accepted | 用户拍板 accept ADR-AIOS-25 · 4 fork ready 解锁(F1+F2 独立可起手 · F3 blocked-by-F1 · F4 e2e blocked-by-F1..F3) |
| 2026-06-15 13:50 | F1+F2 双连 dispatched | ClaudeA(详见 DASHBOARD v5.1.8) |
| 2026-06-15 15:48 | F2 zombie | bff2fc2 SubgraphsDock 落地(整体方向错 · 后续 16:45 supersede) |
| 2026-06-15 15:53 | F1 zombie | d9a2e1c useChainMiniNodes + 📦 视觉(部分保留) |
| 2026-06-15 16:06 | ⛔ 用户反馈范围方向再次错 | 见 ADR-25-R1 §1.1 verbatim 三段拆解 |
| 2026-06-15 16:14 | ADR-25-R1 proposed | 修订 §3.2+§3.3+§4 二 fork |
| 2026-06-15 16:45 | ⚠️ partially-superseded by ADR-25-R1 | 用户拍板 accept R1 · 同时启用 .clinerules v3.0(砍 accept 二阶段)· §3.2(SubgraphsDock 整体废弃)+ §3.3(嵌套 mini-bar 废弃)+ §4 F2/F3 二 fork 由 R1 修订 · §1+§2+§3.1+§5+§6 主体保留 |
8. 关联文档
- supersedes:
ADR-AIOS-23-xilink-mininode-link-ux.md(2026-06-15 12:11 superseded) - 依赖:
ADR-AIOS-08-xilink-stage-ux.md(子图概念定义)ADR-AIOS-08-R1(子图重设计 · dirty 标记 · 复用)ADR-AIOS-16-subgraph-runtime.md(SubgraphRuntime API · 已 accepted 零修改)- 相关:
ADR-AIOS-21-xilink-dock-and-analysis-modules.md(xilink dock 体系 · xitune 复用 DrawerConnection/DrawerEngine 标本)ADR-AIOS-21-R1-dock-three-selectors-and-popup-entries.md(R1 dock 三选 · UA21R1.F1+F2+F4+F6 进行中 · 与本 ADR 不冲突)
9. 教训沉淀(本 ADR 起草教训)
9.1 起 ADR 前必须 grep 目标 stage 现状(ADR-23 失败教训)
ADR-23 起草时 Cline-AIOS 未 grep xitune/index.vue 现有实现 · 默认按"xilink stage"理解 · 设计完整 5 fork 7d · 三 zombie 落地后才发现范围错。
ADR-25 自查: - ✅ 已 grep xitune 完整文件树(50+ 文件 · 顶层 + dialogs + drawers + modes/auto) - ✅ 已 read xitune/index.vue 关键段(line 1-100 模板 / line 200-320 数据源 / line 440-520 函数 + drawer 注册) - ✅ 已 grep linkStore 引用(确认 xitune 完全不读 subgraphDefs) - ✅ 已对照 xitune 现有 chain-mini-bar 视觉风格设计 F1(文字+emoji · 不引入 svg)
9.2 supersede ADR 必须含 revert 证据(commit hash)
ADR-25 frontmatter supersedes: [ADR-AIOS-23] + §1.2 教训表 + §7 状态流转 + §8 关联文档 4 处交叉引用 · 确保 ADR-23 的失败可被未来 ADR 检索到。
revert commit:27ec16d · 范围 14D + 3M · -1792/+56 行(2026-06-15 12:11)