跳转至
SUPERSEDED

ADR-AIOS-23 · XiLink Mini-Node 链路 UX 三件套(已 superseded)

⚠️ 本 ADR 已 superseded(2026-06-15 12:11) · 范围错误 · 详见 §"Supersede 说明"段 后续 ADR:ADR-AIOS-25 · xitune stage 加载并显示 xilink 子图 revert commit:27ec16d(04_development 仓库 · 2026-06-15 12:11 · 14D + 3M · -1792/+56 行) abort 文件:prompts/active/P1.A23.F4-meter-click-protocol.aborted-2026-06-15-1207.md + P1.A23.F3-subgraph-tab-open.aborted-2026-06-15-1207.md


0. Supersede 说明(2026-06-15 12:11 加注)

用户 2026-06-15 11:30 verbatim 反馈:

"我说的是在 xitune 中无法显示和打开 xilink 工程中的子图 · mini node 的结构都是针对 xitune stage 的 · 你为何去改 xilink 呢"

失败教训(归档保留以警后人)

失败点 根因
范围方向错(xilink stage 改造) 起 ADR-23 时未 grep xitune/index.vue 现有 chain-mini-bar 实现 · 默认按"xilink 子图入口"理解
三 zombie 在 xitune 零复用 80×60 svg 缩略 + Tarjan SCC fan-out 算法 + 折叠面板风格 · 与 xitune 文字+emoji + BFS 拉平 + drawer 体系不匹配
双击行为方向错 设计"双击新开 LinkEditor tab" · 但 xitune 双击是 floating.openDialog 弹悬浮调音

处置(用户 2026-06-15 12:00 拍板方案 1)

  1. ✅ ADR-23 status:accepted → superseded by ADR-25(本 frontmatter 改动)
  2. ✅ 三 zombie revert(commit 27ec16d · -1792/+56)
  3. ✅ F4 + F3 dispatched abort(prompts/active/*.aborted-2026-06-15-1207.md)
  4. ✅ ADR-25 起草(proposed)· 4 fork 2.7d · 范围 P3-xitune

历史读取价值

本 ADR 三件套设计(子图加载入口 / meter 单双击 / 并行拓扑)思路本身仍可参考,但目标 stage 必须迁移到 xitune · 详见 ADR-25。


范围(原):仅 P1-xilink stage 主画布 mini-node 链路 UX 层 · 不涉及 P3-xitune(已由 ADR-11 闭环)· 不涉及 SubgraphRuntime 运行时(已由 ADR-16 闭环)· 不涉及 DockHost 通用化与算法实现(已由 ADR-21 闭环)。本 ADR 只补齐 ADR-16 与 ADR-21 实施后用户实测发现的 3 个 UI/交互/布局盲区


1. 背景与动机(Context)

ADR-16(子图统一架构 · accepted 2026-06-05)与 ADR-21(xilink dock 通用化 + 分析模块 · accepted 2026-06-13)两轮架构闭环后,用户 2026-06-13 在 xilink stage 实测 mini-node 链路画布,发现 3 个未覆盖盲区:

1.1 盲区 ① · 子图加载入口缺失

  • ADR-16 已就位 SubgraphRuntime.flatten() 运行时路径 + linkStore.toJSON()/fromJSON() 持久化钩子
  • ADR-08-R1(superseded)曾决议 LinkEditor 顶部 tab bar 切换模式
  • :当 .xilink 文件中含子图(嵌套 LinkSchema)时,左侧 dock 没有"子图列表"区域可视化展示 · mini-node 画布上子图节点没有缩略图渲染 · 双击子图节点没有"新开主页 tab(tab 名 = 子图名)"的交互
  • 用户原话:"无法加载 xilink 的子图,要求 xilink 有子图的需要在左侧 dock 中显示子图,并且在 mini-node 链路中显示缩略图,在左侧或者顶栏的 mini-node 中双击子图出现新的主页 tab,名字是子图名"

1.2 盲区 ② · meter mini-node 单/双击行为不一致

  • ADR-21 F1 已通用化 DockHost · 节点 selector 支持 5 类(source/sink/log_module_v1/xitune/xilink-module)
  • ADR-21 F2/F3/F5 已就位 fft/phase/transfer 控件与算法
  • :meter 类 mini-node(fft/phase/rms/spectrogram/scope 等)的单击与双击行为没有统一规范——目前部分 meter 单击只高亮节点不绑定 dock,双击行为在不同 meter 间不一致(部分弹框 / 部分无响应 / 部分进入 inspector)
  • 用户原话:"meter 功能比如 fft phase rms 等在 mini-node 中单击和双击应该和其他算法 module 行为一致 · 单击选中主界面显示对应的曲线 · 双击弹框形式显示"

1.3 盲区 ③ · 并行节点排布只对 source 生效

  • 当前 mini-node 链路画布仅在多 source 并入时按并列方式排列
  • :同一上游节点 fan-out 出多个下游 meter(如 1 个 sink 接 fft + phase + rms 3 个 meter)时,这些 meter 没有按真实拓扑并列排布 · 而是被强制串成一列 · 视觉上失真
  • 用户原话:"目前关于 link 链路中的并行节点只是 source 按照并列的方式排列了 · 多个 meter 连接在同一节点并没有并列排布 · 希望这个不能作死 · 一定要按照节点的真实并列情况来排列 mini-node"

1.4 时序与依赖

  • ADR-16 ✅ accepted 2026-06-05(SubgraphRuntime + 持久化已就位)
  • ADR-21 ✅ accepted 2026-06-13 12:51(DockHost 通用化 F1 dispatched / 控件增强 F2 / phase F3 dispatched · F4/F5/F6 ready)
  • ADR-23 提议 2026-06-13(本 ADR · 站在 ADR-16 + ADR-21 之上的 UI/交互/布局补齐层)
  • 实施前置:ADR-21 F1 DockHost 通用化 zombie(让 meter 单击 → dock 绑定有承接点)

2. 决议(Decision)

2.1 总体决策

新起 ADR-AIOS-23 · 在 ADR-16(子图运行时)与 ADR-21(DockHost + 分析模块)之上,补齐 3 个 UI/交互/布局盲区。不修改 ADR-16 SubgraphRuntime 契约 · 不修改 ADR-21 DockHost 通用化契约 · 不修改 dsp_algo/v7 framework。

2.2 三件套子决议

2.2.1 子决议 A · 子图加载入口三连(左 dock + 缩略图 + 双击新 tab)

  • A.1 左侧 Dock "子图列表" 区域:LinkEditor 左侧 dock 新增 "Subgraphs" 折叠面板 · 列出当前 .xilink 文件中所有子图(name + 输入/输出端口数 + 模块计数 Σ modules)· 项点击高亮主画布对应节点 · 项双击触发 A.3
  • A.2 mini-node 画布子图节点缩略图:子图节点(type === 'subgraph')在主画布以缩略图形式渲染(80×60px 内嵌迷你拓扑图 · 显示 ≤ 5 个核心 module 形状 · 不显示连线细节)· 区别于普通 module 节点(纯文字+图标)
  • A.3 双击子图节点 → 新开主页 tab:在主画布或左 dock 双击子图节点 → LinkEditor 顶栏 tab bar 新增 1 tab(tab 名 = 子图 name · 例 "EQ Bank A")· 切换至该 tab 后主画布渲染该子图内部链路 · tab 关闭按钮带 dirty 标记联动(沿用 ADR-08-R1 R1.5)

2.2.2 子决议 B · meter mini-node 单/双击行为统一

  • B.1 单击行为铁律:任何 meter 类 mini-node(fft/phase/rms/spectrogram/scope/transfer)单击 → 节点高亮 + DockHost 自动绑定该节点的数据流(complementing ADR-21 F1 节点 selector)· 主界面 dock 显示对应曲线
  • B.2 双击行为铁律:任何 meter 类 mini-node 双击 → 弹出独立浮动窗口(Floating MeterPanel · 复用 P0.K-shared Dialog 组件)· 内容与 dock 一致但解耦节点选择 · 多窗共存允许
  • B.3 与算法 module 行为对齐:此约定与现有算法 module(EQ/Compressor/Crossover 等)单击=选中、双击=Inspector 弹框的行为模式完全对齐 · 用户认知统一
  • B.4 对接点:依赖 ADR-21 F1 DockHost 通用化 zombie · F1 已支持 5 类节点 selector · 本决议追加"meter 类 mini-node click 协议"作为 selector 触发源

2.2.3 子决议 C · mini-node 并行节点真实拓扑排布

  • C.1 排布算法:基于 LinkSchema 拓扑图执行分层 + 同层 fan-out 并列算法
  • Step 1:DAG 拓扑排序 · 计算每节点的层级 level(source 层级 = 0,sink 层级 = max)
  • Step 2:同层级节点按上游节点扇出顺序横向并列(若 1 个 sink 接 3 个 meter,这 3 个 meter 在同一层级并列)
  • Step 3:跨层连线由当前 mini-node 渲染器自动绘制(无需改连线逻辑)
  • C.2 适用范围:不仅 source 多入并列(现有行为)· 任意节点的 fan-out 多分支均按真实并列(本 ADR 核心补齐)
  • C.3 性能:节点数 ≤ 100 时排布 < 50ms · 节点数 > 100 时降级为现有列式布局(避免页面卡顿)

2.3 非目标(Non-Goals · 严禁纳入本 ADR)

  • ❌ 不动 SubgraphRuntime.flatten() 算法(ADR-16 已 accepted · 零修改)
  • ❌ 不动 DockHost 通用化逻辑(ADR-21 F1 已 dispatched · 零修改)
  • ❌ 不动 fft/phase/transfer 算法实现(ADR-21 F2-F6 已规划)
  • ❌ 不动 dsp_algo/v7 framework
  • ❌ 不引入子图层级面包屑 breadcrumb(留作 ADR-24+ 候选)
  • ❌ 不引入子图运行时端口可视化(留作未来 fork)
  • ❌ 不动 P3-xitune autotune 业务(ADR-11 v1.3 已闭环)

3. 业务行为契约(5 必填段 × 3 子决议)

3.1 子决议 A · 子图加载入口三连

① 输入/输出契约

// 左 dock 子图列表 props
interface SubgraphDockPanelProps {
  subgraphs: Array<{
    id: string;          // 子图唯一 ID(对应 LinkSchema.subgraphs[].id)
    name: string;        // 显示名(tab 名同步)
    inputPorts: number;  // 输入端口数
    outputPorts: number; // 输出端口数
    moduleCount: number; // 含 module 总数(递归展开后)
  }>;
  onItemClick: (id: string) => void;
  onItemDoubleClick: (id: string) => void;
}

// 主画布子图节点缩略图 props
interface SubgraphNodeMiniProps {
  subgraphId: string;
  thumbnailModules: ModuleInstance[];  // ≤ 5 个核心 module(用于缩略图)
  size: { width: 80; height: 60 };     // 固定尺寸
}

// LinkEditor tab bar 双击响应
interface TabBarOpenSubgraphTabEvent {
  type: 'open-subgraph-tab';
  subgraphId: string;
  tabName: string;       // = subgraph.name
}

② 收敛/成功判据

判据 阈值 含义
左 dock 子图列表渲染 100% .xilink 子图全部列出 不漏不重
缩略图渲染时延 ≤ 100ms 子图节点视觉立刻可识别
双击新开 tab 响应 ≤ 200ms 用户感知"瞬间"切换
tab 名同步子图 name 100% 一致 重命名子图后 tab 名实时更新
dirty 标记联动 100% 子图修改后 tab 标 ● · 关闭弹 confirm

③ 失败回退路径(5 类)

# 失败 触发 UI 表现 恢复路径
1 子图列表为空 .xilink 无嵌套子图 左 dock "Subgraphs" 折叠面板显示 "No subgraphs" 提示 用户从 LinkEditor 工具栏 "+ Subgraph" 创建
2 缩略图渲染失败 thumbnailModules 计算超时 / 空 子图节点降级为"📦 Subgraph: " 文字标签 用户双击仍可进入子图
3 双击新 tab 失败 tab 已存在同 ID 切换到已有 tab(不重复创建) 自动收敛
4 子图名重复 2 个子图同 name tab 名后缀 (2) (3) 区分 用户重命名解决
5 子图加载异常 LinkSchema 损坏 左 dock 项标 ⚠️ + tooltip 错误信息 + 不可双击 用户修复 .xilink 文件

④ 用户操作流(端到端 5 步)

  1. 用户打开含子图的 .xilink 文件 → 左 dock "Subgraphs" 折叠面板自动展开 + 列出全部子图
  2. 用户在主画布看到子图节点以缩略图形式呈现(区别于 module 节点)
  3. 用户单击主画布子图节点 → DockHost 显示该子图聚合元信息(端口数 / 内部 module 列表)
  4. 用户双击主画布子图节点 / 左 dock 子图项 → LinkEditor 顶栏 tab bar 新增 tab + 切换至子图内部链路
  5. 用户编辑子图后切回 Main tab → 主画布子图节点缩略图同步刷新(若内部 module 数量变化)

⑤ 端到端真值 e2e

  • playwright 测试:加载 fixture .xilink 文件(含 2 子图 "EQ_A" + "Crossover_B" 各 3 modules)
  • 断言 ① 左 dock 列出 2 项 · 名字一致 · moduleCount=3 · ② 主画布 2 个子图节点为缩略图(80×60px)· ③ 双击 "EQ_A" 缩略图 → tab bar 出现 "EQ_A" tab + 切换 + 主画布渲染 3 个 module 节点 · ④ 关闭 "EQ_A" tab(无修改)立即关闭 · ⑤ 修改后关闭弹 confirm

3.2 子决议 B · meter mini-node 单/双击行为统一

① 输入/输出契约

// meter mini-node click 协议
interface MeterNodeClickProtocol {
  onSingleClick: (nodeId: string, nodeRef: ChainNodeRef) => void;
  // → DockHost.bindNodeRef(nodeRef) · 沿用 ADR-21 F1 通用化接口

  onDoubleClick: (nodeId: string, nodeRef: ChainNodeRef) => void;
  // → openFloatingMeterPanel(nodeRef) · 弹出独立浮动窗口
}

// 浮动 MeterPanel props
interface FloatingMeterPanelProps {
  nodeRef: ChainNodeRef;
  meterType: 'fft' | 'phase' | 'rms' | 'spectrogram' | 'scope' | 'transfer';
  initialPosition: { x: number; y: number };
  onClose: () => void;
}

// meter 类节点判定
const METER_NODE_TYPES = ['fft', 'phase', 'rms', 'spectrogram', 'scope', 'transfer'] as const;

② 收敛/成功判据

判据 阈值 含义
单击响应时延 ≤ 80ms DockHost 绑定 + 曲线刷新
双击弹框响应 ≤ 150ms 浮动窗口打开 + 数据流接入
6 类 meter 行为一致 100% fft/phase/rms/spectrogram/scope/transfer 全覆盖
与算法 module 一致性 100% 单击=选中 · 双击=独立窗口 · 视觉无差异
多浮窗共存 ≥ 4 窗 同时打开 4 个 meter 浮窗无卡顿

③ 失败回退路径(5 类)

# 失败 触发 UI 表现 恢复路径
1 DockHost 未就位 ADR-21 F1 zombie 前 单击仅高亮节点 + warning toast "DockHost 未就位" 等 F1 zombie 后自动恢复
2 浮窗渲染失败 meter 数据流断开 浮窗显示 "No data" 占位 用户检查节点连接
3 节点 nodeRef 缺失 ChainNodeRef.channelCount 为 0 DockHost 显示 "Disconnected" 用户重连节点
4 双击触发单击竞态 用户快速点击 单击响应取消 · 仅触发双击逻辑 自动收敛(防抖 250ms)
5 浮窗超出屏幕 initialPosition 越界 自动吸附到屏幕内最近边界 自动收敛

④ 用户操作流(端到端 5 步)

  1. 用户在主画布单击 fft mini-node → 节点高亮 + 主界面 DockHost 显示该 fft 曲线(实时刷新)
  2. 用户切换单击 phase mini-node → DockHost 切换到 phase 曲线(节点选择联动)
  3. 用户双击 rms mini-node → 弹出独立浮动 MeterPanel(显示 rms 仪表)· DockHost 绑定不变
  4. 用户再双击 spectrogram → 又弹一个浮窗 · 2 浮窗共存
  5. 用户关闭 1 浮窗 → 另 1 浮窗保留 · DockHost 选择不受影响

⑤ 端到端真值 e2e

  • playwright 测试:加载 fixture .xilink(含 1 source + 1 sink + 4 meter:fft/phase/rms/spectrogram)
  • 断言 ① 单击 fft → DockHost 显示 fft 曲线 · ② 单击 phase → DockHost 切换到 phase · ③ 双击 rms → 浮窗 1 弹出 · ④ 双击 spectrogram → 浮窗 2 弹出 · 浮窗 1 仍存在 · ⑤ 注入 1kHz @ -20dBFS 信号 · 浮窗 1(rms)读数 -20 ± 0.5 dB · 浮窗 2(spectrogram)1kHz bin 高亮

3.3 子决议 C · 并行节点真实拓扑排布

① 输入/输出契约

// 拓扑排布算法输入
interface TopologyLayoutInput {
  nodes: ChainNodeRef[];
  edges: Array<{ from: string; to: string }>;  // 节点 ID 连线
  canvasSize: { width: number; height: number };
}

// 输出:每节点的 (x, y) 坐标
interface TopologyLayoutOutput {
  positions: Map<string, { x: number; y: number; level: number }>;
  // level = 拓扑层级(0 = source 层 · max = sink 层)
}

// 算法签名
function computeTopologyLayout(input: TopologyLayoutInput): TopologyLayoutOutput;

② 收敛/成功判据

判据 阈值 含义
排布耗时(节点 ≤ 50) ≤ 30ms 流畅刷新
排布耗时(节点 ≤ 100) ≤ 50ms 性能上限
fan-out 节点同层并列 100% 1 上游 → N 下游 · N 个下游 y 轴并列
多 source 并入沿用 100% 现有行为不退化
跨层连线交叉数 最小化 启发式重排同层节点顺序减少交叉

③ 失败回退路径(5 类)

# 失败 触发 UI 表现 恢复路径
1 节点数 > 100 复杂链路 降级为现有列式布局 + warning toast 用户拆分子图
2 含环路(非 DAG) 配置错误 算法降级 + 高亮环路节点 + BottomProblems 报错 用户断开环路
3 孤立节点 未连线 孤立节点放置在画布右下角 用户连线或删除
4 排布算法异常 内部 bug catch + console.error + 降级现有布局 自动收敛
5 节点重叠 同 (x,y) 自动微移 ±10px 避让 自动收敛

④ 用户操作流(端到端 5 步)

  1. 用户加载 fixture .xilink(含 1 sink + 3 meter 全连到该 sink)
  2. mini-node 画布渲染 → 3 meter 横向并列显示(同层 fan-out 真实并列)
  3. 用户拖入第 4 meter 连到同 sink → 立即重排 · 4 meter 同层并列
  4. 用户删除 1 meter → 立即重排 · 剩余 3 meter 仍并列
  5. 用户加载含 100 节点的复杂链路 → 排布完成后 < 50ms 流畅展示

⑤ 端到端真值 e2e

  • playwright 测试:加载 fixture(1 sink + 4 meter 同层 fan-out)
  • 断言 ① 4 meter 的 level 全部相等 · ② 4 meter 的 x 坐标差 ≥ 80px(并列间距)· ③ 4 meter 的 y 坐标差 ≤ 5px(同层水平)· ④ 加载 100 节点 fixture · 排布耗时 ≤ 50ms · ⑤ 含环路 fixture → BottomProblems 报错 + 降级布局

4. 实施清单(fork 表)

F# UID 部门 CPU 工作量 描述
F1 P1.A23.F1-subgraph-dock-panel 前端 P1-xilink ClaudeA 1.5d 左侧 Dock "Subgraphs" 折叠面板 · 列出子图 + click/doubleClick 协议 · 单击 → 主画布高亮节点 · 双击 → 触发 F3
F2 P1.A23.F2-subgraph-node-thumbnail 前端 P1-xilink ClaudeA 1.0d mini-node 画布子图节点缩略图渲染(80×60px 内嵌迷你拓扑 · ≤ 5 module)· 区别于普通 module 节点 · 失败降级为文字标签
F3 P1.A23.F3-subgraph-tab-open 前端 P1-xilink ClaudeA 1.5d LinkEditor tab bar 双击新开 tab(tab 名=子图 name)· dirty 标记联动 · 复用 ADR-08-R1 R1.5
F4 P1.A23.F4-meter-click-protocol 前端 P1-xilink ClaudeA 1.0d meter mini-node 单击 → DockHost 绑定 nodeRef(对接 ADR-21 F1)· 双击 → 弹浮动 MeterPanel(复用 P0.K-shared Dialog)· 6 类 meter 全覆盖 + 防抖 250ms
F5 P1.A23.F5-topology-layout-algo 前端 P1-xilink ClaudeA 2.0d 拓扑分层 + 同层 fan-out 并列算法 · DAG 排序 · 节点 ≤ 100 时 ≤ 50ms · 含环路降级 + BottomProblems 报错 · e2e 4-meter fan-out fixture

fork 总计:5 fork · 7.0d · 全部 ClaudeA 前端

依赖关系: - F1 → F3(F1 双击需触发 F3 新开 tab 逻辑) - F2 → F3(F2 缩略图节点双击同样触发 F3) - F4 → ADR-21 F1 DockHost 通用化(必须 zombie 后启动) - F5 独立 · 与 F1-F4 文件正交(布局算法层)

派发顺序建议: 1. 首推 F5(并行节点排布 · 独立 · 不依赖 ADR-21 F1) 2. 次推 F1(子图 dock 面板 · 不依赖) 3. 三推 F2(子图缩略图) 4. 四推 F3(双击新 tab · 等 F1+F2) 5. 五推 F4(meter 单/双击协议 · 等 ADR-21 F1 zombie)


5. 风险与缓解

风险 缓解
F4 依赖 ADR-21 F1 DockHost 通用化 zombie · 时序耦合 F4 派发前必须 grep 验证 ADR-21 F1 zombie 状态 · 否则改 ready blocked_on
F5 拓扑算法复杂度 100 节点 ≤ 50ms 阈值 实现采用 Sugiyama 风格分层算法 · 用 dagre 库 baseline · 必要时降级
子图嵌套层级 > 2 时 tab 数爆炸 F3 限制单 LinkEditor 最多 8 tab · 超出关闭最旧
meter 浮窗多开导致内存泄漏 F4 复用 ADR-21 frame 数据流 · 浮窗关闭时释放订阅 · 上限 6 浮窗
缩略图渲染卡顿(F2) 缩略图 lazy 渲染 + 缓存 · 子图修改时增量刷新

6. 决议者签名

角色 签名 时间
用户 ✅ accepted 2026-06-13 18:08
Cline-AIOS proposed 2026-06-13 18:00

7. 状态流转

时间 事件 版本
2026-06-13 18:00 proposed by Cline-AIOS · 草案 v0.1 v0.1
2026-06-13 18:08 ✅ accepted by 用户 · 5 fork ready 解锁 v0.1
2026-06-15 12:11 ⚠️ superseded by ADR-AIOS-25 · 范围错误(应改 xitune 不是 xilink)· 三 zombie revert(commit 27ec16d · -1792/+56)· F4+F3 abort · 详见 §0 v0.1

8. 关联文档

  • ADR-AIOS-08-xilink-stage-ux · accepted v1.1 · 父 ADR(xilink stage 5 议题 · 含子图议题 ④)
  • ADR-AIOS-08-R1-subgraph-redesign · superseded by ADR-16 · 历史子图 tab 切换决议(R1.5 dirty 标记本 ADR F3 复用)
  • ADR-AIOS-16-subgraph-unified-architecture · accepted v1.0 · 子图运行时架构(SubgraphRuntime.flatten() · 本 ADR 站在其上做 UI 补齐)
  • ADR-AIOS-21-xilink-dock-and-analysis-modules · accepted v0.1 · DockHost 通用化(F1 是本 ADR F4 的强依赖)
  • ADR-AIOS-17-R1-realtime-widgets-algorithm-impl · 实时控件算法(参考 meter 数据流契约)
  • ADR-AIOS-07 · P3-P4 三层分工(本 ADR 严守:前端零数学 · 算法在 xilink module 层)

9. 教训沉淀

  • 2026-06-13 18:00:用户实测 ADR-16(子图运行时)+ ADR-21(DockHost 算法)闭环后,发现 UI 入口 / 交互行为 / 布局算法 3 个未覆盖盲区。教训:架构 ADR(运行时/算法)就位 ≠ 用户体验闭环,UI 层 fork 必须显式立项,不能假设运行时就位用户就能用上。后续 ADR 在拍板时 §"实施清单"必须问"是否含 UI 入口 fork"避免再现盲区。
  • 范围澄清教训:用户原文写"xitune stage 中"实际指"xilink stage 中"(P3 与 P1 词形接近导致口误)。Cline-AIOS 必须先做范围歧义澄清(ask_followup_question)再起 ADR · 不能直接按字面起草。