P5.UA13-builtin-link-registry · ADR-13 BuiltinLinkRegistry + source_v1 整合源复用(议题 2 + APX500 sequence 信号支持)
Worker:ClaudeB · 后端 (backend-csharp) + DSP (真值核查 + 可能扩展 source_v1) / 预计:0.8d ~ 1.5d / 优先级:P1 / 状态:dispatched 隔离:🧵 文件隔离(同 worktree 同 branch · 与 ADR-13 fork 1 + fork 3 + ADR-14 4 active + P0.UH12 文件路径完全正交)
🔍 触发与解锁链
| 触发 | 状态 | 影响 |
|---|---|---|
| ADR-AIOS-13 v1.0 accepted(2026-06-01 19:21) | ✅ user accept | 8 fork ready · 用户分批 start |
| 用户 6/2 09:53 拍板第二批 start fork 2 + 业务设计补充 | ✅ 09:53 原话 | source_v1 = player 引擎 · WAV 模式补漏 |
| ADR-13 fork 1(P5.UA13-realtime-session-service)已 dispatched | ✅ 6/1 19:30 ClaudeB | 文件正交可并行 |
| 真值核查 #2(subagent · 2026-06-01 18:25) | ✅ source_v1 已被拆分 · 整合源是否仍可用待 ClaudeB 二审 | 本 fork Step 1 必跑 |
→ 本 fork zombie 解锁:Phase 2 fork 5(P0.UA13-input-output-device-config-panel · 调 /api/builtin-links + signalConfig UI)。
任务定义(基于 ADR-AIOS-13 v1.0 §2.2 + §2.3 + §3.2 + §11 + 用户 6/2 业务补充)
新建 BuiltinLinkRegistry 单例 service · 注册 frozen 不可改 link 模板 · 同时核查并(必要时)修复/扩展 source_v1 整合源:
核心范围:
1. BuiltinLinkRegistry 单例(注册 builtin links · 不允许 user 修改 · 可扩展支持未来更多 builtin)
2. realtime-loopback.json preset(frozen · 3 module:source_v1 + channel_gain + sink · ADR §2.2 schema)
3. REST API:GET /api/builtin-links 列出 + GET /api/builtin-links/{id} 取 frozen JSON
4. 🚨 source_v1 真值核查 + 修复 + 双模式确认(用户 6/2 业务补充 · Step 1 必跑):
- ① 核查 dsp_algo/modules/source/source_v1.* 当前架构是否与 ChainBuilder/ModuleRegistry 兼容(用户原话:"每次加载的时候都会报错")
- ② 若加载失败 → 修复(优先级:不破坏拆分后的 source_sine/source_pink 等独立 source · 与现有 user project 兼容)
- ③ 确认 source_v1 内置 signal_generator 子模式覆盖范围:sine/pink/white/MLS/multitone/sweep(linear/log)/burst/silence
- ④ 确认 source_v1 是否含 file_player 子模式(WAV 回放)· 若无 → 新建 file_player 子模式(WAV 加载 + 循环/单次播放 + 起止位置 · 对应用户"wav 模式播放")
- ⑤ 输出对标 APX500 sequence 信号清单的覆盖率分析报告(commit body · 用户 6/2 原话直接引用)
5. Ximind 兼容性 5 项(ADR §11):自描述 JSON / description 字段 / recovery_hints[] / 审计日志 / 结构化 error
🚨 用户 6/2 09:53 业务补充铁律(必须在 prompt 内反映):
| 用户原话 | 实施动作 |
|---|---|
| "source_v1 模块架构可能和当前的架构不一致 · 每次加载的时候都会报错" | Step 1 grep + 实测 source_v1 是否能在 ChainBuilder 加载(写测试模拟加载) · 失败则修复 |
| "source_v1 = 音源播放的 player 引擎"(对标 APX500) | 文档化 source_v1 = signal_generator + file_player(WAV) + loopback_input 三子模式 |
| "需要播放的参考信号可能有很多种 · 各种不同的测量信号" | Step 4 列对标 APX500 sequence 的信号清单(THD: sine 单频 / Crossover: sweep / IMD: 双音 / SINAD: sine + 滤波 / 群延迟: chirp 等) |
| "当前 source 里面可能不能够完全满足" | 真值核查后输出"覆盖率分析"(满足 N/M)· 不满足部分走 wav 模式 |
| "如果是不满足的信号就用 wav 模式来进行播放" | source_v1 新增/扩展 file_player 子模式(WAV 加载 + 单次/循环播放 + 起止位置 + 采样率匹配) |
| "这样的功能设定是否能满足 APX500 sequence 信号设定要求" | commit body 输出"是否满足"分析 + 不满足项的后续 ADR-14 占位备案 |
不在本 fork 范围(留 fork 3/其他):
- ❌ 不实施 RealtimeSessionService(fork 1 范围 · Services/Realtime/)
- ❌ 不修改 AudioDeviceService.cs(fork 3 范围)
- ❌ 不写完整 APX500 sequence 执行引擎(留 ADR-AIOS-14 议题 6 · 本 fork 仅落 source_v1 双模式 + 信号清单覆盖率分析)
- ❌ 不实施 LinkService 加载 builtin 的具体逻辑(fork 1 RealtimeSessionService.StartAsync 内部调用 · 本 fork 仅暴露 IBuiltinLinkProvider 接口给 fork 1)
- ❌ 不动 contract-v1.0(realtime 走 v2 命名空间)
完整 prompt(直接复制粘贴 worker 终端)
[U-thread] P5.UA13-builtin-link-registry
[部门] 后端 (backend-csharp) + DSP (dsp_algo source_v1 真值核查 + 可能扩展) · 推荐 skill: dotnet-realtime-communication
[Worker CWD] d:/work/25_claude/workspace/AlgoDepartment/04_development/
[Occupies] P5.K-services-link(写 · 新建 Services/Link/BuiltinLinks/ 命名空间) + P6.K-dsp-source-v1(read 必跑 · 失败则写 · 真值核查后决策)
[隔离] 🧵 文件隔离 · 仅写:
- backend_csharp/Services/Link/BuiltinLinks/BuiltinLinkRegistry.cs(新建)
- backend_csharp/Services/Link/BuiltinLinks/IBuiltinLinkProvider.cs(新建)
- backend_csharp/Services/Link/BuiltinLinks/presets/realtime-loopback.json(新建 frozen)
- backend_csharp/Routes/BuiltinLinkApiRoutes.cs(新建)
- backend_csharp/Program.cs(扩展:注册 service + map 1 路由 · 行号正交 fork 1/3)
- backend_csharp/Tests/Services/Link/BuiltinLinkRegistryTests.cs(新建 xunit)
- dsp_algo/modules/source/source_v1.* (Step 1 真值核查 · 失败则修复 · 用户 6/2 业务补充 ④ 可能新建 file_player 子模式)
- dsp_algo/modules/source/CMakeLists.txt + module_registry_all.c (若 source_v1 修复需重新注册)
与 ADR-13 fork 1 (Services/Realtime/) + fork 3 (Services/Meter/AudioDeviceService.cs) + ADR-14 4 active (dsp_algo/framework + Services/Plugin/) + P0.UH12 (frontend_vue3/) 文件路径完全正交
[优先级] P1 · 0.8d ~ 1.5d · 解锁 Phase 2 fork 5
[ADR] d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-13-xitest-realtime-dual-mode.md
(必读 §2.2 BuiltinLinkRegistry + §2.3 source_v1 整合源复用 + §3.2 议题 2 业务行为契约 + §11 Ximind 兼容性)
[业务行为契约引用] ADR-13 §3.2(① 输入输出契约 + ② 收敛/成功判据 + ③ 失败回退 + ④ 用户操作流 + ⑤ e2e 真值)
[参考文档](绝对路径 · worker 必读)
- ADR-13:d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-13-xitest-realtime-dual-mode.md
· §2.2 BuiltinLinkRegistry 完整定义(realtime-loopback.json schema)
· §2.3 source_v1 整合源复用(本 fork 主战场 · ⚠️ 用户 6/2 业务补充强化)
· §3.2 议题 2 业务行为契约(5 子段)
· §11.5 RealtimeError 结构(code/message/human_readable_message/recovery_hints[])
- PCB:d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/processes/P_arch/ADR-AIOS-13/PROCESS.md
- 范式参考(已 zombie · ClaudeB 同部门标本):
· d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/done/P5.U-runtime-mode-refactor--b43c35a.md
(RuntimeTargetService 单例 + REST + LEGACY_MAP 范式 · 7 预定义清单 · 本 fork BuiltinLinkRegistry 模仿)
· d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/done/P5.U-meter-tap-multi-tool--48cf0ba.md
(MeterTapService 单例 + 7 toolKind 路由范式)
- 现状必读(主仓真值核查 · Step 1 必跑 · 用户 6/2 强调):
· dsp_algo/modules/source/source_v1.h + source_v1.c(全文必读 · 重点看 init/process/destroy 函数签名 + 与拆分后的 source_sine/source_pink 等是否冲突)
· dsp_algo/modules/source/CMakeLists.txt(看 source_v1 是否仍参与编译)
· dsp_algo/framework/module_registry_all.c(看 source_v1 是否被注册)
· dsp_algo/dll/dspalgo_dll.c(看 P/Invoke 导出是否含 source_v1 加载路径)
· backend_csharp/Services/Link/(看现有 LinkService 怎么加载 user link · 本 fork builtin link 加载逻辑参照)
· backend_csharp/Program.cs(看 service 注册 + map 路由风格 · 模仿现有 MeterDevApi 风格新增 BuiltinLinkApi 注册)
【背景】
ADR-AIOS-13 v1.0 已 accepted(2026-06-01 19:21)· 议题 2 决议:loopback 模式走 BuiltinLinkRegistry · 不动 user xilink project。
3 路 subagent 主仓真值核查(2026-06-01 18:25)发现:
① source_v1 已被拆分为各独立 source(source_sine / source_pink 等)
② 原版 source_v1 整合源是否仍保留 + 是否能 ChainBuilder 加载 → **本 fork Step 1 必跑核查**
③ 没有 BuiltinLinkRegistry 概念(本 fork 新建)
🚨 **用户 6/2 09:53 业务设计补充**(必须严守):
> "source_v1 模块架构可能和当前的架构不一致,每次加载的时候都会报错,需要看一下当前的架构中 sourcev1 是否可以正常使用;
> 另外关于这个 sourcev1 我们可以理解为是音源播放的 player 引擎,按照对标 APX500 的需求,需要播放的参考信号可能有很多种,各种不同的测量信号,
> 当前 source 里面可能不能够完全满足,如果是不满足的信号就用 wav 模式来进行播放;
> 这样的功能设定是否能满足 apx500 中的关于测量 sequence 中的信号设定要求"
→ source_v1 = 音源播放 player 引擎 · 双模式:① signal_generator(内置生成器 · sine/pink/MLS/sweep/multitone 等) + ② file_player(WAV 文件回放 · 不满足的信号走这条)
【执行步骤】(7 步 · 总 0.8d ~ 1.5d 视真值核查结果)
Step 1 · 🚨 source_v1 真值核查(必跑 · 0.2d · 用户 6/2 业务补充铁律)
- git status / git pull origin xistudio --no-rebase
- cat dsp_algo/modules/source/source_v1.h(全文 · 输出 schema:init 函数签名 / process 函数签名 / destroy 函数签名 / config 字段含哪些 kind)
- cat dsp_algo/modules/source/source_v1.c(全文 · 重点 init 是否会 NULL 指针 / process 是否会越界 / 是否含 signal_generator 与 file_player 双子模式)
- cat dsp_algo/modules/source/CMakeLists.txt | grep -i source_v1(看是否仍参与编译)
- grep -n "source_v1" dsp_algo/framework/module_registry_all.c(看是否被注册)
- grep -rn "source_v1" backend_csharp/(看 C# 端是否曾用过 source_v1 链路)
- 实测加载(用 ChainBuilder 单元测试或 sample 链 · 如有现成):
· 写最小 link "source_v1 + sink" · ChainBuilder.Build → Engine.Run 1 帧
· 如果加载报错 → 抓 stderr/exception 并归类:① symbol 未导出 / ② config schema 不兼容 / ③ ABI 字段缺失 / ④ 其他
- 输出真值核查结果到 commit message body(必含):
· source_v1 现状:符合 / 不符合 拆分架构(需修)
· 加载是否报错:Yes / No · 报错类型:??? · 修复建议:???
· signal_generator 子模式覆盖范围:[sine, pink, white, MLS, multitone, sweep, burst, silence](√/× 各项)
· file_player 子模式是否存在:Yes / No
· loopback_input 子模式是否存在:Yes / No
Step 2 · source_v1 修复或扩展(0.2 ~ 0.6d · 视 Step 1 结果)
- 路径 A(Step 1 报告 source_v1 现状良好 · 仅缺 file_player):
· 在 source_v1.c 加 file_player 子模式实现:
- config: { kind: "file_player", file_path: "...", loop: true|false, start_ms?, end_ms?, gain_db? }
- init:加载 WAV 文件(用 dr_wav.h 单头 lib 或现有 wav 工具)· 校验采样率/位深匹配(不匹配则重采样或报错)
- process:每帧 memcpy / 重采样后输出 · 到末尾根据 loop 决定 wrap 或 silence
- destroy:释放 WAV buffer
· 不破坏现有 signal_generator 子模式
· 加 sample wav(eg. 1kHz_sine_-20dbfs_1s.wav 占位)放在 dsp_algo/data/wav-presets/(如目录不存在新建)
- 路径 B(Step 1 报告 source_v1 加载报错 · 需修复架构):
· 修复点 1:确认 module_func_table 字段对齐 v7 ABI(参考 ADR-AIOS-14 §2.2 v7 ModuleFuncTable)
· 修复点 2:重新注册到 module_registry_all.c(若被遗漏)
· 修复点 3:确保 ChainBuilder 拓扑能识别 source_v1 + 拆分后 source(name 不冲突 · source_v1 = "整合 player 引擎" · source_sine 等 = "独立单功能源")
· 同步加 file_player 子模式(同路径 A)
- 路径 C(Step 1 报告 source_v1 已彻底废弃 · 拆分后无整合源):
· 不在本 fork 重建(超范围)· commit body 报告 · 起 ask_followup 给用户:
· "source_v1 已废弃 · 是否 ① 在本 fork 重建整合源(+ 0.5d)/ ② realtime-loopback 改用拆分后的 source_sine 一对一映射(0.2d 但限 sine 信号)/ ③ 起 ADR-13-R1 修订 §2.3 设计"
· 暂停本 fork 实施 · 等用户决策
Step 3 · 落 BuiltinLinkRegistry 单例(0.15d)
- backend_csharp/Services/Link/BuiltinLinks/IBuiltinLinkProvider.cs:
public interface IBuiltinLinkProvider
{
IReadOnlyList<BuiltinLinkInfo> ListAll();
BuiltinLinkInfo? GetById(string id);
Task<string> LoadFrozenJsonAsync(string id); // 返 raw JSON 字符串(供 RealtimeSessionService 加载)
}
public record BuiltinLinkInfo(
string Id, // eg. "realtime-loopback"
string Name, // eg. "Realtime Loopback (APX500 Style)"
string Type, // 常量 "builtin"
bool Frozen, // 永远 true
string Description, // ⭐ Ximind 自然语言描述
string[] SupportedSignalTypes, // ⭐ 用户 6/2 补充 · eg. ["sine","pink","wav-file","sweep"]
string[] SupportedToolKinds // eg. ["thd","transfer","crossover"]
);
- backend_csharp/Services/Link/BuiltinLinks/BuiltinLinkRegistry.cs:
· 实施 IBuiltinLinkProvider · 在 ctor 内扫 presets/*.json 加载 · 单例
· ListAll/GetById 直接返内存索引
· LoadFrozenJsonAsync(id) 返 frozen JSON 文本(给 RealtimeSessionService.StartAsync 内部加载用 · 本 fork 不实施加载逻辑)
· 错误处理:STRUCTURED RealtimeError(code=BUILTIN_LINK_NOT_FOUND/BUILTIN_LINK_LOAD_FAILED · recovery_hints)
Step 4 · 落 realtime-loopback.json preset + APX500 信号清单分析(0.15d · 用户 6/2 业务补充强化)
- backend_csharp/Services/Link/BuiltinLinks/presets/realtime-loopback.json:
{
"id": "realtime-loopback",
"name": "Realtime Loopback (APX500 Style)",
"type": "builtin",
"frozen": true,
"description": "APX500-style loopback link for THD/Crossover/Transfer measurements. source_v1 (signal_generator + file_player) → channel_gain → sink. Use signal_generator for built-in signals (sine/pink/MLS/sweep), use file_player for WAV files when built-in not satisfying.",
"supportedSignalTypes": ["sine","pink","white","mls","multitone","sweep_linear","sweep_log","burst","silence","wav-file"],
"supportedToolKinds": ["thd","thd-n","sinad","snr","transfer","crossover","frequency-response"],
"modules": [
{ "id": "src.0", "type": "source_v1", "config": { "kind": "signal_generator", "default": "sine_1khz_-20dbfs", "description": "Player engine · signal_generator subtype OR file_player subtype (WAV)" } },
{ "id": "gain.0", "type": "channel_gain", "config": { "channels": [0, 1], "gainDb": 0 } },
{ "id": "sink.0", "type": "sink", "config": { "device": "$user_selected_output" } }
],
"links": [
{ "from": "src.0:out", "to": "gain.0:in" },
{ "from": "gain.0:out", "to": "sink.0:in" }
]
}
- APX500 sequence 信号覆盖率分析(commit body 必填 · 用户 6/2 原话最后一句):
| APX500 测量 | 标准信号 | source_v1 子模式 | 是否满足 |
|---|---|---|:---:|
| THD / THD+N | 1kHz sine -20dBFS | signal_generator/sine | ??? |
| Crossover | 20Hz-20kHz sweep | signal_generator/sweep_log | ??? |
| Transfer / Group Delay | swept sine 或 MLS | signal_generator/mls or sweep | ??? |
| IMD (SMPTE) | 60Hz + 7kHz 双音 | signal_generator/multitone | ??? |
| SINAD | 1kHz sine + notch filter | signal_generator/sine + 后处理 | ??? |
| Burst | 1kHz burst 100ms | signal_generator/burst | ??? |
| 任意自定义信号 | WAV 文件 | file_player | ??? |
· ClaudeB 在 Step 1 真值核查后填表(√/×)· 不满足的信号建议走 file_player WAV 模式
· 若 ≥ 1 项 × 且 file_player 也不可用 → ask_followup 给用户决策
Step 5 · 落 BuiltinLinkApiRoutes(REST · 0.1d)
- backend_csharp/Routes/BuiltinLinkApiRoutes.cs:
public static class BuiltinLinkApiRoutes
{
public static void MapBuiltinLinkApi(this WebApplication app)
{
app.MapGet("/api/builtin-links", (IBuiltinLinkProvider svc) =>
Results.Ok(svc.ListAll()));
app.MapGet("/api/builtin-links/{id}", async (string id, IBuiltinLinkProvider svc) =>
{
var info = svc.GetById(id);
if (info is null) return Results.NotFound(new { code="BUILTIN_LINK_NOT_FOUND", message=$"Builtin link '{id}' not found", recoveryHints=new[]{"check id spelling","call /api/builtin-links to list available"} });
var json = await svc.LoadFrozenJsonAsync(id);
return Results.Text(json, "application/json");
});
}
}
- Program.cs 加 1 行 `app.MapBuiltinLinkApi();`(模仿 fork 1 的 MapRealtimeApi 风格 · 行号正交)
Step 6 · 落 xunit 测试(0.1d)
- backend_csharp/Tests/Services/Link/BuiltinLinkRegistryTests.cs · 6+ case:
· ListAll_Returns_AtLeastRealtimeLoopback
· GetById_RealtimeLoopback_ReturnsValidInfo(name + frozen=true + description 非空 + supportedSignalTypes ≥ 5 项)
· GetById_NonExistent_ReturnsNull
· LoadFrozenJsonAsync_RealtimeLoopback_ReturnsValidJson(可解析 · modules 有 3 项)
· LoadFrozenJsonAsync_RealtimeLoopback_ContainsSourceV1WithSignalGenerator(JSON path 校验)
· LoadFrozenJsonAsync_RealtimeLoopback_DescriptionContainsAPX500(Ximind 兼容 description 字段)
- 若 source_v1 修复/扩展(Step 2 路径 A 或 B)还需 dsp_algo 单元测试(用 framework 测试桩)
Step 7 · build + test + 手动 e2e + commit(0.1d)
- cd backend_csharp && dotnet build(零错误零警告 · 基线 217+(fork 1)/0)
- dotnet test(基线 +6 用例)
- 若 source_v1 修复:cd dsp_algo && cmake --build · 跑 framework 单元测试(基线参考)
- 手动 e2e:
· curl http://localhost:5000/api/builtin-links → 200 + JSON 数组 ≥ 1 项
· curl http://localhost:5000/api/builtin-links/realtime-loopback → 200 + 完整 frozen JSON · 含 source_v1 + channel_gain + sink 三 module
· curl http://localhost:5000/api/builtin-links/non-existent → 404 + 结构化 error(含 recovery_hints)
- git add backend_csharp/Services/Link/BuiltinLinks/ backend_csharp/Routes/BuiltinLinkApiRoutes.cs backend_csharp/Program.cs backend_csharp/Tests/Services/Link/
- 若 source_v1 修复:git add dsp_algo/modules/source/source_v1.* dsp_algo/modules/source/CMakeLists.txt dsp_algo/framework/module_registry_all.c
- git commit(三元组 trailer 见下) · git push origin xistudio
【验收】
形式合规:
- [ ] dotnet build 零错误零警告
- [ ] dotnet test 全绿(基线 +6 用例)
- [ ] 仅本 fork 范围文件修改(后端 + 必要时 dsp_algo source_v1 · 不动 fork 1/3 范围)
- [ ] 不动 contract-v1.0 / RealtimeSessionService(fork 1)/ AudioDeviceService(fork 3)/ ADR-14 fork 范围
- [ ] 0 引入新 NuGet 包(若 wav 解析必须用 dr_wav.h 单头 · 是 dsp_algo C 范围 · 不影响 NuGet)
业务行为契约(端到端真值 · 必跑 · ADR §3.2):
- [ ] curl GET /api/builtin-links → 200 + JSON 数组 ≥ 1 项 · 含 realtime-loopback
- [ ] curl GET /api/builtin-links/realtime-loopback → 200 + frozen JSON · modules 3 项 · description 含 "APX500" · supportedSignalTypes ≥ 5 项
- [ ] curl GET /api/builtin-links/non-existent → 404 + structured error(code/message/recoveryHints)
- [ ] source_v1 真值核查报告完整(Step 1 必跑 · commit body 输出)
- [ ] APX500 信号覆盖率分析表填全(Step 4 必跑 · commit body 输出 · 用户 6/2 原话第 5 问"是否满足"必答)
🚨 用户 6/2 业务补充验收(必跑):
- [ ] source_v1 加载实测:写最小 link "source_v1 + sink" · ChainBuilder 能正常 Build + Run · 不报错
- [ ] file_player 子模式落地:能加载 WAV · 能 1 帧输出非零 PCM · 循环/单次模式正确
- [ ] APX500 信号清单覆盖率 ≥ 6/7(必含 sine + sweep + multitone + WAV;burst/MLS/sweep_log 至少满足 1 项)
- [ ] 不满足项有 file_player WAV 模式兜底说明(commit body)
- [ ] 用户 6/2 第 5 问"是否满足 APX500 sequence 信号设定要求"输出明确答案(YES/PARTIAL/NO + 理由)
Ximind 兼容性(ADR §11 · 必跑):
- [ ] BuiltinLinkInfo.description 字段非空(自然语言描述用途)
- [ ] BuiltinLinkInfo.supportedSignalTypes 字段非空(大模型可知支持哪些信号)
- [ ] 字段名 camelCase 自描述(supportedSignalTypes 等不缩写)
- [ ] 错误返 structured(code + message + recoveryHints[])
【commit】
subject:`feat(P5.UA13-builtin-link-registry): BuiltinLinkRegistry + realtime-loopback preset + source_v1 真值核查/扩展 file_player · ADR-13 §2.2 §2.3 §3.2 §11`
trailer(必须精确 · 三元组):
[step=7/7] [pid=P5] [uid=UA13-builtin-link-registry] [occupies=P5.K-services-link+P6.K-dsp-source-v1]
[files=Services/Link/BuiltinLinks/IBuiltinLinkProvider.cs, Services/Link/BuiltinLinks/BuiltinLinkRegistry.cs, Services/Link/BuiltinLinks/presets/realtime-loopback.json, Routes/BuiltinLinkApiRoutes.cs, Program.cs, Tests/Services/Link/BuiltinLinkRegistryTests.cs, dsp_algo/modules/source/source_v1.* (if fixed), dsp_algo/framework/module_registry_all.c (if updated)]
[isolation] file(同 worktree 同 branch · 与 ADR-13 fork 1/3 + ADR-14 4 active + P0.UH12 文件路径完全正交)
[derived_from] ADR-AIOS-13 v1.0 §2.2 + §2.3 + §3.2 + §11 · 用户 6/2 09:53 业务设计补充
[truth-check] source_v1 现状=??? · 加载是否报错=??? · 修复路径=A/B/C · APX500 覆盖率=N/7 · file_player 是否落地=Yes/No(Step 1+4 输出真值)
[acceptance] curl /api/builtin-links 3 用例全过 · xunit 6+ 用例全绿 · source_v1 加载实测 + APX500 信号覆盖率分析报告
[ximind] 5 项检查清单全过(description + supportedSignalTypes + camelCase + structured error + 自描述字段名)
[user-business-补充] 用户 6/2 09:53 拍板 source_v1 = player 引擎(signal_generator + file_player 双模式)+ APX500 sequence 信号 · 不满足走 wav · 第 5 问答案=???
【禁止】(8 条红线)
1. ❌ 不修改 backend_csharp/Services/Realtime/(fork 1 范围)
2. ❌ 不修改 backend_csharp/Services/Meter/AudioDeviceService.cs(fork 3 范围)
3. ❌ 不实施完整 APX500 sequence 执行引擎(留 ADR-AIOS-14 议题 6 · 本 fork 仅 source_v1 双模式 + 信号清单分析)
4. ❌ 不破坏拆分后的 source_sine/source_pink 等独立 source(它们在 user project 下要继续可用)
5. ❌ 不动 contract-v1.0(realtime 走 v2 命名空间)
6. ❌ 不省略 Step 1 真值核查报告(commit body 必含 source_v1 实际状态 + 加载报错日志)
7. ❌ 不省略 Step 4 APX500 信号覆盖率分析(commit body 必含 7 行表格 + 用户第 5 问明确答案)
8. ❌ 不在 Step 2 路径 C(source_v1 已废弃)时强行重建 — 必须 ask_followup 给用户决策(超范围)
解锁链(本任务 zombie 后)
- ✅ Phase 2 fork 5 P0.UA13-input-output-device-config-panel(等本 fork + fork 1 zombie · 调 /api/builtin-links + signalConfig UI)
- ✅ Phase 3 fork 8 P_e2e.UA13-truth(议题 2 模式 B loopback e2e 验收 · THD < 1% 等)
- ✅ ADR-13 §3.2 议题 2 业务行为契约 ⑤ e2e 真值脚本可跑
解锁的下游设计决策(用户 6/2 业务补充触发)
- 🔥 若 source_v1 真值核查发现已废弃 → 触发 ADR-13-R1 修订 §2.3(建议)
- 🔥 若 APX500 信号清单覆盖率 < 5/7 → 触发 ADR-AIOS-15(候选 · 完整 APX sequence)优先级提升
- 🔥 file_player 子模式落地后 → fork 5 UI 设计可加 wav 文件选择器(LeftDock § Engine signalConfig 段)
风险评估
| 风险 | 缓解 |
|---|---|
| ⚠️ source_v1 加载报错(用户 6/2 明确警告) | Step 1 必跑真值核查 · 三路径决策(A 修复 / B 扩展 / C ask_followup)· 不强行实施 |
| ⚠️ source_v1 ABI 与 v7 ModuleFuncTable(ADR-14)不一致 | Step 2 路径 B 时与 ADR-14 fork 1(P6.UB14-load-dynamic-plugins-api)对齐 · 必要时同 commit 触发 |
| ⚠️ file_player 实施超 0.5d 工作量(WAV 解析 + 重采样 + loop 逻辑) | 用 dr_wav.h 单头 lib(< 50 行 C)· 重采样仅支持精确匹配(48kHz↔44.1kHz 不重采样 · 报错让用户提供匹配 WAV)· 工作量收敛 |
| ⚠️ APX500 信号清单覆盖率 < 5/7 | Step 4 报告 · 不满足项明确建议走 file_player WAV · ADR-15 候选 |
| ⚠️ 与 fork 1 同 PR 合并冲突 Program.cs | 三 fork 都改 Program.cs 但行号正交(本 fork 加 MapBuiltinLinkApi · fork 1 加 MapRealtimeApi/Ws · fork 3 不动)· git pull 自动合并 |
| ⚠️ presets/realtime-loopback.json 字段后续修订需求多 | Step 4 description + supportedSignalTypes 字段足够灵活 · 后续加字段不破坏 frozen 语义(append-only) |
历史
| 时间 | 事件 | hash |
|---|---|---|
| 2026-06-02 09:55 | dispatched · 用户 6/2 09:53 拍板第二批 start fork 2 + 业务设计补充(source_v1 = player 引擎 · signal_generator + file_player 双模式 · APX500 sequence 信号 · 不满足走 wav)· ClaudeB 0.8d ~ 1.5d 🧵 file 与 ADR-13 fork ⅓ + ADR-14 4 active + P0.UH12 文件正交 · ⚠️ Step 1 必跑 source_v1 真值核查 + Step 4 必填 APX500 信号覆盖率分析(commit body) | — |