# 持续迭代台账（长期优化 backlog）

> 建立：2026-09-09（第五十五波）｜owner 目标：**持续迭代优化**
> 定位：跨会话的迭代驱动台账。每一波只做**一个实质项**，做完登记；下一波从「候选池」取最高优先级，不凭记忆、不拍脑袋。

---

## 1. 迭代规则（每波强制）

1. **先现盘后动手**：跑 `node scripts/audit/iteration-scan.mjs`（或等价的 lint / check / 覆盖率 / 契约审计），用数据定目标。
2. **先核实再改代码**：审计脚本报「问题」时，必须回到源文件确认是真缺陷还是**误报 / 已裁决保留**（第五十四波教训：7 项问题全是误报）。
3. **查裁决文档**：动手前必读 `docs/review/*-alignment.md` 与 `round-2-问题清单.md`，避免把已裁决保留的差异当缺陷重构。
4. **最小改动 + 全仓回归**：改动后必须 `npm test`（基线 `--test-concurrency=4`，默认全核并发会误报 cancelled）+ 两个契约审计 + lint + check。
5. **一趟一提交**：提交信息写清「改了什么 / 为什么 / 验证结果」，推送到 `origin main`。
6. **登记**：本文件追加波次条目；当日 `.workbuddy/memory/YYYY-MM-DD.md` 追加摘要。

**红线（不得擅动）**：
- 案 A「完全同构」剩余项（mkv D1/D2/D3/D11/D4 = §7 Q1-Q5）——**待 owner 拍板**，D2 会退化 attach 换源重试能力。
- 任何单模块擅改冻结裁决项（`mkv-base-class-alignment.md` §8、`wav-base-class-alignment.md` §8）。

---

## 2. 驱动源（每波候选来自这里）

| 驱动 | 命令 | 产出 |
|---|---|---|
| 迭代扫描（聚合） | `node scripts/audit/iteration-scan.mjs` | 下一轮候选清单 |
| 分层覆盖率门禁 | `node scripts/audit/coverage-gate.mjs` | 逻辑层未达标文件 |
| 结构层契约审计 | `node scripts/audit/contract-2-4-audit.mjs` | §2.4 结构层问题（应为 0） |
| 运行时契约审计 | `node scripts/audit/runtime-2-4-audit.mjs` | 7 demuxer 运行时矩阵 |
| 风格检查 | `npm run lint` | 应为 0 警告 |
| 模块门槛 | `npm run check` | 16/16 模块达标 |
| 全仓测试 | `npm test` | 1142/1142，fail=0、cancelled=0（第六十一波基线） |

---

## 3. 覆盖率现状基线（2026-09-09，第五十五波实测）

全仓 `line 91.32% / branch 83.66% / funcs 88.60%`。低覆盖高度集中在**环境依赖层**（浏览器 API，Node 不可测）：

| 文件 | 行覆盖 | 未覆盖 | 分层 |
|---|---|---|---|
| `wav/src/player.js` | 13.2% | 283 | env（豁免） |
| `core/src/video-frame-renderer.js` | 24.8% | 233 | env（豁免） |
| `flac/src/player.js` | 38.0% | 103 | env（豁免） |
| `hls/src/player.js` | 40.1% | 343 | env（豁免） |
| `mp4/src/webcodecs-pipeline.js` | 40.7% | 127 | env（豁免） |
| `subtitle/src/renderer.js` | 40.8% | 170 | env（豁免） |
| `core/src/mse-helper.js` | 43.2% | 159 | env（豁免） |

**结论**：这些不是测试缺失，是环境限制。**不要为刷覆盖率给它们写假测试**；正确方向是
①分层门禁（已落地 `coverage-gate.mjs`）；②若确需验证，走真机 e2e（`docs/review/i3/`）。

### 第六十一波里程碑：逻辑层未达标文件清零

| 层 | 文件数 | 均值 | 门槛 | 状态 |
|---|---|---|---|---|
| core 逻辑层 | 20 | **96.3%**（第五十五波 94.3%） | 85% | ✓ |
| parser 层 | 123 | **95.3%**（第五十五波 93.7%） | 80% | ✓ |
| env 浏览器层 | 17 | 61.8% | 豁免（仅报告） | — |

自第五十五波建立门禁起，逐波清掉 8 个未达标文件：`rtsp/nal.js` 42.9% → `mp4/file-source.js`
56.7% → `subtitle/errors.js` 74.2% → `webtorrent/utils.js` 75% → `rtmp/flv-demuxer.js` 75.1%
→ `webtorrent/loader.js` 79% → `core/exp-golomb.js` 82.2% → `core/data-source.js` 84.8%。
全部为**真实补测**（先核实根因、再写断言），无一通过放宽阈值或写假测试达成。

---

## 4. 波次台账

| 波次 | 主题 | 关键产出 | 提交 |
|---|---|---|---|
| 50 | §2.4 契约对齐 | 结构层 + 运行时全 16 模块对齐；mkv/wav 补 initTimeoutMs 与事件双发 | `60419a7` 起 |
| 51 | AbortSignal | `core/src/abort.js`（raceAbort/throwIfAborted）；4 处 readSample 接可选 signal；修中断吞样本 / flac 游标丢帧 / wav ABORTED 误判 | `6cfd638` |
| 52 | 治理文档化 | `wav-base-class-alignment.md` 新建；flac 现状并入 mkv §2.4 | `8844813` |
| 53 | wav 案 C 子类化 | `WavDemuxer extends Demuxer`，删 MiniEmitter、解析体入 `_doOpen` | `b73a6a4` |
| 54 | 审计误报清零 + CI | 结构层问题 7→0（scope 修正 + DECIDED 白名单）；`npm test` 固化并发参数；`.github/workflows/ci.yml` | `7c9fc1b` |
| 55 | 分层覆盖率门禁 + 补测 | `coverage-gate.mjs`（env 豁免 / core 85% / parser 80%）接入 CI；`rtsp/src/nal.js` 专项补测 42.9%→达标；迭代台账建立 | `fa8ebe3` |
| 56 | 迭代扫描器 + 两项补测 | `iteration-scan.mjs` 聚合现盘（git/lint/check/双契约审计/覆盖率/backlog → 自动建议下一波）；`mp4/src/file-source.js` DOM stub 补测 56.7%→达标；`subtitle/src/errors.js` 构造器表驱动补测 74.2%→达标 | `077a33e` |
| 57 | webtorrent utils 补测 | `webtorrent/src/utils.js` 75%→达标（+15 例）；发现 `withTimeout` 未导出且零调用（死代码候选，待 owner 定夺） | `79135b3` |
| 58 | rtmp FLV 分支补测 | `rtmp/src/flv-demuxer.js` 75.1%→达标（+16 例）：AAC 轨、不支持 codec、未知 Tag 跳过、未配置前丢样本、tsExt/负 cts、PreviousTagSize 告警、魔数缺失、destroy 后写入 | `7e73f05` |
| 59 | webtorrent loader 补测 | `webtorrent/src/loader.js` 79%→达标（+16 例）：用 `module.registerHooks` 白名单拦截解决「Node 只支持 file/data import vs 安全白名单只放行 http(s)」的互斥，真实跑通 CDN 成功路径；含 data:/blob:/file: 安全过滤回归 | 本波 |
| 60 | core exp-golomb 分支补测 | `core/src/exp-golomb.js` 82.2%→达标（+7 例）：high profile scaling list 消费、chroma_format_idc=3(4:4:4)/0(mono) 的 CropUnitX/Y 分支、frame_mbs_only=0 高度翻倍、pic_order_cnt_type=1 循环、非 SPS PARSE_ERROR、stripEmulationPrevention、BitReader 复用 | 本波 |
| 61 | core data-source 补测（逻辑层清零） | `core/src/data-source.js` 84.8%→达标（+8 例）：`MemoryDataSource`/`BlobDataSource`/`asDataSource` 三个导出此前**零直接测试**；含 ArrayBuffer 入参、File 名回退、尾部截断 vs 越界、无 Blob 环境降级、鸭子类型 TypeError | `9c577f9` |
| 62 | README 工程化章节刷新 | 新增「质量门禁与工程化」章节（单仓库 monorepo / CI 五段 / 分层覆盖率门禁 / §2.4 双契约审计 / 迭代扫描器）+ 测试与覆盖率现状表（1142/1142 绿；core 96.3% / parser 95.3% / env 61.8% 豁免）；模块状态表脚注日期→2026-09-09 | `98e3af4` |
| 63 | withTimeout 死代码转正（owner「继续」授权） | 裁决=**导出**而非删除：`index.js` 导出 `withTimeout`（增量合规 §12.3）；`loader.js` 删自写 `raceTimeout` 改用 `withTimeout`（超时错误原被循环内 `catch{}` 吞掉，替换为零可观察差异，实为消费者转正）；新增 2 例超时分支回归（永不 settle 的 CDN 模块按 timeoutMs 放弃返回 null、超时后回退下一源）；全仓 1144/1144 | `8e89068` |
| 64 | README 效果演示 + 使用方式（owner 指出缺口） | 新增「效果演示」：playwright 驱动真实 Chrome 播放实拍——WebCodecs 主路线动图（bbb480_30s.ts + 15 步断言日志）+ MP4/MSE 实拍 + 演示站全景（`docs/demo/` 三件约 660KB）；新增「使用方式」四级（demo 体验 / createPlayer 集成 / 底层 Demuxer API / 真机 e2e）；修 mp4/demo 环境日志陈旧字段 `.available`→`.supported`（截图暴露） | `4d90c61` |
| 65 | README localhost 框架修正（owner 反馈） | §使用方式 1 补 clone→run→open 完整流程，localhost 改代码体并注明「本机地址非外网链接」；§e2e 如实注明素材不入库需自备；覆盖率计数 1142→1144 | `b44b219` |
| 66 | GitHub Pages 在线演示上线（owner 指令「自己弄」） | 通道：OAuth device flow（curl 全程走本机 VPN 代理 127.0.0.1:7897，绕开沙箱代理对 github.com 的封锁）→ token → API 开通 Pages（201）→ 构建 built → 站点 200。根 `index.html` 重定向演示站 + `.nojekyll`（`9d37879`）；README 顶部与使用方式 1 均加在线链接（`2ad56e2`）。在线地址：https://zhenghy-gh.github.io/pure-webcodecs-player/ | `2ad56e2` |

---

## 5. 候选池（下一波从这里取，按优先级）

> 每波完成后更新：已做项划掉并写入 §4。

### 已完成
- [x] **P1** 接入 CI：`coverage-gate.mjs` 已加进 `.github/workflows/ci.yml`（第五十五波）
- [x] **P1** `iteration-scan.mjs`：聚合扫描器已落地（第五十六波）
- [x] **P1** 补测 `mp4/src/file-source.js` 56.7% → 达标出列（第五十六波，+12 例）
- [x] **P2** 补测 `subtitle/src/errors.js` 74.2% → 达标出列（第五十六波，+26 例）
- [x] **P1** 补测 `webtorrent/src/utils.js` 75% → 达标出列（第五十七波，+15 例）
- [x] **P1** 补测 `rtmp/src/flv-demuxer.js` 75.1% → 达标出列（第五十八波，+16 例）
- [x] **P1** 补测 `webtorrent/src/loader.js` 79% → 达标出列（第五十九波，+16 例，`registerHooks` 白名单拦截）
- [x] **P1** 补测 `core/src/exp-golomb.js` 82.2% → 达标出列（第六十波，+7 例）
- [x] **P1** 补测 `core/src/data-source.js` 84.8% → 达标出列（第六十一波，+8 例）——**至此逻辑层（core+parser）未达标文件清零，`coverage-gate` exit 0**
- [x] **P2** README 刷新：补「质量门禁与工程化」章节 + 覆盖率现状表，反映第 50-61 波成果（第六十二波，`98e3af4`）
- [x] **P1** 死代码处置：`withTimeout` **导出**（owner「继续」授权，第六十三波）——`index.js` 增导出 + `loader.js` 删自写 `raceTimeout` 改用它（消费者转正，行为零差异）+ 2 例超时回归
- [x] **P2** 总览页 MODULES.status 陈旧修复（第七十波 `e7ff2eb`）：nav.js 16 模块 status 全部对齐 ok（core/mp4/mov/mkv/webtorrent/ts/flv/hls/cmaf/webrtc wip→ok，rtsp/rtmp na→ok）；线上 hub 验证徽章唯一 ["可用"]
- [x] **P2** 真机 e2e 回归脚本化（第七十一波）：新增 `scripts/e2e/demo-smoke.mjs`——playwright 驱动真实 Chrome 遍历 16 模块 demo 页 + hub，捕获 console error/pageerror + 资源 404（favicon/sourcemap 豁免良性），mp4/hls 用本地样本自动驱动播放并断言，全屏截图刷新 `docs/review/i3/*.png` 与 `docs/demo/demo-hub.png`；17/17 全 PASS、退出码 0。把 i3 手工验证固化成可重跑回归

- [x] **P2** 薄弱模块测试补强（第七十三~七十八波）：webrtc/wav/cmaf/ape/flac/mkv 共新增 23 个测试文件，全仓测试 1144 → **1385**（+241），全量全绿；过程中修复 mkv 两个真实缺陷（第七十二波）

### 待办（按优先级，下一波取 P1 第一条）
- [x] **P3** flv iso-bmff 剩余面（**第九十波 `7485e97` 已完成**，flv 63→89）。下一批：rtmp player/gateway 正向管线（需网关样本）、webvtt 渲染层
- [x] **P3** 信息性观察**已逐条核实完毕**（第一百零六波）——两项均**非缺陷，属有意设计**，已补测试固化：
  - ①`rendered` 先于 `firstframe`：**同一帧**先后派发是显式设计，且 `core/__tests__/core-pipeline-queue.test.js:180` 早已断言固化（期望 `[500000, 'first:500000', 300000, 400000]`）。语义上 `rendered` 是「每帧已绘制」逐帧事件、`firstframe` 是「首次出画」一次性里程碑，后者由前者内部触发，顺序必然如此。**改序会破坏已固化契约，不建议动**。
  - ②`_waitQueue` guard=64：核实为**有意防死锁阀**——队列持续满时最多让出 64 次即放弃（`core/src/pipeline-webcodecs.js:205`），与 `player.js:413` 的 4096 次轮询阀同构。注释「默认上限 8」指 `maxDecodeQueue`（背压**阈值**），guard 是放弃**上限**，二者是不同参数，并非注释不一致。此前 `_waitQueue` **零测试覆盖**，本波补 `core/__tests__/pipeline-backpressure.test.js`（9 例）固化含 guard 耗尽在内的全部行为。
- [x] **P3** webtorrent 手动选文件 API（**第九十三波 `18d1ec4` 已落地**）：player.selectFile(selector) 在 degraded 态调用，selector 四形态，错误码全显式
- [x] **P3** 重构收敛（audit-79 D，**第一百零七波 owner 点头后落地**）：`buildEsds`×2 收敛至 `core/src/esds.js`（hls 以参数透传保持 128000 码率字节级兼容，有等价回归）；`BitWriter`×2 收敛至 `core/src/bit-reader.js`（flac re-export，API 超集：writeBits/writeUE/writeSE/alignToByte/merge/finish/toUint8Array）；BitReader 4→2：ts/flv 的同源精简版删除、消费端迁移至 core BitReader（core 增 readFlag/readUE/readSE/alignByte 语义成员；ts aac.js 的 pos/bit 字段访问改 bitPosition；2 处 >32 位丢弃型读取改 skipBits）；**flac BitReader 刻意保留**（byteOffset+bitLimit 相对窗口构造域、错误文案受测试断言固化、FLAC 专属读法 readUnary/readBytes/readUtfCodedNumber，强并入会破坏既有契约，已在源码头登记理由）；删 mp4 box-builder 死导出 buildBtrt。全仓 2496/2496、lint 0、check 16/16、双契约审计 0
- [ ] **P3** env 层可测化（浏览器依赖层 61.8%）：引入 Playwright 跑 `player.js`/`renderer.js`/`mse-helper.js`，或维持豁免
  - **第一百零八波续作**（Fake globalThis 模式，非 Playwright）：flac/player.js 38.0→98.8%（智能装载 decodeAudioData 主路径/失败回退/无全局回退、createFlacPlayer 能力探测、WAV 封装字节级）；mp4/webcodecs-pipeline.js 40.6→97.2%（管线类 supported 三分支/start 双轨 pump/fromSampleIndex/decode 抛错捕获/背压让出/reset 中止/close 幂等）。env 层均分 79.3%→86.2%
  - **第一百零九波续作**：hls/player.js 40.1→94.1%（新增 `hls/__tests__/player-pipeline.test.js` +12 例，注入式替换 loader/mse/transmuxer + 真实 m3u8 解析 + mock timers：VOD 双轨/passthrough/EXT-X-MAP 去重、master 两级装载与 setLevel、stall 降档、直播轮询 sn 锚点、_buildReloadUrl、append 失败重试、autoplay guard、destroy 幂等）。**修复 2 个真实缺陷**：①`computeResumeIndexBySn` 未导入——直播轮询与切档锚点续播一进 `computeResumeIndexBySn` 即抛 ReferenceError 被伪装成 network 错误（此前测试只直测 utils 版函数，从未经 player 走到该分支）；②`_loadMediaPlaylist` 不更新 `playlistUrl`——直播中 ABR 切档后轮询仍 reload 旧档位清单。env 层均分 86.2%→89.4%
  - **第一百一十波收官**：hls/mse-controller.js 53.0→97.3%（新增 `hls/__tests__/mse-controller.test.js` +14 例，Fake MediaSource/SourceBuffer/URL 注入 globalThis：attach 双构造器与 sourceerror、addSourceBuffer 校验链、append 队列串行化/同步 QuotaExceeded 原样上抛/error 事件配额分类（≥30 段→裁剪回调+DECODE_ERROR，SB 已移除→普通错误）/失败不阻塞后续、remove abort 语义、trim 保留窗口（左外/右外整段删、部分重叠留、NaN 播放点空操作）、getBuffered 安全空数组、currentBufferSeconds 视频→音频回退链与 0.5s 容差、finalize duration 防御、endOfStream drain 先行与非 open 幂等、destroy 全链与幂等）。env 层均分 89.4%→**92.0%**，浏览器依赖层可测化系列收口
  - **第一百一十一波续作（wav 调度层 + 修复首播断流缺陷）**：wav/player.js 69.9→**100%**（新增 `wav/__tests__/wav-player-smart.test.js` +9 例，Fake WebAudio（AudioContext/AudioWorkletNode/Blob/URL 注入 globalThis）+ node:test mock timers 驱动真实推送循环：首播循环存活至 eof、暂停恢复续启不重复装载、ended 重播 flush 后单次预填充、播放中 seek 游标采纳续推、高水位节流推迟/回落恢复、progress/overflow/underrun/ended 上行消息全分支、ensureGraph addModule→revoke 与初值自动化、stop 幂等与重建、suspended resume）。**修复 1 个用户可感真实缺陷（wav/src/player.js）**：`play()` 中 `#prefill` 在 `state==='ready'` 时执行，而推送循环 `pushNext` 守卫要求 `state==='playing'`——循环在预填充阶段即自灭，**首播播完 8192 帧（~170ms）后永久断流**（underrun 静音、eof 永不发出、`ended` 永不触发），暂停恢复同样无人续推。修复=先置 playing 再装载 + ended/paused 走 `#maybePushRest` 续启而非重复预填充；配套 `#maybePushRest` 改「已推送仅更新游标」（旧循环下一跳自动采纳 seek 新位置），并删除 `seek()` 内无条件 `#pushGen++`（其与游标采纳叠加会在播放中 seek 后杀死循环）。WriteTracker 断言各分段 [a,b) 连续无重叠无缝隙。env 层均分 92.1%→**93.7%**
  - **第一百一十二波续作（core 音频输出契约实现全链）**：core/audio-worklet-player.js 63.7→**99.3%**（扩展 `core/__tests__/core-audio-worklet-env.test.js` +7 例，Fake WebAudio 注入：init 装载链（AudioContext 仅透传 sampleRate/addModule/节点连线/ready 事件/重复 init 幂等）、push 未初始化 STATE_ERROR 与空数据早退及 Transferable 列表、play/pause/resume 状态机（suspended 触发 resume→resumed 事件、锚点与 startedAt、暂停回落已消费帧时钟）、currentTimeSec 三态（无 ctx/非 playing/playing）与 currentTimeUs 整数 µs 主钟（契约 §7）、worklet 上行 stats 驱动 progress（值不变不重发）与 underrun 累计广播及 default 静默、setVolume 钳制、clearBuffer 复位镜像与锚点、destroy 全链幂等（disconnect/close/revoke/清引用/removeAllListeners）、createAudioOutput channels 定稿参数与 channelCount 兼容别名等价）。env 层均分 93.7%→**95.8%**
  - **第一百一十三波续作（CMAF WebCodecs 直解路线）**：cmaf/webcodecs.js 68.2→**100%**（新增 `cmaf/__tests__/cmaf-webcodecs-env.test.js` +8 例，Fake VideoDecoder/AudioDecoder/EncodedVideoChunk 注入 globalThis 与 window 载体、hls fMP4 构造器程序化生成真实 init/chunk：open 双轨配置推导（avc1.PPCCLL/ASC AOT·采样率·声道推导）与 configure/timescale 落位、isConfigSupported 拒绝→NOT_SUPPORTED 不实例化解码器、appendChunk 分轨分发与 key/delta 及 ticks→µs 边界换算、trackId===1 视频启发式（非 1 轨一律回退音频解码器，含未知轨，以断言固化现行为）、decode 抛错逐样本隔离不中断、close flush→close/closed 态跳过/无解码器安全/清引用、output·error 回调连线）。env 层均分 95.8%→**97.7%**
  - **第一百一十四波（core 编排层 load/默认管线/泵错误路径补测）**：core/player.js 91.6→**99.7%**（全量口径 641/643；新增 `core/__tests__/core-player-load-defaults.test.js` +14 例：detectForMedia 默认清单∪媒体实际 codec 深探测（含无 codec 轨跳过）；默认管线工厂三态——hasWebCodecsCtor→WebCodecsPipeline、hasMseCtor→MsePipeline、皆无→pipeline=null 仍可 load；输入形态分发字符串 URL→demuxerFactory(String)、Blob→BlobDataSource、非法 input→STATE_ERROR；load 重入复用同一装载；caps 深探测期间销毁→ABORTED 且 demuxer 回收、管线工厂迟到成功→ABORTED 且 destroyLate 回收、管线工厂当前代失败→SOURCE_ERROR 且 demuxer 清理；playing 中切轨成功→trackchange+新泵续流；seeking 中 play 拒绝；预缓冲/泵循环 readSample 抛错→error 态+buffering(false) 收尾/不派发 ended；buffered 合成区间与 durationUs=null）。无缺陷发现。env 层均分 97.7%→**98.0%**。全仓 2573/2573（+14）、lint 485 文件、check 16/16、双契约审计 PASS
  - **第一百一十五波（hls player 残余分支补测）**：hls/player.js 94.1→**98.78%**（567/574；新增 `hls/__tests__/player-gaps.test.js` +9 例，承接 player-pipeline 替身基建 + 门控 loader：master→media 两级装载失败 _fail+rethrow、缓冲已满 bufferfull 定时器暂缓与恢复、AES-128 EXT-X-KEY assertSupported/decryptSegment 按 sn 解密链路、ABR reportLoad 一次性回调触发切档重载（sn 锚点衔接）、passthrough+仅音频 CODECS→_audioOnlyHint 固化且只建音频 SB、直播 trim 失败 fire-and-forget 静默、自动播放策略拦截不中断流水线、直播轮询失败 non-fatal error 且下一轮自愈按 sn 锚点衔接窗口推进、无 video 引用时 play/pause 空操作安全）。**发现疑似不可达防御分支 2 处（登记不删，待 owner 裁决）**：`hls/src/player.js:245-250`（EXT-X-MAP 兜底建 SB——`_ensureSourceBuffers` 保证调用后至少存在一个 SB，前置 `!video && !audio && !_audioOnlyHint` 恒 false）与 `:362`（`_audioOnlyHint` 置位但 codecs 全空——hint 置位路径必有 audio codec，现有路径矛盾）。env 层均分 98.0%→**98.47%**。全仓 2582/2582（+9）、lint 486 文件、check 16/16、双契约审计 PASS
  - **第一百一十六波（SPS 深分支 + b64 双端回退补测）**：flv/codec-info.js 83.1→**100%**（201/201；新增 `flv/__tests__/codec-info-sps.test.js` +11 例，core BitWriter 程序化构造 SPS 位流、构造器字段序与解析器读取序互为镜像：H264 高档位 profile=100 chroma=1/3、chroma=3+scaling matrix 12 组列表（skipScalingList 16/64 两种尺寸全消费，位序错位即宽高断言失败）、pocType 0/1 分支、frame_mbs_only=0 高度 ×2、截断 catch 返 null；HEVC SPS 1920x1080、conformance window 四 ue 消费、chroma=3、多层流返 null、截断）。rtsp/b64.js 80.0→**100%**（30/30；`rtsp-sdp-edge.test.js` 追加 +5 例，withGlobals delete/define atob/btoa/Buffer 驱动双端回退：无 atob→Buffer 解码、双缺失抛错、无 atob→Buffer 编码、有 atob 无 btoa→Buffer 编码、双缺失抛错，Buffer 端到端闭环）。全仓 2599/2599（+17）、lint 487 文件、check 16/16、双契约审计 PASS
  - **第一百一十七波（ts nalu 深分支补测）**：ts/nalu.js 87.9→**100%**（379/379；`ts/__tests__/nalu.test.js` 追加 +9 例，复用第一百一十六波的 BitWriter SPS 构造器（与 flv 同构镜像互验）：NALU 类型判定四助手（h264/hevc nal type、IDR/IRAP 关键帧边界 16/21/外侧）、H264 高档位 profile=100 chroma=1/3、chroma=3+scaling matrix 12 组列表（skipScalingList 16/64）、pocType 0/1、截断 catch 返 null、HEVC conformance window 四 ue 消费、parseHevcSpsConfig 色深/嵌套/conformance 全字段与多层流抛错降级 null/截断 null）。无缺陷发现。全仓 2608/2608（+9）、lint 487 文件、check 16/16、双契约审计 PASS
  - **第一百一十八波（flv demuxer 残余分支补测）**：flv/flv-demuxer.js 90.2→**97.72%**（601/615；新增 `flv/__tests__/flv-demuxer-gaps.test.js` +20 例：probe 防御性 catch、非法数据源 STATE_ERROR、ChunkSource 垃圾/非法 avcC/非法 ASC 序列头降级 error 事件、open 后 onMetaData 回填 durationUs/seekable、泵 EOF 四形态（size 用尽/读取抛错/空数据/短读）与解析器抛错、迭代器内泵（>64KB 文件逼出 open 首泵仅拿配置）、ChunkSource waiter 交付、push 垃圾吞错、start() pause/resume 25ms 循环、工厂 fetch 失败/404/成功 + Blob/DataSource sniff 三入口）。**无产品缺陷**；固化两条时序要点：①`d.open()` 内部先 await source.open?.() 让出一拍后才注册 complete/轨道监听，ChunkSource 测试必须先发起 open 等 setImmediate 再喂数据（否则事件循环排空、node:test 级联取消）；②泵 read 契约「返回 < want 即 EOF」，小步读源须按 want 截断而非恒返 64B。全仓 2628/2628（+20）、lint 488 文件、check 16/16、双契约审计 PASS
  - **第一百一十九波（rtsp H265 分片容错 + 出口委托补测）**：rtsp/depacketize-h265.js 86.2→**100%**（123/123；新增 `rtsp/__tests__/depacketize-h265-gaps.test.js` +5 例：reset() 清在途 FU/缓冲/序号水位、乱序过期 RTP 包静默丢弃不污染 AU、序号跳空 lost=跳空数-1、FU 载荷<3 中止、FU 不连续（单 NAL 插入/错序续片）→ #abortFu 的 fuDropped 计数且错序续片整体丢弃不产生 NAL）。ts/emitter.js 90.2→**100%**（61/61；新增 `ts/__tests__/emitter-edge.test.js` +3 例：off() 精确移除与无集合空操作、监听器抛错转发 error 不打断后续监听、error 处理器自身抛错降级 console.error 不递归，mock.method 捕获）。flv/index.js 83.3→**95.83%**（46/48；flv-demuxer-gaps.test.js 追加 +2 例：index.probe 委托嗅探、index.createDemuxer 工厂委托全链路；残余 2 行为 probe try/catch 防御分支，主类 probe 本身不抛、公共路径不可达，登记不硬造）。无产品缺陷。全仓 2638/2638（+10）、lint 490 文件、check 16/16、双契约审计 PASS
  - **第一百二十波（core HTTP Range 源 + hls 转封装适配层补测）**：core/http-range-source.js 89.9→**99.03%**（206/208；新增 `core/__tests__/http-range-gaps.test.js` +9 例：无 fetch 环境 → SOURCE_ERROR 非 TypeError、open 退路两类失败（无 Content-Range / 总长不可解析）、探测响应 body.cancel 抛错吞并且 open 成功、read 越界（offset≥size 与 <0）、Range 请求非 206/200、服务器无视 Range 返 200（start>0 抛错且 body 被取消 / start=0 直接截取可用）、206 短响应未到文件尾 → SOURCE_ERROR）。hls/transmuxer.js 87.8→**98.13%**（105/107；新增 `hls/__tests__/transmuxer-gaps.test.js` +2 例：isInit 无条件直通（即便字节形似 TS）、真实 TS 分片（assembleTs adts 双轨）经 process → transmuxed 双轨 codecs/init·media 段、reset/destroy 后 impl 重建可继续转封装；残余 2 行为 tsAvailable 动态 import 失败 catch，模块图完整时不可达，登记不硬造）。无产品缺陷。全仓 2649/2649（+11）、lint 492 文件、check 16/16、双契约审计 PASS
  - **第一百二十一波（core registry 自动选路 + ts 出口委托补测）**：core/registry.js 91.7→**100%**（145/145；新增 `core/__tests__/registry-gaps.test.js` +5 例：createDemuxerAuto detail 聚合单模块嗅探异常记 0、探测命中容器名无注册模块 → PROBE_FAILED 携带 hit（probe 返回 container 与注册名解耦的别名漂移场景）、detectFromUrl 无 fetch / 头请求非 2xx/206 / body.cancel 同步抛错吞并 / 内容不可识别）。ts/index.js 88.4→**97.1%**（67/69；新增 `ts/__tests__/index-delegates.test.js` +2 例：index.probe 委托嗅探、index.createDemuxer 工厂委托全链路；残余 2 行为 probe try/catch 防御分支，与 flv 同型，登记不硬造）。无产品缺陷。全仓 2656/2656（+7）、lint 494 文件、check 16/16、双契约审计 PASS
  - **第一百二十二波（hls ChunkSource 出口补测）**：hls/data-source.js 89.5→**100%**（162/162；新增 `hls/__tests__/data-source-gaps.test.js` +4 例：defaultFetchImpl 无 fetch → notSupported 注入提示与全局 fetch 兜底全链、EXT-X-MAP init 分片先行入 pendingInit（URI 经清单基准解析为绝对地址）且 init 不进 write 通道、detectContainer fMP4（styp 头）/unknown 分支、close() 语义=不再启动后续分片（在途分片仍会完成，onEnd 恰一次）。无产品缺陷。全仓 2660/2660（+4）、lint 495 文件、check 16/16、双契约审计 PASS
  - **第一百二十三波（hls 解密器 + mp4 出口 + flv emitter 残余分支补测）**：hls/decrypter.js 93.1→**100%**（202/202；新增 `hls/__tests__/decrypter-gaps.test.js` +6 例：defaultKeyLoader 三路径（无 fetch → NOT_SUPPORTED 注入提示 / 非 2xx → SOURCE_ERROR 携带状态码 / 成功返回并导入 CryptoKey）、_decryptSoftware 直接单测（分片长度非 16 倍数 → PARSE_ERROR / 坏密钥 expandKey128 抛错 → DECODE_ERROR 且 cause 透传主路径错误）、destroy() 清空密钥缓存后 keyLoader 重新触发）。mp4/index.js 92.0→**100%**（50/50；新增 `mp4/__tests__/index-gaps.test.js` +2 例：源 read 抛错 → head=null 归一为 PROBE_FAILED 而非原错误外泄、垃圾字节 PROBE_FAILED）。flv/emitter.js 93.8→**100%**（48/48；新增 `flv/__tests__/emitter-edge.test.js` +2 例：监听器抛错转发 error 事件且后续监听器不受影响、'error' 处理器自身抛错降级 console.error 不递归，与 ts/src 同构镜像）。无产品缺陷。全仓 2670/2670（+10）、lint 498 文件、check 16/16、双契约审计 PASS
  - **第一百二十四波（wav/flac demuxer 残余分支补测）**：wav/demuxer.js 93.0→**98.76%**（240/243；新增 `wav/__tests__/demuxer-gaps.test.js` +6 例：probe(null) 防御性 catch、未 parseInit getBufferedRanges 空区间、seek 两级 STATE_ERROR（缺头部 / destroy 后头部已有但态 destroyed）、samples 迭代中源读取抛错 → error 态 + error 事件、迭代中 abort → ABORTED 上抛但不置 error 态不进 error 事件面；残余 3 行为 seek 体纯数学计算 catch，公共路径不可达，登记不硬造）。flac/demuxer.js 94.0→**99.29%**（280/282；新增 `flac/__tests__/demuxer-gaps.test.js` +6 例：probe(null) 防御性 catch、未 parseInit getBufferedRanges 空区间、PADDING 块体 70000B 逼出首读 64KB 块越界 → 按 cap 全量重读解析成功（audioOffset 精确断言）、durationUs 有效全区间、destroy 后 seek STATE_ERROR、seek 中建索引读取抛错 → error 态透传原错误；残余 2 行为 _parseInit `catch(e){throw e}` 直通，不可达，登记不硬造）。无产品缺陷。全仓 2682/2682（+12）、lint 500 文件、check 16/16、双契约审计 PASS
  - **第一百二十五波（core ByteStream/ByteWriter + mp4 box-builder 残余分支补测）**：core/byte-stream.js 94.7→**100%**（397/397；新增 `core/__tests__/byte-stream-gaps.test.js` +8 例：Uint8Array 窗口越界 sourceError、ArrayBufferView 子窗口尊重 byteOffset/byteLength（小端内存字节大端重解释）、非法类型 sourceError、position setter 委托 seek、rewind 回退、readSlice overflow、readFixed8_8/readFixed2_30 定点语义、writeF32 大端往返、patchU32 越界）。mp4/box-builder.js 96.1→**98.17%**（484/493；新增 `mp4/__tests__/box-builder-gaps.test.js` +4 例：buildFree 零填充尺寸语义、buildHvcC 载荷直通、buildStsd hvc1 分支（hvc1 entry + hvcC 子盒 + 宽高 U16）、未知 sampleEntryType → notSupported；残余 9 行为 box largesize 分支（需 >4GB body）与 findTrunDataOffset 无 trun 抛错（内部不可达），登记不硬造）。无产品缺陷。全仓 2694/2694（+12）、lint 502 文件、check 16/16、双契约审计 PASS
  - **第一百二十六波（core Demuxer 基类残余分支补测）**：core/demuxer.js 94.4→**100%**（448/448；新增 `core/__tests__/demuxer-base-gaps.test.js` +11 例，双轨 toy demuxer：_transition 非法迁移 STATE_ERROR、_transitionSafe 终态吞错、无 source open 提示传参、未实现 _doOpen/_createTrackIterator 抛错指明类名、基类默认 _doSeek → SEEK_UNSUPPORTED、attach 仅限 open 前、seek 负数/NaN/Infinity STATE_ERROR、直播暂停 readSample 照常返回样本并派发 sample 事件（缓冲语义固化）、destroy 时 source.close 抛错吞并且 end(aborted) 照发、getTracks(type) 过滤与 getTrack(id) 未命中 null）。无产品缺陷。全仓 2705/2705（+11）、lint 503 文件、check 16/16、双契约审计 PASS
  - **第一百二十七波（mp4 demuxer/box-parser 残余分支补测）**：mp4/box-parser.js 97.2→**100%**（636/636）；mp4/demuxer.js 96.0→**99.36%**（623/627；新增 `mp4/__tests__/demuxer-gaps.test.js` +15 例：probe wide 0.5 与其余顶层 box 0.82、无 moov PARSE_ERROR 且 destroyed+error 事件、顶层 largesize（size=1+u64）扫描与读样本、mdat size=0 延伸到文件尾、截断 largesize 头 PARSE_ERROR、enca 加密 entry NOT_SUPPORTED、hvc1 轨 description/codec 取自 hvcC、moof 后无 mdat PARSE_ERROR、分片 seek 关键帧二分+resumeIndex 续读、双轨渐进 seek 其余轨 _locateResumeIndex、expandSampleTable stsc 首条目晚于全部 chunk 兜底 0→表不一致、parseTkhd version=1 u64 布局、parseMvex mehd v1 u64、parseBoxByType 视觉 entry 分派与未知 null、parseSampleEntry 子 box 全失败重抛）。残余 4 行登记不硬造：probe catch 84-86 防御分支（Uint8Array 索引不可抛，与 flac probe 同型）、169-170 `const boxes/let pos` 为 c8 行归属伪影（while 循环已覆盖、直接调用 _scanTopLevel 实验验证仍不翻转）。无产品缺陷。全仓 2720/2720（+15）、lint 504 文件、check 16/16、双契约审计 PASS
  - **第一百二十八波（ts-demuxer 残余分支补测 + 修复休眠缺陷 seekUnsupportedTs）**：ts-demuxer.js 90.5→**99.25%**（532/536；新增 `ts/__tests__/ts-demuxer-gaps.test.js` +15 例：_normalizeSource Blob→BlobDataSource 打开读样本 / 非法源 42→STATE_ERROR、_feed 引擎抛错转 error 事件不打断循环、engine 'error' 透传、chunk 模式全流程（readSample 队列空挂入 _waiters 405、参数集 PES 亦产样本、AU 惰性出样由下一 PES 冲出、音频轨补齐刷进 MediaInfo、end 后 flush 回填 durationUs=67000/视频轨 66667、flush 冲出末 AU 后 EOS null）、泵失败三形态（0x47 无 PSI EOF / read 抛错 / 空读 → 同一 PARSE_ERROR 面）、start() pause 冻结轮询与 resume 恢复、start() 消费循环 readSample 抛错→error、_doSeek 直调 SEEK_UNSUPPORTED+getBufferedRanges 恒空、工厂 fetch ok/404 PROBE_FAILED/Blob slice 路径/非法源兜底）。**修复 1 处休眠缺陷**：ts-demuxer.js:473 `seekUnsupportedTs` 未定义标识符（公共 API 因 seekable=false 在基类短路不可达，但 _doSeek 契约钩子直调即 ReferenceError）→ 改为已导入的 `seekUnsupported`。残余 6 行登记不硬造：demuxer probe catch 68-69、308-309 `_waitForTracks`（分析确认不可达：_pumpOnce 返回 false 的全部路径均先置 _sourceEof，304 分支必走 306 抛错）、engine 三处兜底 catch 196-197/400-401/555-556（包解析/PSI/HEVC hvcC 构建防御）。全仓 2735/2735（+15）、lint 505 文件、check 16/16、双契约审计 PASS
  - **第一百二十九波（gateway ws-server 残余分支补测 + 修复 Buffer.constants 缺陷）**：samples/gateway/ws-server.js 80.7→**98.75%**（395/400；新增 `samples/gateway/__tests__/ws-server-gaps.test.js` +22 例：encodeFrame 64bit 扩展长度往返、FrameDecoder ping/pong 控制帧与未知 opcode 忽略、分片重组（文本/二进制 fin=0 首片 + CONT fin=1 收束、首片不上报）、未掩码负载拷贝脱离底层 buffer、64bit 声明超 MAX_LENGTH 抛 frame too large、close 控制帧状态码解析与 closed 停帧、WsConnection ping→自动回 pong/入站 pong 触发处理器、decoder 抛错 error 事件、socket error→teardown(1006)+readyState=3+send false、对端 close 回显 1005→1000、teardown 三级写异常吞噬、业务回调抛错 console.error 隔离、terminate 硬终止与 destroy 抛错吞噬、心跳两分支（终止后自清/超时 close(1001)）、send 文本二进制、createWsHttpServer HTTP 404/Upgrade 400 两拒绝路径/closeAllConnections 调用与抛错吞噬）。**修复 1 处产品缺陷**：ws-server.js:140 `Buffer.constants.MAX_LENGTH` 在 Node 22 已不存在（undefined.MAX_LENGTH TypeError，64bit 长度帧守卫自身崩溃）→ 改用 `node:buffer` 具名导出 `constants.MAX_LENGTH`。残余 2 行登记不硬造：225-227 心跳回调 alive=false 分支（所有置 alive=false 的路径均先 clearInterval，不可达）、386-387 dispose 兜底 terminate（真实 socket write 不同步抛错）。全仓 67058/68284（+22）、lint 506 文件、check 16/16、双契约审计 PASS
  - **第一百三十波（ts aac/psi 残余分支补测 + 删除死代码 readSectionFromPayload）**：ts/aac.js 93.5→**99.18%**（243/245；新增 `ts/__tests__/aac-gaps.test.js` +4 例：splitAdtsFrames 假同步码（channelConfig=0）pos++ 继续找真帧、splitLatmUnits 非同步字节 pos++ 与零长度单元跳过、parseLatmSyncStream ASC 有界扫描耗尽（窗口全 1 → 各 delta 采样率索引恒 15 被前置跳过）→ 抛错被外层 catch 降级 {asc:null,payload:null}、合法 ASC 但 PayloadLengthInfo=0 → {asc,payload:null}）；ts/psi.js 93.4→**100%**（175/175；**删除死代码 readSectionFromPayload**：round-1 问题清单已登记「无调用方」，未从 index.js 导出、无任何引用，整函数连同 docblock 移除）。残余 2 行登记不硬造：aac.js 227-228 tryReadAscBounded 的 parse catch continue（不可达：aot=31 必伴 idx 14/15 在 219 行前置跳过、idx=15 同样前置跳过、其余候选最大读取 13 位不越 16 位窗口 → parseAudioSpecificConfig 不抛）。全仓 67064/68242（+4）、lint 507 文件、check 16/16、双契约审计 PASS
  - **第一百三十一波（rtsp depacketize-h264 残余分支补测）**：rtsp/depacketize-h264.js 92.0→**100%**（137/137；新增 `rtsp/__tests__/depacketize-h264-gaps.test.js` +4 例：reset() 全状态归零且序列号语境重置、未定义类型 29 到达 → 忽略且未完成 FU 作废（fuDropped 计数）、未完成 FU 遇新单 NAL → #abortFu body 作废且 AU 照常收束、type 0 静默忽略收束空 AU）。无产品缺陷。全仓 67092/68242（+4）、lint 508 文件、check 16/16、双契约审计 PASS
  - **第一百三十二波（core nal 残余分支补测）**：core/nal.js 94.5→**100%**（183/183；新增 `core/__tests__/nal-gaps.test.js` +5 例：空 NAL 单元（起始码紧邻/尾部悬空起始码）PARSE_ERROR、splitAnnexB 零拷贝切片与 scan 一致、annexbToAvcc 与 splitAvcc 的 lengthSize 0/5 越界 PARSE_ERROR、splitAvcc 尾部垃圾（不足一个长度字段）PARSE_ERROR）。无产品缺陷。全仓 67106/68242（+5）、lint 509 文件、check 16/16、双契约审计 PASS
  - **第一百三十三波（flv tag-stream 残余分支补测 + 登记结构性死守卫）**：flv/tag-stream.js 95.1→**98.91%**（183/185；新增 `flv/__tests__/tag-stream-gaps.test.js` +1 例：reset() 全状态归零（buffer/header/headerDone/finished/_absPos）且同段字节可重新从头解析）。**登记结构性死守卫不硬造**：tag-stream.js:106-107「dataSize > 128MB」不可达——dataSize 由 3 字节拼出（24 位上限 0xFFFFFF≈16MB）恒小于阈值；收紧阈值会改变现有行为（16MB 内 Tag 均合法放行），维持现状登记。全仓 67120/68242（+1）、lint 510 文件、check 16/16、双契约审计 PASS
  - **第一百三十四波（hls segment-loader 残余分支补测）**：hls/segment-loader.js 94.2→**100%**（240/240；新增 `hls/__tests__/segment-loader-gaps.test.js` +4 例：无 fetch 环境（defineProperty 置空 globalThis.fetch + finally 还原）构造不炸且首次请求 NOT_SUPPORTED、readStream maxBytes 熔断时 reader.cancel 抛错被吞噬仍抛 SOURCE_ERROR（断言 cancel 被调用）、重试退避期间外部中止 → delay abort 监听触发透传 AbortError、进入退避前 signal 已中止 → 立即 reject）。无产品缺陷。全仓 67148/68242（+4）、lint 511 文件、check 16/16、双契约审计 PASS
  - **第一百三十五波（rtsp client 残余分支补测）**：rtsp/client.js 87.6→**100%**（387/387；新增 `rtsp/__tests__/client-gaps.test.js` +13 例：事件处理器抛错隔离（console.error 登记不中断）、WS 连接超时 close()+TIMEOUT / onerror NETWORK_ERROR、无 url 构造兜底、interleaved 握手 opts.sdp 免 DESCRIBE（Session 头截断 ;timeout）、rtp 模式 sdpUrl fetch 成功建轨、fetch 5xx NETWORK_ERROR / 4xx PARSE_ERROR、keepalive 周期 OPTIONS 且 stop 后停发、RTSP 请求响应超时（mock.timers 虚拟时钟 8s）TIMEOUT、响应 5xx NETWORK_ERROR / 4xx PARSE_ERROR、SDP 协商前收到 RTP 兜底建轨 + 畸形包 emit('error')）。行号勘误：334-336 实为 #handleRtpBytes 内 parseRtp 抛错分支（非 consumeSdp 异常，后者无裸抛路径，测试文件已登记）；241-243/258-261 已由 rtsp-client-edge.test.js 覆盖不重复造例。无产品缺陷。全仓 67220/68242（+13）、lint 512 文件、check 16/16、双契约审计 PASS
  - **第一百三十六波（gateway server-wsflv 残余分支补测）**：samples/gateway/src/server-wsflv.js 84.6→**100%**（104/104；新增 `samples/gateway/__tests__/server-wsflv-gaps.test.js` +4 例：httpHandler /healthz 200 JSON 统计与其余路径 404 文本、initChunk 抛错 → close(1011) 携带错误信息（原型注入 FlvLoopSource.prototype.initChunk 抛错 + finally 还原）、pump 内 take 抛错 → close(1011) 且计时器清理（同法注入 take）、连接 error 事件 → 推流计时器被清数据流停止（原生 TCP 完成 WS 握手后发 64bit 长度 2^53 畸形帧使 FrameDecoder 抛 "frame too large" → WsConnection 捕获 emit('error')，断言在途帧排空后 400ms 零增长）。登记说明：38-40/59-62 依赖 FlvLoopSource 同步抛错，当前实现为确定性纯函数无自然抛错来源，socket.write 对已毁 socket 异步报错不同步抛，原型注入是唯一可达路径（非硬造）。无产品缺陷。全仓 67252/68242（+4）、lint 513 文件、check 16/16、双契约审计 PASS
  - **第一百三十七波（gateway server-relay 残余分支补测 + 删除死代码 signalFrame）**：samples/gateway/src/server-relay.js 87.4→**100%**（186/186；新增 `samples/gateway/__tests__/server-relay-gaps.test.js` +7 例：metaFromQuery 非法 JSON/数组 → null、OPTIONS 预检 204、publish 请求流 error → 500（含 writeHead 抛错被 catch 吞噬）、未匹配端点 404 兜底、慢消费假订阅者（send=()=>false）积压超限 → onDrop 计入 droppedForSlowConsumer/droppedBytes、非 /stream 路径 WS 升级 → close(1008)、订阅端上行二进制帧按通道转发）。**删除死代码 signalFrame**（原 19-21 行，全仓零调用、未导出，按 130 波 readSectionFromPayload 先例）。无产品缺陷。全仓 67292/68234（+7）、lint 514 文件、check 16/16、双契约审计 PASS
  - **第一百三十八波（gateway server-rtsp 残余分支补测）**：samples/gateway/src/server-rtsp.js 88.9→**100%**（324/324；新增 `samples/gateway/__tests__/server-rtsp-gaps.test.js` +4 例：httpHandler /healthz+404、tick 内 conn 已死早退兜底（原型注入 WsConnection.prototype.send 触发真实 terminate() 制造 alive=false 而 close 永不到达的窗口，finally 还原）、/rtsp 播放中 2s 周期 RTCP SR（信道 1）、idle 态直接 SETUP → 455、PAUSE → 200+停推流、未知方法 → 501、文本消息入口 replyAsText、二进制 $ 块噪声静默忽略）。122-124 判定防御分支：run-to-completion 下 tick 永观察不到 close 未达窗口，仅 terminate() 路径真实存在，按 136 波注入先例覆盖。无产品缺陷。全仓 67364/68234（98.72%，+4）、lint 515 文件、check 16/16、双契约审计 PASS
  - **第一百三十九波（mkv source 残余分支补测）**：mkv/src/source.js 92.31→**100%**（286/286；新增 `mkv/__tests__/source-gaps.test.js` +8 例：BlobSource 拒绝无 slice 对象 BAD_BLOB、FetchSource HEAD 405/403 回退 GET Range:0-0（200 不支持 Range / 206 content-range 判支持并解析 total）、HEAD+GET 双重失败 HTTP_BAD_STATUS 且 SourceError rethrow（覆盖 catch 非 TypeError 分支）、探测期 TypeError（CORS）→ 顺序模式兜底可读流、read 越界 OUT_OF_RANGE（byteLength 已知）、顺序模式 openStream GET 503 → HTTP_BAD_STATUS、createByteSource 非法输入 BAD_SOURCE）。无产品缺陷。全仓 67408/68234（98.78%，+8）、lint 516 文件、check 16/16、双契约审计 PASS
  - **第一百四十波（core pipeline-mse 残余分支补测）**：core/pipeline-mse.js 94.44→**99.64%**（556/558；新增 `core/__tests__/core-pipeline-mse-gaps.test.js` +9 例：defaultSchedule 真实 setTimeout 背压（timer 被 unref，测试需 setInterval keep-alive 防 event loop 提前退出）、defaultRemuxerFactory 动态 import Fmp4Remuxer、defaultMseFactory 动态 import MseHelper 且 init 期接管 this.mse（Node 无 MediaSource → open 拒绝恰好固化 118-119）、init() 生命周期失效（destroy 先行）吞错返回 this、end() endOfStream 抛错 emit error、seek() 双活动轨 resetTrack 各抛一次 emit error、selectTrack 三态守卫（destroy 后直调 439-440 / init 等待期 abort 445-446 / addTrack 等待期 abort 462-463，均需 setImmediate 让 run() 先挂入 race——否则 destroy 先置 aborted 短路到 run() 的 420 守卫）。**登记 2 行不硬造**：31-32 defaultRemuxerFactory catch（目标模块 '../../mp4/src/remuxer.js' 真实存在，import 静态可解析时不可达）。无产品缺陷。全仓 67472/68234（98.88%，+9）、lint 517 文件、check 16/16、双契约审计 PASS
  - **第一百四十一波（rtmp player 残余分支补测）**：rtmp/player.js 94.86→**99.68%**（310/311；新增 `rtmp/__tests__/rtmp-player-gaps.test.js` +5 例：demuxer track(video) setVideoTrack 抛错 → #fail ERROR 态、track(audio) 正常路径（audioTrack 赋值/mediaInfo.tracks 汇总/冲刷循环启动——video 轨事件即触发 #startFlushLoop，前置断言勘误）、track(audio) setAudioTrack 抛错 → #fail、sample addSample 抛错 → #fail（均原型注入 Fmp4Remuxer.prototype 方法 + finally 还原）、#onStable 稳定运行超 stableMs 后 _backoffAttempt 归零复位退避节奏；断言须置于 stop() 之前——stop 置 STOPPED 会掩盖 ERROR 终态）。无产品缺陷。全仓 67500/68234（98.92%，+5）、lint 518 文件、check 16/16、双契约审计 PASS
  - **第一百四十二波（webtorrent index 补测 + 修复 PlayerError 未导入缺陷）**：webtorrent/index.js 95.20→**100%**（127/127；新增 `webtorrent/__tests__/webtorrent-create-source-gaps.test.js` +3 例：非法输入类型（数字/null/非契约对象）→ PARSE_ERROR、magnet 网络路径 attach 成功 → meta.mode=network 附带 infoHash/trackers/files/selected（注入 fake player）、http url 路径不带 magnetInfo 且 attach 失败时 player.destroy() 兜底）。**修复 1 处产品缺陷**：index.js:34 `new PlayerError(...)` 守卫直接 ReferenceError——第 9 行 `export { PlayerError } from ...` 为 re-export 不产生本地绑定（createSource 收到非法输入即抛 ReferenceError 而非预期 PARSE_ERROR，实测取证）→ 补 `import { PlayerError } from '../../core/src/errors.js'`。全仓 67518/68238（98.94%，+3）、lint 519 文件、check 16/16、双契约审计 PASS
  - **第一百四十三波（mov demuxer probe 残余分支补测）**：mov/demuxer.js 95.54→**100%**（112/112；新增 `mov/__tests__/mov-probe-gaps.test.js` +2 例：顶层 wide atom（QT_TOP_ATOMS 特征）→ hinted 分支取 max(base=0.95, 0.9)=0.95（isom 品牌 ftyp + wide + free 三 atom 字节级构造）、基础探测抛错（静态注入 Mp4Demuxer.probe 抛错 + finally 还原）→ 外层 catch 返回 null）。无产品缺陷。全仓 67530/68238（98.95%，+2）、lint 520 文件、check 16/16、双契约审计 PASS
  - **第一百四十四波（webrtc signaling 残余分支补测）**：webrtc/signaling.js 95.64→**100%**（275/275；新增 `webrtc/__tests__/signaling-gaps.test.js` +5 例：defaultFetch 无 fetch 环境 → notSupported（defineProperty 置空 + finally 还原）、defaultFetch 委托全局 fetch（spy 替换）、exchange Location 无法解析 → fallback 保留原始串（'http://['：isSafeUrl 宽松放行（parseUrl null→true）而 new URL 严格抛错，覆盖 127-128 catch）、exchange 等待 answer 超时（mock.timers 虚拟时钟——必须在 exchange 调用前 enable，apis 仅支持 setTimeout）→ TIMEOUT、sendCandidate 连接态发送 JSON）。无产品缺陷。全仓 67542/68238（98.99%，+5）、lint 521 文件、check 16/16、双契约审计 PASS
  - **第一百四十五波（core limits + flv index 残余分支补测，全仓破 99%）**：core/limits.js 95.92→**100%**（98/98；新增 `core/__tests__/limits-gaps.test.js` +2 例：clampReadLength 合法值数值化透传与越界抛错——契约面薄包装虽内部零调用仍按公共 API 补测保留（区别于未导出死代码的删除先例）、BoundedMapCache.delete 命中/未命中）；flv/index.js 95.83→**100%**（48/48；新增 `flv/__tests__/flv-index-probe-gaps.test.js` +1 例：§10 probe 底层抛错吞错返回 null——静态注入 FlvDemuxer.probe + finally 还原）。无产品缺陷。全仓 67557/68238（**99.00%**，+3）、lint 523 文件、check 16/16、双契约审计 PASS
  - **第一百四十六波（gateway slow-consumer 残余分支补测）**：samples/gateway/src/slow-consumer.js 95.65→**100%**（92/92；新增 `samples/gateway/__tests__/slow-consumer-gaps.test.js` +2 例：sendText 底层 send 抛错 → false 且文本不排队、drain 底层 send 抛错 → 保留队列等待下一次 enqueue 触发重试（boom 开关三阶段：正常发出→抛错保留→恢复排空））。无产品缺陷。全仓 67561/68238（99.02%，+2）、lint 524 文件、check 16/16、双契约审计 PASS
  - **第一百四十七波（mp4 remuxer 残余分支补测）**：mp4/remuxer.js 96.07→**100%**（229/229；新增 `mp4/__tests__/remuxer-gaps.test.js` +3 例：sequenceNumber getter 推进与 resetSequence 任意值复位、非 video/audio（metadata）轨 init segment 走 nmhd 占位（handlerType 'meta' + nmhdBox 字面量字节断言）、remuxDemuxer videoTrackId 过滤（命中单轨 / 999 全滤空输出）。**用例侧关键点**：track 必须带受支持的 sampleEntryType（'avc1'）——buildStsd 对未知 entry 抛 `unsupported sample entry`，meta 轨语义上无中立 entry，唯一可达路径即配受支持 entry 过 stsd 构造）。残余 1 行登记不硬造：lcov DA:1 文件头注释伪影（c8 summary 已计 229/229）。无产品缺陷。全仓 33792/34119（**99.04%**，+3）、lint 525 文件、check 16/16、双契约审计 PASS
  - **第一百四十八波（mkv demuxer 残余分支补测）**：mkv/demuxer.js 95.74→**99.53%**（1075/1080；新增 `mkv/__tests__/demuxer-gaps.test.js` +10 例：probe 无 DocType 0.85 保守命中 / 非 webm-matroska 明确 null / 非法 size vint 触发 catch 吞错、构造源无 read → SOURCE_ERROR、open destroyed 与 opening 重入两守卫、attach 非法源/idle 换源链式/ready 后 STATE_ERROR、Cues 体非法 vint（0x01 声明 8B 仅给 2B → readId 抛 EbmlError）parseCuesAt 失败被吞、短读源（恒回半数字节且 size 充足）#readExact → SOURCE_ERROR、未知长度 Tags（default 分支 Void/CRC32 白名单）、未知长度嵌套 Segment 经 seek→#ensureSeekIndex 线性扫描（SCHEMA 白名单 + 857-858 else 分支）、readSample AbortController 竞速 ABORTED + 迟到落地 pendingResults 缓存续读不吞样本、samplesInternal 非 ready STATE_ERROR）。**用例侧勘误**：0xFF 开头不是非法 vint（vintLength=1 全 1 数据位=未知长度元素，iterElements 不抛），触发越界须用 0x01 开头配合截断。**登记 5 行不硬造**：221-225 #peekHeader 头部扩展循环不可达——head 恒为 min(16,剩余) 足额返回（readId VINT 最长 8B ⇒ need≤16），不足额已被 #readExact 短读守卫前置拒绝，循环体（含 223 bigger 不增长 break）在现行读写契约下无进入路径；DA:1 注释伪影。无产品缺陷。全仓 33833/34119（**99.16%**，+41）、lint 526 文件、check 16/16、双契约审计 PASS
  - **第一百四十九波（hls fmp4-muxer 残余分支补测）**：hls/fmp4-muxer.js 96.04→**99.24%**（654/659；新增 `hls/__tests__/fmp4-muxer-gaps.test.js` +4 例：remux 空 TS 分片无轨无样本 → video/audio null（444-445）、safeCodec 正常透传与推导抛错降级空串+console.warn 告警（551-562）、parseAot 空 ASC 默认 AOT=2/正常移位解析两分支（566-569）、toAvcc 合法 AnnexB→AVCC 4 字节长度前缀往返与非法输入 undefined → splitAnnexB TypeError 包成 PARSE_ERROR（578-579））。**最小 src 改动**：既有 `_internalForTest` 测试出口补导出 safeCodec/parseAot/toAvcc（非公共 API 面）。**登记 5 行不硬造**：381-385 remux 动态 import 失败 → NOT_SUPPORTED 防御（ts/src/index.js、ts/src/nalu.js 仓库内真实模块静态可解析，Node 下不 reject，同 140 波 pipeline-mse 31-32 先例）；DA:1 注释伪影。无产品缺陷。全仓 33857/34122（**99.22%**，+24）、lint 527 文件、check 16/16、双契约审计 PASS
  - **第一百五十波（ape index probe 兜底补测）**：ape/src/index.js 96.07→**100%**（51/51；新增 `ape/__tests__/index-gaps.test.js` +1 例：probeApe(null)/probeApe(undefined) 属性访问抛 TypeError → catch 吞错返回 null，固化「probe 永不抛」契约）。残余 DA:1 注释伪影。无产品缺陷。全仓 33859/34122（**99.22%**，+2）、lint 528 文件、check 16/16、双契约审计 PASS
  - **第一百五十一波（mov atom-compat 防御性 catch 补测）**：mov/src/atom-compat.js 96.10→**99.22%**（255/257；新增 `mov/__tests__/atom-compat-gaps.test.js` +5 例：hasQuickTimeHints 顶层残字节 → catch false 且 looksLikeQuickTime 不炸、detectCompressedMoov cmov 内 dcom 越界 size=200 → 内层「尽力读取」catch 仍判 compressed=true、parseUdtaTags 外层扫描残字节 → catch 返空表、ISO 风格 meta（version/flags 4B + 4B 残片）子盒残缺 → parseMetaAtom 内部吞错不外抛、附 0xff/0xfe 非法 UTF-8 解码取证例）。**登记 2 行不硬造**：233-234 readTextAtom 的 TextDecoder.decode catch——`new TextDecoder('utf-8')` 默认 fatal:false 对任意字节以 U+FFFD 替换不抛，编码标签合法构造器也不抛，现行 API 契约下不可达（已加取证测试固化判定）；DA:1 注释伪影。无产品缺陷。全仓 33867/34122（**99.25%**，+8）、lint 529 文件、check 16/16、双契约审计 PASS
  - **第一百五十二波（samples net fixture 默认 NAL 补测）**：samples/fixtures/net.js 96.15→**100%**（156/156；在既有 `samples/fixtures/__tests__/net.test.js` 追加 +1 例：makeRTPH264Packets() 不传 nal → defaultNal() 101B IDR（0x65 头 + i&0xff 确定性载荷，超默认 mtu=64）走 FU-A，断言 mode/nalType=5/包数≥2/reassembled 101B 逐字节还原）。残余仅 DA:1 注释伪影。无产品缺陷。全仓 33874/34122（**99.27%**，+7）、lint 529 文件、check 16/16、双契约审计 PASS
  - **第一百五十三波（core codec-string 残余分支补测）**：core/src/codec-string.js 96.15→**100%**（234/234；新增 `core/__tests__/codec-string-gaps.test.js` +4 例：h264CodecStringFromSps(null) TypeError catch → '' 与短 SPS 长度守卫、含 00 00 03 emulation prevention 转义 SPS 剥除后 avc1.42001E、parseCodecString hvc1/hev1 → hevc 家族、注入 globalThis.MediaSource.isTypeSupported 抛错 → mseIsTypeSupported catch false + finally 还原）。无产品缺陷。全仓 33882/34122（**99.29%**，+8）、lint 530 文件、check 16/16、双契约审计 PASS
  - **第一百五十四波（flv parser reset 与 Info/Command 帧补测）**：flv/src/flv-parser.js 96.35→**100%**（274/274；新增 `flv/__tests__/flv-parser-gaps.test.js` +2 例：reset() 解析中途全量归零（stream/hasAudio/hasVideo/_headerEmitted/keyframeIndex/stats 五字段断言）并验证重置实例可重新喂流头事件再派发、frameType=5（首字节 0x57：Info/Command + codecID=7）视频 tag 静默忽略不产 video 事件不报错（193-195））。无产品缺陷。全仓 33893/34122（**99.32%**，+11）、lint 531 文件、check 16/16、双契约审计 PASS
  - **第一百五十五波（mov 工厂 head 读取失败补测）**：mov/src/index.js 96.36→**100%**（55/55；新增 `mov/__tests__/index-gaps.test.js` +1 例：createDemuxer 假源 read 直接 reject「介质不可读」→ head catch 置 null（48-49）→ 包装抛 PROBE_FAILED，裸错误不冒泡）。残余仅 DA:1 注释伪影。无产品缺陷。全仓 33894/34122（**99.33%**，+1）、lint 532 文件、check 16/16、双契约审计 PASS
  - **第一百五十六波（subtitle track 编码回退与 probe 守卫补测）**：subtitle/src/track.js 96.46→**100%**（113/113；新增 `subtitle/__tests__/track-gaps.test.js` +2 例：parseCues 非法 encoding 标签 'x-不存在的编码'（TextDecoder 构造 RangeError，已 Node 取证）→ decodeBytes catch 回退 utf-8 正常解析中文 SRT 两条 cue、probe(null)（decode(null) TypeError，已取证）→ catch 返 null 不冒泡）。无产品缺陷。全仓 33898/34122（**99.34%**，+4）、lint 533 文件、check 16/16、双契约审计 PASS
  - **第一百五十七波（core mse-helper 残余分支补测）**：core/src/mse-helper.js 96.46→**100%**（339/339；新增 `core/__tests__/core-mse-helper-gaps.test.js` +4 例：SourceBufferChannel.abortThenClear 三态（非更新不 abort/更新态 abort 一次/changeType 为函数进预留 no-op 分支 114-120）、MseHelper.append 正常经通道入队（241，updateend 落定）+ 未知 key STATE_ERROR、drainAll 等全部通道队列 resolve（299-300，updateend 前 pending/后 resolve 两态断言）、destroy 期 endOfStream 因 readyState 竞态抛错被 catch 吞掉仍置 destroyed（324-325））。用例侧：FakeMediaSource 必须带实例 isTypeSupported→true（addTrack 先过支持度校验）。无产品缺陷。全仓 33910/34122（**99.37%**，+12）、lint 534 文件、check 16/16、双契约审计 PASS
  - **第一百五十八波（webtorrent source 私有别名 helper 补测）**：webtorrent/src/source.js 96.77→**100%**（217/217；新增 `webtorrent/__tests__/source-gaps.test.js` +1 例：withSizeAlias 返同一对象、byteLength 为 size 动态 getter、configurable 可重定义 28-34）。src 最小改动：withSizeAlias 加 `export`（同第 149 波 _internalForTest 手法；该 helper 为重构遗留、类自身 96 行已有 byteLength getter，全仓仅此一处定义无调用方，导出直测比登记死代码更可验证，未删除以免擅动 owner 范围）。无产品缺陷。全仓 33917/34122（**99.39%**，+7）、lint 535 文件、check 16/16、双契约审计 PASS
  - **第一百五十九波（webrtc mock 信令残余方法补测）**：webrtc/src/mock-signaling.js 97.05→**100%**（102/102；新增 `webrtc/__tests__/mock-signaling-gaps.test.js` +2 例：单通道 drainRemoteCandidates 恒 []（55）、回环对两侧 sendCandidate 推入各自出线 wireA/wireB 并断言 drainRemoteCandidates 恒 []（87/90））。无产品缺陷。全仓 33920/34122（**99.40%**，+3）、lint 536 文件、check 16/16、双契约审计 PASS
  - **第一百六十波（ts 出口 probe 防御性 catch 补测）**：ts/src/index.js 97.10→**100%**（69/69；新增 `ts/__tests__/index-gaps.test.js` +1 例：注入 TsDemuxer.probe 静态方法抛错 → 出口 probe catch 返 null（30-31，契约「禁止抛异常」独立保证），finally 还原后断言同步字节命中 `{container:'ts'}`（注意 ProbeResult 字段是 container 非 format））。底层 TsDemuxer.probe 本体整体 try/catch 实测对 null/undefined/{}/42/空数组全返 null 不抛（其内部 catch 已登记不可达），故用静态注入手法（同已验证手法清单）覆盖出口包装。无产品缺陷。全仓 33922/34122（**99.41%**，+2）、lint 537 文件、check 16/16、双契约审计 PASS
  - **第一百六十一波（core WebCodecs 管线残余分支补测）**：core/src/pipeline-webcodecs.js 97.10→**99.71%**（688/690；新增 `core/__tests__/core-webcodecs-pipeline-gaps.test.js` +6 例：defaultSchedule 真实 setTimeout 100ms wait→推进主钟后到点渲染（21-25，options.schedule:undefined 回落 + sleep180）、resync 外部不可控钟（有数字 currentTimeUs 无 clearBuffer）_masterRealignToUs 返 false → break 保帧不派 resynced（380-381）、_render 无 renderer 直还帧仍计数派 rendered/firstframe（465）、frame.close 双重 close 抛错被 _closeFrame 吞（483-484）、selectTrack(video) 新轨解码器 configure 内 destroy（闭包 isNewTrackDecoder 标志区分；勿用 created.length===1——工厂 push 先于外部 configure，首解码器 configure 时 length 已 1 会误杀 init）→ 569 守卫回收新解码器早退（570-573）、_setupAudio 同格式输出复用路径在 audioOutput.channels getter 内 destroy → 223 守卫关闭新解码器返 false（224/228/229，225 条件经复用路径求值为 false 亦覆盖））。**登记 226-227 不可达**：225 `nextOutput && nextOutput !== existing` 仅新输出路径可为真，而该路径 217 守卫（含同组 generation/destroyed 条件）与 223 间无 await，同步不可翻转，必先 return false；复用路径 nextOutput===existing 恒 false。无产品缺陷。全仓 33940/34122（**99.46%**，+18）、lint 538 文件、check 16/16、双契约审计 PASS
  - **第一百六十二波（mp4 WebCodecs 管线音频回调与不支持路径补测）**：mp4/src/webcodecs-pipeline.js 97.19→**100%**（214/214；新增 `mp4/__tests__/webcodecs-pipeline-gaps.test.js` +2 例：FakeDecoder.supported=false 双配置不支持 → start 经 _ensureDecoders 抛 DECODE_ERROR「decoder unsupported: configs unsupported」且不建解码器（99-100）、音频-only demuxer start 后手触 audioDecoder.init.output/error → onAudioData meta `{decoder:'audio'}` + stats.markSampleDecoded、onError + stats.markDecodeError（117-118/121-122））。用例侧：stats mock 必须带 markDemuxed（pump 成功路径会调，缺则被 decode catch 记成假错误干扰断言）；FakeDecoder 同名充 Video/Audio 时静态 supported 一控双控。无产品缺陷。全仓 33946/34122（**99.48%**，+6）、lint 539 文件、check 16/16、双契约审计 PASS
  - **第一百六十三波（rtsp source close 与启动错误补测）**：rtsp/src/source.js 97.22→**100%**（108/108；新增 `rtsp/__tests__/source-gaps.test.js` +2 例：客户端 close 且未 stop、reconnect=false → 派发 end（48）；SDP/meta 到达前 client error → 清理 metaTimer 并拒绝 start（67-68），确认 source.meta 仍为 null）。无产品缺陷。全仓 33949/34122（**99.49%**，+3）、lint 540 文件、check 16/16、双契约审计 PASS
  - **第一百六十四波（HLS MSE 控制器异常路径补测）**：hls/src/mse-controller.js 97.31→**100%**（298/298；新增 `hls/__tests__/mse-controller-gaps.test.js` +3 例：QuotaExceeded error 事件路径中 `_onQuotaEvict` 回调抛错仍吞掉并继续以 DECODE_ERROR 拒绝（110-111）、remove error 事件 cleanup 后以 DECODE_ERROR/type 拒绝（151-152）、destroy 时 `removeSourceBuffer` 抛错与 `endOfStream` 竞态均被销毁期 catch 吞（278-279、287-288））。FakeMediaSource 需构造微任务派发 sourceopen；初版未派发导致 attach Promise pending，已修正。无产品缺陷。全仓 33957/34122（**99.51%**，+8）、lint 541 文件、check 16/16、双契约审计 PASS
- [ ] **P3** 案 A 完全同构（**待 owner 裁决**）：mkv D1/D2/D3/D11/D4 收敛
- [ ] **P3** **两项契约差异已探针取证并复核为「已裁决」**（第一百零六波，**勿再当缺陷重复上报**）：
  - **D6 seek 非法目标错误码**：实测 `mp4`（走基类）`seek(-1)/seek(NaN)/seek(-0.5)/seek(Infinity)` 全为 `STATE_ERROR`，而 `mkv` 同四例全为 `PARSE_ERROR`（`mkv/src/demuxer.js:802`）。属裁决表 D6（`mkv-base-class-alignment.md:167`：「暂保兼容…**公开契约最终口径待 captain+leader 双签后统一**」）。
  - **seek 落点回退钳制**：`mkv.seek(target)` 在落点后无样本时返回 `durationUs`（而非最近簇），已在 `mkv/__tests__/demuxer.test.js:182-183` 显式断言固化（`seek(500_000)` → `actualTimestampUs === 1_000_000`，注释「回退钳制到时长」）。**非缺陷**。
- [ ] **P3** **基类 `end` 语义偏差已探针取证**（第一百零六波，双轨 toy demuxer 实测）：`core _maybeEmitEnd` 判定条件是「**已建迭代器**的轨全 done」，而非契约字面的「全部轨 EOS」。实测三种可观察偏差——
  1. **提前发**：只消费视频轨（音频轨从未建迭代器）→ `end{reason:'eos'}` 立即派发，而音频轨其实尚未读完；
  2. **可重复发**：随后消费音频轨 → `end` **再发一次**（无 `#endEmitted` 去重守卫）；
  3. 已 done 的轨二次 `for await` 返回 0 样本且不重发（相对安全）。
  与 mkv/wav（`#endEmitted` 单次 + 全可读轨扫完才发）、flac 的语义均不同。**属裁决表 D4**（`mkv-base-class-alignment.md:165`：「以契约字面『全部轨 EOS』为目标…**基类收敛另立跨模块议题**」）→ **需 owner/captain 裁决，禁止单模块擅改**。本波仅取证登记，未改代码。

| 109 | MP4 双轨 MSE 初始化顺序修复 + 浏览器真机回归 | Chrome 真机探针复现：MP4 demo 先创建视频 SourceBuffer 并追加 init、再创建音频 SourceBuffer 会触发 `QuotaExceededError(22)`；修复 `mp4/demo/index.html` 为先注册全部 video/audio SourceBuffer，再统一追加 init segment。同步修正 `scripts/e2e/demo-smoke.mjs` 的 MP4 按钮选择器（`#playUrl`→`#loadUrl`）。验证：core、MP4、HLS 真实 Chrome smoke 全 PASS；MP4 `readyState=4`、`currentTime≈11.7s` 持续推进，HLS 驱动 PASS；全仓 2901/2901、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 110 | AudioWorklet 销毁异常分支补测 | 扩展 `core/__tests__/core-audio-worklet-env.test.js`：覆盖 node/gain disconnect 抛错时 destroy 仍完成 context/节点清理、destroy 事件与幂等；补充销毁后 resume/clearBuffer 无 context 守卫。`audio-worklet-player.js` 定向覆盖率达到 100%（行/分支/函数），全量回归待本轮完成。 | 本波 |

| 111 | HLS utils 边界补测 | 扩展 `hls/__tests__/llhls-utils.test.js`，覆盖无效 URL/base、空/畸形属性、奇数十六进制、MIME 组装、SN/时间续播边界、EWMA 无效样本与暖机默认估计；`hls/src/utils.js` 定向行/函数覆盖率 100%。全仓 2904/2904、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 112 | MP4 probe 防御分支补测 | 扩展 `mp4/__tests__/mp4-probe-brand.test.js`：构造 `byteLength` getter 抛错的 hostile 输入，固化 `Mp4Demuxer.probe()` 同步不抛异常并返回 `null` 的契约；与既有 ftyp/wide/styp/mdat 品牌矩阵一起验证。全仓 2905/2905、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 113 | Stats reset 全状态回归 | 扩展 `core/__tests__/clock-stats.test.js`：断言 `Stats.reset()` 同时清零全部计数器、decode 平均/最大耗时、FPS EMA 与渲染时间锚点，避免未来只清零单字段造成脏状态。`core/src/stats.js` 定向行/分支/函数覆盖率 100%。 | 本波 |

| 114 | MKV 工厂源构造错误归一回归 | 扩展 `mkv/__tests__/mkv-info-errors.test.js`：非法输入在 `createByteSource()` 构造阶段抛错时，`createDemuxer()` 统一归一为 `PlayerError(SOURCE_ERROR)` 并保留“无法构造数据源”语义；不触碰案 A 冻结结构。全仓 2906/2906、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 115 | FLV track waiter 清理回归 | 扩展 `flv/__tests__/flv-demuxer-gaps.test.js`：直接验证 `waitForTracksOrEos()` 在 video 信号完成后 resolve，并清理 video/audio/complete 全部监听，固化避免事件监听泄漏的行为。全仓 2907/2907、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 116 | VideoFrameRenderer 2D 初始化异常回归 | 扩展 `core/__tests__/core-video-renderer-dom.test.js`：Canvas2D `getContext()` 抛错时验证渲染器安全归一为 `NOT_SUPPORTED`，并保持全局 document 清理；定向 renderer 行/分支/函数覆盖率达到 100%。全仓 2908/2908、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 117 | Fixture BitWriter 非整字节收尾回归 | 扩展 `samples/fixtures/__tests__/bytes.test.js`：写入 3-bit 字段后验证 `BitWriter.finish()` 正确补零为 `0xA0`，并验证重复 finish 稳定，覆盖此前未执行的 partial-byte finalize 路径。全仓 2909/2909、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 118 | Gateway 聚合入口 close 生命周期回归 | 扩展 `samples/gateway/__tests__/servers.test.js`：独立启动三类 gateway 并等待 ready 后，验证 `startGateways().close()` 无异常且随后 `dispose()` 可幂等收尾，覆盖 `samples/gateway/src/index.js` 聚合 close 分支。全仓 2910/2910、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 119 | TS PES stream_id 分类边界回归 | 扩展 `ts/__tests__/pes.test.js`：覆盖视频 `e0–ef`、音频 `c0–df` 两端边界，以及音视频互斥判断，补齐 `isAudioStreamId()` 未执行路径；`ts/src/pes.js` 定向行/分支/函数覆盖率达到 100%。全仓 2911/2911、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 120 | Gateway FLV builder 死代码收敛 | 核实 `samples/gateway/src/flv-builder.js` 私有 `u24()` 全仓零调用，且现有 3 字节编码路径使用 `u24be16()`；删除该零调用 helper，不改变公开 API。FLV builder 定向测试全绿、行/函数覆盖率 100%；全仓 2911/2911、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 121 | ASS 标签状态机颜色与缩放边界回归 | 扩展 `subtitle/__tests__/subtitle-style-tags.test.js`：验证 `\2c` 支持但不改描边、`\3c` 更新描边色，以及 `\fscy` 小数纵向缩放，覆盖 `subtitle/src/tags.js` 先前未执行的 2c/3c/fscy 分支。全仓 2912/2912、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 122 | RTMP FLV 畸形 script Tag 错误归一回归 | 扩展 `rtmp/__tests__/flv-demuxer.test.js`：非法 AMF marker 触发 script 解析异常时，验证 demuxer 统一派发 `PARSE_ERROR`，后续未知 Tag 仍可消费且样本计数不污染。全仓 2913/2913、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 123 | HTTP Range 忽略响应的取消异常防御回归 | 扩展 `core/__tests__/http-range-gaps.test.js`：服务器对非零 offset 忽略 Range 返回 200，且 `body.cancel()` 自身抛错时，验证原始 `SOURCE_ERROR`（server ignored Range header）仍被保留。全仓 2914/2914、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 124 | WebTorrent infohash 异常回退回归 | 扩展 `webtorrent/__tests__/webtorrent-source-edge.test.js`：注入 WebCrypto `subtle.digest()` 抛错，验证 `computeInfoHash()` 按浏览器/Node 兼容契约安全返回 `null`，不泄漏底层异常。全仓 2915/2915、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 125 | CMAF sidx 64 位索引回归 | 扩展 `cmaf/__tests__/sidx.test.js`：构造 version=1 sidx，验证 `earliestPresentationTime` 与 `firstOffset` 的 64 位字段、SAP 引用表均按规范解析。全仓 2916/2916、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 126 | A/V 同步控制器播放速率回归 | 扩展 `core/__tests__/core-utils-boundary.test.js`：验证 `AvSyncController.setRate()` 委托内部时钟、外部 master clock 接入后 `start()` 不重置内部锚点，且主钟读取优先外部源。全仓 2917/2917、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 127 | MPEG-TS fixture 零长度自适应字段回归 | 扩展 `samples/fixtures/__tests__/ts.test.js`：使用 `auPadBytes=302` 精确构造非 PCR 包仅剩 1 字节空隙，验证 `af_control=11`、`adaptation_field_length=0` 与 183 字节载荷均符合 TS 结构。全仓 2918/2918、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 128 | 字幕 Canvas rAF 时钟驱动回归 | 扩展 `subtitle/__tests__/renderer.test.js`：注入 rAF/cancelAnimationFrame，验证函数时钟、`currentTimeUs()` 对象时钟、视频 `currentTime` 三条读取路径，以及停止时取消调度并实际渲染。全仓 2919/2919、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 129 | WAV 非法 PCM 组合回归 | 扩展 `wav/__tests__/wav.test.js`：验证 `convertToFloat32Planar()` 遇到未支持的 formatTag/bitsPerSample 组合时抛出 `NOT_SUPPORTED`，且错误信息保留格式参数。全仓 2920/2920、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 130 | H.264 AnnexB 单帧 fixture 回归 | 扩展 `samples/gateway/__tests__/h264-pcm.test.js`：实际调用 `makeFrameAnnexb()`，验证 4 字节 AnnexB 起始码、IDR NAL 类型与完整 I_PCM 帧长度，替代此前仅 `void` 引用的覆盖空洞。全仓 2921/2921、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 131 | AAC LATM 截断扩展 AOT 回归 | 扩展 `ts/__tests__/aac-gaps.test.js`：构造截断扩展 AOT 候选，验证 LATM 的有界 ASC 扫描不会被异常候选阻断，输出保持为合法的 ASC/null 与 null payload 组合。全仓 2922/2922、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 132 | TS 引擎单包异常隔离回归 | 扩展 `ts/__tests__/ts-packet-header.test.js`：注入单包解析异常，验证每个异常转为 error 事件、后续包继续消费，且 flush 仍能完成。全仓 2923/2923、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 133 | AMF0 不支持类型回归 | 扩展 `flv/__tests__/amf0.test.js`：验证公开 `encodeAmf0(Symbol())` 明确抛出带类型信息的 TypeError，覆盖编码器不支持类型保护。全仓 2924/2924、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 134 | CMAF 缺失 ASC 回归 | 扩展 `cmaf/__tests__/cmaf-box.test.js`：构造包含 `esds` 但没有合法 DSI 的初始化字节，验证 `findAudioSpecificConfig()` 返回 null 而不误报配置。全仓 2925/2925、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 135 | ASS 样式未知行回归 | 扩展 `subtitle/__tests__/ass.test.js`：验证 [V4+ Styles] 中未知行被忽略，不生成伪样式，也不增加畸形块计数。全仓 2926/2926、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 136 | 字幕空文本布局回归 | 扩展 `subtitle/__tests__/layout.test.js`：验证活跃空文本 cue 仍生成稳定空行、零宽度与默认字号，覆盖无文本片段时的字号回退路径。全仓 2927/2927、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 137 | MP4 空源打开回归 | 扩展 `mp4/__tests__/artifacts-edge.test.js`：验证空 `MemoryDataSource` 调用 `Mp4Demuxer.open()` 明确拒绝并返回 `PARSE_ERROR`，不静默完成。全仓 2928/2928、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 138 | RTMP 重连构造失败回归 | 扩展 `rtmp/__tests__/rtmp-player-fake.test.js`：注入重连 WebSocket 构造异常，验证播放器进入 error，且定时器中的连接失败 Promise 被消费，不产生未处理拒绝。全仓 2929/2929、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 139 | WebCodecs 延迟音频输出清理回归 | 扩展 `core/__tests__/pipeline-webcodecs.test.js`：在音频输出工厂等待期间 destroy，验证迟到的输出实例仍被销毁回收，覆盖生命周期代数与异步清理路径。全仓 2930/2930、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 140 | MKV 无限长度源尾部半截元素头回归 | 扩展 `mkv/__tests__/demuxer.test.js`：使用 size=Infinity 的流式数据源，在合法 WebM 后追加截断的 Void 元素头，验证 `open()` 将尾部残缺按流尾处理并保持媒体信息可用。全仓 2931/2931、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 141 | MP4 顶层 mdat size-zero 回归 | 扩展 `mp4/__tests__/artifacts-edge.test.js`：将渐进式 fixture 的 `mdat` 大小字段改为 0，验证按文件末尾计算盒边界，并继续完整解封装 8 个样本。全仓 2932/2932、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 142 | CMAF 截断 ASC 防御 | 修复 `cmaf/src/isobmff.js`：DSI 声明长度超过剩余数据时不再返回截短的 AudioSpecificConfig，改为返回 `null`；新增回归测试。全仓 2933/2933、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 143 | CMAF 截断视频配置防御 | 修复 `cmaf/src/isobmff.js`：avcC/hvcC 等视频配置盒声明长度超过所属 moov 时返回 `null`，不再返回截短 description；新增 avcC 回归测试。全仓 2934/2934、lint 541 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 144 | FLV demuxer 残余防御分支直测 | 新增 `flv/__tests__/flv-demuxer-guard.test.js`（+7 例）：_feedParser/_pumpOnce/旧式 push 三处 parser.push 抛错转 error 事件、_doSeek 双守卫（ChunkSource/索引缺失含 null 与空数组）、start() 消费任务异常在非 destroyed 态发 error、destroyed 态静默。`flv/src/flv-demuxer.js` 行/函数覆盖率→**100%**（分支 89→93.33%）。全仓 2941/2941、lint 542 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 145 | TS 引擎与 probe 残余防御分支直测 | 新增 `ts/__tests__/ts-engine-gaps.test.js`（+3 例）：TsDemuxer.probe 字节访问抛错防御性 null（对齐 MP4 probe 先例）、_onPsiSection section 抛错转 error 事件、_rebuildVideoConfig SPS 抛错转 error 且 _emitTracks 收尾不被阻断。`ts-demuxer.js`/`ts-stream-engine.js` 行覆盖率→**100%**（分支 95.24%/94.64%）。全仓 2944/2944、lint 543 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 146 | HLS VOD 时间续播 ReferenceError 修复 | **真实缺陷**：`hls/src/player.js` `_loadMediaPlaylist` 的 `resumeFromUs` 分支调用 `computeResumeIndexByTimeUs` 但未从 utils.js 导入 → 一走入即 ReferenceError（该行从未被覆盖故长期潜伏）。补 import 并在 player-gaps.test.js 追加续播锚点三分支回归（+3 例：时间映射 seg1 / sn 锚点优先 / 0 值回列表头）。`hls/src/player.js` 行覆盖率→**100%**。全仓 2947/2947、lint 543 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 147 | FLAC 损坏帧重同步回归 | 新增 `flac/__tests__/player-resync.test.js`（+3 例）：尾部伪同步垃圾帧贡献 0 样本且与干净解码逐字节一致、帧体 CRC-16 损坏丢当前帧从下一好帧续解（样本位不虚增）、尾部半帧裁切不抛错。踩坑登记：`readFix` 返回 Buffer，`Buffer#slice()` 是视图非拷贝，破坏性用例须用 `new Uint8Array(flac)` 复制。`flac/src/player.js` 行/函数覆盖率→**100%**；frame-header.js:56-57 阻断策略守卫登记为结构性不可达（1 bit 读出恒合法）。全仓 2950/2950、lint 544 文件、check 16/16、双契约审计 PASS。 | 本波 |

| 148 | MP4 顶层扫描与 stbl 守卫补测 | 新增 `mp4/__tests__/demuxer-scan-gaps.test.js`（+4 例）：_scanTopLevel 直调幂等（free×2）、尾部 <8 字节 → truncated box header、声明尺寸越过文件末尾 → invalid top-level box、expandSampleTable 缺 stts → incomplete stbl tables。`mp4/src/demuxer.js` 残余 522-523 转绿；**169-170 登记为 V8 覆盖率报告伪缺口**（直调实测执行后仍报未覆盖，不再追）。全仓 2954/2954、lint 545 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 149 | MP4 box-parser 残余版本/防御分支补测 | 新增 `mp4/__tests__/box-parser-gaps.test.js`（+11 例）：iterateBoxes 尾部非零零头 throw / 全零 padding 早退（isPadding）/ size=0 延展容器末尾；parseMvhd、parseMdhd version 1 的 64 位字段分支；parseSampleEntry mp4a v1 扩展段、v2 QuickTime 扩展（F64 采样率）、未识别类型 raw 兜底；parseMoov largesize（size=1）与 size=0 头部形态；parseTrak edts→elst 嵌套扫描。`mp4/src/box-parser.js` 行 92.14→**100%**（分支 69.93→76.88%）。全仓 2965/2965、lint 546 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 150 | 跨模块薄缺口合测（webrtc/mkv/mp4/hls） | 新增 `webrtc-player-channel-factory.test.js`（+2：play 无 channel 走 createSignalChannel 工厂/有 channel 不重建，BoomSocket 快速失败法）；`builder-index-remuxer-gaps.test.js`（+5：buildEdts 非空 entries、index.probe 转发、createDemuxer Uint8Array/DataSource 双形态成功路径、remuxer 缺 description 守卫）；ebml.test.js +1（vintLength 0x100 越界）；decrypter-gaps.test.js +1（密钥响应过大 SOURCE_ERROR）。webrtc/player、mp4/index、mp4/remuxer、hls/decrypter 行覆盖→**100%**；登记 3 处不可达：ebml readDate 溢出守卫（u64 ns 恒 < MAX_SAFE ms）、box-builder largesize（需 >4GB 内存）、findTrunDataOffset 私有死分支。踩坑：FakePC removeEventListener 空实现致 gathering 回调自递归。全仓 2974/2974、lint 548 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 151 | core demuxer 别名层与 webtorrent 加载失败路径补测 | 新增 `core/__tests__/demuxer-legacy-gaps.test.js`（+4：getMediaInfo 透传、readSampleData 三段——data 短路/无 source STATE_ERROR/lazy 读取回填缓存）；player.test.js +1（client emit error 驱动 fail()：ATTACH_FAILED + 临时监听摘除断言）。core/demuxer.js 98.44→**100%**、webtorrent/player.js 99.45→**100%** 行覆盖。注：跑子集时基类覆盖数据失真，须带全模块合跑核实。全仓 2979/2979、lint 549 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 152 | FLAC _parseInit 外层重抛 + RTMP/WAV 死分支登记 | demuxer-gaps.test.js +1（非法字节直调 _parseInit（stateValue 注入 opening）→ 外层 catch 原样重抛），flac/src/demuxer.js 99.29→**100%**。登记 2 处结构性不可达：rtmp flv-demuxer 89-92（findFlvMagic 命中后魔数复核恒 false）、wav _doSeek 202-204 catch（try 体内无可抛错注入点）。全仓 2980/2980、lint 549 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 153 | 跨模块畸形输入契约 fuzz 固化 | 覆盖率饱和后转向缺陷挖掘：探测脚本 3000 轮（截断/字节覆写变异喂 mp4/mkv/mov/ts/flv/ape/wav/flac 八模块 probe+createDemuxer）零原始异常泄漏后，固化为 `core/__tests__/fuzz-contract.test.js`（+2 例，seeded xorshift 可复现）：probe 禁抛契约 + createDemuxer 拒绝面必带契约 code + 3s 限时 settle。用例侧踩坑：makeMinimalWebm 返回 {bytes,…} 对象非纯字节（首轮整批 TypeError 实为 fuzz 自身 mutate 入参误用）。全仓 2982/2982、lint 550 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 154 | 运行时 API 滥用面 fuzz 固化 + 测试基建静默丢例缺陷修复 | 探测（seek 边界 44 组合、操作序列交错 60 轮）零缺陷后固化 fuzz-contract.test.js +2 例（seek 非法入参必带 code/结果整数 µs；seek/readSample/samples/destroy 随机交错 20 轮不裸抛不悬挂、destroy 幂等）。**收尾时发现真缺陷**：`--test-force-exit` 下 top-level await 之后注册的用例被静默吞掉（本文件 4 例全仓只跑 2 例且 fail 0）——重构为无 top-level await（静态导入 8 模块 + 懒加载 ready promise），并在文件头注释登记该禁令。全仓 2984/2984（无损口径与 force-exit 口径差恰为 2，确认其他文件未受害）、lint 550 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 155 | 流式分块不变性 fuzz 固化 | 探测（.tmp/fuzz-probe4.mjs：flv 3 fixture × 6 档 + ts 3 fixture × 5 档随机切块，maxChunk=1 逐字节、188/376 跨 TS 包边界）零漂移后固化为 `core/__tests__/fuzz-chunk-invariance.test.js`（+2 例）：完好流整体喂入 vs 随机小块喂入，FlvParser/TsStreamEngine 事件流逐一 deepEqual（TypedArray 折叠为长度+校验和，Error 展开 name+message）；内置防空转断言（整体喂入零事件即失败）+ 负向自证（截尾 5 字节即事件流不一致，断言有判别力）。遵守第二百零七波禁令：无 top-level await。全仓 2986/2986、lint 551 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 156 | trun 敌意 sample_count 防御接手（clamp 重构） | 并行落盘的半成品修复（break 收敛/清零）致 cmaf 2 用例红且**破坏 ISO 规范语义**——stride=0 时全零样本行是 tfhd 默认回退的合法载体（materializeSamples `r.duration \|\| defaults.*`、mp4 `rec.size ?? defaultSampleSize`），清零=合法音频段整段丢样本。接手为钳制方案：stride===0 以接通的 limits.js 既有常量 DEFAULT_MAX_TRUN_SAMPLES（1e6，实测构造 47ms/77MB）封顶；cmaf stride>0 按框体完整行数钳制（消裸 RangeError），mp4 stride>0 保留 ByteStream 受控抛错；外部 2 个新测试文件期望同步改写并 +1 规范语义固化例（小 sampleCount 不得清零）。全仓 2994/2994、lint 552 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 157 | 流式变异×分块双应力 fuzz 固化 | 206 波（变异×整体）与 208 波（完好×分块）的交叉象限：畸形字节 + 随机切块**同时**施加于 FlvParser/TsStreamEngine，专打分块边界上的错误恢复/缓冲错位缺陷。探测 .tmp/fuzz-probe5.mjs 1600 轮（轻变异）+ 2400 轮高强度三模式（半缓冲覆写/纯随机流/极端截断）均零泄漏后固化为 fuzz-chunk-invariance.test.js +1 例（24 轮×7 fixture，断言 error/warn 事件载荷与 push 同步抛出均禁 TypeError/RangeError，rejection 必带 code）。旁证：AMF0 公开面（decodeAmf0）敌意深嵌套/巨大长度声明全部 1ms 内返回 null，防御已达标无需补测。全仓 2995/2995、lint 552 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 158 | hls m3u8 文本变异 fuzz 固化 | 首次把 fuzz 施加于文本协议面：5 个真实 playlist fixture 行级变异（12 种敌意行——溢出数值/未闭合引号/非法日期/巨型重复行——覆写、插入、删行、字符覆写、复制）× parsePlaylist/parseMaster/parseMedia/detectPlaylistType/parseByteRange/parseAttributes 公开面。探测 600 轮（2400 调用）+ utils 敌意串零泄漏后固化为 `hls/__tests__/fuzz-m3u8-text.test.js`（+2 例，同步 readFileSync 零 top-level await，含「200 轮全拒绝即探测失效」防空转断言与正例误杀锚点）。用例侧小坑：parseAttributes 数值属性返回 number（BANDWIDTH:1 非 '1'），首版正例锚点按字面猜测写字符串被断言当场纠正——锚点须以既有契约为准。全仓 2997/2997、lint 553 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 159 | subtitle 文本变异 fuzz 固化 | 211 波框架迁移到字幕面：6 个真实 srt/vtt/ass fixture 行级变异（12 种敌意行——溢出时间戳/未闭合标签/双向控制符 U+202E/巨型 Dialogue 重复字段——覆写、插入、删行、字符覆写、复制行）× parseSrt/parseVtt/parseAss/parseAuto/detectFormat/probe/parseCues/parseTimestamp/parseAssColor/tokenizeDialogue 十函数面。探测 700 轮 4713 调用零泄漏，固化 `subtitle/__tests__/fuzz-text.test.js`（+2 例，含正例锚点防过度拒绝）。登记非缺陷观察：数组工具面（shiftCues/sortCues 等）对 null 元素抛无 code TypeError 属 JS 参数惯例（入参非外部不可信数据），与首探 28 条「RAW」同为入参形状误用（206 波教训再现：**探前先核对函数签名与入参形状**）。用例侧第二坑：parseXxx 返回 {format,cues,…} 文档对象非裸数组，锚点断言按实际契约修正。全仓 2999/2999、lint 554 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 160 | wav/flac 头部字段定向 mutation + flac totalSamples 36-bit 截断修复 | 定向边界值（0/1/满码/半程/回绕）取代随机覆写：wav RIFF/fmt/data 九字段边界表 × 3 fixture、flac STREAMINFO 敌意位域 11 补丁、parseFrameHeader 保留码全枚举（bs×sr×ch×bits 768 组合+截断+非法 offset）。探测 8390 调用零裸抛后固化 `wav/__tests__/fuzz-header-fields.test.js`（+2 例）、`flac/__tests__/fuzz-header-fields.test.js`（+4 例）。**命中真缺陷**：`flac/src/metadata.js` parseStreamInfo totalSamples `(A + B) >>> 0` 优先级截断——36-bit 字段高 4 位丢失（2^36-1 读成 2^32-1），修复为 `A + (B >>> 0)`，低 32 位内行为逐位不变；既有测试 helper 早已拆写 tsHi/tsLo 却从未喂高位非零值，拆写测试与截断解析互相掩盖（**位域拆写必须配高位断言**）。探测侧教训：STREAMINFO 补丁首轮全部未生效——body 基址是 fixture 偏移 8 非 0，定向 mutation 先核对字段偏移基址否则假阴性。登记观察：flac sampleRate=0 为规范合法占位、解析层不校验与 wav 头同一哲学。全仓 3005/3005、lint 556 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 161 | mkv EBML vint 定向边界 + 三处防御修复 | 定向战线迁移到 EBML 面：vintLength 全 256 枚举、readSize 宽度 1..8 各档 max/unknown/zero 位型+截断、encodeSize/encodeUnknownSize/encodeSignedVint round-trip、readUInt/Int/Float/Date 宽度枚举、decodeLacing 敌意头 10 例、iterElements seeded 敌意 300 轮收敛。探测 804 调用后固化 `mkv/__tests__/vint-directed-boundary.test.js`（+8 例）。**修复 3 处**：vintLength 域外输入行为漂移（null 裸 TypeError、-1/1.5 位运算误判长度）→ 定义域统一 EbmlError；readDate 按无符号读——全 1 位型 -1ns 被读成公元 2596 年、与注释 signed 声明不符 → 补二补码；encodeSignedVint 缺 len>8 守卫越界静默产出错乱 9 字节编码 → 补抛（对齐 encodeSize）。探测者自身教训：8 档极值/进位全踩 Number 2^53 精度域（断言值必须可精确表示），固化期望修正三轮。登记观察：readFloat NaN 位型属 IEEE754 无损解码；8 字节全 1 = unknown 属规范行为。全仓 3013/3013、lint 557 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 162 | subtitle 布局面敌意 cue 序列 + 三处防御修复 | 212 波文本面推进到几何求解面：layoutEvents 敌意 geom/settings 表 × 时间轴点、7 纯函数直接函数面、seeded 混合活跃 fuzz。探测 .tmp/probe-subtitle-layout.mjs 575 调用。**修复 3 处**：①首次性能防御面——resolveCollisions O(n²) 无钳制，5 万条同刻活跃单次 4061ms（敌意字幕冻帧 DoS）→ MAX_STACK_EVENTS=512 堆叠钳制（超限照常绘制不堆叠，显示退化不冻结，66ms）；②tags \pos/\org 正则只锁字符集不锁值域，'..'/'9'×400 parseFloat 出 NaN/Infinity 泄漏几何 → 补 Number.isFinite（对齐 move/clip 既有守卫）；③ASS Margin 原样字符串 'Infinity' 过 >0 判定推爆 rect.y → buildOne 加 fin() 有限数守卫。登记观察：程序化直传非有限 cue.geom 属调用方责任（212 波数组面先例，外部文件路径已在 tags 层封堵）。固化 subtitle/__tests__/layout-hostile.test.js +6 例（含限时收敛与钳制行为断言）。全仓 3019/3019、lint 558 文件、check 16/16、双契约审计 PASS。 | `c7c75f7` |
| 163 | mov/atom 头部字段定向 mutation + interpretEdits 守卫 + vendor 越界读修复 | 定向战线推进到 QT 兼容层：ftyp size 字段 14 边界值 × 4 主品牌 × 11 截断长度、largesize/size=0/size<8 敌意序列、cmov/dcom 位型 8 例、udta 文本 atom strLen 全边界（0/恰满/超长1/65535/非法 UTF-8）13 套件 × 双入参形态、interpretEdits 13 敌意形状 × 11 timescale、probe 顶层 size 回绕。**修复 2 处**：①interpretEdits（index.js 公开导出）定义域守卫——{} 无 entries/entries 非数组/null 条目裸 TypeError（已有 `!elstEntries` 防御姿态但不完整，214 波 vintLength 同型），Infinity mediaTime 泄漏非有限 firstMediaTimeSec、timescale=Infinity 过 >0 判定产出 NaN → Array.isArray+isFinite 过滤，合法路径逐位不变；②detectCompressedMoov dcom 截断位型按绝对偏移直读 4 字节越过盒尾混入零字节（vendor='\u0001\u0002\u0000\u0000' 控制字符泄漏）→ 要求内容区 ≥4B 且可打印 ASCII 才采纳。固化 mov/__tests__/atom-directed-boundary.test.js +7 例。探测/固化双侧教训：**手工构盒 size 字段=整盒长度（8+payload），helper 少算 4 会让全部「正例锚」实际喂进错位字节**（本轮探测 680 调用的语义锚失真，固化时以正确 helper 重建才暴露 vendor 越界真缺陷）；探测判据「禁裸抛」以 isRaw 过滤会放过无 code 裸抛，固化判据升级为「受控错误必须带 code」（ctrl 包装）。全仓 3026/3026、lint 559 文件、check 16/16、双契约审计 PASS。 | 本波 |

> 注：候选池未达标项以 `node scripts/audit/iteration-scan.mjs` 实时输出为准（本表为快照，可能滞后）。
| 67 | npm 首发pure-webcodecs-player@0.1.0（owner 指令「先发布一版npm」） | package.json：exports 16 子路径（"."=core、./mp4 等 15 模块）、files 仅各模块 src+README+LICENSE、sideEffects=false；新增 MIT LICENSE（此前无许可证）；README §使用方式 2 加 npm 安装段。验证：npmjs 发布成功（tar 412.8kB/171 文件），临时目录真实 `npm i` 后 bare import 与 ./mp4、./wav 子路径导入全通；全仓 1144/1144 绿 | `52df096` |
| 68 | README 精简（owner 指令） | 删「模块状态表」「交付标准」「质量门禁与工程化」三块内部治理内容（非使用者视角）；保留目标/效果演示/快速开始/使用方式/统一管线。结合第六十七波：npm@0.1.0 标注 + CDN 直引断链修复 + §3 包名 import | `8dd57c9` |
| 69 | 根路径重定向 mp4/demo/（owner 选方向1） | index.html 重定向目标由 ./site/demo/index.html 改为 ./mp4/demo/，打开仓库主页即播放器；线上已生效验证（curl 返回 location.replace('./mp4/demo/')） | `2c66a19` |
| 70 | 总览页 MODULES.status 陈旧修复（owner「继续优化」） | nav.js 16 模块 status 全部对齐 ok（core/mp4/mov/mkv/webtorrent/ts/flv/hls/cmaf/webrtc wip→ok，rtsp/rtmp na→ok）；线上 hub playwright 验证 16 卡片徽章取值唯一 ["可用"]；hub 截图已同步更新 | `e7ff2eb` |
| 71 | 真机 e2e 回归脚本化（P2） | 新增 `scripts/e2e/demo-smoke.mjs`：playwright 驱动真实 Chrome 遍历 16 模块 demo 页 + hub，捕获 console error/pageerror + 资源 404（favicon/sourcemap 豁免），mp4/hls 用本地样本（sintel-trailer.mp4 / ts-hls/playlist.m3u8）自动驱动播放并断言（video playing / stats 分片），全屏截图刷新 `docs/review/i3/*.png` 与 `docs/demo/demo-hub.png`；17/17 全 PASS、退出码 0；backlog 划掉 hub 徽章 P2 + e2e P2 | 本波 |
| 72 | 修复 mkv 两个真实缺陷 | ①**CueTime 未按 TimecodeScale 缩放**：`#parseCuesAt` 把 CueTime 直接当 ns，与 `locate()` 的 targetNs(=us×1000) 单位差 1e6 倍 → 二分命中错误簇（seek(1.6s) 误落 2s 簇）；改为 ×`this.timecodeScaleNs`，并修正既有用例 demuxer.test.js「seek：Cues 定位」（原期望 1.6s 命中 cluster1 系旧 bug 凑巧成立，目标改 2s 以保持原意图）。②**DiscardPadding 对外丢失**：`#emitBlockFrames` 已解析为 µs，但 `#iterateTrack` 映射未透传 → `readSample` 拿不到 Opus/AAC 首尾填充裁剪依据；现透传 `discardPaddingUs`/`discardable` | `8d47f09` |
| 73 | webrtc 补测（27→58） | +4 文件：SDP 构造与 `parseCandidateLine` 边界、getStats 极端输入（无 inbound-rtp / 未 succeeded 候选 / 除零 / 未来时间戳截断）、player 边界（parsePlayerUrl 多形态、状态枚举冻结、destroy 清理、trickle 注入、重连中 destroy 取消定时器）、信令错误分支（5xx/4xx/非 sdp/Location 协议白名单、WS 无实现、`__proto__` 键拒绝） | `c183b95` |
| 74 | wav 补测（75→82） | +4 文件：RIFF/WAVE 头校验（截断/坏魔数/流式哨兵 0xFFFFFFFF）、fmt 全格式（PCM 8/16/24/32、IEEE float、mulaw/alaw、extensible SubFormat GUID、cbSize 缺失）、chunk 边界（未知块跳过/奇数长度补齐/data 先于 fmt/超大块报错）、createWavPlayer 在 Node 与 browser-mock 下的支持性契约 | `70a4010` |
| 75 | cmaf 补测 | +3 文件：init segment 配置提取（avcC/hvcC/mp4a、未知盒、零长不崩）、fragment 封装（两遍 `data_offset` 回填、mdat 载荷、parseMoof 的 tfhd/tfdt/trun、mfhd seq 递增）、box 字节级解析（readBoxHeader 普通/largesize/截断、findBox、parseTrun v0/v1 有符号 cts） | `fd2ef47` |
| 76 | ape 补测 | +3 文件：压缩等级码表全量映射（descriptor/legacy 双路径、未知码兜底 `code-XXXX`）、validate 边界（采样率/声道/帧数越界拒绝与合法极值）、APE 标签解析（<32B/<160B 的 ID3v1 守卫、空标签安全、valueLen 越界钳制、itemsStart>itemsEnd 抛错） | `351616c` |
| 77 | flac 补测 | +5 文件：bitreader 位读取边界越界、CRC8/CRC16、帧头与帧同步、metadata 各类块（STREAMINFO/VORBIS_COMMENT/PICTURE/SEEKTABLE 占位乱序残尾/APPLICATION/padding 截断）、subframe 各预测分支（CONSTANT/FIXED/LPC/verbatim）与残差解码 | `3c9e7e0` |
| 78 | mkv 补测（+4 文件） | EBML 变长整数与定长读写边界、Cues 与 seek 定位、时间戳与关键帧判定、轨道与编解码私有数据解析。**并修正 3 处测试自身缺陷**：Cues 自依赖（CueClusterPosition 依赖 Cues 长度、Cues 长度又依赖其值）改用 `minLen=8` 固定宽度两遍构造并附等长断言兜底；`U8(10)` 实为 `Uint8Array.from(10)`→空数组致 xiph 帧全 0 长，改 `new Uint8Array(10)`；AAC ASC 显式采样率须位于 channelConfiguration **之前**（规范顺序），此前置错得到 sampleRate=2103152 | `293ade7` |
| 79 | rtmp/rtsp/subtitle 补测（后台并行） | +12 文件（rtmp/rtsp/subtitle 各 4）：rtmp 按 WebSocket-FLV 桥接实际源码补 AMF0 全类型/错误工厂/MP4 封装/WS URL 安全守卫；rtsp 补错误枚举/Backoff/SDP 边界/报文与 RTP 解析错误分支；subtitle 补时间码/ASS 标签/detectFormat/VTT settings。全仓 1385 → **1531**（+146） | `6e2babf` |
| 80 | 修复 subtitle 两个真实缺陷 | ①track.js:69 对 ASS 的 Uint8Array raw 二次 encode（ToString 压成逗号串），改 instanceof 透传，连带修复 createTextTrack 的 x-ass codec 推断；②time.js:45 小数域 padEnd 只补不截（'1234'→1234ms），改 slice(0,3).padEnd | `ce34d30` |
| 81 | 修复 APE 头偏移（高危，真实文件全读错） | descriptor 分支把 offset 6 的 nPadding 当 descriptorLen、header 硬编码 offset 32、audioOffset=56 忽略 seekTable/headerData。按真实布局（52B 描述符含 MD5，header 从 descriptorLen 起）重写；5 个测试文件的 buildDescriptorFile 与 gen.mjs 复刻了错误布局自洽掩盖 bug，全部重写 + 3 条 conformance 回归。ape 74/74 | `0b5e0cc` |
| 82 | 修复 CMAF findTimescales 顺序假定 | 全文件扫 'mdhd' + 按出现顺序假定第 1 个=视频 → 音频在前取反、解码配置字节误命中。改 box 树关联：moov→trak→mdia，hdlr handlerType 判轨型再读 mdhd；缺字段跳过兜底。新增乱序双轨/埋字节/缺 hdlr 测试（旧实现验证必败）。cmaf 58/58 | `bd7b327` |
| 83 | 全仓只读审计 | 产出 `docs/review/audit-79.md`：A 技术债 8 条（多为有意设计，轻量债 webtorrent bencode 死参数、rtsp/rtmp 空 catch）、B 密度最低 flv/core/ts、C 确凿 bug 4 条（C-1 APE 高危已修、C-2 CMAF 已修、C-3 subtitle ms 截断已修、C-4 flv duration=0 待办）、D 死导出 buildBtrt + 重复实现 BitReader×4/BitWriter×2/buildEsds×2。C-4 与重构级收敛**待 owner 决策**后动 | 本波 |
| 84 | flv 补测 + 修复 C-4 | cut() 非 flush 切片末帧 durationTicks 未回填即出 trun → duration=0；改用上一回填帧时长估算兜底（与 flush() 一致）+ trun 全 duration>0 回归。补测 +11（音频位域/ASC 序列头/MP3 直通/ASC 24bit 扩展位序修正）。flv 52 → 63 | `734c982` |
| 85 | ts 补测（+17） | 包头/TEI/PUSI/CC/afControl 三分支与 afLen 边界/AF stuffing 落位/半截 PES 丢弃（0xff stuffing 语义）/截断与垃圾重同步。ts 72 → 90 | `17985dd` |
| 86 | core 补测（+19） | pipeline 错误路径：Fake codec 注入下 decodeError 传播/configure 失败/close-reset 重建。core 密度收敛起步 | `d97d47a` |
| 87 | hls 补测（+28）+ 修复 averageBandwidth 恒 0 | m3u8-parser 读 AVERAGE-BANDWIDTH 键名误写下划线（attrs.AVERAGE_BANDWIDTH），parseAttributes 保留连字符原键 → 所有 level 的 averageBandwidth 恒 0，ABR 选档依据失效。补测覆盖主清单边界/KEY 作用域与 IV/ABR 闸/loader 守卫（410 不重试/maxBytes 熔断）。hls 118 → 146 | `2d40098` |
| 88 | mov 补测（+39）+ 修复 mp4 两缺陷 | ①buildStsz defaultSize≠0 时 sample_count 恒写 0（违反 ISO 14496-12）→ 恒写 sizes.length；②stz2 误映射 parseStsz（布局不符，field_size<32 静默错解）→ 新增 parseStz2（4/8/16，返回形状与 stsz 一致）+ 5 例专项。mov 30 → 69、mp4 68 → 74 | `1e62d38` |
| 89 | core 正向补测（+38）+ 修复 ended 恒 true | player.js seek() 成功路径不复位 endedValue → ended 后 play() 自动重播期间 player.ended 恒 true；seek 成功即复位（HTMLMediaElement 语义）+ 回归断言。补测覆盖状态机全矩阵/pipeline 队列与渲染决策/clock 与 Emitter 边界。core 180 → 218 | `e434065` |
| 90 | 第三批后台流程升级 | 后台 agent 改用 lite 模型规避默认模型 429 + 「增量验证」约束（每写完 1 个测试文件立即跑模块测试再写下一个）→ 落盘文件全部已验证，主线程零测试构造错修复，只处理真实缺陷 | 本波 |
| 91 | mp4 补测（+15）+ 修复 seek 游标不重定位 | **高**：_doSeek 只算返回值不重定位游标，违反 core 契约——渐进模式 seek 后从样本 0 重来、分片模式 seek 后提前 EOS（两种模式 seek 全坏）。修：各轨 state 增 resumeIndex，_doSeek 写目标轨关键帧二分结果 + 其余轨按各自时间基定位（_locateResumeIndex）；渐进迭代器从 resumeIndex 起步；分片迭代器开头重放表内样本再接续扫描（重放不动共享游标；resumeIndex=0 且表非空也重放）。已知限制注释明示：中断 moof 内未解析样本随游标越过丢失。补测：双轨交错、渐进→fMP4 remux→读回往返、游程与退化文件、seek 四场景回归。mp4 74 → 92 | `6268350` |
| 92 | webtorrent 补测（+45）+ 修复 3 缺陷 | **高**：read() OOB 检查只在 slice 路径，顺序流 offset≥size 静默返回空数组（两路行为不一致 + 违反 EOF 契约）→ 检查上提入口两路共用；**中**：autoSelect=false 声明可用实际不可用（null file 流入 createTorrentSource 抛 SOURCE_ERROR 且 state 永卡 loading，且无手动选文件 API）→ 诚实抛 STATE_ERROR + degraded，手动选文件 API 进待办；清理 bdecodeRaw 的 void bytes+arguments[0] 占位异味（audit A 遗留）。webtorrent 100 → 145 | 本波 |
| 93 | webtorrent selectFile() API（第五批后台） | 补上 autoSelect=false 的手动路径：player.selectFile(selector) 在 degraded 态调用后续走加载管线至 ready；selector 四形态（对象/文件名/索引/谓词）；错误分支全显式（FILE_NOT_FOUND / NOT_MEDIA / PARSE_ERROR / STATE_ERROR）保持 degraded 可重试；attach 与 selectFile 公共收尾 #finishLoad()；README 同步 + 修正两处过期计数（50→152）。webtorrent 145 → 152 | `18d1ec4` |
| 94 | cmaf 深化补测 + 修复 2 缺陷（第五批后台） | **isobmff parseTrun**：flags 含 first-sample-flags-present（0x004）时不消费 data_offset 后的 4 字节字段 → 样本行整体错位 4 字节且首样本标志未应用 → 消费并赋 rows[0]；**materializeSamples**：dataOffset 应以 moof 起点为基准（各 muxer 均按 moof.length+8 写入），此前错加在 mdat 载荷起点 → dataStart 偏大 moof.size+8、样本数据全读偏 → 改 moofStart+dataOffset（无标志回退 mdat）。补测：splitChunks finalize 分支、moof flag 组合（v0/v1 cts、tfhd 缺省回落、单 moof 双 traf）、muxer→parser 逐字段往返。cmaf 58 → 81 | `3109f37` |
| 95 | ts 深化补测 + 修复 3 缺陷（第五批后台） |
| 97 | webrtc 深化补测 + 修复 stats 帧数误归零（第六批后台） | 补测 4 文件 +75 例：player-main 状态机全矩阵/destroy 幂等/parsePlayerUrl 拒 stun/turn/ftp/rtsp；signaling-http WHEP 协议白名单/sendCandidate 无 Auth/WS 8MB 熔断/危险键拒绝；stats-backoff 抖动下限/各类 report 缺省/续采；sdp-advanced 多 m= section/四方向/parseCandidateLine TCP 归一。修复：stats.js framesDecoded/framesDropped ?? bucket 0 致某次 report 缺字段时指标从非零归零（违反 WebRTC 单调递增）→ fallback 顺序 s→prev→bucket + 纳入 nextPrev 通道。webrtc 58 → 134。 | `2febd4c` |
| 98 | 第六批后台待补 rtmp（额度未恢复） | 6 次派 rtmp（agent-21/23/25 三次 429，agent-22/24/25 等 webrtc 已完成）均撞额度。**实际状态：webrtc 97 已完成并提交，rtmp 仍维持 84/84 基线**，14:08 重置后重派。 | 本波 |
| 96 | 第五批后台任务收尾 | webtorrent selectFile API（93）+ cmaf 两缺陷修复（94：parseTrun first-sample-flags 错位 / materializeSamples dataOffset 基准错）+ ts 三缺陷修复（95：CC/disc 次序 / PCR 33bit 回绕 / PMT 换版静默）| 本批 | **CC/discontinuity 次序**：CC 校验先于 AF 解析，拼接点跳变误计 ccError → AF 解析上提、discontinuity 豁免；**PCR 回绕**：min/max 追踪使 33 位回绕后时长变 ≈26.5h 垃圾值且 span<0 补偿不可达 → 回退值 +2^33 抬升单调域；**PMT 换版静默**：`changed = firstSeen` 使仅移除 ES 的换版不重发 tracks、this.tracks 残留 → firstSeen\|\|versionChanged。补测：跨包 PES 组装/PTS-DTS 三形态与回绕连续化/declaredLength=0/PSI 跨包分段/stream_type 全映射/版本对账/PCR ext/丢包恢复。ts 90 → 113 | 本波 |
| 99 | rtmp 正向管线补测 + 修复 4 缺陷（第七批后台） | agent-26 补 player/gateway-source/flv-demuxer 正向管线与错误恢复（92→114，+3 文件）；主线程独立核实修 4 缺陷：①stats.reconnects 仅声明不累加→#scheduleReconnect 重连分支累加；②#nextBackoffMs 先++再 emit 致 will-reconnect.attempt 首次报 1→改先 emit 后++（attempt=本轮重连序号）；③flushPending() 无参却 flushPending(true) 调用（死参，去掉参数）；④gateway-source.js 视图越界（byteOffset）→按 byteOffset/byteLength 切片。补 2 条回归（reconnects 自增 / will-reconnect.attempt）。rtmp 114 → 116 | 本波 |
| 100 | core env 层可测化补测 + 修复 flipY 死选项（第七批后台） | agent-27 env 层纯逻辑分支（capabilities/renderer/mse-helper/pipeline-mse，Fake globalThis + try/finally 还原，218→297，+4 文件）；主线程修 video-frame-renderer.js:238 `1-offY-scaleY ≡ offY` 代数恒等致 flipY 失效→改 `1-offY`（flipY=false 关于 v=0.5 镜像，默认 flipY=true 行为不变）+ 翻转固化观测（断言 flipY=false 使 uvTop=0.78125 且 ≠ flipY=true）。core 297/297 | 本波 |
| 101 | mkv 深化补测 + 修复 5 缺陷（第七批后台） | agent-28 深化补测（BlockGroup/Cluster 跨边界/Cues/codecs 私有数据/错误边界，118→179，+4 文件）；主线程修 5 缺陷：①codecs.js FLAC totalSamples 36bit 字节位错；②簇内未知元素 break 致整簇丢弃→跳过 payload 后 continue；③同 CuePoint 多 CueTrackPositions 后者覆盖→按 CueTrack 独立 push；④Duration 早于 TimecodeScale 误用默认 scale→先存 durationRaw 后重算；⑤LanguageIETF 被 legacy Language 覆盖→`_ietfLang` 守卫。5 处均翻转固化观测。mkv 179/179 | 本波 |
| 102 | subtitle 渲染层与解析边界深化补测（+60 例，第八批后台） | 攻克 renderer（覆盖率 40.8% 的环境豁免层）：Node 下**注入式 stub 2D 上下文**（measureText 按字符数×10 确定性返回）断言绘制几何而非像素。renderer.test.js（14：九宫锚点 an=1/3/5/7/9→textAlign/textBaseline、`\pos` 直通、样式透传、多 cue 堆叠、attach 无 rAF 降级）+ subtitle-renderer.test.js（19：borderStyle=3 底框、shadow 层、outline 描边、underline/strikeout、多 run 累计偏移、alpha≤0 跳过、clip/rotation 变换）+ detect-parseauto（11）+ parse-edge（16）。主线程核实并修正 1 处**断言张冠李戴**：折行不属 renderer 职责，实为 layout.js:111 `wrapSegments`（layoutEvents 阶段完成），未经 layout 的原始 cue 渲染为单行 → 改为固化观测并记录折行归属。subtitle 249/249 | 本波 |
| 103 | flv remuxer/demuxer 深化补测（+41 例，第八批后台） | flv-demuxer-deep（15：probe 边界/AAC ASC 边角与 AOT=31 扩展/多 sps-pps/非官方 CodecID=12 HEVC/vp09 透传/PreviousTagSize 不校验/destroy 后写入守卫）；fmp4-remuxer-deep（14：trun flag 组合/duration 回填/tfdt baseDts/CTS 正负/>255 样本/空轨）；flv-fmp4-remuxer-deep（12：setTracks 幂等/pushSample 守卫/HEVC hvcC/mp3 排除/音频 0x705）。主线程修 6 处**用例侧**错误（src 无误）：①`walkBoxes(moof)` 只列给定缓冲顶层盒（moof 切片顶层即 moof）→ 改用 drill 下钻校验 mfhd/traf；②默认 fragmentUs 下样本并入同片致 segs[1] undefined → 首样本关键帧/非关键帧两种情形分别构造；③`dts=-1000µs` 实为 -1ms（timescale=1000）→ tfdt 应为 `(-1)>>>0`(0xFFFFFFFF) 而非 `(-1000)>>>0`；④>255 样本需放大 fragmentUs（10s）才会合并为单个 trun；⑤destroy 后 `samples()` 抛 STATE_ERROR 属 core `_requireUsable` 既有守卫（非静默返回 0）。flv 130/130 | 本波 |
| 104 | mov 深化补测（+20 例，第八批后台） | mov-demuxer-deep（20）：expandSampleTable 的 stsc 三 run/stts 多 run 与大 delta(1<<24)/stss/stsz 零尺寸/ctts v0 无符号与 v1 负偏移，端到端多轨、奇数 timescale(2997)、elst、逐字节增量喂入、probe 品牌取舍。**修复阻断性 SyntaxError**：test 回调内含 `await import` 却未声明 async → 整文件 789 行无法编译（0 pass/1 fail）；改为 `async () =>` 后解锁 20 例。修正 stts 期望（**src 正确**）：`dts[i]=Σ delta[0..i-1]` → [0,10,20,40,60] 而非 [0,10,30,50,70]。**登记 2 项待核查**：text 轨未回填 sampleEntryType（undefined）；未知 ftyp 品牌('xyz ')仍命中 mov（置信 0.57，未让位 null）。mov 89/89 | 本波 |
| — | 第八批后台：全员 429 额度中断 | 本批 agent-31/32（第七批末派出）与 agent-33/34/35（本批重派）**全部因 429「使用量已超出频率限制」失败**（重置 19:10:56）。**结论：重派无效，改主线程直接接手**——agent 产物虽落盘但未经完整验证（8 个新文件中 6 个带缺陷），主线程逐一核实并修复后全绿。**教训：429 期间不要空等/重派，先扫 `git status` 抢救已落盘产物。** | 本波 |
| 108 | env 层可测化续作（flac/mp4 两低覆盖文件） | 沿用 Fake globalThis（withGlobals try/finally 还原）+ 注入式 stub 模式，不引入 Playwright：①`flac/__tests__/player-smart.test.js`（+6）：loadFlacSmart 主路径 decodeAudioData（WAV 交接头/载荷、原字节不分离、tags 空对象）、decode 抛错回退与无 AudioContext 回退（真实 fixture 与 decodeFlacToPlayable 全等）、createFlacPlayer 能力探测（Node null / 齐全 instanceof WavPlayer / 缺 createObjectURL null）、encodeF32PlanarToWavBytes IEEE float 头与 planar→交错字节级；②`mp4/__tests__/webcodecs-pipeline.test.js`（+7）：Fake VideoDecoder/AudioDecoder/EncodedChunk + 假 demuxer 覆盖管线类全分支——supported() 三分支（双支持/音频不支持仍 true/双不支持 configs unsupported/isConfigSupported 抛异常 reason）、start() 双轨 pump（chunk key/delta、timestamp/duration、stats 多重集比较）、fromSampleIndex 跳过不读取、无 data 触发 readSampleData、decode 抛错捕获 pump 不中断、背压 decodeQueueSize>maxQueue 让出回落继续、reset() 中止运行中 pump（flush 不调用、引用清空）、close 幂等、运行中重复 start 抛 STATE_ERROR。**修复 3 处测试自身缺陷**：demuxed 顺序依赖微任务交错改多重集比较；FakeDecoder 静态方法硬读父类属性致子类遮蔽无效改 `this.supported`；fixture 期望值算错（-0 vs 0、0.5 vs 0.75）。flac/player 38.0→98.8%、mp4/webcodecs-pipeline 40.6→97.2%，env 层均分 79.3%→86.2%；全仓 2509/2509（+13）、lint 480 文件 0 警告、check 16/16、双契约审计 0/PASS | 本波 |
| 109 | MOV atom 定向边界防御 | 修复 `mov/src/atom-compat.js`：压缩 moov 的 dcom vendor 仅接受盒内完整且可打印的四字符，`interpretEdits` 对 entries、mediaTime、timescale 做定义域校验；新增 `mov/__tests__/atom-directed-boundary.test.js`，覆盖 ftyp/atom 截断、cmov/dcom、udta 文本、编辑列表与 probe 敌意输入。全仓 3028/3028、lint 559 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 110 | TS ChunkSource 未知流类型 EOS 回归 | 扩展 `ts/__tests__/ts-demuxer.test.js`：构造 PAT/PMT 仅含未知 `stream_type=0x06` 的流式输入，并补足三个同步包满足包长探测；验证 PSI 已解析、未知 PID 进入 ignoredStreams，`open()` 在 EOS 返回 `container=ts` 且空轨道，不挂起或误报解析错误。全仓 3029/3029、lint 559 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 111 | CMAF 视频配置搜索隔离 sample entry | 修复 `cmaf/src/isobmff.js`：`findVideoDecoderConfig()` 将配置盒搜索和尺寸校验限制在当前 sample entry 内，避免第一条轨缺配置时误取后续轨的 avcC/hvcC；新增双视频轨回归。全仓 3031/3031、lint 559 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 111 | CMAF esds 跨盒误识别防御 | 修复 `cmaf/src/isobmff.js`：`findAudioSpecificConfig()` 将扫描范围限制在合法 `esds` 盒内，避免从后续盒误识别 `0x05 + ASC`；新增跨盒误命中回归。全仓 3030/3030、lint 559 文件、check 16/16、双契约审计 PASS。 | 本波 |
| 112 | CMAF ESDS 嵌套描述符结构解析 | 修复 `cmaf/src/isobmff.js`：按边界解析 ES_Descriptor、ES 可选字段、DecoderConfigDescriptor 与 DSI，避免在 ES_ID/bitrate 等字节中误判伪 `0x05` ASC；新增伪标签与可选字段回归。全仓 3033/3033、lint 559 文件、check 16/16、双契约审计 PASS。 | 本波 |
