P5.UH-runtime-target-data-fix · RuntimeTarget 7 预定义数据填充 hotfix(ADR-08 §议题① 验收失败修复)
Worker:ClaudeB · 后端 (backend-csharp) / 预计:0.5d / 优先级:P0 ⚠️ / 状态:dispatched 隔离:🧵 文件隔离(同 worktree 同 branch · 与 P5.UH-perf-real-data-fix 文件正交)
🔍 触发与解锁链
| 触发 | 状态 | 影响 |
|---|---|---|
| 用户验收 ADR-08 议题① 失败 | ✅ 2026-05-31 11:01 | 原话"下拉啥都没有 · 一直加载中" |
| parent zombie P5.U-runtime-mode-refactor | ✅ b43c35a | 仅声明 RuntimeTarget schema · 7 预定义条目可能未填 |
| 用户拍板方案 A 派 5 hotfix fork | ✅ 2026-05-31 11:02 | 本 fork 是 P0 优先(ClaudeA/B 并行 5 fork) |
→ 后端独立(纯 .NET) · 不修改 contract-v1.0 · 走 dev-api /api/runtime/available 已存在路由(填数据即可)
任务定义
修复 ADR-08 议题① "DrawerEngine RuntimeTarget 下拉一直加载中"。根因高概率是后端 RuntimeTargetService 仅声明 schema 但未填 7 个预定义 RuntimeTarget(GetAvailable() 返空数组 → 前端 loading 永不结束)。
核心范围:
1. 核查 RuntimeTargetService.cs 是否含 7 预定义条目(pc-native-0~3 + dsp-21489/21569/hexagon-v73)
2. 若缺 → 填齐 7 条目 + DspProfile 完整数据(对照 ADR §2.4 §3.2)
3. 验证 GET /api/runtime/available 返 200 + JSON 数组 7 项
4. 加 xunit 验收 case · 防止回归
完整 prompt(直接复制粘贴 worker 终端)
[U-thread] P5.UH-runtime-target-data-fix(alias: P5.U-runtime-target-data-fix)
[部门] 后端 (backend-csharp) · 推荐 skill: dotnet-realtime-communication
[Worker CWD] d:/work/25_claude/workspace/AlgoDepartment/04_development/
[Occupies] P5.K-services-runtime(写 · 填 RuntimeTargetService 7 预定义) + P5.K-api-routes(read · 确保 GET /api/runtime/available 真返 7 项)
[隔离] 🧵 文件隔离 · 仅写:
- backend_csharp/Services/Runtime/RuntimeTargetService.cs(填 _availableTargets 7 预定义 · 不动 schema/SwitchRuntimeAsync 等)
- backend_csharp/Tests/Services/Runtime/RuntimeTargetServiceTests.cs(加 case GetAvailable 返 7 项)
与 P5.UH-perf-real-data-fix 完全正交(本 hotfix 仅 Services/Runtime · perf 在 Services/Metrics)
[优先级] P0 · 0.5d ⚠️ · ADR-08 议题① 用户验收失败修复 · 主页面阻塞中
[ADR] d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-08-xilink-stage-ux.md(必读 §2.4 RuntimeTarget 完整定义 · 7 预定义清单)
[业务行为契约引用] ADR-08 §2.4 + 验收清单 C1-1~C1-7 · 用户原话"下拉啥都没有 · 一直加载中"
[参考文档](绝对路径)
- ADR-08:d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-08-xilink-stage-ux.md(§2.4 全文 · 重点 7 预定义 RuntimeTarget 完整字段)
- 验收清单:d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-08-acceptance-checklist.md(议题① C1-1~C1-7 + 4 种排查路径)
- parent zombie:d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/done/P5.U-runtime-mode-refactor--b43c35a.md(看其 step 3 规划的 7 预定义清单 · 本 fork 验证是否真填了)
- 现状必读:
· backend_csharp/Services/Runtime/RuntimeTargetService.cs(全文必读 · 重点看 GetAvailable() 是否返非空 + _availableTargets 字段是否含 7 条目)
· backend_csharp/Models/Runtime/RuntimeTarget.cs(record schema · 不动)
· backend_csharp/Models/Runtime/DspProfile.cs(DSP 子 record · 不动)
· backend_csharp/Controllers/Runtime/RuntimeController.cs(GET /api/runtime/available 路由 · 确认调 IRuntimeTargetService.GetAvailable 不是 stub)
· backend_csharp/Tests/Services/Runtime/RuntimeTargetServiceTests.cs(看现有 case · 是否覆盖 7 条目验收)
【背景】
ADR-08 accepted v1.1 · parent zombie `b43c35a` 完成了 RuntimeTargetService schema 重构(从 RuntimeModeService 64 行二态扩到枚举集合 + LEGACY_MAP + REST + WS)· 但用户 2026-05-31 11:01 实测验收原话:**"下拉啥都没有 · 一直加载中"**。
🚨 **真值核查根因猜测**(本 fork 第一步必须 grep 验证):
- 高概率 ① _availableTargets 字段为空数组 · 或仅含 1-2 条 stub · 不是 ADR §2.4 规定的 7 条
- 高概率 ② GetAvailable() 直接 return new List<RuntimeTarget>() · 没真填
- 低概率 ③ Controller 没注册 · 但 parent zombie 应已落
**本任务核心**(仅 0.5d · 不重构 · 仅填数据):
- ✅ grep `RuntimeTargetService.cs` 找 _availableTargets / GetAvailable · 看是否真有 7 条
- ✅ 若缺 → 按 ADR §2.4 完整填 7 条(pc-native-0~3 含 ThreadAffinity · dsp-21489/21569/hexagon-v73 含 DspProfile MIPS/Memory/SampleRate)
- ✅ Available 字段:pc-native-0~3 = true;dsp-* = false + UnavailableReason="MVP stub · DSP 模拟引擎留后续 fork"(让用户能看到全 7 项 · 灰显 DSP 部分)
- ✅ xunit 加 1-2 case 验证 GetAvailable() 返 7 项
- ❌ **不动** schema / SwitchRuntimeAsync / LEGACY_MAP / Controller / WS handler(parent zombie 已落 · 本 hotfix 仅补数据)
**ADR §2.4 7 预定义完整数据**(直接抄):
```csharp
private static readonly List<RuntimeTarget> _availableTargets = new()
{
new RuntimeTarget(
Id: "pc-native-0",
Kind: "pc-native",
Label: "PC Native · Core 0(主线程)",
ThreadAffinity: 0,
DspProfile: null,
Available: true,
UnavailableReason: null
),
new RuntimeTarget("pc-native-1", "pc-native", "PC Native · Core 1(辅线程 1)", 1, null, true, null),
new RuntimeTarget("pc-native-2", "pc-native", "PC Native · Core 2(辅线程 2)", 2, null, true, null),
new RuntimeTarget("pc-native-3", "pc-native", "PC Native · Core 3(辅线程 3)", 3, null, true, null),
new RuntimeTarget(
Id: "dsp-21489",
Kind: "dsp-simulated",
Label: "ADSP-21489 · 450 MIPS · 5 MB SRAM · 48kHz",
ThreadAffinity: null,
DspProfile: new DspProfile("ADSP-21489", 450, 5120, 48000),
Available: false,
UnavailableReason: "MVP stub · DSP 模拟引擎留 ADR §3.2 长期演进 #12"
),
new RuntimeTarget(
Id: "dsp-21569",
Kind: "dsp-simulated",
Label: "ADSP-21569 · 800 MIPS · 16 MB SRAM · 96kHz",
ThreadAffinity: null,
DspProfile: new DspProfile("ADSP-21569", 800, 16384, 96000),
Available: false,
UnavailableReason: "MVP stub · DSP 模拟引擎留 ADR §3.2 长期演进 #12"
),
new RuntimeTarget(
Id: "hexagon-v73",
Kind: "dsp-simulated",
Label: "Qualcomm Hexagon V73 · 2000 MIPS · 32 MB · 192kHz",
ThreadAffinity: null,
DspProfile: new DspProfile("Hexagon-V73", 2000, 32768, 192000),
Available: false,
UnavailableReason: "MVP stub · SDK 未集成"
),
};
【执行步骤】
Step 1 · 真值核查(必跑 · 0.05d) - git status / git pull origin xistudio --no-rebase - cat backend_csharp/Services/Runtime/RuntimeTargetService.cs(全文) - grep "_availableTargets|GetAvailable" backend_csharp/Services/Runtime/RuntimeTargetService.cs - grep "pc-native-0|pc-native-1|dsp-21489|hexagon-v73" backend_csharp/Services/Runtime/RuntimeTargetService.cs - 输出真值核查结果到 commit message body: · 现状 _availableTargets 含 N 条(N=?) · GetAvailable() 实际返回 M 条 · 是否需补 7 条预定义(若 N < 7 → 必须补)
Step 2 · 修补 _availableTargets(0.2d) - 编辑 backend_csharp/Services/Runtime/RuntimeTargetService.cs - 找到 _availableTargets 字段 · 替换为完整 7 条(数据见上文 §背景) - 不动 SwitchRuntimeAsync / GetCurrent / MapLegacyMode / MapToLegacyMode 等其他逻辑 - 不动 schema(RuntimeTarget / DspProfile record)
Step 3 · xunit 加验收 case(0.1d)
- 编辑 backend_csharp/Tests/Services/Runtime/RuntimeTargetServiceTests.cs
- 加 case GetAvailable_Returns7Targets_With4PcNativeAnd3DspSimulated:
· arrange:new RuntimeTargetService()
· act:var targets = service.GetAvailable()
· assert:targets.Count == 7
· assert:targets.Count(t => t.Kind == "pc-native") == 4
· assert:targets.Count(t => t.Kind == "dsp-simulated") == 3
· assert:targets.All(t => !string.IsNullOrEmpty(t.Id) && !string.IsNullOrEmpty(t.Label))
- 加 case GetAvailable_DspTargets_AreUnavailable_WithReason:
· 验证 dsp-* 三条 Available=false + UnavailableReason 非空
- 加 case GetAvailable_PcNativeTargets_HaveCorrectThreadAffinity:
· 验证 pc-native-N 的 ThreadAffinity == N(0/½/3)
Step 4 · build + test + 手动 e2e(0.1d) - cd backend_csharp - dotnet build(零错误零警告 · 基线参考 b43c35a) - dotnet test(基线 159/0 → 162/0 · +3 用例) - 手动 e2e: · 启动 backend(dotnet run) · curl http://localhost:5000/api/runtime/available · 应返 JSON 数组 7 项 · 字段完整(id/kind/label/threadAffinity/dspProfile/available/unavailableReason) · 浏览器 DevTools Network 也可验
Step 5 · commit + push(0.05d) - git add backend_csharp/Services/Runtime/RuntimeTargetService.cs \ backend_csharp/Tests/Services/Runtime/RuntimeTargetServiceTests.cs - git commit subject + trailer 见下 - git push origin xistudio
【验收】
形式合规: - [ ] dotnet build 零错误零警告 - [ ] dotnet test 全绿(基线 +3 用例 · 159 → 162) - [ ] 仅 2 文件修改(Services/Runtime/RuntimeTargetService.cs + Tests/.../RuntimeTargetServiceTests.cs) - [ ] 不动 schema(RuntimeTarget / DspProfile record) - [ ] 不动 SwitchRuntimeAsync / Controller / WS handler
业务行为契约(端到端真值 · 必跑):
- [ ] curl GET /api/runtime/available → 200 OK · JSON 数组 7 项
- [ ] 7 项中含 pc-native-0~3(4 项 · Available=true · ThreadAffinity=0~3)
- [ ] 7 项中含 dsp-21489 / dsp-21569 / hexagon-v73(3 项 · Available=false · UnavailableReason 非空)
- [ ] 每项都有完整字段(id/kind/label · DspProfile 在 dsp-* 上非 null)
- [ ] 用户回测 ADR-08 验收清单 C1-1~C1-7(本 fork zombie 后由用户执行)
【commit】
subject:fix(P5.UH-runtime-target-data-fix): populate 7 pre-defined RuntimeTargets · ADR-08 §2.4 hotfix · user acceptance C1-1 fix
trailer(必须精确): [step=5/5] [pid=P5] [uid=UH-runtime-target-data-fix] [occupies=P5.K-services-runtime+P5.K-api-routes(read)] [files=backend_csharp/Services/Runtime/RuntimeTargetService.cs, backend_csharp/Tests/Services/Runtime/RuntimeTargetServiceTests.cs] [isolation] file(同 worktree 同 branch · 与 P5.UH-perf-real-data-fix 文件正交) [derived_from] ADR-AIOS-08 §议题① 验收失败 · parent_zombie b43c35a [truth-check] _availableTargets 现状 N 条 → 修补到 7 条(pc-native-0~3 + dsp-21489/21569/hexagon-v73) [acceptance] curl /api/runtime/available 返 JSON 7 项 · 用户重跑 C1-1~C1-7
【禁止】 1. ❌ 不动 RuntimeTarget / DspProfile record schema(parent zombie b43c35a 已落 · 本 hotfix 仅填数据) 2. ❌ 不动 SwitchRuntimeAsync / GetCurrent / MapLegacyMode 等其他逻辑(零回归) 3. ❌ 不动 RuntimeController(parent zombie 已落 · 本 hotfix 仅确认能调通) 4. ❌ 不动 WS handler(runtime:get_available / runtime:switch · 同上) 5. ❌ 不删 [Obsolete] 的 RuntimeModeService(7 天宽限期未到) 6. ❌ 不引入新的 DSP 模拟数学逻辑(dsp-* 三条 Available=false · MVP stub) 7. ❌ 不跳手动 e2e curl 验证(必须看到 7 项 JSON · 不是只跑 dotnet test 就 commit) 8. ❌ 不动前端代码(P1 hotfix 由 ClaudeA 跑 · 本 fork 仅后端) 9. ❌ 不动 P5.UH-perf-real-data-fix 的文件区域(Services/Metrics 是它的) 10. ❌ 不省略三元组 trailer + truth-check 报告 ```
解锁链(本任务 zombie 后)
- ✅ 用户重跑 ADR-08 验收清单 §议题① C1-1~C1-7(应全过)
- ✅ DrawerEngine RuntimeTarget 下拉显示 7 项 · pc-native 4 项可选 · dsp-* 3 项灰显
- ✅ 配合 P1 前端验收(C1-5 切换不破坏链路 · C1-6 source 已删 PC/DSP 开关 · C1-7 LEGACY_MAP)
- ✅ 若仍有问题 → 启第二轮 hotfix(eg. WS handler 没注册等)
风险评估
| 风险 | 缓解 |
|---|---|
| ⚠️ 真值核查发现 _availableTargets 已含 7 条但前端仍 loading → 根因不在数据 | step 1 grep 后若发现已含 7 条 · 立即检查 Controller / WS handler · 必要时升级 fork 范围(commit message 报告) |
| ⚠️ DspProfile record 字段名与 ADR §2.4 不一致 | step 1 read DspProfile.cs · 字段对齐(MaxMips / MaxMemoryKB / SampleRateHz) |
| ⚠️ pc-native-N ThreadAffinity 与现实 CPU core 数不符 | MVP 写死 0~3 · 长期演进可改为运行时查询 Environment.ProcessorCount |
| ⚠️ 前端 loading 不解的根因可能多源(并发 fork 调度问题 / 网络问题等) | 本 fork 只修后端数据 · 前端验收若仍失败 · 用户告知后起 hotfix-2 修前端 useRuntimeTarget |
历史
| 时间 | 事件 | hash |
|---|---|---|
| 2026-05-31 11:05 | dispatched · 用户验收 ADR-08 议题① 失败 "下拉一直加载中" → 拍板派 5 hotfix fork(方案 A)· 本 fork P0 优先 · 0.5d ClaudeB | — |
| 2026-05-31 13:36 | zombie · ClaudeB 完成 · 真值核查 _availableTargets 现状 7 条 → 修补 labels/UnavailableReason 对齐 ADR §2.4(Thread→Core · 全角括号→半角 · DSP labels 加规格 · UnavailableReason 改中文 MVP stub)· 修改 2 文件:RuntimeTargetService.cs(20 行调整) + RuntimeTargetServiceTests.cs(新增 39 行 · +3 xunit case GetAvailable_Returns7Targets / DspTargets_Unavailable / PcNative_ThreadAffinity)· dotnet test 217/0 · curl /api/runtime/available 返 7 项 JSON · ADR-08 议题① 后端 hotfix 闭环 · 待用户重跑 C1-1~C1-7 | 40b73e5 |