跳转至
ACCEPTED

ADR-AIOS-10 · 控制信号总线决议(LiveAmp 风格信号画布 + HMI API)

1. 上下文(Context)

1.1 触发事件

2026-05-28 18:26 用户在 ADR-AIOS-08 拍板对话中,基于 Cline-AIOS 提到 LiveAmp 对标契机,提出新增议题 ⑦:LiveAmp 风格控制信号画布(独立于 link audio 画布的第二画布层 · 信号源驱动 module 控制 + HMI 上层 API 接入)。Cline-AIOS 评估议题 ⑦ 工作量 ≥ ADR-07,与议题 ⑥(代码动态加载)性质完全不同(数据流 vs 代码加载),Plan 模式给归属选项 X/Y/Z。用户 18:27 选 X · 议题 ⑦ 单独成 ADR-AIOS-10 + 契约同 v2。

1.2 用户原话(2026-05-28 18:26)

"我新加一个问题点:提到 liveamp,我们讨论过针对声浪的场景或者音效的控制信号,需要有类似 liveamp 的信号搭建画布,来实现比如速度 油门等信号链路的路由,这里就需要搭建一个新的 toolbar 了,一定有这个窗体,就可以制作信号,然后所有的信号都可以在 link 的画布中被想要接收信号的 module 进行接收;同理这个信号也可以使用于 比如音效的音量 速度 音效模式等和 HMI 上层的 API 接口定义"

1.3 真值核查发现

P1-xilink 现状(prompt_1): - ❌ stages/xilink/ 0 命中 signal / control-bus / signal-canvas / signal-toolbar - ❌ ModuleNode / Edge schema 不区分 audio / control 端口类型 - ❌ 现有 toolbar 仅支持 audio module 拖拽 · 无信号节点抽象

P5-backend 现状(prompt_3): - ❌ ControlSignalService / SignalBus / 类似抽象 - ❌ HMI API(车机/移动端控件 → 后端)未找到任何接入端点 - ⚠️ 现有 /api/source-list /api/preset 走 audio 域 · 无 control 域并行

LiveAmp 对标参考(prompt_4): - ✅ AIOS 历史调研中 LiveAmp 是 IDE 对标"首选"(docs/03-platform/30-frontend/10-xi-ide-architecture.md §1.4) - LiveAmp 模式:双画布(audio chain + control chain)· control chain 信号源 = MIDI / OSC / sensor / API · 信号汇 = audio module 参数 - 信号节点类型:Source(信号产生) / Transform(信号变换 · scale/offset/curve)/ Sink(连接到 audio module) - HMI 集成:LiveAmp 通过 OSC over UDP 让外部控制器(平板 app / 车机)实时推参数

契约 v1 现状(prompt_5): - ❌ protocol-v1.md 无 §control-signal-bus - ❌ HMI API 无任何相关章节 - ✅ §3 错误码体系可扩 · §4 sourceList 概念可类比 control-source-list

事实判断: - 议题 ⑦ 全部全新增 · 无任何前置代码可复用 - 性质 = 数据流路由 + HMI API 网关 · 与议题 ⑥(代码动态加载)正交 - 工作量初判:(双画布 + 信号节点抽象 + 跨画布订阅 + HMI 网关 + 契约 §control-signal-bus)


2. 决议(Decision)

2.1 主决议 · 双画布 + 跨画布信号订阅架构

核心理念(LiveAmp 双画布 + 用户原话): - 画布 A(已有):Audio Chain Canvas · link 画布 · audio module + audio 连线 - 画布 B(新增):Control Signal Canvas · 信号画布 · 信号节点 + 信号连线 - 跨画布订阅:画布 B 的信号 sink 节点 → 暴露为"信号源"· 画布 A 的 audio module 可订阅该信号 · 绑定到指定参数 - HMI 接入:画布 B 的信号 source 节点支持"HMI input" 类型 · 暴露 REST/WS API · 外部控制器推送

2.2 信号节点抽象(types/control-signal.ts · 新增)

// 信号值类型
export type SignalValueType = 'scalar' | 'vector2' | 'vector3' | 'enum' | 'trigger'

// 信号节点 3 大类
export type SignalNodeKind = 'source' | 'transform' | 'sink'

// 信号源节点(Source)
export type SignalSourceType =
  | 'hmi-input'           // HMI 上层 API 输入 · 外部推送(车机/移动端)
  | 'sensor-mock'         // 模拟传感器(开发调试)
  | 'lfo'                 // 低频振荡器(内部生成)
  | 'manual-knob'         // 用户拖动旋钮
  | 'midi-cc'             // MIDI Continuous Controller
  | 'osc-input'           // OSC over UDP

// 信号变换节点(Transform)
export type SignalTransformType =
  | 'scale-offset'        // y = a*x + b
  | 'curve-mapping'       // 自定义曲线(类比 AWE Designer Curve)
  | 'lowpass-filter'      // 一阶低通(去抖)
  | 'sample-hold'         // 采样保持
  | 'gate-comparator'     // 阈值比较 → 触发
  | 'mix-blend'           // 多输入混合

// 信号汇节点(Sink · 暴露给画布 A 的 audio module 订阅)
export interface SignalSink {
  id: string                  // sink ID
  label: string               // 显示名(如 "engine-throttle" / "hmi-volume")
  valueType: SignalValueType
  range?: { min: number; max: number }   // 标量信号取值范围
  description?: string        // 元描述(给 audio module 端展示)
}

// 信号节点统一接口
export interface SignalNode {
  id: string
  kind: SignalNodeKind
  type: string                // 具体子类型(SignalSourceType / TransformType / 'sink')
  label: string
  position: { x: number; y: number }
  params: Record<string, unknown>     // 节点参数(scale/offset/curve points 等)

  // 端口
  inputs?: SignalPort[]       // transform / sink 有输入
  outputs?: SignalPort[]      // source / transform 有输出
}

export interface SignalPort {
  id: string
  label: string
  valueType: SignalValueType
}

// 信号画布连线
export interface SignalEdge {
  id: string
  fromNode: string
  fromPort: string
  toNode: string
  toPort: string
}

// 完整画布 schema
export interface ControlSignalCanvas {
  nodes: SignalNode[]
  edges: SignalEdge[]
  sinks: SignalSink[]         // 暴露给画布 A 订阅的 sink 列表(自动从 kind=sink 节点派生)
}

2.3 跨画布订阅机制

audio module 参数订阅信号(linkStore 扩展):

// audio module 参数 binding(本 ADR 新增)
export interface ParamSignalBinding {
  paramId: string             // audio module 参数 ID
  signalSinkId: string        // 订阅的信号 sink ID(画布 B)
  scaleFactor?: number        // 可选:信号值 → 参数值的缩放(默认 1)
  offset?: number             // 可选:偏移(默认 0)
}

// ModuleNode 扩展(原结构 + signalBindings)
export interface ModuleNode {
  // ... 现有字段
  signalBindings?: ParamSignalBinding[]   // 该 module 订阅的信号列表
}

绑定 UI 交互: - audio module PropertyPanel(BottomProperties)中 · 每个参数旁有"绑定信号"按钮 - 点击 → 弹出 SignalSink 选择器(画布 B 已定义的 sink 列表) - 选定后 · 该参数变为"受控参数"(UI 显示锁图标 · 实时数值显示) - 取消绑定 → 恢复手动控制

运行时执行: - 画布 B 信号链每 tick(1ms / 10ms 可配)算一帧 · 所有 sink 输出最新值 - audio module 在 process() 前 · 检查 signalBindings · 拉取信号 sink 当前值 · 应用 scale/offset · 写入参数 - 防抖:信号值变化 < 0.001 时跳过 set_param(避免 DSP 抖动)

2.4 HMI 上层 API(用户原话核心场景)

REST API:

GET  /api/control-signals/sources
  → 列出所有 hmi-input 类型的 SignalSource
  Response: [{ id, label, valueType, range, description }]

POST /api/control-signals/push
  Body: { sourceId: string, value: number | number[] | string, timestamp?: number }
  → 推送信号值(车机 / 移动端 / 第三方系统调用)
  Response: { ok: boolean, latencyMs?: number }

POST /api/control-signals/push-batch
  Body: [{ sourceId, value, timestamp }, ...]
  → 批量推送(高频场景 · 减少 HTTP 开销)

WebSocket Channel(/ws/control-signals):

入站(client → server):
  { type: 'push', sourceId, value, timestamp }
  { type: 'subscribe-sink', sinkId }      // 订阅 sink 当前值变化

出站(server → client):
  { type: 'sink-update', sinkId, value, timestamp }
  { type: 'sources-changed', sources: [...] }   // hmi-input 列表变化
  { type: 'topology-changed' }                  // 画布 B 拓扑变化通知

典型 HMI 场景:

场景 1 · 声浪(车机控制):

车机软件
  ↓ POST /api/control-signals/push
  Body: { sourceId: 'engine-rpm', value: 3500 }

画布 B:
  hmi-input(engine-rpm) → curve-mapping(0-7000 → 0-1) → sink(throttle-normalized)

画布 A(audio module):
  EngineSoundSynth.intensity ← signalBinding(throttle-normalized · scale=1, offset=0)
  → set_param(intensity, 0.5) 实时下发 DSP

场景 2 · 音效音量(移动端 app):

移动端 app
  ↓ WS push: { sourceId: 'music-volume', value: 0.7 }

画布 B:
  hmi-input(music-volume) → lowpass-filter(防抖) → sink(volume-target)

画布 A:
  Gain.volume ← signalBinding(volume-target)

场景 3 · 音效模式切换:

HMI 按钮
  ↓ POST /api/control-signals/push
  Body: { sourceId: 'sound-mode', value: 'sport' }    // enum 类型

画布 B:
  hmi-input(sound-mode) → gate-comparator → sink(eq-preset-id)

画布 A:
  PresetLoader.preset_id ← signalBinding(eq-preset-id)

新增 toolbar(画布 B 信号画布):

┌──────────────────────────────────────────┐
│ [画布 A · 音频链路] [画布 B · 控制信号] [⚙]   │  ← 顶部 tab 切换
├──────────────────────────────────────────┤
│                                          │
│  [画布 B 内容区]                          │
│                                          │
│  左侧 toolbar:                           │
│  · Sources(hmi/sensor/lfo/midi/osc)     │
│  · Transforms(scale/curve/lpf/gate)     │
│  · Sinks(暴露给画布 A)                   │
│                                          │
└──────────────────────────────────────────┘

画布交互: - 标签页切换:画布 A ↔ 画布 B(快捷键 Ctrl+1 / Ctrl+2) - 拖拽节点:从左 toolbar 拖信号节点到画布 - 连线:同 audio 画布(节点端口拖拽连线) - 跨画布可视化:画布 A 中 audio module 显示订阅信号数量徽章 · 鼠标 hover 显示绑定列表

新增组件清单: - stages/xilink/SignalCanvas.vue — 画布 B 主组件 - stages/xilink/components/SignalToolbar.vue — 信号节点工具栏 - stages/xilink/components/SignalNodeCard.vue — 信号节点卡片 - stages/xilink/components/SignalBindingDialog.vue — 参数绑定对话框 - stages/xilink/CanvasTabSwitcher.vue — A/B 画布切换器

2.6 P5-backend ControlSignalService

public interface IControlSignalService
{
    // HMI API
    IReadOnlyList<SignalSourceDescriptor> ListHmiSources();
    Task<PushResult> PushSignalAsync(string sourceId, object value, long? timestamp);
    Task<PushResult[]> PushBatchAsync(IEnumerable<SignalPushRequest> requests);

    // 拓扑管理
    Task UpdateCanvasAsync(ControlSignalCanvasDto canvas);
    ControlSignalCanvasDto GetCurrentCanvas();

    // 运行时
    Task<double> EvaluateSinkAsync(string sinkId);          // 取 sink 当前值
    Channel<SinkUpdateEvent> SubscribeSinkUpdates(string sinkId);    // WS 推送
}

public record SignalPushRequest(string SourceId, object Value, long? Timestamp);
public record PushResult(bool Ok, double LatencyMs, string? Error);
public record SinkUpdateEvent(string SinkId, object Value, long Timestamp);

信号链运算引擎: - 单 daemon 任务(P5 daemon 第 K-thread)· 1ms tick · 评估画布 B 全部节点 - 拓扑排序(无环) · 按依赖顺序计算 - 输出 sink 值缓存 · 供 audio engine 读(P/Invoke 路径) - WS 推送 sink 变化(防抖 + 去重)

2.7 边界铁律(强制约束)

  1. 画布 A / B 严格隔离:audio 节点不能放进画布 B · 信号节点不能放进画布 A · 跨画布只走 SignalSink 订阅
  2. 信号链不允许成环:画布 B 拓扑必须 DAG · 创建时显式拒绝 cycle
  3. HMI API 限流:/api/control-signals/push 默认 100Hz/source · 超限 backoff(防恶意刷)
  4. 信号 tick 精度不绑死 audio block:1ms tick 独立于 audio engine block size · 防 audio jitter 影响信号
  5. 绑定参数仍可手动覆盖:audio module 受控参数 UI 锁定 · 但保留"暂时手动"开关(15s 超时自动恢复 binding)
  6. 本 ADR 不解决信号录制/回放:历史信号轨迹 / replay 留下季度 ADR
  7. 不实施 OSC / MIDI 真实接入:MVP 仅 hmi-input + manual-knob + lfo · midi-cc + osc-input 留下季度

3. 后果(Consequences)

3.1 正面后果

声浪场景完整解锁:车机 RPM/throttle 信号 → 引擎声合成 module 实时调音 · 用户原话核心诉求满足 ✅ HMI 上层 API 标准化:车机/移动端/第三方系统统一通过 /api/control-signals/push 接入 ✅ 音效模式切换闭环:sound-mode 信号 → preset 切换 module · 替代当前硬编码模式枚举 ✅ LiveAmp 行业对标:双画布架构对齐 LiveAmp · 工程师从 LiveAmp 迁移成本低 ✅ 信号链可视化调试:开发者通过画布 B 直观看到信号路由 + 数值变化(对比当前"参数从哪来"完全不可见) ✅ K2-protocol-v2 推动:与 ADR-08 + ADR-09 合并启 v2 · 新增 §control-signal-bus 段

3.2 负面后果与缓解

后果 影响 缓解措施
⚠️ 双画布学习曲线 用户需理解 audio / control 两层概念 提供 5 个典型场景模板(声浪 / 音量 / 模式 / LFO / MIDI) · 一键创建
⚠️ 信号链运算开销 1ms tick · 节点数多时 CPU 占用 节点数上限 100 · 超过提示用户拆 subgraph(关联 ADR-08 议题 ④)
⚠️ 跨画布订阅复杂度 linkStore + signalStore 双 store 协调 signalStore 独立 Pinia store · 通过 SignalSink ID 解耦 · 不直接互引
⚠️ HMI API 限流体验 高频场景 / 调试时可能误触发限流 提供 push-batch 接口减少调用频次 · 限流可配置
⚠️ 绑定参数 UX 复杂 受控参数 UI 锁定可能让用户困惑 锁图标 + tooltip + "暂时手动"按钮 · 文档详述
⚠️ 契约 §control-signal-bus 段大 v2 启动时 §control-signal-bus 单段超 200 行 拆 §control-signal-bus / §hmi-api 两段 · 都入 v2

3.3 关键非目标(Non-Goals · 本 ADR 不解决)

  • ❌ 不实施信号录制 / replay(留下季度 ADR-10-RX)
  • ❌ 不实施 OSC over UDP 真实接入(MVP 不做 · 留下季度)
  • ❌ 不实施 MIDI CC 真实接入(MVP 不做 · 留下季度)
  • ❌ 不解决信号链 AI 自动构建(留长期路线)
  • ❌ 不实施信号链子图(画布 B 内的 subgraph · 留下季度 · 关联 ADR-08 议题 ④)
  • ❌ 不修改 protocol-v1.0 frozen(全入 v2)
  • ❌ 不进议题 ⑥ 动态加载(ADR-09)

4. 实施清单(Implementation)

4.1 立即行动(本 ADR accepted 后立即派 · 优先级 P1)

# U-thread 部门 CPU 工作量 描述
1 P1.U-control-signal-types 前端 ClaudeA 1.0d types/control-signal.ts 新建 · SignalNode/Edge/Sink/Binding 全套类型 · signalStore Pinia 骨架
2 P1.U-signal-canvas-mvp 前端 ClaudeA 3.0d SignalCanvas.vue 主画布 + SignalToolbar + 6 节点类型(hmi-input/manual-knob/lfo/scale-offset/curve/sink) · CanvasTabSwitcher 切换 A/B

4.2 短期解锁(立即行动后 1-2 周内 · 优先级 P2)

# U-thread 部门 CPU 工作量 描述
3 P1.U-signal-binding-ui 前端 ClaudeA 1.5d BottomProperties 加"绑定信号"按钮 · SignalBindingDialog · ModuleNode signalBindings 字段 · 绑定可视化(锁图标+徽章)
4 P5.U-control-signal-service 后端 ClaudeB 3.0d IControlSignalService + 实现 · 信号链运算引擎(1ms tick · DAG 拓扑排序 · sink 缓存) · sinkValue 通过 P/Invoke 给 audio engine
5 P5.U-hmi-api-endpoints 后端 ClaudeB 1.5d REST /api/control-signals/* + WS /ws/control-signals · 限流(100Hz/source 默认) · LatencyMs 统计
6 P1.U-signal-canvas-ws-sync 前端 ClaudeA 1.0d 画布 B 拓扑变化推后端 · sink 值变化订阅 · 调试期数值实时显示

4.3 中期协调(下个迭代 · 优先级 P2)

# U-thread 部门 CPU 工作量 描述
7 P1.U-signal-templates 前端 ClaudeA 1.0d 5 个典型场景模板(声浪 / 音量 / 模式 / LFO / 调试) · 一键插入预设拓扑
8 P5.U-signal-link-runtime 后端 ClaudeB 2.0d 受控参数运行时执行 · audio engine process() 前拉信号值 · 防抖 + 去重 · "暂时手动"超时恢复
9 P_contracts.U-protocol-v2-bootstrap(与 ADR-08/09 共享) 契约 ClaudeB (共享) 见 ADR-08 §4.3 · 本 ADR 贡献 §control-signal-bus + §hmi-api 两段

4.4 长期演进(下季度+)

# 议题 触发条件
10 信号录制 / replay(画布 B 时序数据库) MVP 落地 + 调试场景反馈强烈
11 OSC over UDP 真实接入(SignalSourceType='osc-input') 商务侧确定 OSC 客户端 ≥1 个
12 MIDI CC 真实接入 用户硬件需求收集
13 信号链子图(画布 B 内 subgraph) 节点数 >50 实际场景出现
14 信号链 AI 自动构建(从场景描述生成拓扑) LLM 集成成熟度评估

5. 验收(Acceptance)

5.1 文档验收(本 ADR 自身)

  • ADR-AIOS-10 主文件落盘(本文件 · status: proposed)
  • P_arch/ADR-AIOS-10-control-signal-bus/ 子进程目录创建
  • P_arch/ADR-AIOS-10-control-signal-bus/PROCESS.md(子进程 PCB)
  • P_arch/PROCESS.md 加 ADR-10 子事件 user_thread
  • DASHBOARD.md v2.7.27 → v2.7.28(§⚡ 加 ADR-10 起草 · §📋 加 8 fork U-thread ready)

5.2 实施验收(§4 全部 U-thread 完成)

检查项 通过条件
P1.U-control-signal-types types/control-signal.ts · signalStore · typecheck 通过 · 单测 ≥10 case
P1.U-signal-canvas-mvp 画布 B 可拖入 6 节点 · 可连线 · DAG 拓扑校验 · 切换 A/B 流畅
P1.U-signal-binding-ui audio module 参数可绑信号 · 锁图标 + 实时数值 · 取消绑定可恢复
P5.U-control-signal-service 1ms tick 评估 100 节点 < 5% CPU · sink 值缓存正确 · DAG 拓扑变化无 race
P5.U-hmi-api-endpoints /api/control-signals/push p99 延时 < 5ms · push-batch 100 项 < 20ms · 限流生效
P1.U-signal-canvas-ws-sync 画布 B 修改 → WS 推后端 < 50ms · sink 数值实时显示 30Hz
P1.U-signal-templates 5 模板可一键插入 · 声浪场景 e2e 走通(模拟车机推 RPM → engine sound 响应)
P5.U-signal-link-runtime 绑定参数下发 DSP 延时 < 2ms · 防抖去重正确 · 暂时手动超时恢复
P_contracts.U-protocol-v2-bootstrap protocol-v2.md §control-signal-bus + §hmi-api 落盘

5.3 边界铁律验收(长期)

  • 任何"audio 节点放画布 B"提议 → 拒绝(§2.7 边界铁律 #1)
  • 任何"信号链成环"提议 → 拒绝
  • HMI API 限流配置 → 必须可调 + 监控
  • 任何"画布 B 子图"提议 → 必须先起 ADR-10-RX 修订

6. 替代方案(Alternatives Considered)

6.1 替代方案 A(已废弃)· 单画布合并(audio node + signal node 同画布)

  • 描述:不分画布 A/B · 所有 module 和信号节点在同一画布
  • 废弃理由:
  • 视觉混乱(audio chain + control chain 概念混淆)
  • 与 LiveAmp 双画布对标不一致
  • 拓扑算法复杂度高(audio DAG + signal DAG 混在一起)
  • 本 ADR 选择:严格双画布 + 跨画布 sink 订阅

6.2 替代方案 B(已废弃)· 信号通过 audio path 传递(类比模块化合成器 CV)

  • 描述:把 control 信号当作 audio sample 编码 · 通过音频通道传递(类比模块化合成器 control voltage)
  • 废弃理由:
  • 浪费 audio 带宽(48kHz 传递 100Hz 控制信号)
  • 精度损失(浮点 audio 量化)
  • 与 HMI API 完全不匹配(REST/WS 不可能编 audio 帧)
  • 本 ADR 选择:控制信号独立总线 · 不走 audio path

6.3 替代方案 C(已废弃)· 直接暴露 audio module 参数 REST API(无信号画布)

  • 描述:每个 audio module 参数直接暴露 /api/modules//params/ · HMI 直接调
  • 废弃理由:
  • 无信号变换中间层(scale/curve/filter 都得在 HMI 端做)
  • HMI 与 audio chain 强耦合(audio chain 改变 → HMI 端代码改)
  • 失去"信号源 → 多路复用 → 多 module 订阅"能力
  • 本 ADR 选择:信号画布作为中间层 · 解耦 HMI 与 audio module

6.4 替代方案 D(已废弃)· 把控制信号纳入 ADR-09 plugin 架构

  • 描述:把控制信号节点也当 plugin 实现 · 走 plugin_abi.h v1
  • 废弃理由:
  • plugin_abi 是为 audio process 设计 · 信号节点不需要 process(samples)
  • 强行复用 ABI 会扭曲两个领域设计
  • 议题 ⑥ ⑦ 性质完全不同(代码加载 vs 数据流路由)
  • 本 ADR 选择:独立成 ADR · 独立设计

7. 相关决议与文档

7.1 相关 ADR

  • ADR-AIOS-01:multi-agent-collaboration(P_contracts B1-B4 · contract-v1.0 frozen) — 本 ADR 推动 K2-protocol-v2
  • ADR-AIOS-04:XiForge 架构(Module UID + ModuleMode 4→2) — 本 ADR ParamSignalBinding.paramId 必须符合 XiForge 参数 ID 规范
  • ADR-AIOS-05:XiStudio Workspace · LEGACY_*_MAP — 本 ADR 持久化(.xilink 含 controlSignalCanvas)沿用 LEGACY_LINK_FILE_MAP
  • ADR-AIOS-06:OS 化任务调度 — 本 ADR 全程使用其调度协议
  • ADR-AIOS-07:P3-xitune / P4-xitest · P0.K-shared-meter-dock — 不直接相关
  • ADR-AIOS-08(平行):议题 ①~⑤ XiLink Stage UX — 共享 K2-protocol-v2 · 本 ADR §2.5 与 ADR-08 §2.5 子图概念可能未来融合
  • ADR-AIOS-09(平行):议题 ⑥ 动态加载 — 共享 K2-protocol-v2

7.2 相关 PROCESS.md

  • processes/P1-xilink/PROCESS.md(本 ADR 主战场 · 新增 5 fork U-thread)
  • processes/P5-backend-csharp/PROCESS.md(本 ADR 新增 3 fork U-thread)
  • processes/P_contracts/PROCESS.md(K2-protocol-v2 启动 · 三 ADR 共享)
  • processes/P_arch/PROCESS.md(本 ADR 子事件 user_thread)
  • processes/P_arch/ADR-AIOS-10-control-signal-bus/PROCESS.md(子进程 PCB · 本 ADR 派生)

7.3 关联契约

  • contracts/protocol-v1.md(frozen · 不修改)
  • contracts/protocol-v2.md(本 ADR + ADR-08 + ADR-09 共同启动)
  • §control-signal-bus(本 ADR 贡献:画布 schema + sink 订阅协议)
  • §hmi-api(本 ADR 贡献:REST/WS HMI 接入协议)
  • contracts/protocol-v1.md §3 错误码体系(本 ADR 占用 6xxx 区间 · 控制信号错误)

8. 状态流转(Status History)

日期 状态 操作 说明
2026-05-28 18:26 起草触发 用户在 ADR-08 拍板对话中新增议题 ⑦ LiveAmp 风格信号画布 DASHBOARD §🤔
2026-05-28 18:27 归属研判 Cline-AIOS plan_mode 给 X/Y/Z 选项 推荐 X(独立 ADR-10)
2026-05-28 18:27 方案拍板 用户选 X · 议题 ⑦ 独立成 ADR-10 + 契约同 v2 三 ADR 平行启动
2026-05-28 18:40 proposed(本版) ADR-AIOS-10 v1.0 落盘 status: proposed 等用户 accept ADR-AIOS-10

9. 关键术语表(Glossary)

术语 定义
画布 A Audio Chain Canvas · 现有 link 画布 · audio module + audio 连线
画布 B Control Signal Canvas · 本 ADR 新增 · 信号节点 + 信号连线 · 与画布 A 通过 sink 订阅交互
SignalSource 信号源节点 · 6 子类型(hmi-input/sensor-mock/lfo/manual-knob/midi-cc/osc-input · MVP 实装前 3 类)
SignalTransform 信号变换节点 · 6 子类型(scale-offset/curve-mapping/lpf/sample-hold/gate/mix)
SignalSink 信号汇节点 · 暴露 sinkId 给画布 A 的 audio module 订阅
ParamSignalBinding audio module 参数与 SignalSink 的绑定关系 · scale/offset 可选
HMI API Human Machine Interface 上层 API · 车机/移动端/第三方系统通过 REST/WS 推送控制信号
声浪场景 用户原话典型场景 · 车机 RPM / 油门信号 → 引擎声合成 module 实时调音
音效模式切换 用户原话场景 · HMI 按钮 → 信号 enum 值 → preset 切换 module
LiveAmp 风格 双画布(audio chain + control chain)架构 · 本 ADR 行业对标
K2-protocol-v2 契约 v2 · 由 ADR-08 + ADR-09 + ADR-10 共同启动 · 本 ADR 贡献 §control-signal-bus + §hmi-api

10. 决议者签名(Approvers)

  • 拍板:用户(2026-05-28 18:27 选 X · 议题 ⑦ 独立成 ADR-10 · 契约同 v2 · 立即开始 fork)
  • 起草:Cline-AIOS · cwd=d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/
  • 真值核查:Cline-AIOS 5 路 subagent 并行核查(2026-05-28 18:10) · 用户 18:26 增议题后基于已有核查 · 无需追加
  • 后续修订:任何修改本 ADR 必须先 fork ADR-10-RX(R = Revision)子进程

本 ADR 落地 = AIOS v7 OS 化模型下"双画布架构 ADR"实践 · 与 ADR-08(短平快 UX) + ADR-09(plugin 架构)平行起草 · 三者共同启动 K2-protocol-v2 · 议题 ⑦ 单独深挖回应用户"声浪 / HMI API"场景诉求。