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)
2.5 P1-xilink stage UI 改造
新增 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 边界铁律(强制约束)
- 画布 A / B 严格隔离:audio 节点不能放进画布 B · 信号节点不能放进画布 A · 跨画布只走 SignalSink 订阅
- 信号链不允许成环:画布 B 拓扑必须 DAG · 创建时显式拒绝 cycle
- HMI API 限流:/api/control-signals/push 默认 100Hz/source · 超限 backoff(防恶意刷)
- 信号 tick 精度不绑死 audio block:1ms tick 独立于 audio engine block size · 防 audio jitter 影响信号
- 绑定参数仍可手动覆盖:audio module 受控参数 UI 锁定 · 但保留"暂时手动"开关(15s 超时自动恢复 binding)
- 本 ADR 不解决信号录制/回放:历史信号轨迹 / replay 留下季度 ADR
- 不实施 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"场景诉求。