Files
ArtPlayer/refactor/risks.json
T

2419 lines
134 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.ts",
"packages/artplayer/src/option/resolve.ts"
],
"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. CORE-18 notice.ts now models a boolean getter and string/Error/false writes; source and retained public consumer fixtures are in test/types/notice.ts. Public precise-view coordination remains CORE-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."
},
{
"id": "BASE-DOM-16",
"title": "Hotkeys intercept input in rebound documents and shadow roots",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/hotkey.spec.js",
"refactor/changes/2026-09-11-CORE-17-input.md"
],
"compatibleResolution": "Resolve the keyboard event document and deep editable focus while retaining normal shortcuts, modifiers and generic keydown notifications.",
"closureCriteria": "Final installed matrices cover real typing and playback keys, iframe/global rebinding, shadow and inherited editing, composition and source ownership.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "Event-document and deep editable focus checks preserve actual iframe/shadow typing while retaining ordinary shortcuts. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-DOM-17",
"title": "Prototype-named hotkeys fail registration through inherited keys properties",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/hotkey.spec.js",
"test/hotkey.test.js"
],
"compatibleResolution": "Use own-property registration without changing the public keys object prototype, callback arrays, chainable methods or receiver contract.",
"closureCriteria": "Installed and unit regressions retain normal registration/removal, prototype-name safety, array identity, callback mutation and original errors.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "Own-property registration supports prototype-named keys without changing the public keys prototype or arrays. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-LIFE-23",
"title": "Repeated Hotkey initialization accumulates keyboard subscriptions",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/hotkey.spec.js",
"test/hotkey.test.js"
],
"compatibleResolution": "Own one subscription in the instance scope and reuse default callbacks, preserving explicit default restoration and stopping post-destroy dispatch.",
"closureCriteria": "Final installed matrices cover repeated init, default restoration, mobile manual initialization, real key operations and destruction during a callback.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "One scoped hotkey subscription and stable default callbacks retain opt-in initialization and restoration. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-LIFE-24",
"title": "Mutable capture options and partial native registration failures leave listeners behind",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/listener-registry.spec.js",
"test/listener-registry.test.js",
"refactor/changes/2026-09-11-CORE-17-input.md"
],
"compatibleResolution": "Snapshot capture, roll back failed registration, release direct-disposer and aborted records, and preserve native callback identity, once and duplicate semantics.",
"closureCriteria": "Final installed matrices cover mutable/null options, registration failure, direct native removal, once/abort, retryable cleanup and destruction during registration.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "Capture snapshots, rollback and owned disposal retain native callback identity and handle abort/failure/destruction. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-LIFE-25",
"title": "Failed global rebinding drops the old document and retains partial new listeners",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/global-events.spec.js",
"test/global-events.test.js",
"refactor/changes/2026-09-11-CORE-17-input.md"
],
"compatibleResolution": "Commit a new document/window binding only after registration succeeds, keep the previous binding on failure and cancel interrupted generations without changing event identities or target fallback rules.",
"closureCriteria": "Final installed matrices cover actual iframe rebinding, document/window failure rollback, nested rebinding, destruction and keyboard focus integration.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "Staged global bindings commit only on successful registration; cancelled/reentrant generations cannot overwrite newer targets. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-LIFE-26",
"title": "Click callbacks that destroy the player still trigger subsequent default playback actions",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/pointer-events.spec.js",
"test/pointer-events.test.js",
"refactor/changes/2026-09-11-CORE-17-input.md"
],
"compatibleResolution": "Check instance closure before pointer handling and after click/double-click callbacks, own document focus subscriptions, and retain native events, click thresholds, nested dispatch and normal default actions.",
"closureCriteria": "Final installed matrices cover real mouse playback, desktop/mobile callback destruction, normal click pairs, focus/hover/move behavior and unit fullscreen/error/cleanup contracts.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "Pointer handlers check closure after user callbacks and no longer trigger playback/fullscreen after destruction. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-LIFE-27",
"title": "Cancelled, locked or replaced touches continue a previous seek gesture",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/gesture.spec.js",
"test/gesture.test.js",
"refactor/changes/2026-09-11-CORE-17-input.md"
],
"compatibleResolution": "Track the active touch, source and orientation; cancel invalidated sessions, own touch-end/cancel subscriptions and preserve ordinary drag axes, thresholds and multipliers.",
"closureCriteria": "Final installed matrices retain normal video/progress touch behavior and verify cancel, lock, multitouch, identity changes, source/rotation changes and invalid geometry; physical touch remains a release gate.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "Touch/source/orientation identity and cancellation prevent invalid sessions from continuing; normal axes and multipliers remain. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-LIFE-28",
"title": "Gesture callbacks continue seeking or updating progress after destruction",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/gesture.spec.js",
"test/gesture.test.js",
"refactor/changes/2026-09-11-CORE-17-input.md"
],
"compatibleResolution": "Check the current gesture after progress/seek callbacks and before subsequent writes; permit the shared position helper to check an optional caller lifetime without changing its ordinary call contract.",
"closureCriteria": "Final installed matrices and unit tests cover destruction/reentry/errors during absolute and relative seeking, with original event order and normal desktop progress behavior retained.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "Gesture lifetime checks stop post-callback seek/bar/notice writes and preserve nested gesture ownership. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-LIFE-29",
"title": "Scroll throttle reset timers remain pending after player destruction",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/event-scheduling.spec.js",
"test/event-scheduling.test.js"
],
"compatibleResolution": "Own the view throttle timer and emitter subscriptions while retaining leading-only dispatch, captured delay, live gap and synchronous nested behavior.",
"closureCriteria": "Final installed matrices and unit tests cover pending timer removal, view callback destruction/errors, normal scroll/mini behavior and remaining scheduling ownership.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "Owned leading-throttle timers and subscriptions cancel at destruction with normal timing and synchronous errors retained. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-LIFE-30",
"title": "Screen orientation changes are ignored when onchange is initially null",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/event-scheduling.spec.js",
"test/event-scheduling.test.js"
],
"compatibleResolution": "Detect addEventListener on the owner's orientation target and retain the existing coalesced resize flow and disposal.",
"closureCriteria": "Installed matrices cover controlled orientation events with a null onchange property and resize/cleanup regressions; physical orientation remains a release gate.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "Orientation listeners use event capability on the owner target rather than requiring an assigned onchange handler. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-DOM-18",
"title": "View visibility uses the original global viewport after container adoption into an iframe",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-17"
],
"evidence": [
"test/browser/event-scheduling.spec.js",
"test/event-scheduling.test.js"
],
"compatibleResolution": "Use the current container owner document's viewport while preserving the original edge and gap arithmetic.",
"closureCriteria": "Installed matrices cover actual iframe adoption/rebinding, normal visibility and exact gap boundaries without changing public viewport utilities.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-17-input.md",
"refactor/baselines/input-validation.json"
],
"resolutionRationale": "View calculations use the current owner viewport after iframe adoption and preserve the original edge/gap boundaries. Final installed UMD/legacy each pass 1119 full-suite plus 24 supplemental cases on identical artifacts, and exact-package consumers pass. Controlled touch/IME/orientation paths do not waive physical-device release gates."
},
{
"id": "BASE-LIFE-31",
"title": "Notice reentrant writes can schedule after destruction or erase a newer message",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-18"
],
"evidence": [
"test/notice.test.js",
"test/browser/notice.spec.js",
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md"
],
"compatibleResolution": "Preserve public fields and normal hide/expiry behavior; own timer generations and reject stale writes.",
"closureCriteria": "Installed UMD and legacy verify normal notices, reentrant writes and destruction without late timers or stale DOM effects.",
"workspaceState": "Final CORE-18 source, production outputs and installed UMD/legacy artifacts match; ownership and compatible behavior are verified.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md",
"refactor/baselines/builtins-prompts-validation.json",
"test/notice.test.js",
"test/browser/notice.spec.js"
],
"resolutionRationale": "Owned prompt/input resources prevent stale callbacks and survive reentry/removal/destruction; normal public API and event ordering are retained. Final installed UMD and legacy each pass 1350 browser cases, including 207 CORE-18 cases, plus actual tarball runtime/type consumers. Physical mobile and release-review gates remain outstanding for the overall refactor."
},
{
"id": "BASE-LIFE-32",
"title": "Fast-forward repeated starts and missing cancellation retain timers or accelerated playback",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-18"
],
"evidence": [
"test/fast-forward.test.js",
"test/browser/fast-forward.spec.js",
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md"
],
"compatibleResolution": "Own a single press in the current source; restore its prior rate and clean subscriptions while preserving native load reset behavior.",
"closureCriteria": "Installed UMD and legacy verify touch and cancellation, pause/lock/source/destroy and rate restoration; physical touch limitations remain documented.",
"workspaceState": "Final CORE-18 source, production outputs and installed UMD/legacy artifacts match; ownership and compatible behavior are verified.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md",
"refactor/baselines/builtins-prompts-validation.json",
"test/fast-forward.test.js",
"test/browser/fast-forward.spec.js"
],
"resolutionRationale": "Owned prompt/input resources prevent stale callbacks and survive reentry/removal/destruction; normal public API and event ordering are retained. Final installed UMD and legacy each pass 1350 browser cases, including 207 CORE-18 cases, plus actual tarball runtime/type consumers. Physical mobile and release-review gates remain outstanding for the overall refactor."
},
{
"id": "BASE-LIFE-33",
"title": "Auto-playback restarts retain obsolete resume clicks, subscriptions and timers",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-18"
],
"evidence": [
"test/auto-playback.test.js",
"test/browser/auto-playback.spec.js",
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md"
],
"compatibleResolution": "Keep storage and public plugin contracts; bind one prompt generation to the layer and source, independently of instance-owned time recording.",
"closureCriteria": "Installed UMD and legacy prove single current resume action, actual playback/storage, close/rejection and restart/source/remove/destroy cleanup.",
"workspaceState": "Final CORE-18 source, production outputs and installed UMD/legacy artifacts match; ownership and compatible behavior are verified.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md",
"refactor/baselines/builtins-prompts-validation.json",
"test/auto-playback.test.js",
"test/browser/auto-playback.spec.js"
],
"resolutionRationale": "Owned prompt/input resources prevent stale callbacks and survive reentry/removal/destruction; normal public API and event ordering are retained. Final installed UMD and legacy each pass 1350 browser cases, including 207 CORE-18 cases, plus actual tarball runtime/type consumers. Physical mobile and release-review gates remain outstanding for the overall refactor."
},
{
"id": "BASE-LIFE-34",
"title": "Lock icon and miniature progress subscriptions outlive their UI or player",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-18"
],
"evidence": [
"test/builtin-layers.test.js",
"test/browser/builtin-layers.spec.js",
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md"
],
"compatibleResolution": "Scope icon subscriptions to their layer and miniature progress to the player; retain live lock setters after UI removal while suppressing post-destroy mutations.",
"closureCriteria": "Installed UMD and legacy verify builtin activation matrix, state/event/icon contracts, layer removal and retained setters/events after destruction.",
"workspaceState": "Final CORE-18 source, production outputs and installed UMD/legacy artifacts match; ownership and compatible behavior are verified.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md",
"refactor/baselines/builtins-prompts-validation.json",
"test/builtin-layers.test.js",
"test/browser/builtin-layers.spec.js"
],
"resolutionRationale": "Owned prompt/input resources prevent stale callbacks and survive reentry/removal/destruction; normal public API and event ordering are retained. Final installed UMD and legacy each pass 1350 browser cases, including 207 CORE-18 cases, plus actual tarball runtime/type consumers. Physical mobile and release-review gates remain outstanding for the overall refactor."
},
{
"id": "BASE-LIFE-35",
"title": "Info repeated initialization retains polling and close callbacks; destroyed reads continue writing",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-18"
],
"evidence": [
"test/prompt-components.test.js",
"test/browser/prompt-components.spec.js",
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md"
],
"compatibleResolution": "Own one info initialization generation; preserve mask destroy observer ordering and finalize its resources after event dispatch, including failure paths.",
"closureCriteria": "Installed UMD and legacy verify info initial/repeated/mobile/manual/failed init and DOM conversion, plus mask playback, destroy ordering and throwing-observer finalization.",
"workspaceState": "Final CORE-18 source, production outputs and installed UMD/legacy artifacts match; ownership and compatible behavior are verified.",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-18-builtins-prompts.md",
"refactor/baselines/builtins-prompts-validation.json",
"test/prompt-components.test.js",
"test/browser/prompt-components.spec.js"
],
"resolutionRationale": "Owned prompt/input resources prevent stale callbacks and survive reentry/removal/destruction; normal public API and event ordering are retained. Final installed UMD and legacy each pass 1350 browser cases, including 207 CORE-18 cases, plus actual tarball runtime/type consumers. Physical mobile and release-review gates remain outstanding for the overall refactor."
},
{
"id": "BASE-LIFE-36",
"title": "Screenshot Blob callback failures escape and leave public promises pending",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/screenshot.test.js"
],
"compatibleResolution": "Preserve legal capture results and error propagation, while fixing asynchronous failure and stale lifecycle effects.",
"closureCriteria": "Candidate unit, real-browser and installed-package regressions plus compatibility review pass.",
"workspaceState": "Before migration, null Blob and thrown createObjectURL escape the asynchronous callback. Candidate Node regression passes; final installed-package evidence remains outstanding. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-LIFE-37",
"title": "Screenshot completion can download or emit after destruction or source replacement",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/screenshot.test.js",
"test/browser/screenshot.spec.js"
],
"compatibleResolution": "Preserve legal capture results and error propagation, while fixing asynchronous failure and stale lifecycle effects.",
"closureCriteria": "Candidate unit, real-browser and installed-package regressions plus compatibility review pass.",
"workspaceState": "Before migration, screenshot await resumes download and event effects after disposal or source replacement. Candidate guards preserve the captured string result while suppressing stale effects. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-LIFE-38",
"title": "Screenshot toolbar leaves internal capture failures as unhandled rejections",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/browser/screenshot.spec.js",
"refactor/baselines/screenshot-partial.json"
],
"compatibleResolution": "Consume the internal toolbar Promise after the existing notice, while preserving rejection of every public capture method.",
"closureCriteria": "Exact historical Error identity is reproduced and candidate toolbar, cross-origin and installed-package regressions pass.",
"workspaceState": "Published toolbar produces one exactly identified rejection per engine; source candidate produces none. Real cross-origin toolbar validation passes. Installed-package exit remains outstanding. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-LIFE-39",
"title": "Thumbnail image completions can overwrite newer configuration or hover state and outlive controls",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/thumbnails.test.js",
"test/browser/thumbnails.spec.js",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"compatibleResolution": "Preserve public configuration identity, dimensions, layout positioning and public URL ownership; repair documented crop and lifecycle defects.",
"closureCriteria": "Candidate type, unit, actual image browser and installed-package validation pass with explicit historical differences.",
"workspaceState": "Five of seven initial Node cases fail before migration. Candidate generation/source/control ownership guards and latest-hover rendering now pass focused Node and real-image browser checks. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-LIFE-40",
"title": "Image load failures leave thumbnail loading frozen and canvas callback failures escape public loadImg promises",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/thumbnails.test.js",
"test/browser/thumbnails.spec.js",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"compatibleResolution": "Preserve public configuration identity, dimensions, layout positioning and public URL ownership; repair documented crop and lifecycle defects.",
"closureCriteria": "Candidate type, unit, actual image browser and installed-package validation pass with explicit historical differences.",
"workspaceState": "Owned image requests now settle on cancellation or failure and release handlers; the public utility retains HTMLImageElement results and callback errors reject. Transient no-store HTTP failure can retry in all three engines. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-LIFE-41",
"title": "Scaled thumbnail Blob URLs survive replacement, control removal and destruction",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/thumbnails.test.js",
"test/browser/thumbnails.spec.js",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"compatibleResolution": "Preserve public configuration identity, dimensions, layout positioning and public URL ownership; repair documented crop and lifecycle defects.",
"closureCriteria": "Candidate type, unit, actual image browser and installed-package validation pass with explicit historical differences.",
"workspaceState": "Candidate internal URLs belong to the thumbnail configuration/control. Public loadImg and screenshot Blob URL ownership stays with callers. Final installed-package evidence remains outstanding. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-DOM-19",
"title": "Thumbnail row boundaries and first-cell return do not match the generated zero-based sprite grid",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/thumbnails.test.js",
"test/browser/thumbnails.spec.js",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"compatibleResolution": "Preserve public configuration identity, dimensions, layout positioning and public URL ownership; repair documented crop and lifecycle defects.",
"closureCriteria": "Candidate type, unit, actual image browser and installed-package validation pass with explicit historical differences.",
"workspaceState": "artplayer-tool-thumbnail uses index modulo column and floor(index / column). Published renderer selects the previous row last cell at exact multiples and writes invalid double-negative CSS for the first cell. Corrected candidate crop is compared against a numbered real SVG grid. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-LIFE-42",
"title": "Progress callbacks and active drags can seek an obsolete source or removed control",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/source.test.js",
"test/progress.test.js",
"test/browser/progress-quality.spec.js",
"test/browser/source.spec.js",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"compatibleResolution": "Preserve legal progress and quality APIs, callback order, source results and caller ownership; stop obsolete work and bound native position correction.",
"closureCriteria": "Unit, strict types and installed-package browser matrices pass with explicit baseline differences and native evidence.",
"workspaceState": "Published real progress interactions continue seeking after setBar reentry; candidate guards entry, source and action identity and ends a drag on source replacement. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-LIFE-43",
"title": "Replacing a media source revokes a caller-owned Blob URL still in use",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/source.test.js",
"test/progress.test.js",
"test/browser/progress-quality.spec.js",
"test/browser/source.spec.js",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"compatibleResolution": "Preserve legal progress and quality APIs, callback order, source results and caller ownership; stop obsolete work and bound native position correction.",
"closureCriteria": "Unit, strict types and installed-package browser matrices pass with explicit baseline differences and native evidence.",
"workspaceState": "Published URL setter revokes the supplied old URL. Node fetch and three-browser byte ownership checks reproduce the consumer failure; candidate preserves caller ownership after switching and destruction. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-LIFE-44",
"title": "Native quality restoration can settle at a different position after its first seek",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-19"
],
"evidence": [
"test/source.test.js",
"test/progress.test.js",
"test/browser/progress-quality.spec.js",
"test/browser/source.spec.js",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"compatibleResolution": "Preserve legal progress and quality APIs, callback order, source results and caller ownership; stop obsolete work and bound native position correction.",
"closureCriteria": "Unit, strict types and installed-package browser matrices pass with explicit baseline differences and native evidence.",
"workspaceState": "Windows WebKit native event traces show the first seek reporting the accepted target then completing near zero. Waiting or deferring alone is insufficient. Candidate waits for native completion and performs at most one correction; a persistent seeked listener prevents a pending Promise after that correction. Final CORE-19 CI and installed-package acceptance passed; see resolution evidence.",
"resolutionEvidence": [
"refactor/baselines/capture-progress-validation.json",
"refactor/changes/2026-09-11-CORE-19-capture-thumbnails.md"
],
"resolutionRationale": "Core source, strict types, unit cases, real images/media, actual installed tarball and full UMD/legacy matrices pass. Explicit historical defect differences are documented; no API/type removal or environment waiver."
},
{
"id": "BASE-ENV-01",
"title": "Windows WebKit native Blob video samples lack decoding support; Apple-device validation remains outstanding",
"confirmation": "reproduced",
"status": "open",
"owners": [
"REL-03",
"REVIEW-02"
],
"evidence": [
"test/browser/progress-quality.spec.js",
"refactor/environment-matrix.md"
],
"compatibleResolution": "Keep byte ownership and real HTTP playback evidence distinct from native Blob decoding; do not infer Safari or Apple-device support from Windows WebKit.",
"closureCriteria": "Record actual Safari and Apple device versions and native sample capabilities, then compare published/candidate load, playback, seek, source replacement and Blob ownership.",
"workspaceState": "Independent video probes on Windows WebKit 26.6 return error 4 and width zero for both local MP4 and WebM Blob samples. Chromium and Firefox decode the tested Blob sample. WebKit ownership tests explicitly report decodedBlob=false.",
"resolutionEvidence": []
},
{
"id": "BASE-ENV-02",
"title": "Custom iOS or Macintosh user agents dereference absent browser globals during SSR import",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/environment.test.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Keep UA matching, override priority and browser flags while guarding absent window and navigator globals.",
"closureCriteria": "Published failure, isolated environment flags and complete candidate entry/installed import regressions pass without new import side effects.",
"workspaceState": "Absent window/navigator are guarded without changing custom UA priority or lazy evaluation. Full UMD/legacy/ESM imports from the installed tarball pass the explicit no-browser-global profile, and published failures remain tested.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/environment.test.js"
],
"resolutionRationale": "Absent window/navigator are guarded without changing custom UA priority or lazy evaluation. Full UMD/legacy/ESM imports from the installed tarball pass the explicit no-browser-global profile, and published failures remain tested."
},
{
"id": "BASE-LIFE-45",
"title": "Previous workspace safe-area measurement leaks its probe when native style access fails",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/dom-boundaries.test.js",
"test/browser/dom-boundaries.spec.js",
"test/helpers/legacy-safe-area.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve public utility exports, tree/style semantics and primary errors while closing owned probe cleanup and absent-global failures.",
"closureCriteria": "Complete entry, source/consumer types and installed-package/browser exit pass with explicit source provenance.",
"workspaceState": "The CORE-19 own-source safe-area helper is frozen with provenance; candidate finally cleanup releases its probe on native append/style failures while preserving primary errors. Installed browser regressions pass. The npm baseline does not contain this helper.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/dom-boundaries.test.js",
"test/browser/dom-boundaries.spec.js",
"test/helpers/legacy-safe-area.js"
],
"resolutionRationale": "The CORE-19 own-source safe-area helper is frozen with provenance; candidate finally cleanup releases its probe on native append/style failures while preserving primary errors. Installed browser regressions pass. The npm baseline does not contain this helper."
},
{
"id": "BASE-ENV-03",
"title": "Fallback event-path utilities dereference absent window in server environments",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/dom-boundaries.test.js",
"test/browser/dom-boundaries.spec.js",
"test/helpers/legacy-safe-area.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve public utility exports, tree/style semantics and primary errors while closing owned probe cleanup and absent-global failures.",
"closureCriteria": "Complete entry, source/consumer types and installed-package/browser exit pass with explicit source provenance.",
"workspaceState": "Fallback event paths preserve native receiver, original array identity and DOM ancestry while supporting an absent window. Published failure and candidate source/browser regressions pass.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/dom-boundaries.test.js",
"test/browser/dom-boundaries.spec.js",
"test/helpers/legacy-safe-area.js"
],
"resolutionRationale": "Fallback event paths preserve native receiver, original array identity and DOM ancestry while supporting an absent window. Published failure and candidate source/browser regressions pass."
},
{
"id": "BASE-LIFE-46",
"title": "Option initialization continues native, style and source writes after reentrant destruction",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/initialization.test.js",
"test/helpers/legacy-option-init.js",
"test/helpers/legacy-airplay.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve initialization and AirPlay contracts while stopping effects after lifecycle cancellation; keep real device limits explicit.",
"closureCriteria": "Final constructor, strict source types, normal/error/teardown tests and installed-package/browser acceptance pass.",
"workspaceState": "Option initialization retains ordered native/storage/style/source writes, but checks lifecycle closure after callbacks, getters and conversion boundaries. Frozen old traces and complete installed construction tests cover the difference.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/initialization.test.js",
"test/helpers/legacy-option-init.js",
"test/helpers/legacy-airplay.js"
],
"resolutionRationale": "Option initialization retains ordered native/storage/style/source writes, but checks lifecycle closure after callbacks, getters and conversion boundaries. Frozen old traces and complete installed construction tests cover the difference."
},
{
"id": "BASE-LIFE-47",
"title": "AirPlay methods can call a picker or publish events and notices after destruction",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/initialization.test.js",
"test/helpers/legacy-option-init.js",
"test/helpers/legacy-airplay.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve initialization and AirPlay contracts while stopping effects after lifecycle cancellation; keep real device limits explicit.",
"closureCriteria": "Final constructor, strict source types, normal/error/teardown tests and installed-package/browser acceptance pass.",
"workspaceState": "AirPlay capability detection, picker getter/call completion, event and notice publication stop after closure. Controlled source and installed construction checks preserve normal receiver/error behavior; real AirPlay devices remain unverified release scope.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/initialization.test.js",
"test/helpers/legacy-option-init.js",
"test/helpers/legacy-airplay.js"
],
"resolutionRationale": "AirPlay capability detection, picker getter/call completion, event and notice publication stop after closure. Controlled source and installed construction checks preserve normal receiver/error behavior; real AirPlay devices remain unverified release scope."
},
{
"id": "BASE-LIFE-48",
"title": "Proxy-time destruction cannot clean a template before its public assignment",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/instance-lifecycle.test.js",
"test/browser/initialization.spec.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve normal constructor order, public property visibility and first-call teardown semantics while cancelling later installation and cleaning the mounting template.",
"closureCriteria": "Strict final entry, normal/failed/reentrant construction and installed package/browser acceptance pass.",
"workspaceState": "Private mounting ownership permits cleanup before public template assignment. Installed removeHtml true/false, proxy ownership, destroy-observer order, replacement construction and failed-constructor regressions pass.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/instance-lifecycle.test.js",
"test/browser/initialization.spec.js"
],
"resolutionRationale": "Private mounting ownership permits cleanup before public template assignment. Installed removeHtml true/false, proxy ownership, destroy-observer order, replacement construction and failed-constructor regressions pass."
},
{
"id": "BASE-LIFE-49",
"title": "Constructor and Player initialization continue after a callback destroys the instance",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-20"
],
"evidence": [
"test/browser/initialization.spec.js",
"test/initialization.test.js",
"refactor/changes/2026-09-11-CORE-20-entry.md"
],
"compatibleResolution": "Preserve normal constructor order, public property visibility and first-call teardown semantics while cancelling later installation and cleaning the mounting template.",
"closureCriteria": "Strict final entry, normal/failed/reentrant construction and installed package/browser acceptance pass.",
"workspaceState": "Player installers and outer construction stop after reentrant closure without publishing later plugins or registering the dead instance. Installed normal descriptors/static/subclass behavior and getter/native-write destruction cases pass.",
"resolutionEvidence": [
"refactor/baselines/entry-validation.json",
"refactor/changes/2026-09-11-CORE-20-entry.md",
"test/browser/initialization.spec.js",
"test/initialization.test.js"
],
"resolutionRationale": "Player installers and outer construction stop after reentrant closure without publishing later plugins or registering the dead instance. Installed normal descriptors/static/subclass behavior and getter/native-write destruction cases pass."
}
]
}