diff --git a/refactor/baselines/mb-hour-av-breach.json b/refactor/baselines/mb-hour-av-breach.json new file mode 100644 index 000000000..1210e2d3b --- /dev/null +++ b/refactor/baselines/mb-hour-av-breach.json @@ -0,0 +1,270 @@ +{ + "schemaVersion": 1, + "task": "PKG-MB-09", + "risk": "MB-SYNC-01", + "status": "running-threshold-breach", + "terminalResultObserved": false, + "thresholdSeconds": 0.25, + "sourceSnapshot": { + "path": "refactor/.cache/mb09-hour-first-av-breach.json", + "sha256": "045ef64a10a183afd1910e297b1486942043c944cc157ba16b39db9fdc78ec1a" + }, + "capturedAt": "2026-09-16T03:51:20.798Z", + "scope": "Existing per-five-second samples, not a root-cause conclusion or terminal result", + "cases": [ + { + "case": "mediabunny-MediaBunny-sust-71bde-layback-with-published-core-chromium", + "firstBreachIndex": 352, + "totalSamples": 385, + "aroundBreach": [ + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1751710, + "time": 1751.9706666666666, + "rate": 1, + "active": 51, + "queued": 51, + "iterators": 2, + "draws": 42023, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.02500000000009095 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1756731.2999999523, + "time": 1756.9893333333332, + "rate": 1, + "active": 56, + "queued": 56, + "iterators": 2, + "draws": 42144, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.02500000000009095 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1762024.2999999523, + "time": 1762.28, + "rate": 1, + "active": 37, + "queued": 37, + "iterators": 2, + "draws": 42270, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.2293333333332157 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1767445.5, + "time": 1767.7013333333332, + "rate": 1, + "active": 49, + "queued": 49, + "iterators": 2, + "draws": 42401, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5489999999997508 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1772834.6999999285, + "time": 1773.0906666666665, + "rate": 1, + "active": 53, + "queued": 53, + "iterators": 2, + "draws": 42531, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5489999999997508 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1778402.7999999523, + "time": 1778.6613333333332, + "rate": 1, + "active": 48, + "queued": 48, + "iterators": 2, + "draws": 42664, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5489999999997508 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1783602.1999999285, + "time": 1783.8613333333333, + "rate": 1, + "active": 60, + "queued": 60, + "iterators": 2, + "draws": 42789, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5489999999997508 + } + ], + "latest": { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1929476.7999999523, + "time": 1929.7306666666666, + "rate": 1, + "active": 54, + "queued": 54, + "iterators": 2, + "draws": 46290, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5489999999997508 + } + }, + { + "case": "mediabunny-MediaBunny-sust-828df-layback-with-candidate-core-chromium", + "firstBreachIndex": 352, + "totalSamples": 385, + "aroundBreach": [ + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1751722.7999999523, + "time": 1751.9813333333332, + "rate": 1, + "active": 50, + "queued": 50, + "iterators": 2, + "draws": 42024, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.02500000000000213 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1756745.3999999762, + "time": 1757, + "rate": 1, + "active": 55, + "queued": 55, + "iterators": 2, + "draws": 42144, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.02500000000000213 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1761913.6999999285, + "time": 1762.1706666666666, + "rate": 1, + "active": 53, + "queued": 53, + "iterators": 2, + "draws": 42268, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.15599999999994907 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1767215, + "time": 1767.4693333333332, + "rate": 1, + "active": 60, + "queued": 60, + "iterators": 2, + "draws": 42395, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5699999999999363 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1772244.5, + "time": 1772.5013333333334, + "rate": 1, + "active": 48, + "queued": 48, + "iterators": 2, + "draws": 42515, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5699999999999363 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1777372.5999999046, + "time": 1777.6293333333333, + "rate": 1, + "active": 48, + "queued": 48, + "iterators": 2, + "draws": 42639, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5699999999999363 + }, + { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1782881.0999999046, + "time": 1783.1413333333333, + "rate": 1, + "active": 62, + "queued": 62, + "iterators": 2, + "draws": 42771, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5699999999999363 + } + ], + "latest": { + "kind": "sample", + "phase": "continuous-1x", + "wall": 1928707.2999999523, + "time": 1928.96, + "rate": 1, + "active": 58, + "queued": 58, + "iterators": 2, + "draws": 46271, + "visibility": "visible", + "paused": false, + "error": null, + "maxAVError": 0.5699999999999363 + } + } + ] +} diff --git a/refactor/changes/2026-09-16-PKG-MB-09-av-breach.md b/refactor/changes/2026-09-16-PKG-MB-09-av-breach.md new file mode 100644 index 000000000..2a98a945b --- /dev/null +++ b/refactor/changes/2026-09-16-PKG-MB-09-av-breach.md @@ -0,0 +1,32 @@ +# PKG-MB-09:长测中的 AV 阈值越界 + +这是一份运行中检查点,不是终结报告。长测进程继续运行,被测源码、产物、素材和 +原有阈值没有修改,也没有重启用例或将结果标为通过。 + +## 已观察到的事实 + +首批两个 Chromium 场景都使用已安装的 MediaBunny 2.0.0,分别搭配发布核心和候选核心。 +约第 1762 秒,累计最大解码帧时间戳/AudioContext 主时钟偏差从约 25ms 增至 +229ms / 156ms;约第 1767 秒,两组分别升至约 549ms / 570ms,超过原有 250ms 门槛。 +对应采样仍为 visible、1×、未暂停、无媒体错误;媒体时钟和绘制计数继续增加,活动 +音频节点和迭代器未突破原上限。参见[固定采样快照](../baselines/mb-hour-av-breach.json)。 + +两组几乎同时发生越界,但都使用同一候选 proxy;这不能证明历史 proxy 也失败, +不能归因于特定核心,也不能仅据同时出现就认定是系统调度问题。 +观察后的 CPU/内存读数不是事发时剖析,不用它推导根因。 + +## 源码核对及后续 + +当前默认 `dropLateFrames` 为 false;`video-frames.ts` 的默认策略允许读取并绘制 +落后帧,开启丢帧才会按容差跳过。`video-renderer.ts` 的已排队帧绘制还需结合实际 +调度进一步诊断。这是现有源码事实,不足以证明本次偏差的具体来源。 +测试统计的是每次 drawImage 的帧时间戳/音频时钟差,不是声音输出测量或用户可见 +帧呈现的独立测量;短暂追赶、持续漂移与宿主阻塞需要分别验证。 + +登记 MB-SYNC-01,保持 PKG-MB-09 doing。等待当前运行产生阶段统计、清理结果和 +最终报告后,再设计有限的调度/帧追赶对照,复现后修复项目缺陷并回归。 +不得直接更改公开默认丢帧行为、扩大 250ms 门槛、缩短长测,或重跑直到通过。 +当前已足以拒绝将这两个场景称为长播放通过,但最终进程退出状态仍需实际观察。 + +本检查点只改证据、风险和文档;计划/风险校验及风险校验器测试完成后单独提交。 +不开始正式复盘,不推送或发布。 diff --git a/refactor/plan.md b/refactor/plan.md index 8460da2c3..8a42e76e6 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -669,7 +669,7 @@ - PKG-MB-06: [记录](baselines/mb-audio-source.json) [记录](changes/2026-09-12-PKG-MB-06-audio.md) [记录](baselines/mb-audio-validation.json) - PKG-MB-07: [记录](baselines/mb-hls-source.json) [记录](changes/2026-09-12-PKG-MB-07-hls.md) [记录](baselines/mb-hls-validation.json) - PKG-MB-08: [记录](baselines/mb-entry-source.json) [记录](changes/2026-09-12-PKG-MB-08-entry-checkpoint.md) [记录](baselines/mb-entry-checkpoint.json) [记录](baselines/mb-capability-source.json) [记录](changes/2026-09-12-PKG-MB-08-capability.md) [记录](baselines/mb-capability-validation.json) -- PKG-MB-09: [记录](changes/2026-09-12-PKG-MB-09-native-pip-checkpoint.md) [记录](baselines/mb-native-pip-checkpoint.json) [记录](changes/2026-09-12-PKG-MB-09-sustained-playback-checkpoint.md) [记录](baselines/mb-sustained-validation.json) [记录](baselines/mb-sustained-media.json) [记录](changes/2026-09-16-PKG-MB-09-hour-soak.md) [记录](baselines/mb-hour-soak-start.json) +- PKG-MB-09: [记录](changes/2026-09-12-PKG-MB-09-native-pip-checkpoint.md) [记录](baselines/mb-native-pip-checkpoint.json) [记录](changes/2026-09-12-PKG-MB-09-sustained-playback-checkpoint.md) [记录](baselines/mb-sustained-validation.json) [记录](baselines/mb-sustained-media.json) [记录](changes/2026-09-16-PKG-MB-09-hour-soak.md) [记录](baselines/mb-hour-soak-start.json) [记录](changes/2026-09-16-PKG-MB-09-av-breach.md) [记录](baselines/mb-hour-av-breach.json) - PKG-IFRAME-01: [记录](changes/2026-09-12-PKG-IFRAME-01-contract.md) [记录](baselines/iframe-release.json) [记录](baselines/iframe-contract.md) [记录](baselines/iframe-contract-validation.json) - PKG-IFRAME-02: [记录](changes/2026-09-12-PKG-IFRAME-02-behavior.md) [记录](baselines/iframe-behavior-validation.json) - PKG-IFRAME-03: [记录](changes/2026-09-12-PKG-IFRAME-03-requests-checkpoint.md) [记录](baselines/iframe-requests-checkpoint.json) [记录](changes/2026-09-12-PKG-IFRAME-03-boundaries-checkpoint.md) [记录](baselines/iframe-boundaries-checkpoint.json) [记录](iframe-message-boundary.md) [记录](changes/2026-09-13-PKG-IFRAME-03-navigation.md) [记录](baselines/iframe-navigation-validation.json) [记录](iframe-document-protocol.md) diff --git a/refactor/progress.md b/refactor/progress.md index 170f0bcb3..fb61f3e8d 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,12 @@ # 进度与证据 +## PKG-MB-09 长测 AV 阈值越界(运行未终结) + +首批两个Chromium组合约1767秒时累计最大帧/音频时钟差达到549ms/570ms,超过 +250ms门槛。仍visible、未暂停、无媒体错误,绘制/时钟继续推进;不能据此归因于核心 +或系统。新增MB-SYNC-01并保留[快照与诊断边界](changes/2026-09-16-PKG-MB-09-av-breach.md)。 +被测输入不变,原进程继续,等待阶段统计/清理和终结报告;不称为通过,不重启到绿。 + ## DOC-03 校正根 AI 接续指引 根AGENTS仍引用MediaBunny五个旧JS路径及过期源码风格,现已核对并改为实际TS入口, diff --git a/refactor/risk-table.md b/refactor/risk-table.md index f83859b2f..cd3afd910 100644 --- a/refactor/risk-table.md +++ b/refactor/risk-table.md @@ -291,3 +291,4 @@ | SITE-EDITOR-VAST-01 | resolved / 已复现 | Monaco browser consumer still assumes the workspace VAST namespace after the approved npm-root restoration | SITE-EDITOR-VAST-01 | | CI-JASSUB-SOURCE-01 | resolved / 已复现 | Default native JASSUB source runs select only the published plugin and omit the current source | CI-JASSUB-SOURCE-01 | | DANMUKU-INSTALLED-GAP-01 | resolved / 已复现 | Windows WebKit installed Danmuku candidate misses two rows after a native main-thread gap | PKG-DANMUKU-08, PKG-DANMUKU-START-01 | +| MB-SYNC-01 | open / 已复现 | Installed MediaBunny hour soak exceeds the original frame/audio-clock tolerance in both Chromium core combinations | PKG-MB-09 | diff --git a/refactor/risks.json b/refactor/risks.json index 56350cccd..7bbc736f2 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "task": "BASE-07", "sourceCommit": "e01f39ff", - "updatedAt": "2026-09-16T02:27:53.896Z", + "updatedAt": "2026-09-16T03:53:29.998Z", "note": "Open means closure evidence is outstanding; source-observed and unverified are not reproduced runtime bugs. A source issue already mitigated in the workspace still requires candidate regression evidence. No accepted-with-scope item is implied by baseline task completion.", "items": [ { @@ -6886,6 +6886,23 @@ "refactor/baselines/danmuku-start-validation.json" ], "resolutionRationale": "The first sampling anchor was created only inside RAF. Reproduced in controlled first-frame and time-zero tests plus real Chromium/WebKit start-listener CPU stalls. Private playback-start anchoring preserves public queries and invalidation. Final source/installed three-engine timing, both installed runtime formats, scheduler regression and actual model load pass." + }, + { + "id": "MB-SYNC-01", + "title": "Installed MediaBunny hour soak exceeds the original frame/audio-clock tolerance in both Chromium core combinations", + "confirmation": "reproduced", + "status": "open", + "owners": [ + "PKG-MB-09" + ], + "evidence": [ + "refactor/baselines/mb-hour-av-breach.json", + "refactor/changes/2026-09-16-PKG-MB-09-av-breach.md", + "test/soak/mediabunny.spec.js" + ], + "compatibleResolution": "Keep the running test and original 250ms gate. Distinguish delayed presentation, catch-up draws, sustained clock drift and host scheduling using bounded controls after preserving the terminal result; fix a reproduced project defect without changing the public dropLateFrames default.", + "closureCriteria": "Retain the first failing samples and terminal report; establish cause with appropriate historical/native controls, fix any confirmed project regression, and complete unchanged duration/cleanup requirements with a justified clock/presentation interpretation. A later passing run alone does not close this risk.", + "workspaceState": "Running-at-capture, not a final report: around 1767 seconds both Chromium cases using the same candidate proxy reach approximately 549ms/570ms max delta; visibility, advancing media/draws, node bounds and lack of media errors remain intact. Core-specific, historical-proxy and OS-cause claims are unproven." } ] } diff --git a/refactor/tasks.json b/refactor/tasks.json index 0be26e630..2dc6d31fa 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -4024,7 +4024,9 @@ "baselines/mb-sustained-validation.json", "baselines/mb-sustained-media.json", "changes/2026-09-16-PKG-MB-09-hour-soak.md", - "baselines/mb-hour-soak-start.json" + "baselines/mb-hour-soak-start.json", + "changes/2026-09-16-PKG-MB-09-av-breach.md", + "baselines/mb-hour-av-breach.json" ] }, {