Files
ArtPlayer/refactor/risks.json
T

2956 lines
165 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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": "ENG-PERF-01",
"title": "Candidate core bundles exceed the BASE-06 size review threshold in all three formats",
"confirmation": "source-observed",
"status": "open",
"owners": [
"CORE-22",
"MOD-03",
"REVIEW-01"
],
"evidence": [
"refactor/coverage-performance.md",
"refactor/baselines/quality-validation.json",
"refactor/changes/2026-09-11-ENG-08-quality-reports.md",
"refactor/baselines/core-setting-navigation-partial.json",
"refactor/changes/2026-09-11-CORE-22-core-acceptance.md",
"refactor/core-acceptance.md",
"refactor/baselines/core-acceptance-validation.json"
],
"compatibleResolution": "Attribute the growth to actual modules and build output, remove avoidable overhead while preserving APIs, and document any justified remaining cost against matching published entries.",
"closureCriteria": "Fresh isolated artifacts have reproducible raw/gzip9/Brotli6 results and an explicit size review; do not raise or overwrite the historical threshold to pass.",
"workspaceState": "First ENG-08 modern core measurement: 134037 to 207875 raw bytes, 35486 to 58374 gzip9, 32533 to 53326 Brotli6. Chapter remains below the combined relative/absolute review threshold. This is a review requirement, not a release approval. CORE-22 navigation phase: 208030 raw / 58429 gzip9 / 53361 Brotli6 modern bytes. Preferred-target revalidation removes a second panel scan at a cost of 55 gzip bytes over ENG-08; it does not resolve total bundle growth. Final CORE-22: modern 208037 raw / 58434 gzip9 / 53372 Brotli6; legacy 212218 / 59686 / 54412; ESM 361496 / 77141 / 70030. Navigation and initial-layout work were reduced, but total size remains above the historical threshold. MOD-03 and REVIEW-01 must review this before release."
},
{
"id": "ENG-PERF-02",
"title": "Intermittent constructor and destruction timing signals require follow-up paired measurement",
"confirmation": "unverified",
"status": "open",
"owners": [
"CORE-22",
"MOD-03",
"REVIEW-01"
],
"evidence": [
"refactor/coverage-performance.md",
"refactor/baselines/quality-validation.json",
"refactor/changes/2026-09-11-ENG-08-quality-reports.md",
"refactor/baselines/core-setting-navigation-partial.json",
"refactor/changes/2026-09-11-CORE-22-core-acceptance.md",
"refactor/core-acceptance.md",
"refactor/baselines/core-acceptance-validation.json"
],
"compatibleResolution": "Repeat paired measurements on the same environment, distinguish initialization and teardown work from host jitter, and optimize only after identifying a reproducible cost.",
"closureCriteria": "Explain repeat-group timing signals with retained samples and source fingerprints; do not infer a regression or improvement from a single group or expand timing allowances.",
"workspaceState": "First ENG-08 run: Firefox group 2 had core/chapter constructor delta 3/5 ms, WebKit group 3 chapter delta 3 ms, versus 2 ms absolute allowance. Other groups did not trigger. Candidate resource checks passed independently. Final run: Chromium/Firefox had no timing signals; WebKit group 1 core/chapter each increased 3 ms, with no signals in the other two groups. The intermittent review remains open. CORE-22 navigation phase: Chromium group 1 core/chapter destroy deltas 3.1/2.5 ms and group 3 chapter constructor delta 2.8 ms; WebKit group 1 chapter destroy delta 27 ms (71 to 98 ms); Firefox has no timing signals. Other groups do not reproduce those destroy signals. All 54 candidate resource probes pass. The timed fixture uses default settings disabled, so these measurements do not establish any timing effect from setting navigation changes. Final CORE-22: no constructor timing signals in any of the three engines; Chromium/Firefox have no timing signals. WebKit group 1 chapter destruction delta 44 ms and group 2 core delta 30 ms remain, group 3 has no signal. All 54 candidate resource probes pass. Chromium sampling identifies native load/DOM teardown cost but does not establish the cause of WebKit signals. MOD-03/REVIEW-01 retain the open review without changing allowances."
},
{
"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": "resolved",
"owners": [
"CORE-23",
"CORE-17"
],
"evidence": [
"refactor/baselines/dom.json"
],
"compatibleResolution": "补键盘可达性、焦点及名称,保留旧 DOM/CSS 和快捷键。",
"closureCriteria": "真实键盘与焦点回归通过,不只检查静态属性。",
"resolutionEvidence": [
"refactor/changes/2026-09-11-CORE-23-keyboard-focus.md",
"refactor/baselines/keyboard-validation.json",
"test/browser/accessibility.spec.js",
"test/browser/accessibility-setting.spec.js",
"test/browser/accessibility-integration.spec.js"
],
"resolutionRationale": "旧发布包的 Tab 缺口保留对照;现有按钮、进度/音量滑块、选择列表、设置、mini、信息/锁定层及菜单具备真实键盘与焦点回归,保留旧快捷键和点击契约。新安装包 modern/legacy 各 1749 项三引擎全量通过,CI 468 项;动态入口失效先复现再修正。只关闭主要控件 Tab 不可达;物理 Apple/触摸/IME/辅助技术与 CORE-22/发布复盘仍为独立门槛。"
},
{
"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": "resolved",
"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": "Historical root inaccuracies remain intentional compatibility behavior; the optional runtime entry provides the accurate alternative validated by CORE-21.",
"playbackResolution": "Both the existing PlaybackControls view and the new runtime entry expose accurate playback results; old root acceptance remains unchanged.",
"resolutionRationale": "The optional runtime entry models sync registration as the original registry, Promise registration as Promise<registry>, and toggle as the actual play/pause result. Old root returns remain accepted. Installed module/constructor identity, old factories, rejection tests and all five legacy/eight precise consumer modes pass without runtime wrappers.",
"resolutionEvidence": [
"refactor/baselines/core-declarations-validation.json",
"refactor/changes/2026-09-11-CORE-21-public-declarations.md",
"packages/artplayer/types/COMPATIBILITY.md",
"test/types/runtime-public.ts"
]
},
{
"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": "source-observed",
"status": "open",
"owners": [
"PKG-HLS-05",
"EX-03"
],
"evidence": [
"packages/artplayer-plugin-hls-control/src/index.ts",
"docs/assets/example/hls.control.js",
"refactor/hls-validation.md"
],
"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",
"PKG-DASH-05"
],
"evidence": [
"packages/artplayer-plugin-dash-control/src/index.ts",
"docs/assets/example/dash.control.js",
"refactor/baselines/dash-control-contract.md"
],
"compatibleResolution": "Caller supplies art.dash. Preserve published 4.x callers (demo 4.5.2) and workspace 5.x stable representation IDs (demo 5.2.1); verify actual media and SDK lifecycle in PKG-DASH-05.",
"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": "source-observed",
"status": "resolved",
"owners": [
"CORE-01",
"CORE-07",
"CORE-22"
],
"evidence": [
"packages/artplayer/src/index.ts",
"packages/artplayer/src/option/resolve.ts",
"test/options.test.js",
"test/browser/options.spec.js",
"test/browser/initialization.spec.js",
"refactor/baselines/core-acceptance-validation.json"
],
"compatibleResolution": "Bundled validation dependency; preserve validation/default/merge behavior and failure cleanup when typing constructor boundaries.",
"closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。",
"resolutionEvidence": [
"refactor/baselines/core-acceptance-validation.json",
"refactor/core-acceptance.md",
"refactor/changes/2026-09-11-CORE-22-core-acceptance.md"
],
"resolutionRationale": "option-validator 2.0.6 is a bundled synchronous dependency with recorded file hash and lock/version evidence. Current and published real-browser consumers retain default/merge identity, callback behavior, exact invalid-option errors before mounting, subsequent container reuse and destruction; modern/legacy full matrices and current unit tests passed. The dependency itself has no source-switch, network or physical-device lifecycle, so those external-SDK conditions do not apply; player media lifecycle is covered by the core matrix. This closes its integration scope, not an independent audit of the upstream project."
},
{
"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": "resolved",
"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": "Historical root inaccuracies remain intentional compatibility behavior; the optional runtime entry provides the accurate alternative validated by CORE-21.",
"resolutionRationale": "Generated runtime Utils covers actual exports, object/PropertyKey def target identity, optional sleep, timer void results and preserved receivers with ignored debounce context documented. Source correspondence, installed positive/negative consumers and real utility behavior pass; historical root signatures remain accepted.",
"resolutionEvidence": [
"refactor/baselines/core-declarations-validation.json",
"refactor/changes/2026-09-11-CORE-21-public-declarations.md",
"packages/artplayer/types/COMPATIBILITY.md",
"test/types/runtime-public.ts"
]
},
{
"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": "resolved",
"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": "Historical root inaccuracies remain intentional compatibility behavior; the optional runtime entry provides the accurate alternative validated by CORE-21.",
"workspaceState": "Generated runtime Setting/Subtitle/Notice expose item/null/void, cue-array contextual payloads and boolean notice reads independently from message writes. Installed consumers and real browser callbacks/returns pass. The historical root retains its old inference/returns and explicit array overloads rather than using false intersections.",
"resolutionRationale": "Generated runtime Setting/Subtitle/Notice expose item/null/void, cue-array contextual payloads and boolean notice reads independently from message writes. Installed consumers and real browser callbacks/returns pass. The historical root retains its old inference/returns and explicit array overloads rather than using false intersections.",
"resolutionEvidence": [
"refactor/baselines/core-declarations-validation.json",
"refactor/changes/2026-09-11-CORE-21-public-declarations.md",
"packages/artplayer/types/COMPATIBILITY.md",
"test/types/runtime-public.ts"
]
},
{
"id": "BASE-TYPE-08",
"title": "Write-only player commands have fictitious public getter declarations",
"confirmation": "reproduced",
"status": "resolved",
"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.",
"resolutionRationale": "The optional runtime entry exposes undefined reads and the actual write types for seek/forward/backward/switch/quality; TS 5.1.6/5.9.3 consumers verify independent accessors. Published/candidate descriptors and reads pass; historical TS 4.3.5 consumers and PlaybackControls remain accepted. No runtime getter was invented.",
"resolutionEvidence": [
"refactor/baselines/core-declarations-validation.json",
"refactor/changes/2026-09-11-CORE-21-public-declarations.md",
"packages/artplayer/types/COMPATIBILITY.md",
"test/types/runtime-public.ts"
]
},
{
"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": "resolved",
"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.",
"resolutionRationale": "Generated runtime Template/Icons/MediaSurface model nullable SSR/query nodes, real icon wrappers, div container validation and static html placement. Constructor-stage host consumers reject premature getters; installed type modes and published/candidate shape/browser checks pass while old imports remain compatible.",
"resolutionEvidence": [
"refactor/baselines/core-declarations-validation.json",
"refactor/changes/2026-09-11-CORE-21-public-declarations.md",
"packages/artplayer/types/COMPATIBILITY.md",
"test/types/runtime-public.ts"
]
},
{
"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": "resolved",
"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": "Generated runtime Player exposes native Element|null or WebKit boolean PiP reads and boolean writes. Installed positive/negative type consumers and native/fallback browser behavior pass, preserving original JS return identity and historical boolean declaration acceptance at the old root. Physical Apple/AirPlay certification remains a separate release gate.",
"resolutionRationale": "Generated runtime Player exposes native Element|null or WebKit boolean PiP reads and boolean writes. Installed positive/negative type consumers and native/fallback browser behavior pass, preserving original JS return identity and historical boolean declaration acceptance at the old root. Physical Apple/AirPlay certification remains a separate release gate.",
"resolutionEvidence": [
"refactor/baselines/core-declarations-validation.json",
"refactor/changes/2026-09-11-CORE-21-public-declarations.md",
"packages/artplayer/types/COMPATIBILITY.md",
"test/types/runtime-public.ts"
]
},
{
"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."
},
{
"id": "HLS-UI-01",
"title": "空轨道和关闭配置仍残留 HLS 菜单",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-HLS-03"
],
"evidence": [
"refactor/hls-validation.md",
"test/hls-control.test.js",
"test/browser/hls-control.spec.js"
],
"compatibleResolution": "使用既有 remove API 清理不再可用的 UI,保留菜单名称及选择语义。",
"closureCriteria": "候选空轨道、关闭开关及恢复测试通过。",
"resolutionEvidence": [
"refactor/baselines/hls-modules-validation.json",
"refactor/changes/2026-09-12-PKG-HLS-03-modules.md",
"packages/artplayer-plugin-hls-control/ARCHITECTURE.md"
],
"resolutionRationale": "PKG-HLS-03 候选回归与新旧核心/实际 Hls.js 1.5.17 验证:空菜单、过期回调/订阅、Auto 及音轨同步。环境/SDK 扩展范围仍由 SDK-01 与 HLS-ENV-01 保持 open,不据此放行发布。"
},
{
"id": "HLS-LIFE-01",
"title": "过期 HLS 选择回调与销毁后 update 仍工作",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-HLS-03"
],
"evidence": [
"refactor/hls-validation.md",
"test/hls-control.test.js",
"test/browser/hls-control.spec.js"
],
"compatibleResolution": "限制过期实例回调,整理监听器归属,Hls 仍由调用方销毁。",
"closureCriteria": "替换、销毁、重入及 SDK 订阅解绑的候选回归通过。",
"resolutionEvidence": [
"refactor/baselines/hls-modules-validation.json",
"refactor/changes/2026-09-12-PKG-HLS-03-modules.md",
"packages/artplayer-plugin-hls-control/ARCHITECTURE.md"
],
"resolutionRationale": "PKG-HLS-03 候选回归与新旧核心/实际 Hls.js 1.5.17 验证:空菜单、过期回调/订阅、Auto 及音轨同步。环境/SDK 扩展范围仍由 SDK-01 与 HLS-ENV-01 保持 open,不据此放行发布。"
},
{
"id": "HLS-AUTO-01",
"title": "真实 ABR 播放的 Auto 标签在 update 后丢失",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-HLS-03",
"PKG-HLS-05"
],
"evidence": [
"refactor/hls-validation.md",
"test/hls-control.test.js",
"test/browser/hls-control.spec.js"
],
"compatibleResolution": "区分自动策略与实际播放档位,保留手动及 Auto 选择值。",
"closureCriteria": "实际 SDK 自动/手动切换和事件同步通过。",
"resolutionEvidence": [
"refactor/baselines/hls-modules-validation.json",
"refactor/changes/2026-09-12-PKG-HLS-03-modules.md",
"packages/artplayer-plugin-hls-control/ARCHITECTURE.md"
],
"resolutionRationale": "PKG-HLS-03 候选回归与新旧核心/实际 Hls.js 1.5.17 验证:空菜单、过期回调/订阅、Auto 及音轨同步。环境/SDK 扩展范围仍由 SDK-01 与 HLS-ENV-01 保持 open,不据此放行发布。"
},
{
"id": "HLS-ENV-01",
"title": "Windows WebKit 缺失 MSE,HLS 播放矩阵尚缺 Safari 证据",
"confirmation": "reproduced",
"status": "open",
"owners": [
"PKG-HLS-05",
"REL-09",
"REVIEW-02"
],
"evidence": [
"refactor/hls-validation.md",
"test/hls-control.test.js",
"test/browser/hls-control.spec.js"
],
"compatibleResolution": "显式验证宿主不支持,保留 14 skipped,不作为播放通过;补有 MSE 的 Safari/macOS/iOS 环境。",
"closureCriteria": "实际 Safari/MSE/native 路径证据齐全,不能仅凭 Windows 能力检查关闭。"
},
{
"id": "HLS-CRASH-01",
"title": "Firefox Hls 1.5.17 worker 销毁可在原生 video 与候选核心复现崩溃",
"confirmation": "reproduced",
"status": "open",
"owners": [
"PKG-HLS-SDK-01",
"PKG-HLS-05",
"REVIEW-02"
],
"evidence": [
"test/browser/hls-sdk.spec.js",
"refactor/changes/2026-09-12-PKG-HLS-SDK-01-integration.md",
"refactor/baselines/hls-sdk-diagnostics.json",
"refactor/scripts/hls-sdk-diagnostic.mjs"
],
"compatibleResolution": "直接原生 video(无 ArtPlayer/插件)和候选核心已有 page crashed;候选核心无观察器也复现。继续区分 SDK、Firefox/Playwright 与媒体销毁,不静默改核心 destroy 顺序或调用方 SDK 配置。",
"closureCriteria": "取得可解释的崩溃诊断或直接 SDK 对照;验证处置和新旧核心/worker/分组销毁矩阵,不能仅以再次通过关闭。"
},
{
"id": "HLS-PLAYBACK-01",
"title": "Firefox 旧核心与 Hls 1.7.2 切组后视频档位未完成切换",
"confirmation": "reproduced",
"status": "open",
"owners": [
"PKG-HLS-SDK-01",
"PKG-HLS-05",
"REVIEW-02"
],
"evidence": [
"test/browser/hls-sdk.spec.js",
"refactor/changes/2026-09-12-PKG-HLS-SDK-01-integration.md",
"refactor/baselines/hls-sdk-validation.json"
],
"compatibleResolution": "区分 SDK、测试媒体/时序和宿主问题,保留真实档位/解码断言及 trace;不扩大等待或只验证菜单。",
"closureCriteria": "直接 Hls 与新旧核心对照定位切换停滞,验证处置和正常/连续组切换,不能以重复通过关闭。"
},
{
"id": "AUDIO-LIFE-01",
"title": "Audio Track 销毁后 update 与媒体/订阅缺少终止守卫",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-AUDIO-02",
"PKG-AUDIO-03",
"PKG-AUDIO-05"
],
"evidence": [
"refactor/baselines/audio-track-contract.md",
"refactor/baselines/audio-track-release.json",
"test/audio-track.test.js",
"test/browser/audio-track.spec.js",
"refactor/baselines/audio-validation.json"
],
"compatibleResolution": "保留公开 audio 和同步 update,封闭销毁后的资源写入并管理插件订阅,验证待决播放拒绝。",
"closureCriteria": "受控复现和新旧核心真实媒体切源/销毁验证通过,不以源码观察代替泄漏证据。",
"resolutionEvidence": [
"refactor/baselines/audio-lifecycle-validation.json",
"refactor/changes/2026-09-12-PKG-AUDIO-03-lifecycle.md",
"packages/artplayer-plugin-audio-track/ARCHITECTURE.md"
],
"resolutionRationale": "候选源码/三格式受控回归及 main/legacy 三引擎验证:插件自己解绑,关闭后的 update/回调/拒绝无资源写入,移除 src 后无新增媒体错误;安装/解绑失败仍释放。此关闭只覆盖已登记守卫/空 src 问题,不称全设备无内存泄漏。"
},
{
"id": "AUDIO-SYNC-01",
"title": "Audio Track 未同步原生暂停/结束,偏移边界与切源/缓冲仍待完整验证",
"confirmation": "reproduced",
"status": "open",
"owners": [
"PKG-AUDIO-02",
"PKG-AUDIO-03",
"PKG-AUDIO-05"
],
"evidence": [
"refactor/baselines/audio-track-contract.md",
"refactor/baselines/audio-track-release.json",
"test/audio-track.test.js",
"test/browser/audio-track.spec.js",
"refactor/baselines/audio-validation.json",
"refactor/baselines/audio-lifecycle-validation.json",
"refactor/baselines/audio-combinations-checkpoint.json"
],
"compatibleResolution": "03 已修复原生暂停/结束;05 的连续切源和偏移原生对照已验证,真实缓冲 Chromium/Firefox 初轮通过但 Windows WebKit 保留 AUDIO-BUFFER-01;策略/设备缺口继续 open。",
"closureCriteria": "正常/边界/失败/缓冲恢复有媒体与受控断言,实际支持环境缺口明确处理。"
},
{
"id": "AUDIO-TYPE-01",
"title": "Audio Track update 部分配置与公开/编辑器声明不一致",
"confirmation": "source-observed",
"status": "accepted-with-scope",
"owners": [
"PKG-AUDIO-04"
],
"evidence": [
"refactor/baselines/audio-track-contract.md",
"refactor/baselines/audio-track-release.json"
],
"compatibleResolution": "ADR-023:默认/legacy 保留旧必填 url 推断与上下文实现;新增 /runtime 复用同一 JS,精确支持部分 update,编辑器通过 RuntimeFactory 显式选择。",
"closureCriteria": "当前与旧编译器的正反例、CJS/ESM/legacy 入口及实际编辑器通过。",
"resolutionRationale": "直接拓宽或重载会使旧上下文实现的 url 成为 string | undefined,已用实际编译复现。五组 TS 正反例、README、CJS/ESM 同一函数、真实 Monaco 三引擎已通过。接受默认旧声明有意保持窄签名的范围,不声称所有入口默认支持部分 update;隔离安装和完整分发仍由 Audio-06 验证。",
"resolutionEvidence": [
"refactor/changes/2026-09-12-PKG-AUDIO-04-types.md",
"refactor/baselines/audio-types-validation.json",
"refactor/decisions.md"
]
},
{
"id": "AUDIO-DEMO-01",
"title": "Audio Track README 示例链接名称不匹配且缺维护说明",
"confirmation": "source-observed",
"status": "open",
"owners": [
"PKG-AUDIO-06"
],
"evidence": [
"refactor/baselines/audio-track-contract.md",
"refactor/baselines/audio-track-release.json"
],
"compatibleResolution": "修正 audio.track 示例路径,补真实模块地图及 update/生命周期说明。",
"closureCriteria": "README、示例、公开声明一致,8082 正式 demo 和包分发验证通过。"
},
{
"id": "CORE-SOURCE-01",
"title": "候选核心连续切源丢失原播放意图",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"CORE-24"
],
"evidence": [
"refactor/baselines/audio-combinations-first.json",
"packages/artplayer/src/source/switch.ts"
],
"compatibleResolution": "继承被替代切源操作的播放意图;显式暂停可以取消恢复,过期操作继续只结算不发布副作用。",
"closureCriteria": "新旧对照的连续切源、手动暂停、重入/取消/错误/销毁和正式产物三引擎验证通过。",
"resolutionEvidence": [
"refactor/changes/2026-09-12-CORE-24-source-intent.md",
"refactor/baselines/core-source-intent-validation.json",
"test/source.test.js",
"test/browser/source-intent.spec.js"
],
"resolutionRationale": "待完成切源操作继承播放意图,公开 play/pause 在原生调用及用户监听器之前更新;内部暂停标记仅消费一次,暂停修订号阻止晚到恢复副作用。34 项源测试、594 项 CI、正式 main/legacy 各 81 项三引擎和原六项 Audio 失败重跑通过,隔离 tarball 字节/运行时/类型验证通过。范围是公开命令及切源操作,不关闭独立 AUDIO-RESUME-01、真机或完整发布门槛。"
},
{
"id": "AUDIO-RESUME-01",
"title": "WebKit 旧核心切源后候选音频保持暂停",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-AUDIO-05"
],
"evidence": [
"refactor/baselines/audio-combinations-first.json",
"test/audio-track.test.js",
"test/browser/audio-combinations.spec.js",
"refactor/baselines/audio-combinations-checkpoint.json"
],
"compatibleResolution": "原生时间零且未暂停、未结束、readyState>2 时允许恢复;显式 proxy playing 布尔值优先。canplay 仅恢复暂停且宿主可播放的 audio,保持公开接口与同步算法。",
"closureCriteria": "保留原始失败,精确事件复现并有旧核心/新核心三引擎回归;不可仅重复到绿灯。",
"resolutionEvidence": [
"refactor/baselines/audio-combinations-checkpoint.json",
"refactor/changes/2026-09-12-PKG-AUDIO-05-combinations.md",
"packages/artplayer-plugin-audio-track/ARCHITECTURE.md"
],
"resolutionRationale": "失败日志确认 seeked 时间零、readyState=4、paused=false 而 art.playing=false。受控用例先红后绿,实际三格式 97 项通过;main/legacy 每组 78 项含三引擎旧/新核心组合通过。仅关闭此具体恢复缺陷,真实缓冲、策略与设备范围保持开放。"
},
{
"id": "AUDIO-BUFFER-01",
"title": "Windows WebKit 原生媒体无法在受限响应下推进至真实缓冲",
"confirmation": "reproduced",
"status": "open",
"owners": [
"PKG-AUDIO-05"
],
"evidence": [
"test/browser/audio-buffering.spec.js",
"test/browser/media-gate-native.spec.js",
"test/helpers/media-gate.js",
"test/media-gate.test.js",
"refactor/baselines/audio-combinations-checkpoint.json",
"refactor/audio-validation.md"
],
"compatibleResolution": "保留真实 waiting 断言;使用独立原生对照和其他实际支持环境/输入继续验证,不将没有播放推进的诊断当成缓冲通过,也不凭此改变插件 API 或否定真实 Safari 支持。",
"closureCriteria": "受影响的缓冲/恢复得到真实媒体证据;与原生能力和测试夹具差异分开,发布环境的剩余范围经显式处理。"
},
{
"id": "CHAPTER-LAYOUT-01",
"title": "长章节标题超出窄播放器进度条宽度",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-CHAPTER-05"
],
"evidence": [
"refactor/baselines/chapter-combinations-checkpoint.json",
"test/browser/chapter-combinations.spec.js"
],
"compatibleResolution": "样式限制最大宽度并省略溢出显示,保留完整 textContent/data-title、DOM hooks 和原有章节数据语义。",
"closureCriteria": "两种核心三引擎窄屏候选标题不越界,历史溢出观察和完整文本保留断言通过。",
"resolutionEvidence": [
"refactor/baselines/chapter-combinations-checkpoint.json",
"packages/artplayer-plugin-chapter/src/style.less",
"packages/artplayer-plugin-chapter/ARCHITECTURE.md"
],
"resolutionRationale": "先复现 6 个候选失败并保留截图,CSS 修复后正式 main/legacy 分别 12 个长标题用例通过(各含 6 历史溢出观察)。实际浏览器输入与产物指纹已冻结,API/类型未改变。"
},
{
"id": "CHAPTER-TIMING-01",
"title": "Windows WebKit 清晰度切换曾在等待窗口内未见 restart,稍后状态恢复",
"confirmation": "reproduced",
"status": "open",
"owners": [
"PKG-CHAPTER-05"
],
"evidence": [
"refactor/baselines/chapter-combinations-checkpoint.json",
"test/browser/chapter-combinations.spec.js",
"refactor/changes/2026-09-12-PKG-CHAPTER-05-combinations.md"
],
"compatibleResolution": "记录原生事件和绝对/相对时序,进一步区分媒体驱动耗时、夹具和核心源操作;未证明原因前不改核心、不扩大超时或重复到绿灯。",
"closureCriteria": "确认先前超时的来源并有对应可靠回归;后续单次通过不足以关闭。"
},
{
"id": "DASH-SDK-01",
"title": "npm 发布版 4.x 与工作区仅 5.x 的 SDK 接口不兼容",
"confirmation": "reproduced",
"status": "open",
"owners": [
"PKG-DASH-02",
"PKG-DASH-03",
"PKG-DASH-05"
],
"evidence": [
"refactor/baselines/dash-control-contract.md",
"refactor/baselines/dash-control-release.json",
"packages/artplayer-plugin-dash-control/src/index.ts",
"packages/artplayer-plugin-dash-control/types/artplayer-plugin-dash-control.d.ts",
"docs/assets/example/dash.control.js",
"test/dash-contract.test.js",
"refactor/dash-validation.md",
"test/dash-lifecycle.test.js",
"refactor/baselines/dash-runtime.json"
],
"compatibleResolution": "按方法能力适配两代已存在用法,保留 v5 稳定 ID,不能要求旧消费者改用新 SDK。",
"closureCriteria": "归档旧用法、v4/v5 受控及实际媒体矩阵通过,清晰度键不混用。"
},
{
"id": "DASH-LIFE-01",
"title": "DASH 空拓扑残留 UI,监听和旧选择回调缺乏关闭守卫",
"confirmation": "reproduced",
"status": "resolved",
"owners": [
"PKG-DASH-02",
"PKG-DASH-03"
],
"evidence": [
"refactor/baselines/dash-control-contract.md",
"refactor/baselines/dash-control-release.json",
"packages/artplayer-plugin-dash-control/src/index.ts",
"packages/artplayer-plugin-dash-control/types/artplayer-plugin-dash-control.d.ts",
"docs/assets/example/dash.control.js",
"test/dash-contract.test.js",
"refactor/dash-validation.md",
"test/dash-lifecycle.test.js",
"refactor/baselines/dash-runtime.json"
],
"compatibleResolution": "仅释放插件自有 ready/restart/destroy 订阅和 UI,SDK 仍由调用方拥有;替换后旧回调不写旧实例。",
"closureCriteria": "空列表、换源/SDK、销毁后引用、安装异常有回归,其他实例与 SDK 不被误释放。",
"resolutionEvidence": [
"refactor/changes/2026-09-12-PKG-DASH-03-runtime.md",
"refactor/baselines/dash-runtime.json",
"packages/artplayer-plugin-dash-control/ARCHITECTURE.md"
],
"resolutionRationale": "空拓扑/禁用/失败/销毁清理自有 UI 与订阅,旧 revision/SDK 引用无副作用;先红后绿、两代方法表及三格式 Node 生命周期、新旧核心 main/legacy 各 84 项真实 DOM 通过。只关闭插件所有权和引用缺陷,不替代实际 SDK/MPD、demo 或设备验证。"
},
{
"id": "DASH-STATE-01",
"title": "DASH 当前项高亮使用真值 ID、音轨身份和标签去重,边界待核实",
"confirmation": "reproduced",
"status": "open",
"owners": [
"PKG-DASH-02",
"PKG-DASH-03",
"PKG-DASH-05"
],
"evidence": [
"refactor/baselines/dash-control-contract.md",
"refactor/baselines/dash-control-release.json",
"packages/artplayer-plugin-dash-control/src/index.ts",
"packages/artplayer-plugin-dash-control/types/artplayer-plugin-dash-control.d.ts",
"docs/assets/example/dash.control.js",
"test/dash-contract.test.js",
"refactor/dash-validation.md",
"test/dash-lifecycle.test.js",
"refactor/baselines/dash-runtime.json"
],
"compatibleResolution": "验证零 ID、重复标签和克隆音轨当前项,在保持原展示语义时按实际可选项定位高亮。",
"closureCriteria": "有受控和真实 SDK 证据说明选中的 representation/track 与 UI 一致。"
},
{
"id": "DASH-TYPE-01",
"title": "DASH 类型未表达默认工厂参数、SDK 回调对象和现代模块入口",
"confirmation": "source-observed",
"status": "resolved",
"owners": [
"PKG-DASH-04"
],
"evidence": [
"refactor/baselines/dash-control-contract.md",
"refactor/baselines/dash-control-release.json",
"packages/artplayer-plugin-dash-control/src/index.ts",
"packages/artplayer-plugin-dash-control/types/artplayer-plugin-dash-control.d.ts",
"docs/assets/example/dash.control.js"
],
"compatibleResolution": "保留旧类型推断,提供准确的 SDK 适配/回调契约和兼容格式入口,不以 any 掩盖源码。",
"closureCriteria": "严格源码、旧/新编译器消费者与隔离产物类型验证通过。",
"resolutionEvidence": [
"refactor/baselines/dash-types-validation.json",
"refactor/changes/2026-09-12-PKG-DASH-04-types.md",
"test/types/dash-control.ts",
"refactor/scripts/dash-package-types.mjs"
],
"resolutionRationale": "五个自有 TS 模块严格检查通过,真实旧 npm 声明/候选消费者在 TS 4.3/5.9 兼容,五种模块模式及非法用法验证、真实 Monaco、工作区外 Yarn tarball 安装与类型检查通过。只关闭插件自身声明和格式解析问题,实际 SDK 类型/媒体矩阵仍由 05 接续。"
},
{
"id": "DASH-DEMO-01",
"title": "DASH 示例仅新 SDK 且重复安装会累积销毁回调",
"confirmation": "source-observed",
"status": "open",
"owners": [
"PKG-DASH-06"
],
"evidence": [
"refactor/baselines/dash-control-contract.md",
"refactor/baselines/dash-control-release.json",
"packages/artplayer-plugin-dash-control/src/index.ts",
"packages/artplayer-plugin-dash-control/types/artplayer-plugin-dash-control.d.ts",
"docs/assets/example/dash.control.js"
],
"compatibleResolution": "验证真实 SDK 销毁和示例重载路径,对齐 v4/v5 文档与示例,不让旧监听误操作新实例。",
"closureCriteria": "真实 8082 demo、旧/新 SDK 路径与 tarball 产物一致,监听和 SDK 所有权可验证。"
}
]
}