## Parent [#85](https://github.com/wt159/SoundBridge/issues/85) — [Spec] 播放器状态与公开 API 契约实现计划。 ## What to build 裁定并落地规格 §6.3 的登记项:播放列表错误路径现在只看 `shouldAutoSkipOnError()`,解码路径还看 `info.action == ErrorAction::SkipTrack`;规格已裁定自动跳轨口径以 `ErrorAction::SkipTrack` 为准。**推荐统一到该口径**,但硬边界是不使坏输入 55 例 / 396 断言与自动跳轨既有用例变红;若两者冲突,保留现状、补注释并在票里写明理由,不悄悄改判据。 - 用错误码 × 回调计数的既有写法补一条可判定用例,锁住最终口径。 - 不重构播放列表逻辑(`doc/bad-input-spec.md` §12 界外)、不改 `shouldAutoSkipOnError()` 的 `count<=1` / `failures<count` 门槛(两处共用)。 ## Acceptance criteria - [ ] 两条路径的自动跳轨判据在票里明确记录为一致,或明确记录保留现状的完整理由 - [ ] 有一条可红可绿的用例锁住该口径 - [ ] 坏输入 55 例、`test_playlist_advance.cpp` 与错误相关用例全绿 ## Blocked by [#87](https://github.com/wt159/SoundBridge/issues/87)(GitHub 原生 blocked_by 已连接)。. **必须遵守(来自 spec、ADR 0002/0003/0004 与 `doc/bad-input-spec.md`):** - 七个控制入口保持 `void`;不新增错误码、不改 `onError` 签名、不新增状态机、不扩状态集合(对外仍 `Playing/Paused/Stopped` 三态)。 - 判据**不新造数值**:沿用 `max(1%,150ms)`、`r × good`、5pp、零容差差分、getter 与回调 ≤50ms、状态序列无相邻重复、每曲一次 duration。 - 坏输入 55 例 / 396 断言与覆盖度矩阵 15 行**一字不动**;14 个 `sdk_*` ctest 目标、TIMEOUT、`-j4`、快集 / 全量集划分全部不动。 - 新增用例若写文件必须带 pid(`-j4` 撞名假红的教训);线程契约用 `promise/future` 或轮询验证,不裸 sleep。 - 事实基线见 [#76](https://github.com/wt159/SoundBridge/issues/76) 的 `research/public-api-contract-facts` 分支;术语见 `GLOSSARY.md`。
Activity
fix: 播放列表错误路径统一自动跳轨口径(#90 / T05)
wt159 commentedon Nov 8, 2026
Resolution(2026-11-08,图外实现 effort #85 / PR #93)
规格 §6.3 登记项按推荐裁定:补
ErrorAction::SkipTrack检查,与handleDecodeError统一。AudioDeviceOpenFailed/AudioDeviceStartFailed是StopPlayback,不再靠自动跳轨绕过;DecodeInitFailed等仍是SkipTrack,坏输入 55 例与自动跳轨既有行为不变。不改
shouldAutoSkipOnError()的count<=1/failures<count门槛(两处共用)、不重构播放列表逻辑。test_error.cpp新增 action 表判据,把口径依赖的 12 个输入值钉成可红可绿;并明确PlaylistEmpty/ResampleInitFailed/ResampleFailed是「有码不承诺上报」(#76 实测零上报点),后两者 action 为 SkipTrack,将来新增上报点须先显式重审。已知缺口:设备错误不跳轨缺端到端判据(无可稳定注入的设备错误接缝),由生产链改动 + 代码审查 + 全量回归锁定。