{ "schemaVersion": 1, "task": "BASE-07", "sourceCommit": "e01f39ff", "updatedAt": "2026-09-11", "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": [ { "id": "BASE-LIFE-06", "title": "Published switch leaves an unhandled rejection and an unsettled promise when resume fails", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-09" ], "evidence": [ "refactor/baselines/lifecycle.json", "refactor/baselines/lifecycle-coverage.md", "test/playback.test.js" ], "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。", "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。", "workspaceState": "Current switchMix uses silencePromise and test/playback.test.js covers resume rejection. Published baseline still reproduces the old failure; preserve the existing workspace mitigation during migration.", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-09-source-operations.md", "refactor/baselines/source-operations-validation.json", "test/source.test.js", "test/playback.test.js", "test/browser/source.spec.js" ], "resolutionRationale": "Owned source generations settle superseded/destroyed calls with undefined, prevent stale restart/restoration and actual playMix effects, retain original load failures and best-effort resume settlement. Published baselines remain unchanged; real-media comparisons and controlled native-play tests cover the candidate." }, { "id": "BASE-LIFE-01", "title": "Superseded switch resolves along with the latest source", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-09" ], "evidence": [ "refactor/baselines/lifecycle.json", "refactor/baselines/lifecycle-coverage.md" ], "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。", "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-09-source-operations.md", "refactor/baselines/source-operations-validation.json", "test/source.test.js", "test/playback.test.js", "test/browser/source.spec.js" ], "resolutionRationale": "Owned source generations settle superseded/destroyed calls with undefined, prevent stale restart/restoration and actual playMix effects, retain original load failures and best-effort resume settlement. Published baselines remain unchanged; real-media comparisons and controlled native-play tests cover the candidate." }, { "id": "BASE-LIFE-02", "title": "Switch remains unsettled during the bounded observation after destroy", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-09" ], "evidence": [ "refactor/baselines/lifecycle.json", "refactor/baselines/lifecycle-coverage.md" ], "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。", "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-09-source-operations.md", "refactor/baselines/source-operations-validation.json", "test/source.test.js", "test/playback.test.js", "test/browser/source.spec.js" ], "resolutionRationale": "Owned source generations settle superseded/destroyed calls with undefined, prevent stale restart/restoration and actual playMix effects, retain original load failures and best-effort resume settlement. Published baselines remain unchanged; real-media comparisons and controlled native-play tests cover the candidate." }, { "id": "BASE-LIFE-03", "title": "Async plugin registers its result after destroy", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-08" ], "evidence": [ "refactor/baselines/lifecycle.json", "refactor/baselines/lifecycle-coverage.md" ], "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。", "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-08-plugin-manager.md", "refactor/baselines/plugins-validation.json", "test/plugins.test.js", "test/browser/plugins.spec.js" ], "resolutionRationale": "Closing guards stop late writes, post-close factories and reentrant name/coercion/reset registration. Pending success still fulfills with the registry and public rejection identity is preserved. This closes late registration only, not arbitrary plugin resource ownership." }, { "id": "BASE-LIFE-04", "title": "Destroying an instance twice unregisters a different live instance", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-04" ], "evidence": [ "refactor/baselines/lifecycle.json", "refactor/baselines/lifecycle-coverage.md" ], "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。", "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-04-instance-lifecycle.md", "refactor/baselines/instance-lifecycle-validation.json", "test/browser/lifecycle.spec.js", "test/instance-lifecycle.test.js" ], "resolutionRationale": "内部防重入与 index >= 0 检查保留其他实例;正常 destroy 回调可挂载替代实例,旧实例重复销毁不移除其 DOM。UMD 与 legacy 三浏览器通过。" }, { "id": "BASE-LIFE-05", "title": "Failed constructor leaves initialized markup/listeners until explicit probe cleanup", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-04" ], "evidence": [ "refactor/baselines/lifecycle.json", "refactor/baselines/lifecycle-coverage.md" ], "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。", "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-04-instance-lifecycle.md", "refactor/baselines/instance-lifecycle-validation.json", "test/browser/lifecycle.spec.js", "test/instance-lifecycle.test.js" ], "resolutionRationale": "失败构造释放已初始化的监听/已接入定时器并恢复原 DOM/SSR 节点;proxy、插件及 Events 半初始化失败和清理同时抛错均有真实浏览器回归。未迁移的字幕/SDK 等资源仍由对应任务验收。" }, { "id": "BASE-DOM-01", "title": "控件 Tab 不可达", "confirmation": "reproduced", "status": "open", "owners": [ "CORE-23", "CORE-17" ], "evidence": [ "refactor/baselines/dom.json" ], "compatibleResolution": "补键盘可达性、焦点及名称,保留旧 DOM/CSS 和快捷键。", "closureCriteria": "真实键盘与焦点回归通过,不只检查静态属性。" }, { "id": "BASE-DOM-02", "title": "窄容器中控件裁切", "confirmation": "reproduced", "status": "open", "owners": [ "CORE-13", "CORE-14" ], "evidence": [ "refactor/baselines/dom.json" ], "compatibleResolution": "在保留自定义控件扩展入口下修正布局。", "closureCriteria": "320px 及正常容器的设置/模式操作真实可用。" }, { "id": "BASE-DEMO-01", "title": "旧 thumbnail 插件示例不对应当前 workspace 包", "confirmation": "source-observed", "status": "open", "owners": [ "SITE-01", "EX-03" ], "evidence": [ "docs/assets/example/thumbnail.js", "refactor/baselines/demo-inventory.json" ], "compatibleResolution": "核实旧外部插件和链接,不自动替换为不同 API 的 auto-thumbnail。", "closureCriteria": "示例依赖有来源,旧参数/URL 的保留或迁移解释完整。" }, { "id": "BASE-TYPE-01", "title": "NodeNext ESM 默认导出与声明互操作失配", "confirmation": "reproduced", "status": "resolved", "owners": [ "ENG-04", "CORE-07", "PKG-CHAPTER-04" ], "evidence": [ "refactor/baselines/consumers.json" ], "compatibleResolution": "分配 ESM/CJS 声明入口,保留旧解析模式,避免 any/skipLibCheck 掩盖。", "closureCriteria": "四模式原合法消费通过,NodeNext ESM 对实际默认导出可构造/调用。", "resolutionEvidence": [ "refactor/changes/2026-09-10-PKG-CHAPTER-04-public-types.md", "refactor/baselines/chapter-types-validation.json", "test/types/chapter-exports.ts", "test/types/language-value.ts", "test/types/commonjs.cts", "refactor/scripts/types.test.mjs" ], "resolutionRationale": "格式匹配的 CJS/ESM 声明及旧 TS legacy/language 回退通过五组编译模式;实际安装 tarball 的已知诊断清零,运行时路径/导出不变,旧发布基线隔离重跑保持原失败。" }, { "id": "BASE-TYPE-02", "title": "chapter 可选运行时参数被声明为必填", "confirmation": "reproduced", "status": "resolved", "owners": [ "PKG-CHAPTER-02" ], "evidence": [ "refactor/baselines/consumers.json", "refactor/fixtures/api.js" ], "compatibleResolution": "补充兼容可选参数,不删除已接受的配置。", "closureCriteria": "无参数和正确参数编译,错误参数依旧被拒绝,运行时一致。", "resolutionEvidence": [ "packages/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", "test/types/chapter-options.ts", "refactor/scripts/types.test.mjs", "test/browser/chapter.spec.js", "refactor/changes/2026-09-10-PKG-CHAPTER-02-tests.md" ], "resolutionRationale": "工厂 option 扩展为可选,旧/新 TS 消费与实际无参插件注册通过;update 及非法输入仍受严格约束。编辑器声明已重新生成。NodeNext ESM 与 legacy 分发问题仍由其他条目跟踪。" }, { "id": "BASE-TYPE-03", "title": "chapter legacy 缺旧模块解析的声明回退", "confirmation": "reproduced", "status": "resolved", "owners": [ "ENG-04", "PKG-CHAPTER-04" ], "evidence": [ "refactor/baselines/consumers.json" ], "compatibleResolution": "保留 legacy 文件和导入路径,补旧解析类型回退。", "closureCriteria": "Node10 解析和 NodeNext/Bundler 消费均有正向证据。", "resolutionEvidence": [ "refactor/changes/2026-09-10-PKG-CHAPTER-04-public-types.md", "refactor/baselines/chapter-types-validation.json", "test/types/chapter-exports.ts", "test/types/language-value.ts", "test/types/commonjs.cts", "refactor/scripts/types.test.mjs" ], "resolutionRationale": "格式匹配的 CJS/ESM 声明及旧 TS legacy/language 回退通过五组编译模式;实际安装 tarball 的已知诊断清零,运行时路径/导出不变,旧发布基线隔离重跑保持原失败。" }, { "id": "BASE-TYPE-04", "title": "plugins.add / toggle 的旧声明返回值与运行时不同", "confirmation": "reproduced", "status": "open", "owners": [ "CORE-07", "CORE-08", "CORE-10", "CORE-21" ], "evidence": [ "refactor/baselines/consumers.json", "refactor/baselines/public-api.json", "refactor/baselines/lifecycle.json", "test/types/declaration-legacy.ts", "refactor/changes/2026-09-11-CORE-07-declarations.md", "refactor/baselines/declarations-validation.json" ], "compatibleResolution": "保留旧声明接受范围并协调精确重载/扩展,不静默把同步注册改成 async。", "closureCriteria": "返回值类型与运行时差异逐项说明,旧合法消费和拒绝传播回归通过。", "scopeNote": "CORE-07 retains historical legal return assignments and records actual runtime separately; incompatible return tightening remains open through CORE-21. No release waiver.", "playbackResolution": "CORE-10 adds assignable PlaybackControls with Promise | void toggle; legacy root void remains accepted. All five installed type modes pass. The overall facade and plugins.add conflict stay open through CORE-21." }, { "id": "BASE-DIST-01", "title": "thumbnail tool 分发入口与类型文件缺失", "confirmation": "source-observed", "status": "open", "owners": [ "PKG-TOOL-THUMB-01", "PKG-TOOL-THUMB-04" ], "evidence": [ "refactor/baselines/distribution.json" ], "compatibleResolution": "核实真实旧 npm 后保留 .esm.js 等历史路径的兼容入口并补声明。", "closureCriteria": "隔离打包消费者能加载所有原承诺路径,dist 不作为源码直接手改。" }, { "id": "BASE-PERF-01", "title": "销毁后的 resize 防抖重新创建 notice timer", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-17", "CORE-04", "CORE-18" ], "evidence": [ "refactor/baselines/performance.json" ], "compatibleResolution": "为 debounce/晚到 UI 工作建立销毁归属;不靠等待自然过期掩盖。", "closureCriteria": "正常 resize 保持,destroy 后无该回调及新 notice timer。", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-04-instance-lifecycle.md", "refactor/baselines/instance-lifecycle-validation.json", "test/browser/lifecycle.spec.js", "test/instance-lifecycle.test.js" ], "resolutionRationale": "resize timeout 由实例 scope 取消,正常 burst 合并保持;销毁后该 resize 不再执行,Notice timer 为 null,已排队 UI 工作不再重建提示。" }, { "id": "BASE-SOURCE-01", "title": "工作区 5.4.1 与采集时真实发布 5.4.0 不同", "confirmation": "source-observed", "status": "open", "owners": [ "BASE-08", "REL-01" ], "evidence": [ "refactor/baselines/releases.json" ], "compatibleResolution": "分别保留工作区与 npm 基线,目标大版本不变;更新发布窗口需新取证。", "closureCriteria": "候选报告明确比较版本与 tarball,不声称工作区版本即已发布。" }, { "id": "BASE-SOURCE-02", "title": "registry gitHead 与发布包版本对应不可靠", "confirmation": "source-observed", "status": "open", "owners": [ "ENG-07", "REL-01" ], "evidence": [ "refactor/baselines/releases.json" ], "compatibleResolution": "以 tarball 内容和可验证的构建来源为准,不能据 gitHead 自动声称复现。", "closureCriteria": "候选 commit、工具链、包内容可关联,旧来源未知仍明确。" }, { "id": "BASE-SITE-01", "title": "文档站实际为静态站点但 manifest 未设 private", "confirmation": "source-observed", "status": "open", "owners": [ "SITE-01", "REL-01" ], "evidence": [ "refactor/baselines/distribution.json" ], "compatibleResolution": "区分站点部署和库 npm 发布;自身 next-major 要求保留。", "closureCriteria": "发布流程显式列出站点处理方式,不机械将其当库发布。" }, { "id": "BASE-MEDIA-01", "title": "示例媒体和字体的完整来源/授权链待核实", "confirmation": "unverified", "status": "open", "owners": [ "BASE-08", "SITE-01", "EX-03" ], "evidence": [ "docs/assets/sample", "docs/assets/jassub" ], "compatibleResolution": "复用现有样本时记录来源;缺许可的公开分发样本需补证据或可兼容替代,不能从文件名猜授权。", "closureCriteria": "候选实际分发样本有来源、许可/使用依据和测试映射。" }, { "id": "VENDOR-01", "title": "screenfull 来源、版本与许可闭环", "confirmation": "unverified", "status": "open", "owners": [ "CORE-12" ], "evidence": [ "refactor/third-party.json", "packages/artplayer/src/libs/screenfull.js" ], "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.", "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。" }, { "id": "VENDOR-02", "title": "hint.css 来源、版本与许可闭环", "confirmation": "unverified", "status": "open", "owners": [ "CORE-12" ], "evidence": [ "refactor/third-party.json", "packages/artplayer/src/style/hint.less" ], "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.", "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。" }, { "id": "VENDOR-03", "title": "webvtt-parser 来源、版本与许可闭环", "confirmation": "unverified", "status": "open", "owners": [ "PKG-MULTI-SUB-01" ], "evidence": [ "refactor/third-party.json", "packages/artplayer-plugin-multiple-subtitles/src/parser.js" ], "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.", "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。" }, { "id": "VENDOR-04", "title": "jassub-code-and-workers 来源、版本与许可闭环", "confirmation": "unverified", "status": "open", "owners": [ "PKG-JASSUB-01" ], "evidence": [ "refactor/third-party.json", "packages/artplayer-plugin-jassub/src/jassub.es.js", "packages/artplayer-plugin-jassub/worker", "docs/assets/jassub/jassub-worker.js", "docs/assets/jassub/jassub-worker.wasm", "docs/assets/jassub/jassub-worker-modern.wasm" ], "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.", "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。" }, { "id": "VENDOR-05", "title": "jassub-font-assets 来源、版本与许可闭环", "confirmation": "unverified", "status": "open", "owners": [ "PKG-JASSUB-01", "SITE-01" ], "evidence": [ "refactor/third-party.json", "docs/assets/jassub/default.woff2", "docs/assets/jassub/fonts" ], "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.", "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。" }, { "id": "VENDOR-06", "title": "monaco-static-assets 来源、版本与许可闭环", "confirmation": "unverified", "status": "open", "owners": [ "SITE-01", "SITE-05" ], "evidence": [ "refactor/third-party.json", "docs/assets/js/vs" ], "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.", "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。" }, { "id": "VENDOR-07", "title": "vconsole 来源、版本与许可闭环", "confirmation": "unverified", "status": "open", "owners": [ "SITE-01" ], "evidence": [ "refactor/third-party.json", "docs/assets/js/vconsole.min.js" ], "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.", "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。" }, { "id": "VENDOR-08", "title": "console-bundle 来源、版本与许可闭环", "confirmation": "unverified", "status": "open", "owners": [ "SITE-01" ], "evidence": [ "refactor/third-party.json", "docs/assets/js/console.js" ], "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.", "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。" }, { "id": "SDK-01", "title": "hls.js 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "PKG-HLS-01", "EX-03" ], "evidence": [ "packages/artplayer-plugin-hls-control/src/index.js", "docs/assets/example/hls.control.js" ], "compatibleResolution": "Caller supplies art.hls; homepage demo loads hls.js 1.5.17. Preserve quality/audio selectors and old core integration.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-02", "title": "dash.js 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "PKG-DASH-01", "EX-03" ], "evidence": [ "packages/artplayer-plugin-dash-control/src/index.js", "docs/assets/example/dash.control.js" ], "compatibleResolution": "Caller supplies art.dash; homepage demo loads dash.js 5.2.1. Preserve representation IDs, Auto/manual and audio topology.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-03", "title": "flv.js 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "EX-03" ], "evidence": [ "docs/assets/example/flv.js" ], "compatibleResolution": "Demo dependency flv.js 1.6.2; customType playback/teardown must be tested with actual SDK.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-04", "title": "mpegts.js 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "EX-03" ], "evidence": [ "docs/assets/example/mpegts.js" ], "compatibleResolution": "Demo dependency mpegts.js 1.7.3; actual codec/stream/browser support remains unverified.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-05", "title": "webtorrent 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "EX-03" ], "evidence": [ "docs/assets/example/webtorrent.js" ], "compatibleResolution": "Demo URL uses webtorrent@1, a moving major selector; preserve caller integration and explicitly capture actual runtime version.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-06", "title": "google-cast 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "PKG-CAST-01", "PKG-CAST-05" ], "evidence": [ "packages/artplayer-plugin-chromecast/src/index.js" ], "compatibleResolution": "Default remote cast_sender.js?loadCastFramework=1; sdk URL/options and actual Cast device/session behavior require separate validation.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-07", "title": "ima-via-glomex 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "PKG-VAST-01", "PKG-VAST-05" ], "evidence": [ "packages/artplayer-plugin-vast/src/index.js" ], "compatibleResolution": "@glomex/vast-ima-player loadImaSdk loads external IMA; preserve event/content/ad state and teardown, do not equate mocks with vendor service acceptance.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-08", "title": "mediapipe-tensorflow 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "PKG-MASK-01", "PKG-MASK-05" ], "evidence": [ "packages/artplayer-plugin-danmuku-mask/src/index.js" ], "compatibleResolution": "Npm dependency versions are separate from unversioned solutionPath CDN assets; keep option override, backend fallback, model result disposal and masks.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-09", "title": "jassub-worker-wasm-fonts 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "PKG-JASSUB-01", "PKG-JASSUB-05" ], "evidence": [ "packages/artplayer-plugin-jassub/src/index.js", "docs/assets/example/jassub.js" ], "compatibleResolution": "Preserve options pass-through, result.instance and worker/wasm/font URLs. Wrapper, worker and WASM must be a verified compatible set.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-10", "title": "mediabunny 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "PKG-MB-01", "PKG-MB-09" ], "evidence": [ "packages/artplayer-proxy-mediabunny/src/input.js", "packages/artplayer-proxy-mediabunny/package.json" ], "compatibleResolution": "Preserve native-video-like events, HLS input and topology, codec capability failures and AV sync; actual library/codec environment still requires verification.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-11", "title": "asr-caller-service 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "PKG-ASR-01", "PKG-ASR-05", "EX-03" ], "evidence": [ "packages/artplayer-plugin-asr/src/index.js", "docs/assets/example/asr.js" ], "compatibleResolution": "Core plugin supplies PCM to caller onAudioChunk. Example fetches an external ASR endpoint and opens its returned WebSocket; not an embedded ASR SDK or a verified service.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "SDK-12", "title": "option-validator 实际集成验证范围", "confirmation": "unverified", "status": "open", "owners": [ "CORE-01", "CORE-07" ], "evidence": [ "packages/artplayer/src/index.js" ], "compatibleResolution": "Bundled validation dependency; preserve validation/default/merge behavior and failure cleanup when typing constructor boundaries.", "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。" }, { "id": "BUILD-AMD-01", "title": "AMD 全局导出补丁误将固定参数 t 当作全局对象", "confirmation": "reproduced", "status": "resolved", "owners": [ "ENG-06" ], "evidence": [ "scripts/utils.js", "refactor/scripts/build.test.mjs", "refactor/baselines/build-validation.json" ], "compatibleResolution": "从实际 UMD 包装提取全局参数,保留 AMD 工厂返回和旧 global 名称;不识别的包装失败而非静默发布。", "closureCriteria": "正常构建的 TS 资源夹具和全部库 UMD/legacy AMD 返回与全局为同一对象;其余输出仅允许已解释变化。", "resolutionEvidence": [ "refactor/changes/2026-09-10-ENG-06-build-development.md", "refactor/baselines/build-validation.json", "refactor/scripts/build.test.mjs" ], "resolutionRationale": "构建逻辑修复已完成;63 产物中 24 仅修复接收者,42 浏览器 AMD 检查通过。未改变旧 npm 内容;正式发布仍须用新工具生成实际候选。" }, { "id": "UTIL-MERGE-01", "title": "mergeDeep lets a JSON __proto__ key replace the result prototype", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-01" ], "evidence": [ "test/utils.test.js", "refactor/changes/2026-09-10-CORE-01-typed-utils.md" ], "compatibleResolution": "Write own data properties while preserving ordinary deep merge and array semantics.", "closureCriteria": "Published defect remains observable; current and three artifacts keep normal prototypes, nested behavior and input identity.", "resolutionEvidence": [ "test/utils.test.js", "packages/artplayer/src/utils/property.ts", "refactor/changes/2026-09-10-CORE-01-typed-utils.md" ], "resolutionRationale": "Published/current and three format contracts prove the __proto__ result-prototype correction, with ordinary merge/reference behavior retained." }, { "id": "UTIL-DOWNLOAD-01", "title": "Temporary download anchor remains if click throws", "confirmation": "source-observed", "status": "resolved", "owners": [ "CORE-01" ], "evidence": [ "refactor/changes/2026-09-10-CORE-01-typed-utils.md", "test/browser/utils.spec.js" ], "compatibleResolution": "Use finally to remove only the owned anchor, preserve thrown error and caller URL ownership.", "closureCriteria": "Real successful download and controlled click-failure cleanup pass in all three browsers.", "resolutionEvidence": [ "test/browser/utils.spec.js", "packages/artplayer/src/utils/file.ts", "refactor/changes/2026-09-10-CORE-01-typed-utils.md" ], "resolutionRationale": "Chromium, Firefox and WebKit downloaded the real fixture; controlled click failure still propagated and left no anchor." }, { "id": "BASE-TYPE-05", "title": "Public Utils declarations omit exports and misstate timer/descriptor signatures", "confirmation": "source-observed", "status": "open", "owners": [ "CORE-07", "CORE-21" ], "evidence": [ "packages/artplayer/types/utils.d.ts", "test/utils.test.js", "test/types/utils-source.ts", "refactor/changes/2026-09-10-CORE-01-typed-utils.md", "test/types/declaration-legacy.ts", "refactor/changes/2026-09-11-CORE-07-declarations.md", "refactor/baselines/declarations-validation.json" ], "compatibleResolution": "Coordinate compatible public overloads/exports separately; use accurate strict types in migrated source.", "closureCriteria": "Cover missing unescape/ArtPlayerError, def identity/property keys, optional sleep, timer void returns and ignored debounce context; retain legal old consumers in new/old compilers.", "scopeNote": "CORE-07 retains historical legal return assignments and records actual runtime separately; incompatible return tightening remains open through CORE-21. No release waiver." }, { "id": "EVENT-NAME-01", "title": "Emitter event names collide with Object.prototype", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-02" ], "evidence": [ "refactor/changes/2026-09-11-CORE-02-typed-emitter.md", "test/public-behavior.test.js", "test/browser/emitter.spec.js" ], "compatibleResolution": "Own property lookup and data descriptors accept reserved event names while preserving registry prototype.", "closureCriteria": "Published observation and candidate regression pass in Node, all three artifact formats and three browsers.", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-02-typed-emitter.md", "refactor/baselines/emitter-validation.json", "test/public-behavior.test.js", "test/browser/emitter.spec.js" ], "resolutionRationale": "Own property lookup and data descriptors accept reserved event names while preserving registry prototype." }, { "id": "EVENT-ONCE-01", "title": "Nested dispatch snapshots invoke the same once registration twice", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-02" ], "evidence": [ "refactor/changes/2026-09-11-CORE-02-typed-emitter.md", "test/public-behavior.test.js", "test/browser/emitter.spec.js" ], "compatibleResolution": "The wrapper records consumption before unsubscribe/invocation; ordinary dispatch snapshot semantics are retained.", "closureCriteria": "Published observation and candidate regression pass in Node, all three artifact formats and three browsers.", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-02-typed-emitter.md", "refactor/baselines/emitter-validation.json", "test/public-behavior.test.js", "test/browser/emitter.spec.js" ], "resolutionRationale": "The wrapper records consumption before unsubscribe/invocation; ordinary dispatch snapshot semantics are retained." }, { "id": "BASE-TYPE-06", "title": "Public Option requires url and excludes numeric control HTML accepted by existing JS", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-07" ], "evidence": [ "test/browser/options.spec.js", "test/types/options-source.ts", "refactor/baselines/options-validation.json", "refactor/changes/2026-09-11-CORE-05-resolved-options.md" ], "compatibleResolution": "Expand public declarations for the verified legal JS forms; preserve existing typed inputs and runtime defaults.", "closureCriteria": "Replace the two historical negative fixtures with positive public consumers and verify old/new TypeScript plus installed package modes.", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-07-declarations.md", "refactor/baselines/declarations-validation.json", "test/types/declaration-inputs.ts", "test/browser/options.spec.js" ], "resolutionRationale": "Additive OptionInput/ComponentInput and constructor/component overloads accept omitted URL and numeric HTML while preserving historical Option reads. Five installed compiler modes and old/new core browser input cases pass." }, { "id": "BASE-TYPE-07", "title": "Setting returns, subtitle contextual payloads and notice getter conflict with historical declarations", "confirmation": "reproduced", "status": "open", "owners": [ "CORE-07", "CORE-14", "CORE-15", "CORE-18", "CORE-21" ], "evidence": [ "test/browser/declarations.spec.js", "test/types/declaration-legacy.ts", "packages/artplayer/types/artplayer.d.ts", "packages/artplayer/types/events.d.ts", "refactor/baselines/declarations-validation.json" ], "compatibleResolution": "Keep legacy consumers; add explicit cue-array listener overloads, type internal implementations accurately, and resolve remaining generated/public facade contracts at CORE-21 without false intersections.", "closureCriteria": "Actual setting/null/void and notice boolean returns, cue array callbacks and old legal type consumers all have an explicit compatible declaration strategy and package tests.", "scopeNote": "CORE-07 provides runtime evidence and explicit cue-array overloads; old inferred scalar event callbacks and return signatures are not claimed corrected." }, { "id": "BASE-TYPE-08", "title": "Write-only player commands have fictitious public getter declarations", "confirmation": "reproduced", "status": "open", "owners": [ "CORE-21" ], "evidence": [ "packages/artplayer/types/player.d.ts", "test/playback-properties.test.js", "test/browser/playback-properties.spec.js", "refactor/changes/2026-09-11-CORE-10-playback-properties.md", "refactor/baselines/playback-properties-validation.json", "test/types/declaration-legacy.ts" ], "compatibleResolution": "Keep historical consumer acceptance, model source command reads as undefined, and provide an accurate public facade without inventing runtime getters.", "closureCriteria": "seek/forward/backward/switch/quality reads and writes have an explicit accurate compatibility strategy validated against old TypeScript consumers and real package descriptors." }, { "id": "BASE-LIFE-07", "title": "Queued reconnect survives source replacement and reloads the new resource", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-11" ], "evidence": [ "test/media-events.test.js", "test/browser/media-events.spec.js", "refactor/changes/2026-09-11-CORE-11-media-events.md" ], "compatibleResolution": "Keep ordinary event order and error identity; scope retries to the current source and stop internal UI/ready work when its instance closes.", "closureCriteria": "Real published/candidate regression comparisons, controlled lifecycle tests and installed UMD/legacy validation pass without altering the frozen published baseline.", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-11-media-events.md", "refactor/baselines/media-events-validation.json", "test/media-events.test.js", "test/browser/media-events.spec.js" ], "resolutionRationale": "Published/candidate real-browser comparisons reproduce stale retry or ghost ready and validate candidate cancellation. Owned source lifetimes preserve retries after switch rejection, while instance closure stops UI work; original Event/count and ordinary readiness order remain tested." }, { "id": "BASE-LIFE-08", "title": "Ready continues after a control callback destroys the instance", "confirmation": "reproduced", "status": "resolved", "owners": [ "CORE-11" ], "evidence": [ "test/media-events.test.js", "test/browser/media-events.spec.js", "refactor/changes/2026-09-11-CORE-11-media-events.md" ], "compatibleResolution": "Keep ordinary event order and error identity; scope retries to the current source and stop internal UI/ready work when its instance closes.", "closureCriteria": "Real published/candidate regression comparisons, controlled lifecycle tests and installed UMD/legacy validation pass without altering the frozen published baseline.", "resolutionEvidence": [ "refactor/changes/2026-09-11-CORE-11-media-events.md", "refactor/baselines/media-events-validation.json", "test/media-events.test.js", "test/browser/media-events.spec.js" ], "resolutionRationale": "Published/candidate real-browser comparisons reproduce stale retry or ghost ready and validate candidate cancellation. Owned source lifetimes preserve retries after switch rejection, while instance closure stops UI work; original Event/count and ordinary readiness order remain tested." } ] }