跳转至
PARTIALLY-SUPERSEDED

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.subgraphDefs API(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 闭环:

  1. F1 chain-mini-bar 子图识别 · 在现有 mini-bar 中识别 SubgraphInstance + 加 📦 图标 + 高亮 + tooltip 含子图内 module 数
  2. F2 SubgraphsDock 左 dock 第 6 项 · 新增 📦 子图列表 drawer · 读 linkStore.subgraphDefs · 单击 → 切 activeInstanceId · 双击 → 进入子图详情
  3. F3 子图详情进入路径 · 双击子图节点 → 切换主区为"子图内部 mini-bar"(嵌套展示)+ 顶部面包屑 Main > [子图名] + 返回按钮
  4. 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 步)

  1. 用户在 xilink 创建工程 + 定义 1 个子图 EQ_A(3 modules:peq + gain + delay)+ 在主链路放 1 个 EQ_A 实例
  2. 用户切到 xitune stage(同一 linkStore)
  3. xitune chain-mini-bar 显示:🎵 source → 📦 EQ_A (3个) → 📤 sink(线性)
  4. 用户 hover 📦 EQ_A → tooltip 显示"子图 EQ_A · 含 3 module · 双击查看内部"
  5. 用户单击 📦 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 步)

  1. 用户切到 xitune · 左 dock 看到 📦 图标(第 6 项)
  2. 单击 📦 → SubgraphsDock 展开 · 显示子图列表(EQ_A · 3个 module · 主链路使用 1 次)
  3. 单击 EQ_A 列表项 → 主区 chain-mini-bar 中 📦 EQ_A 节点高亮(active)+ 主区显示该子图实例摘要(placeholder · F3 接管)
  4. 双击 EQ_A 列表项 → 进入子图详情(F3 接管 · 顶部面包屑 Main > EQ_A)
  5. 用户回到 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 步)

  1. 用户在 xitune Main 双击 📦 EQ_A 子图节点
  2. 顶部出现面包屑 Main > EQ_A · 主区 chain-mini-bar 切换为子图内部:🎚 peq → 🔊 gain → ⏱ delay
  3. 用户单击 🎚 peq → activeInstanceId 切到 peq 实例 · 主区右侧加载 GEQTuningDialog inline 调音
  4. 用户调完 peq · 点击面包屑 Main → 主区切回顶层 chain-mini-bar(🎵 source → 📦 EQ_A → 📤 sink)
  5. 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)