Files
ArtPlayer/refactor/risks.json
T

1659 lines
86 KiB
JSON

{
"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": "resolved",
"owners": [
"CORE-13",
"CORE-14"
],
"evidence": [
"refactor/baselines/dom.json"
],
"compatibleResolution": "在保留自定义控件扩展入口下修正布局。",
"closureCriteria": "320px 及正常容器的设置/模式操作真实可用。",
"workspaceState": "CORE-13 wrapped controls and CORE-14 bounded settings/native input/autoOrientation checks now pass the final installed UMD and legacy matrices; 320px layouts remain operable with long text and wrapped control rows.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-14-setting.md",
"refactor/baselines/setting-validation.json",
"test/browser/setting.spec.js",
"test/browser/setting-update.spec.js",
"test/browser/setting-ownership.spec.js",
"test/browser/setting-interaction.spec.js",
"test/setting-model.test.js",
"test/setting-resources.test.js"
],
"resolutionRationale": "Final installed UMD and legacy each pass the complete 519-case three-engine matrix. Managed tree/DOM/resource rollback, async generation guards, scoped mounts and panel/header ownership preserve normal identities, callbacks and returns. Narrow layouts and native input/touch interactions pass; simultaneous live object sharing fails before mutation while transfer after removal/destruction preserves the original object. Source and shipped package bytes match the tested artifacts."
},
{
"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> | 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": "source-observed",
"status": "resolved",
"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,兼容测试通过;仅当前上游许可证名称不足以关闭。",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-12-template-resources.md",
"refactor/baselines/template-resources-validation.json",
"refactor/scripts/core-vendor.mjs",
"test/core-vendor.test.js",
"packages/artplayer/THIRD_PARTY_NOTICES"
],
"resolutionRationale": "Pinned upstream source and license contents, exhaustive normalized adaptation checks, actual package notices and standalone bundle headers verified. Local runtime retained; native fullscreen gestures and prefixed adapter tests pass. Historical screenfull acquisition tag is explicitly unknown; v6.0.2 is the fixed comparison reference."
},
{
"id": "VENDOR-02",
"title": "hint.css 来源、版本与许可闭环",
"confirmation": "source-observed",
"status": "resolved",
"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,兼容测试通过;仅当前上游许可证名称不足以关闭。",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-12-template-resources.md",
"refactor/baselines/template-resources-validation.json",
"refactor/scripts/core-vendor.mjs",
"test/core-vendor.test.js",
"packages/artplayer/THIRD_PARTY_NOTICES"
],
"resolutionRationale": "Pinned upstream source and license contents, exhaustive normalized adaptation checks, actual package notices and standalone bundle headers verified. Local runtime retained; native fullscreen gestures and prefixed adapter tests pass. Historical screenfull acquisition tag is explicitly unknown; v6.0.2 is the fixed comparison reference."
},
{
"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.",
"workspaceState": "CORE-14 source models item/null/void setting returns; CORE-15 source models cue arrays and string/null/undefined subtitle results. Historical public consumers and explicit array listener overloads still compile; scalar inference and public return facade coordination remain CORE-18/21."
},
{
"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."
},
{
"id": "BASE-I18N-01",
"title": "Missing prototype-named translations return inherited functions",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-12"
],
"evidence": [
"test/template-resources.test.js",
"test/browser/template-resources.spec.js",
"refactor/changes/2026-09-11-CORE-12-template-resources.md"
],
"compatibleResolution": "Read own dictionary keys while preserving explicit custom names and empty-string fallback.",
"closureCriteria": "Published/candidate browser comparison, source tests and installed distribution entries pass.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-12-template-resources.md",
"refactor/baselines/template-resources-validation.json",
"test/template-resources.test.js",
"test/browser/template-resources.spec.js"
],
"resolutionRationale": "Published/candidate real browser comparison verifies own-key fallback while preserving explicit prototype-named translations and empty values. Installed UMD/legacy and all language entries pass."
},
{
"id": "BASE-TYPE-09",
"title": "Template and icon declarations claim incompatible DOM and static shapes",
"confirmation": "source-observed",
"status": "open",
"owners": [
"CORE-21"
],
"evidence": [
"packages/artplayer/types/template.d.ts",
"packages/artplayer/types/icons.d.ts",
"test/browser/template-resources.spec.js",
"refactor/changes/2026-09-11-CORE-12-template-resources.md"
],
"compatibleResolution": "Keep old legal declarations accepted, expose accurate template and icon views without inventing runtime properties.",
"closureCriteria": "Old consumers and accurate template/media/icon view consumers pass all supported type modes and runtime shape checks."
},
{
"id": "BASE-LIFE-09",
"title": "Removed builtin controls retain subscriptions and progress drag effects",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-13"
],
"evidence": [
"test/browser/components.spec.js",
"test/component-resources.test.js",
"refactor/changes/2026-09-11-CORE-13-components.md"
],
"compatibleResolution": "Keep per-entry owned listeners, timers and drag callbacks inert after removal while preserving user subscriptions.",
"closureCriteria": "Published/candidate comparison, final installed UMD and legacy browser matrices, strict types and package verification must pass; original failure evidence remains recorded.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-13-components.md",
"refactor/baselines/components-validation.json",
"test/browser/components.spec.js",
"test/component-resources.test.js"
],
"resolutionRationale": "Published/candidate behavior comparisons and both final installed artifact matrices pass. Entry ownership, transactional registration/removal, current selection guards and literal text assignment correct reproduced defects while retaining normal callbacks, return values, descriptors and public declarations. Source and shipped bytes match the tested package."
},
{
"id": "BASE-LIFE-10",
"title": "Component mounting and removal failures leave partial entries or recurse",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-13"
],
"evidence": [
"test/browser/components.spec.js",
"test/component-resources.test.js",
"refactor/changes/2026-09-11-CORE-13-components.md"
],
"compatibleResolution": "Rollback failed registration, preserve successful reentrant replacement and original errors, retain failed beforeUnmount for retry.",
"closureCriteria": "Published/candidate comparison, final installed UMD and legacy browser matrices, strict types and package verification must pass; original failure evidence remains recorded.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-13-components.md",
"refactor/baselines/components-validation.json",
"test/browser/components.spec.js",
"test/component-resources.test.js"
],
"resolutionRationale": "Published/candidate behavior comparisons and both final installed artifact matrices pass. Entry ownership, transactional registration/removal, current selection guards and literal text assignment correct reproduced defects while retaining normal callbacks, return values, descriptors and public declarations. Source and shipped bytes match the tested package."
},
{
"id": "BASE-LIFE-11",
"title": "Selector failures are unhandled and obsolete completion overwrites current UI",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-13"
],
"evidence": [
"test/browser/components.spec.js",
"test/component-resources.test.js",
"refactor/changes/2026-09-11-CORE-13-components.md"
],
"compatibleResolution": "Keep callback arguments and default flags; report owned failures and gate titles and builtin quality notices by active selection.",
"closureCriteria": "Published/candidate comparison, final installed UMD and legacy browser matrices, strict types and package verification must pass; original failure evidence remains recorded.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-13-components.md",
"refactor/baselines/components-validation.json",
"test/browser/components.spec.js",
"test/component-resources.test.js"
],
"resolutionRationale": "Published/candidate behavior comparisons and both final installed artifact matrices pass. Entry ownership, transactional registration/removal, current selection guards and literal text assignment correct reproduced defects while retaining normal callbacks, return values, descriptors and public declarations. Source and shipped bytes match the tested package."
},
{
"id": "BASE-DOM-03",
"title": "Reusing selector items after update redefines nonconfigurable properties",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-13"
],
"evidence": [
"test/browser/components.spec.js",
"test/component-resources.test.js",
"refactor/changes/2026-09-11-CORE-13-components.md"
],
"compatibleResolution": "Keep getter descriptors and rebind only after the previous entry closes.",
"closureCriteria": "Published/candidate comparison, final installed UMD and legacy browser matrices, strict types and package verification must pass; original failure evidence remains recorded.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-13-components.md",
"refactor/baselines/components-validation.json",
"test/browser/components.spec.js",
"test/component-resources.test.js"
],
"resolutionRationale": "Published/candidate behavior comparisons and both final installed artifact matrices pass. Entry ownership, transactional registration/removal, current selection guards and literal text assignment correct reproduced defects while retaining normal callbacks, return values, descriptors and public declarations. Source and shipped bytes match the tested package."
},
{
"id": "BASE-DOM-04",
"title": "A component named __proto__ changes its registry prototype",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-13"
],
"evidence": [
"test/browser/components.spec.js",
"test/component-resources.test.js",
"refactor/changes/2026-09-11-CORE-13-components.md"
],
"compatibleResolution": "Preserve named DOM access with a normal own property without changing registry prototype.",
"closureCriteria": "Published/candidate comparison, final installed UMD and legacy browser matrices, strict types and package verification must pass; original failure evidence remains recorded.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-13-components.md",
"refactor/baselines/components-validation.json",
"test/browser/components.spec.js",
"test/component-resources.test.js"
],
"resolutionRationale": "Published/candidate behavior comparisons and both final installed artifact matrices pass. Entry ownership, transactional registration/removal, current selection guards and literal text assignment correct reproduced defects while retaining normal callbacks, return values, descriptors and public declarations. Source and shipped bytes match the tested package."
},
{
"id": "BASE-DOM-05",
"title": "Highlight text interpolation permits unintended HTML attributes",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-13"
],
"evidence": [
"test/browser/components.spec.js",
"test/component-resources.test.js",
"refactor/changes/2026-09-11-CORE-13-components.md"
],
"compatibleResolution": "Assign highlight text through dataset while retaining marker positions and intentional control HTML APIs.",
"closureCriteria": "Published/candidate comparison, final installed UMD and legacy browser matrices, strict types and package verification must pass; original failure evidence remains recorded.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-13-components.md",
"refactor/baselines/components-validation.json",
"test/browser/components.spec.js",
"test/component-resources.test.js"
],
"resolutionRationale": "Published/candidate behavior comparisons and both final installed artifact matrices pass. Entry ownership, transactional registration/removal, current selection guards and literal text assignment correct reproduced defects while retaining normal callbacks, return values, descriptors and public declarations. Source and shipped bytes match the tested package."
},
{
"id": "BASE-DOM-06",
"title": "Moved setting items retain parent and option bindings from the old tree",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-14"
],
"evidence": [
"test/browser/setting.spec.js",
"test/setting-model.test.js",
"refactor/changes/2026-09-11-CORE-14-setting.md"
],
"compatibleResolution": "Preserve hidden getter flags and identity while rebinding a removed item to its current parent/panel.",
"closureCriteria": "Final Setting migration, cleanup, strict types and installed UMD/legacy regressions must pass. Source-only model results do not close this task.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-14-setting.md",
"refactor/baselines/setting-validation.json",
"test/browser/setting.spec.js",
"test/browser/setting-update.spec.js",
"test/browser/setting-ownership.spec.js",
"test/browser/setting-interaction.spec.js",
"test/setting-model.test.js",
"test/setting-resources.test.js"
],
"resolutionRationale": "Final installed UMD and legacy each pass the complete 519-case three-engine matrix. Managed tree/DOM/resource rollback, async generation guards, scoped mounts and panel/header ownership preserve normal identities, callbacks and returns. Narrow layouts and native input/touch interactions pass; simultaneous live object sharing fails before mutation while transfer after removal/destruction preserves the original object. Source and shipped package bytes match the tested artifacts."
},
{
"id": "BASE-DOM-07",
"title": "Generated setting names collide with explicit names in nested branches",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-14"
],
"evidence": [
"test/browser/setting.spec.js",
"test/setting-model.test.js",
"refactor/changes/2026-09-11-CORE-14-setting.md"
],
"compatibleResolution": "Reserve explicit names before allocating IDs; preserve normal names and monotonic counters.",
"closureCriteria": "Final Setting migration, cleanup, strict types and installed UMD/legacy regressions must pass. Source-only model results do not close this task.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-14-setting.md",
"refactor/baselines/setting-validation.json",
"test/browser/setting.spec.js",
"test/browser/setting-update.spec.js",
"test/browser/setting-ownership.spec.js",
"test/browser/setting-interaction.spec.js",
"test/setting-model.test.js",
"test/setting-resources.test.js"
],
"resolutionRationale": "Final installed UMD and legacy each pass the complete 519-case three-engine matrix. Managed tree/DOM/resource rollback, async generation guards, scoped mounts and panel/header ownership preserve normal identities, callbacks and returns. Narrow layouts and native input/touch interactions pass; simultaneous live object sharing fails before mutation while transfer after removal/destruction preserves the original object. Source and shipped package bytes match the tested artifacts."
},
{
"id": "BASE-LIFE-12",
"title": "Removed or updated setting rows retain descendant panels and builtin subscriptions",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-14"
],
"evidence": [
"test/browser/setting.spec.js",
"test/setting-resources.test.js",
"refactor/changes/2026-09-11-CORE-14-setting.md"
],
"compatibleResolution": "Own DOM/Emitter subscriptions per rendered item and release descendants and cached panels on update/removal.",
"closureCriteria": "Finish manager/resource rollback and verify strict source types, full installed UMD/legacy and builtin/legacy plugin combinations before closure.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-14-setting.md",
"refactor/baselines/setting-validation.json",
"test/browser/setting.spec.js",
"test/browser/setting-update.spec.js",
"test/browser/setting-ownership.spec.js",
"test/browser/setting-interaction.spec.js",
"test/setting-model.test.js",
"test/setting-resources.test.js"
],
"resolutionRationale": "Final installed UMD and legacy each pass the complete 519-case three-engine matrix. Managed tree/DOM/resource rollback, async generation guards, scoped mounts and panel/header ownership preserve normal identities, callbacks and returns. Narrow layouts and native input/touch interactions pass; simultaneous live object sharing fails before mutation while transfer after removal/destruction preserves the original object. Source and shipped package bytes match the tested artifacts."
},
{
"id": "BASE-LIFE-13",
"title": "Obsolete setting callback completions overwrite current UI and failures are unhandled",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-14"
],
"evidence": [
"test/browser/setting.spec.js",
"test/setting-resources.test.js",
"refactor/changes/2026-09-11-CORE-14-setting.md"
],
"compatibleResolution": "Preserve callback arguments and synchronous state; only the latest live write target may accept completion, and report the original failure.",
"closureCriteria": "Finish manager/resource rollback and verify strict source types, full installed UMD/legacy and builtin/legacy plugin combinations before closure.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-14-setting.md",
"refactor/baselines/setting-validation.json",
"test/browser/setting.spec.js",
"test/browser/setting-update.spec.js",
"test/browser/setting-ownership.spec.js",
"test/browser/setting-interaction.spec.js",
"test/setting-model.test.js",
"test/setting-resources.test.js"
],
"resolutionRationale": "Final installed UMD and legacy each pass the complete 519-case three-engine matrix. Managed tree/DOM/resource rollback, async generation guards, scoped mounts and panel/header ownership preserve normal identities, callbacks and returns. Narrow layouts and native input/touch interactions pass; simultaneous live object sharing fails before mutation while transfer after removal/destruction preserves the original object. Source and shipped package bytes match the tested artifacts."
},
{
"id": "BASE-LIFE-14",
"title": "Removed or replaced setting items still run deferred mounted callbacks",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-14"
],
"evidence": [
"test/browser/setting.spec.js",
"test/setting-resources.test.js",
"refactor/changes/2026-09-11-CORE-14-setting.md"
],
"compatibleResolution": "Bind deferred mounted to its rendered generation and cancel obsolete timers without introducing a disposer return contract.",
"closureCriteria": "Finish manager/resource rollback and verify strict source types, full installed UMD/legacy and builtin/legacy plugin combinations before closure.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-14-setting.md",
"refactor/baselines/setting-validation.json",
"test/browser/setting.spec.js",
"test/browser/setting-update.spec.js",
"test/browser/setting-ownership.spec.js",
"test/browser/setting-interaction.spec.js",
"test/setting-model.test.js",
"test/setting-resources.test.js"
],
"resolutionRationale": "Final installed UMD and legacy each pass the complete 519-case three-engine matrix. Managed tree/DOM/resource rollback, async generation guards, scoped mounts and panel/header ownership preserve normal identities, callbacks and returns. Narrow layouts and native input/touch interactions pass; simultaneous live object sharing fails before mutation while transfer after removal/destruction preserves the original object. Source and shipped package bytes match the tested artifacts."
},
{
"id": "BASE-DOM-08",
"title": "Sharing a live setting object leaves a second published instance blank and can steal candidate bindings",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-14"
],
"evidence": [
"test/browser/setting-ownership.spec.js",
"test/setting-model.test.js",
"refactor/changes/2026-09-11-CORE-14-setting.md"
],
"compatibleResolution": "Reject transfer from an active owner before mutating either tree; allow original-object reuse after removal or destruction, preserving item return identity and immutable getters.",
"closureCriteria": "Retain the published sharing baseline and candidate ownership diagnosis; verify rejection, both owner lifetimes, subtree reuse, full strict checks and final installed UMD/legacy matrices before closure.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-14-setting.md",
"refactor/baselines/setting-validation.json",
"test/browser/setting.spec.js",
"test/browser/setting-update.spec.js",
"test/browser/setting-ownership.spec.js",
"test/browser/setting-interaction.spec.js",
"test/setting-model.test.js",
"test/setting-resources.test.js"
],
"resolutionRationale": "Final installed UMD and legacy each pass the complete 519-case three-engine matrix. Managed tree/DOM/resource rollback, async generation guards, scoped mounts and panel/header ownership preserve normal identities, callbacks and returns. Narrow layouts and native input/touch interactions pass; simultaneous live object sharing fails before mutation while transfer after removal/destruction preserves the original object. Source and shipped package bytes match the tested artifacts."
},
{
"id": "BASE-LIFE-15",
"title": "Subtitle requests overwrite newer state and mutate tracks after destroy",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-15"
],
"evidence": [
"test/browser/subtitle-lifecycle.spec.js",
"refactor/changes/2026-09-11-CORE-15-subtitle.md"
],
"compatibleResolution": "Scope requests, abort and settle superseded calls; ignore stale conversion, errors and notices.",
"closureCriteria": "Installed UMD/legacy cover out-of-order fetch/body completion, rejection, cancellation, reentry and destroy.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-15-subtitle.md",
"refactor/baselines/subtitle-validation.json",
"test/browser/subtitle-lifecycle.spec.js",
"test/subtitle.test.js"
],
"resolutionRationale": "Final installed UMD and legacy each pass 600 real-browser checks. Subtitle cancellation settles promptly and stale work cannot commit. Only generated URLs are owned; native fullscreen-kind rebuilds retain them and failure/reentry/destroy cleanup is verified. Runtime and type consumers pass against the exact packed source and artifacts."
},
{
"id": "BASE-LIFE-16",
"title": "Subtitle URLs revoke caller resources and leak the final generated resource",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-15"
],
"evidence": [
"test/browser/subtitle-lifecycle.spec.js",
"refactor/changes/2026-09-11-CORE-15-subtitle.md"
],
"compatibleResolution": "Own only generated URLs and release track callbacks/resources on replace, failure and destroy.",
"closureCriteria": "Installed UMD/legacy prove caller URL survival, owned URL release, full-screen reuse, failed replacement and callback cleanup.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-15-subtitle.md",
"refactor/baselines/subtitle-validation.json",
"test/browser/subtitle-lifecycle.spec.js",
"test/subtitle.test.js"
],
"resolutionRationale": "Final installed UMD and legacy each pass 600 real-browser checks. Subtitle cancellation settles promptly and stale work cannot commit. Only generated URLs are owned; native fullscreen-kind rebuilds retain them and failure/reentry/destroy cleanup is verified. Runtime and type consumers pass against the exact packed source and artifacts."
},
{
"id": "BASE-DOM-09",
"title": "Web fullscreen loses style and placement across repeated entry or configuration changes",
"closureCriteria": "Final installed matrices prove original styles, parent and sibling restoration, resize integration, reentry and failure recovery.",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-web.spec.js",
"refactor/changes/2026-09-11-CORE-16-display.md"
],
"compatibleResolution": "Capture the first entry layout, restore original ownership on exit/destroy, preserve ordinary events, and stop obsolete operations after reentry.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-web.spec.js"
],
"resolutionRationale": "Session snapshots retain exact initial styles and parent/sibling positions through repeated entry, flag changes and reentry. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-LIFE-17",
"title": "Destroy in body web fullscreen leaves a connected orphan player",
"closureCriteria": "Final installed matrices prove ownership restoration for both removeHtml values and reentrant destroy without late events.",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-web.spec.js",
"refactor/changes/2026-09-11-CORE-16-display.md"
],
"compatibleResolution": "Capture the first entry layout, restore original ownership on exit/destroy, preserve ordinary events, and stop obsolete operations after reentry.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-web.spec.js"
],
"resolutionRationale": "Fullscreen body placement is restored before template destruction; a failed restore detaches only a still-displaced player while preserving the original error. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-DOM-10",
"title": "Native fullscreen state and exit affect unrelated player instances",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-native.spec.js",
"refactor/changes/2026-09-11-CORE-16-display.md"
],
"compatibleResolution": "Derive fullscreen from the instance player/video ownership, ignore unrelated changes, preserve normal event-before-class ordering, and exit only the owned element.",
"closureCriteria": "Final installed UMD/legacy matrices cover real gesture entry, two live instances, fullscreen exit rejection/retry, subtitle integration and display mode composition.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-native.spec.js"
],
"resolutionRationale": "Fullscreen ownership follows the actual instance player/video; real native tests cover two instances and mode transitions. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-LIFE-18",
"title": "Native fullscreen retains destroyed listeners and leaks rejected request listeners",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-native.spec.js",
"test/display-native.test.js",
"refactor/changes/2026-09-11-CORE-16-display.md"
],
"compatibleResolution": "Scope per-instance and per-request listeners, preserve observable native rejection identity, settle cancelled requests promptly, and release late cancelled entry without retaining destroyed instances.",
"closureCriteria": "Final installed matrices cover assignment errors, descriptor rejection, request cancellation/destroy, late Promise and controlled void APIs; document the weak document-lifetime fallback guard and physical-device limitations.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-native.spec.js",
"test/display-native.test.js"
],
"resolutionRationale": "Owned request listeners settle on success/failure/cancel, cancelled native entry is released, and void exit waits for both possible owned elements to leave. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-DOM-11",
"title": "Video-only fullscreen ignores native video state and begin/end transitions",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-video-fullscreen.spec.js",
"test/display-video-fullscreen.test.js"
],
"compatibleResolution": "Read native video presentation/display state and listen to video begin/end plus the historical document bridge, deduplicating the same transition while retaining the synchronous setter.",
"closureCriteria": "Installed candidate regressions cover state, event order, reentry, PiP distinction and exit retry; record separately the physical iOS validation gate.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-video-fullscreen.spec.js",
"test/display-video-fullscreen.test.js"
],
"resolutionRationale": "Controlled native video presentation events and state distinguish fullscreen from PiP and deduplicate transitions without changing synchronous setters. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-LIFE-19",
"title": "Video-only fullscreen survives player destruction and late entry",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-video-fullscreen.spec.js",
"test/display-video-fullscreen.test.js"
],
"compatibleResolution": "Dispose instance listeners, exit owned video presentation, and leave only a static video-held cancellation guard for unabortable late entry without retaining the instance.",
"closureCriteria": "Installed regressions cover active and pending destruction, exit failure behavior, new entry after cancellation and video shims without state properties; physical-device evidence remains explicit.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-video-fullscreen.spec.js",
"test/display-video-fullscreen.test.js"
],
"resolutionRationale": "Video-only instance listeners are removed at destruction; static video-held weak cancellation guards release late entry without holding the player scope. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-DOM-12",
"title": "PiP reports another video as active and WebKit ignores native presentation transitions",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-pip.spec.js",
"test/browser/display-pip-webkit.spec.js"
],
"compatibleResolution": "Keep native element/null and WebKit boolean return shapes, restrict native ownership, observe WebKit transitions and preserve repeated synchronous setter events.",
"closureCriteria": "Installed matrices retain getter/setter contracts and prove native gestures/playback, transition deduplication, fullscreen composition and explicit unsupported capabilities.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-pip.spec.js",
"test/browser/display-pip-webkit.spec.js"
],
"resolutionRationale": "PiP retains native Element/null and WebKit boolean getters, ignores unrelated ownership and stale leave events, and observes native UI transitions. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-LIFE-20",
"title": "PiP survives destruction or late entry and rejected assignments become unhandled",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-pip.spec.js",
"test/browser/display-pip-webkit.spec.js",
"test/display-pip.test.js"
],
"compatibleResolution": "Scope native listeners, restrict exit to owned presentation, suppress obsolete failure notices, and release late cancelled entry without instance-retaining WebKit guards.",
"closureCriteria": "Installed matrices verify destroy/cancel, rejection notices, retry, reentry and cross-instance isolation; document that the historical void setter cannot expose a rejected Promise.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-pip.spec.js",
"test/browser/display-pip-webkit.spec.js",
"test/display-pip.test.js"
],
"resolutionRationale": "PiP scope disposal exits owned presentation; late cancellation and rejected assignments are handled without stale notices or unhandled rejection. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-TYPE-10",
"title": "PiP getter is declared boolean but native runtime returns an element or null",
"confirmation": "reproduced",
"status": "open",
"owners": [
"CORE-16",
"CORE-21"
],
"evidence": [
"test/browser/display-pip.spec.js",
"test/types/display-pip.ts",
"packages/artplayer/types/player.d.ts"
],
"compatibleResolution": "Keep old legal JS return identities and historical public consumers; model the internal branch-dependent getter accurately and coordinate a compatible public declaration strategy in CORE-21.",
"closureCriteria": "Public declaration strategy and installed JS/TS consumers explicitly cover native element/null and fallback boolean without silently narrowing old legal consumption.",
"workspaceState": "CORE-16 preserves historical native Element/null and WebKit boolean runtime returns with precise internal PipProperty. The installed old public consumers still pass; public declaration coordination remains CORE-21."
},
{
"id": "BASE-DOM-13",
"title": "Mini exit loses the video's original parent and sibling position",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-mini.spec.js",
"test/display-mini.test.js"
],
"compatibleResolution": "Capture original placement once per entry session, restore it on exit/destroy, preserve popup reuse and original DOM/display contracts, and retain the snapshot for failed-exit retry.",
"closureCriteria": "Installed matrices cover placement and playback, reentry, recovery, caller-owned popups, narrow viewports and other display modes.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-mini.spec.js",
"test/display-mini.test.js"
],
"resolutionRationale": "Mini restores original parent/sibling snapshots and retains legacy first/reused DOM order, failure retry and caller-owned popup identity. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-LIFE-21",
"title": "Mini leaves a connected popup after player destruction",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-mini.spec.js"
],
"compatibleResolution": "Own created popup and subscriptions in the instance scope, stop drag on hide/destroy, preserve caller-owned popup nodes, and serialize reentrant view creation.",
"closureCriteria": "Installed matrices prove owned popup removal for both destroy modes, no late drag writes, active playback/controls, construction failure/abort recovery and at most one popup during reentry.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-mini.spec.js"
],
"resolutionRationale": "Owned mini popup and subscriptions are removed at destruction; hiding cancels drag and reentrant creation yields at most one popup. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-DOM-14",
"title": "Unready media sizing partially overwrites layout and emits NaN height",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-sizing.spec.js",
"test/display-sizing.test.js",
"refactor/baselines/display-sizing-validation.json"
],
"compatibleResolution": "Defer unusable geometry without invalid CSS or measurement events; recover on the next valid call while preserving normal sizing, descriptors, ratio parsing and event contracts.",
"closureCriteria": "Installed matrices cover unready/hidden geometry, recovery, ratio/flip contracts, destruction and orientation composition.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-sizing.spec.js",
"test/display-sizing.test.js"
],
"resolutionRationale": "Unusable media/container dimensions defer layout and invalid measurements; normal geometry, later recovery, ratio/flip and destruction contracts are verified. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-DOM-15",
"title": "Auto orientation exit clears caller-owned inline dimensions and transforms",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-orientation.spec.js",
"refactor/baselines/display-orientation-validation.json"
],
"compatibleResolution": "Own rotation properties and coordinate restoration with fullscreenWeb; retain initial snapshots, repeated rotated dimensions and normal resize behavior.",
"closureCriteria": "Installed matrices cover exit/destroy, repeated entry, rotated playback and ratio/flip composition; document device rotation and safe-area evidence limitations.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-orientation.spec.js"
],
"resolutionRationale": "Rotation and fullscreen restoration preserve caller-owned inline geometry; repeated entry, both destruction modes and real rotated playback/ratio/flip are verified. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
},
{
"id": "BASE-LIFE-22",
"title": "Orientation lock success after fullscreen exit reactivates a cancelled player",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-16"
],
"evidence": [
"test/browser/display-orientation.spec.js",
"test/display-orientation.test.js",
"refactor/baselines/display-orientation-validation.json"
],
"compatibleResolution": "Scope rotation timers and subscriptions, cancel locks on exit/destroy, release cancelled late success, and protect newer ArtPlayer requests with per-platform ownership tokens.",
"closureCriteria": "Installed matrices and unit tests cover timer cancellation, late success/rejection, repeated entry, retry, destruction and cross-instance ownership; physical orientation remains an explicit device gate.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-16-display.md",
"refactor/baselines/display-validation.json",
"test/browser/display-orientation.spec.js",
"test/display-orientation.test.js"
],
"resolutionRationale": "Owned timers and subscriptions cancel cleanly; orientation request tokens prevent stale classes/notices and old-instance unlock of newer ArtPlayer locks. Final installed UMD/legacy each pass 900 browser cases and exact-package consumers pass. Controlled platform paths do not certify physical devices; REL-03/REVIEW-02 retains that release gate."
}
]
}