From 69ad6fb17edcd3659856e40ac93411a29f093111 Mon Sep 17 00:00:00 2001 From: Harvey Zhao Date: Wed, 16 Sep 2026 00:30:33 +0800 Subject: [PATCH] docs(release): [REL-01] freeze independent major version and migration plans --- refactor/README.md | 1 + .../version-registry-2026-09-16.json | 1203 ++++ .../changes/2026-09-16-REL-01-version-plan.md | 53 + refactor/plan.md | 5 +- refactor/progress.md | 11 + refactor/release-ledger.md | 5 +- refactor/scripts/version-plan.mjs | 52 + refactor/scripts/version-registry.mjs | 79 + refactor/scripts/version-registry.test.mjs | 51 + refactor/tasks.json | 9 +- refactor/toolchain-release.md | 2 +- refactor/version-plan.json | 5212 +++++++++++++++++ refactor/version-plan.md | 69 + refactor/version-policy.md | 4 +- 14 files changed, 6747 insertions(+), 9 deletions(-) create mode 100644 refactor/baselines/version-registry-2026-09-16.json create mode 100644 refactor/changes/2026-09-16-REL-01-version-plan.md create mode 100644 refactor/scripts/version-plan.mjs create mode 100644 refactor/scripts/version-registry.mjs create mode 100644 refactor/scripts/version-registry.test.mjs create mode 100644 refactor/version-plan.json create mode 100644 refactor/version-plan.md diff --git a/refactor/README.md b/refactor/README.md index 386e59b94..689a8092f 100644 --- a/refactor/README.md +++ b/refactor/README.md @@ -37,6 +37,7 @@ | [已实现的开发环境](toolchain-setup.md) | Node/Yarn 固定版本、锁文件、安装命令和实际验证范围 | | [Bun 隔离安装评估](bun-evaluation.md) | 固定版本对比、传递依赖/资源差异及继续使用 Yarn 的依据 | | [全包大版本策略](version-policy.md) | 每包分别升级一个 major 的目标清单、兼容要求和版本落地步骤 | +| [分包版本与迁移方案](version-plan.md) | REL-01冻结的22包目标、registry观察、变更日志范围、依赖与示例计划 | | [已实现的 CI 入口](ci-setup.md) | Yarn 检查/构建、只读 lint、Pages 隔离及远端待验收状态 | | [GitHub CI/CD](github-ci-cd.md) | PR/兼容矩阵、构建报告、Pages、npm 发布及远端准入验证 | | [Pages部署与恢复](pages-deployment.md) | 独立暂存、旧URL/域名预检、只读远端快照与人工切换恢复顺序 | diff --git a/refactor/baselines/version-registry-2026-09-16.json b/refactor/baselines/version-registry-2026-09-16.json new file mode 100644 index 000000000..a6b080db6 --- /dev/null +++ b/refactor/baselines/version-registry-2026-09-16.json @@ -0,0 +1,1203 @@ +{ + "schemaVersion": 1, + "capturedAt": "2026-09-15T16:19:44.313Z", + "registry": "https://registry.npmjs.org", + "policy": "Absence is an observation, not name ownership, reservation or publication authorization. Previously used versions cannot be reused even after unpublish.", + "observations": [ + { + "name": "artplayer", + "target": "6.0.0", + "url": "https://registry.npmjs.org/artplayer", + "status": 200, + "observedAt": "2026-09-15T16:19:40.759Z", + "responseSha256": "560fa27d689284c6e1743835b765e790613b0b11d7255ea0390eb0017a7e9748", + "responseBytes": 380531, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "5.4.0", + "beta": "5.3.1-beta.1" + }, + "activeVersions": [ + "1.0.0", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8", + "1.0.9", + "3.1.5", + "3.1.6", + "3.1.7", + "3.1.8", + "3.1.9", + "3.1.10", + "3.1.12", + "3.1.13", + "3.1.14", + "3.1.15", + "3.1.16", + "3.1.17", + "3.1.18", + "3.1.19", + "3.2.3", + "3.2.4", + "3.2.5", + "3.2.6", + "3.3.1", + "3.3.2", + "3.3.3", + "3.4.1", + "3.4.2", + "3.5.1", + "3.5.2", + "3.5.4", + "3.5.5", + "3.5.8", + "3.5.9", + "3.5.10", + "3.5.11", + "3.5.12", + "3.5.13", + "3.5.14", + "3.5.15", + "3.5.17", + "3.5.18", + "3.5.19", + "3.5.20", + "3.5.21", + "3.5.22", + "3.5.23", + "3.5.24", + "3.5.26", + "3.5.27", + "3.5.28", + "3.5.29", + "3.5.30", + "3.5.31", + "4.0.0", + "4.0.1", + "4.0.2", + "4.0.3", + "4.0.4", + "4.0.5", + "4.0.6", + "4.0.7", + "4.0.8", + "4.0.9", + "4.1.0", + "4.1.1", + "4.1.2", + "4.1.3", + "4.1.4", + "4.2.0", + "4.2.1", + "4.2.2", + "4.2.3", + "4.2.5", + "4.2.6", + "4.2.7", + "4.3.0", + "4.3.1", + "4.3.2", + "4.3.3", + "4.3.4", + "4.3.5", + "4.3.6", + "4.3.7", + "4.3.8", + "4.3.9", + "4.3.10", + "4.3.11", + "4.3.12", + "4.3.13", + "4.3.16", + "4.3.17", + "4.3.18", + "4.3.19", + "4.3.20", + "4.3.21", + "4.3.22", + "4.3.23", + "4.4.0", + "4.4.1", + "4.4.2", + "4.4.3", + "4.4.5", + "4.4.6", + "4.4.7", + "4.5.0", + "4.5.1", + "4.5.2", + "4.5.3", + "4.5.4", + "4.5.5", + "4.5.6", + "4.5.7", + "4.5.8", + "4.5.9", + "4.5.10", + "4.5.11", + "4.5.12", + "4.6.0", + "4.6.1", + "4.6.2", + "5.0.0", + "5.0.1", + "5.0.2", + "5.0.3", + "5.0.4", + "5.0.5", + "5.0.6", + "5.0.7", + "5.0.8", + "5.0.9", + "5.1.0", + "5.1.1", + "5.1.2", + "5.1.3", + "5.1.4", + "5.1.5", + "5.1.6", + "5.1.7", + "5.2.0", + "5.2.1", + "5.2.2", + "5.2.3", + "5.2.4", + "5.2.5", + "5.3.0-beta.0", + "5.3.0-beta.1", + "5.3.0-beta.2", + "5.3.0-beta.3", + "5.3.0-beta.4", + "5.3.0", + "5.3.1-beta.0", + "5.3.1-beta.1", + "5.4.0" + ], + "historicalVersions": [ + "1.0.0", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.5", + "1.0.6", + "1.0.7", + "1.0.8", + "1.0.9", + "3.1.5", + "3.1.6", + "3.1.7", + "3.1.8", + "3.1.9", + "3.1.10", + "3.1.12", + "3.1.13", + "3.1.14", + "3.1.15", + "3.1.16", + "3.1.17", + "3.1.18", + "3.1.19", + "3.2.3", + "3.2.4", + "3.2.5", + "3.2.6", + "3.3.1", + "3.3.2", + "3.3.3", + "3.4.1", + "3.4.2", + "3.5.1", + "3.5.2", + "3.5.4", + "3.5.5", + "3.5.8", + "3.5.9", + "3.5.10", + "3.5.11", + "3.5.12", + "3.5.13", + "3.5.14", + "3.5.15", + "3.5.17", + "3.5.18", + "3.5.19", + "3.5.20", + "3.5.21", + "3.5.22", + "3.5.23", + "3.5.24", + "3.5.26", + "3.5.27", + "3.5.28", + "3.5.29", + "3.5.30", + "3.5.31", + "4.0.0", + "4.0.1", + "4.0.2", + "4.0.3", + "4.0.4", + "4.0.5", + "4.0.6", + "4.0.7", + "4.0.8", + "4.0.9", + "4.1.0", + "4.1.1", + "4.1.2", + "4.1.3", + "4.1.4", + "4.2.0", + "4.2.1", + "4.2.2", + "4.2.3", + "4.2.5", + "4.2.6", + "4.2.7", + "4.3.0", + "4.3.1", + "4.3.2", + "4.3.3", + "4.3.4", + "4.3.5", + "4.3.6", + "4.3.7", + "4.3.8", + "4.3.9", + "4.3.10", + "4.3.11", + "4.3.12", + "4.3.13", + "4.3.16", + "4.3.17", + "4.3.18", + "4.3.19", + "4.3.20", + "4.3.21", + "4.3.22", + "4.3.23", + "4.4.0", + "4.4.1", + "4.4.2", + "4.4.3", + "4.4.5", + "4.4.6", + "4.4.7", + "4.5.0", + "4.5.1", + "4.5.2", + "4.5.3", + "4.5.4", + "4.5.5", + "4.5.6", + "4.5.7", + "4.5.8", + "4.5.9", + "4.5.10", + "4.5.11", + "4.5.12", + "4.6.0", + "4.6.1", + "4.6.2", + "5.0.0", + "5.0.1", + "5.0.2", + "5.0.3", + "5.0.4", + "5.0.5", + "5.0.6", + "5.0.7", + "5.0.8", + "5.0.9", + "5.1.0", + "5.1.1", + "5.1.2", + "5.1.3", + "5.1.4", + "5.1.5", + "5.1.6", + "5.1.7", + "5.2.0", + "5.2.1", + "5.2.2", + "5.2.3", + "5.2.4", + "5.2.5", + "5.3.0-beta.0", + "5.3.0-beta.1", + "5.3.0-beta.2", + "5.3.0-beta.3", + "5.3.0-beta.4", + "5.3.0", + "5.3.1-beta.0", + "5.3.1-beta.1", + "5.4.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-ads", + "target": "3.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-ads", + "status": 200, + "observedAt": "2026-09-15T16:19:40.741Z", + "responseSha256": "f44f323b7c5705a33ef62f093ac12611b308a04ac9d38620e1fad9f0e4df2854", + "responseBytes": 13378, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.0.6" + }, + "activeVersions": [ + "1.0.0", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.6" + ], + "historicalVersions": [ + "1.0.0", + "1.0.2", + "1.0.3", + "1.0.4", + "1.0.6" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-ambilight", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-ambilight", + "status": 200, + "observedAt": "2026-09-15T16:19:40.049Z", + "responseSha256": "bde70a20457ea8a083d056b83e2ce26300d9cb75304f05187350c2b781f130e1", + "responseBytes": 4537, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-asr", + "target": "3.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-asr", + "status": 200, + "observedAt": "2026-09-15T16:19:40.611Z", + "responseSha256": "280de48f746f1eb682b52ec09a09c1ca78876a5061e645412b30c6db898e3c75", + "responseBytes": 4715, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "2.1.0" + }, + "activeVersions": [ + "2.0.0", + "2.1.0" + ], + "historicalVersions": [ + "2.0.0", + "2.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-audio-track", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-audio-track", + "status": 200, + "observedAt": "2026-09-15T16:19:41.038Z", + "responseSha256": "802808f8c7f24d01b562dbc6ef30856451498493b2719e1723097ba069abb26a", + "responseBytes": 5015, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-auto-thumbnail", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-auto-thumbnail", + "status": 200, + "observedAt": "2026-09-15T16:19:41.044Z", + "responseSha256": "52f735ef9be271f06f806995635b7b9a6ba1aedea9c1ad2c307a63788cd28986", + "responseBytes": 6352, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.0.1", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.0.1", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-chapter", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-chapter", + "status": 200, + "observedAt": "2026-09-15T16:19:41.048Z", + "responseSha256": "d225be1116a9293f3c48047de58bba6bd5cc53ac7237b74943c631e8f54b09ef", + "responseBytes": 6068, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.0.1", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.0.1", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-chromecast", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-chromecast", + "status": 200, + "observedAt": "2026-09-15T16:19:41.055Z", + "responseSha256": "357ef2db141c991366e9d1e0f4504a9fa9bb13c9cb99892a6d9e03da48c4d705", + "responseBytes": 4572, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-danmuku", + "target": "6.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-danmuku", + "status": 200, + "observedAt": "2026-09-15T16:19:41.565Z", + "responseSha256": "6fccd0198b2322827b3271a807b60f73a3e4d6f46aeb5494a86aade409caf1d6", + "responseBytes": 193135, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "5.3.0" + }, + "activeVersions": [ + "3.1.8", + "3.1.9", + "3.1.10", + "3.1.12", + "3.1.13", + "3.1.14", + "3.1.15", + "3.1.16", + "3.1.17", + "3.1.18", + "3.1.19", + "3.2.3", + "3.2.4", + "3.2.5", + "3.2.6", + "3.3.1", + "3.3.2", + "3.3.3", + "3.4.1", + "3.4.2", + "3.5.1", + "3.5.2", + "3.5.4", + "3.5.5", + "3.5.8", + "3.5.9", + "3.5.10", + "3.5.11", + "3.5.12", + "3.5.13", + "3.5.14", + "3.5.15", + "3.5.17", + "3.5.18", + "3.5.19", + "3.5.20", + "3.5.21", + "3.5.22", + "3.5.23", + "3.5.24", + "3.5.26", + "3.5.27", + "3.5.28", + "3.5.29", + "3.5.30", + "3.5.31", + "4.1.0", + "4.3.0", + "4.3.12", + "4.3.13", + "4.3.14", + "4.3.15", + "4.3.16", + "4.3.17", + "4.3.18", + "4.3.19", + "4.3.21", + "4.3.22", + "4.3.23", + "4.4.0", + "4.4.1", + "4.4.2", + "4.4.3", + "4.4.6", + "4.4.7", + "4.4.8", + "4.4.10", + "4.4.11", + "5.0.0", + "5.0.1", + "5.1.0", + "5.1.1", + "5.1.2", + "5.1.3", + "5.1.4", + "5.1.5", + "5.1.6", + "5.1.7", + "5.1.8", + "5.2.0", + "5.3.0" + ], + "historicalVersions": [ + "3.1.8", + "3.1.9", + "3.1.10", + "3.1.12", + "3.1.13", + "3.1.14", + "3.1.15", + "3.1.16", + "3.1.17", + "3.1.18", + "3.1.19", + "3.2.3", + "3.2.4", + "3.2.5", + "3.2.6", + "3.3.1", + "3.3.2", + "3.3.3", + "3.4.1", + "3.4.2", + "3.5.1", + "3.5.2", + "3.5.4", + "3.5.5", + "3.5.8", + "3.5.9", + "3.5.10", + "3.5.11", + "3.5.12", + "3.5.13", + "3.5.14", + "3.5.15", + "3.5.17", + "3.5.18", + "3.5.19", + "3.5.20", + "3.5.21", + "3.5.22", + "3.5.23", + "3.5.24", + "3.5.26", + "3.5.27", + "3.5.28", + "3.5.29", + "3.5.30", + "3.5.31", + "4.1.0", + "4.3.0", + "4.3.12", + "4.3.13", + "4.3.14", + "4.3.15", + "4.3.16", + "4.3.17", + "4.3.18", + "4.3.19", + "4.3.21", + "4.3.22", + "4.3.23", + "4.4.0", + "4.4.1", + "4.4.2", + "4.4.3", + "4.4.6", + "4.4.7", + "4.4.8", + "4.4.10", + "4.4.11", + "5.0.0", + "5.0.1", + "5.1.0", + "5.1.1", + "5.1.2", + "5.1.3", + "5.1.4", + "5.1.5", + "5.1.6", + "5.1.7", + "5.1.8", + "5.2.0", + "5.3.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-danmuku-mask", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-danmuku-mask", + "status": 200, + "observedAt": "2026-09-15T16:19:41.971Z", + "responseSha256": "b4caa94b8179a6c6e6ff8f96ed7ec09a615df48afadd2cad66409cf176395820", + "responseBytes": 5666, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-dash-control", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-dash-control", + "status": 200, + "observedAt": "2026-09-15T16:19:41.354Z", + "responseSha256": "f353e76d4228b6e025c914ca7ff4835e6d2456796f47fa283b9efb5658cf2b99", + "responseBytes": 4705, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-document-pip", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-document-pip", + "status": 200, + "observedAt": "2026-09-15T16:19:41.352Z", + "responseSha256": "0271814c8d47a0d48e8be529e7b995d72740fad329abc92d6ade266edc31dcab", + "responseBytes": 8515, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.0.1", + "1.0.2", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.0.1", + "1.0.2", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-hls-control", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-hls-control", + "status": 200, + "observedAt": "2026-09-15T16:19:42.293Z", + "responseSha256": "00aab044106c818a3b52a3cb2a73d816f6c099b7e166f22fa1ebf5d3b9756715", + "responseBytes": 6278, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.0.1", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.0.1", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-jassub", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-jassub", + "status": 200, + "observedAt": "2026-09-15T16:19:42.245Z", + "responseSha256": "fb63338f053428378c97f8d125bc5b20a67a41ee7a0363db3e3ecb1c4f5144a7", + "responseBytes": 4821, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-multiple-subtitles", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-multiple-subtitles", + "status": 200, + "observedAt": "2026-09-15T16:19:42.264Z", + "responseSha256": "42f87af15439205eb6d3c114039b33a148dd7340d9be5ea859da0bacc02faa26", + "responseBytes": 6501, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.2.0" + }, + "activeVersions": [ + "1.0.0", + "1.1.0", + "1.2.0" + ], + "historicalVersions": [ + "1.0.0", + "1.1.0", + "1.2.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-vast", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-vast", + "status": 200, + "observedAt": "2026-09-15T16:19:42.264Z", + "responseSha256": "d72f3611e950231d8c2dc011b4729f519b0d613d542bcc0ee0657f724c89e9f6", + "responseBytes": 2485, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.0.0" + }, + "activeVersions": [ + "1.0.0" + ], + "historicalVersions": [ + "1.0.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-plugin-vtt-thumbnail", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-vtt-thumbnail", + "status": 200, + "observedAt": "2026-09-15T16:19:42.581Z", + "responseSha256": "3c07418004b732ca2af5ada5625a78527a6fc21ee615074d4161b2bcbeecff4d", + "responseBytes": 9554, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.0.1", + "1.0.2", + "1.0.3", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.0.1", + "1.0.2", + "1.0.3", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-proxy-canvas", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-proxy-canvas", + "status": 200, + "observedAt": "2026-09-15T16:19:42.579Z", + "responseSha256": "13c32741fd3b9705d0a28a50e0796d9ddb73c2090e2fd277902bcf440bcc7d81", + "responseBytes": 4411, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.1.0" + }, + "activeVersions": [ + "1.0.0", + "1.1.0" + ], + "historicalVersions": [ + "1.0.0", + "1.1.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-proxy-mediabunny", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-proxy-mediabunny", + "status": 200, + "observedAt": "2026-09-15T16:19:42.812Z", + "responseSha256": "bc6ce60d42fc7b6719d060f5be244ce605437f5bcf19e2ea79714e24230d1924", + "responseBytes": 5101, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.2.0" + }, + "activeVersions": [ + "1.0.0", + "1.2.0" + ], + "historicalVersions": [ + "1.0.0", + "1.2.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "npm" + }, + { + "name": "artplayer-tool-iframe", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-tool-iframe", + "status": 404, + "observedAt": "2026-09-15T16:19:42.578Z", + "responseSha256": "c8d3eae160a892e32837db3dcae515e843e5383fef52b8141940c8bcf8b6d59f", + "responseBytes": 21, + "nameState": "not-found", + "targetState": "not-observed", + "tags": {}, + "activeVersions": [], + "historicalVersions": [], + "majorConflicts": [], + "ownershipVerified": false, + "distribution": "renamed-npm" + }, + { + "name": "artplayer-tool-thumbnail", + "target": "5.0.0", + "url": "https://registry.npmjs.org/artplayer-tool-thumbnail", + "status": 200, + "observedAt": "2026-09-15T16:19:43.110Z", + "responseSha256": "1a5bbf4d14852e0dba2ed51351818bddf742a1278b46ef60366a6a544d443bcf", + "responseBytes": 2552, + "nameState": "unpublished", + "targetState": "not-observed", + "tags": {}, + "activeVersions": [], + "historicalVersions": [ + "1.0.6", + "1.0.7", + "1.0.8", + "1.0.9", + "3.1.5", + "3.1.6", + "3.1.7", + "3.1.8", + "3.1.9", + "3.1.10", + "3.1.12", + "3.1.13", + "3.1.14", + "3.1.15", + "3.1.16", + "3.1.17", + "3.1.18", + "3.1.19", + "3.2.3", + "3.2.4", + "3.2.5", + "3.2.6", + "3.3.1", + "3.3.2", + "3.3.3", + "3.4.1", + "3.4.2", + "3.5.1", + "3.5.2", + "3.5.4", + "3.5.5", + "3.5.8", + "3.5.9", + "3.5.10", + "3.5.11", + "3.5.12", + "3.5.13", + "3.5.14", + "3.5.15", + "3.5.17", + "3.5.18", + "3.5.19", + "3.5.20", + "3.5.21", + "3.5.22", + "3.5.23", + "3.5.24", + "3.5.26", + "3.5.27", + "3.5.28", + "3.5.29", + "3.5.30", + "3.5.31" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": { + "time": "2024-05-26T01:46:10.518Z", + "versions": [ + "1.0.6", + "1.0.7", + "1.0.8", + "1.0.9", + "3.1.10", + "3.1.12", + "3.1.13", + "3.1.14", + "3.1.15", + "3.1.16", + "3.1.17", + "3.1.18", + "3.1.19", + "3.1.5", + "3.1.6", + "3.1.7", + "3.1.8", + "3.1.9", + "3.2.3", + "3.2.4", + "3.2.5", + "3.2.6", + "3.3.1", + "3.3.2", + "3.3.3", + "3.4.1", + "3.4.2", + "3.5.1", + "3.5.10", + "3.5.11", + "3.5.12", + "3.5.13", + "3.5.14", + "3.5.15", + "3.5.17", + "3.5.18", + "3.5.19", + "3.5.2", + "3.5.20", + "3.5.21", + "3.5.22", + "3.5.23", + "3.5.24", + "3.5.26", + "3.5.27", + "3.5.28", + "3.5.29", + "3.5.30", + "3.5.31", + "3.5.4", + "3.5.5", + "3.5.8", + "3.5.9" + ] + }, + "ownershipVerified": false, + "distribution": "recovered-npm" + }, + { + "name": "artplayer-vitepress", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-vitepress", + "status": 404, + "observedAt": "2026-09-15T16:19:43.095Z", + "responseSha256": "c8d3eae160a892e32837db3dcae515e843e5383fef52b8141940c8bcf8b6d59f", + "responseBytes": 21, + "nameState": "not-found", + "targetState": "not-observed", + "tags": {}, + "activeVersions": [], + "historicalVersions": [], + "majorConflicts": [], + "ownershipVerified": false, + "distribution": "site" + }, + { + "name": "artplayer-plugin-iframe", + "target": "2.0.0", + "url": "https://registry.npmjs.org/artplayer-plugin-iframe", + "status": 200, + "observedAt": "2026-09-15T16:19:44.313Z", + "responseSha256": "f17cc1b990a1fe805919c3a4349bfdbdf2fbd844c4ea2aa94adc23c0d6b31c77", + "responseBytes": 3541, + "nameState": "published", + "targetState": "not-observed", + "tags": { + "latest": "1.0.0" + }, + "activeVersions": [ + "1.0.0" + ], + "historicalVersions": [ + "1.0.0" + ], + "majorConflicts": [], + "prereleasesInTargetMajor": [], + "unpublished": null, + "ownershipVerified": false, + "distribution": "historical-name-only" + } + ] +} diff --git a/refactor/changes/2026-09-16-REL-01-version-plan.md b/refactor/changes/2026-09-16-REL-01-version-plan.md new file mode 100644 index 000000000..5f0957789 --- /dev/null +++ b/refactor/changes/2026-09-16-REL-01-version-plan.md @@ -0,0 +1,53 @@ +# REL-01 分包版本与差异方案 + +起点267b21226a11930b1dd89508f326956c1e106928。所有源码/声明决策前置任务已完成, +包括Thumbnail批准的默认策略;本任务完成22包版本准备方案,不改变manifest, +不宣称包已通过发布验收,不执行复盘、推送、npm或标签操作。 + +## 交付 + +- [version-plan.json](../version-plan.json)冻结每包源版本、下一major目标、分发类别、 + 变更日志路径/内容范围、声明规则、原依赖字段、维护文档和剩余验收责任。 + [可读方案](../version-plan.md)说明本地候选和后续版本/标签步骤。 +- [registry快照](../baselines/version-registry-2026-09-16.json)为本次真实只读网络请求, + 覆盖22名和Iframe旧名。记录状态、URL、时间、响应SHA256、active/time/unpublished + 版本和dist-tags;未观察到目标版本或目标/更高major稳定版占用。 + Iframe新名404、Thumbnail撤包、VitePress无npm记录分别保留含义与门槛。 +- [version-registry.mjs](../scripts/version-registry.mjs)提供后续刷新入口,只写新的 + 本地证据文件。并行上限4;未知HTTP/JSON/名称响应不会转成版本可用。 + 一次初始路径检查因Windows根路径尾部分隔符拒绝执行,未发网络请求/写快照; + 根路径规范化后成功完成23次观察,不放宽目录范围与覆盖保护。 +- [version-plan.mjs](../scripts/version-plan.mjs)区分方案一致性和版本已经落实。 + prepared要求22包目标版本、各包目标CHANGELOG和两套示例依赖,不以静态方案 + 冒充版本更改;所有检查都不授权发布。 + +## 冻结决策 + +本轮本地候选使用用户要求的精确M+1.0.0版本,不增加rc后缀。它是尚未上传的 +tarball。未来经授权公开候选用next,正式推广用latest;next不会隔离明确请求 +该版本的用户,也不是发布权限。已经公开的版本不能覆盖,若需改内容则必须 +新版本与重新验证。其余复盘、设备、回退、许可和远端CI门槛均保留。 + +22包没有相互声明的workspace依赖;已有外部dependency/peer字段保持,不能 +因core6.0.0增加只接受6的peer限制。React/Vue源示例计划把三个本仓库包依赖改成 +本地file路径以消费未发布版本;冻结历史消费者和隔离tarball测试保留。REL-09 +核验实际安装/类型/构建流程,只维护根yarn.lock。根private包与示例不升版本。 + +VitePress仍仅站点分发;Iframe旧名与新名的恢复/权限不混淆;Thumbnail历史归档 +缺口不被major升级掩盖。已接受的Ads/VAST/Thumbnail和其他类型差异均要求继续 +记录。公开入口/声明的确切文件沿用现状与逐包维护指南,不统一改成一种导出。 + +方案内准入观察来自真实release-ledger计算,22包均blocked。它是带时间的规划 +快照,后续当前状态仍由原台账计算;REL-01完成不会自动消除这些阻塞。 + +## 验证与后续 + +固定Node24.21.0/Yarn1.22.22。真实registry捕获退出0;5项注册表规则测试通过, +覆盖已发布/撤包版本不可复用、更高major冲突、404非所有权、错误HTTP/格式、 +请求目的地与返回包名。变更脚本lint通过;version-plan --check通过; +--prepared正确退出1并指出artplayer仍是5.4.1,没有误报已经完成major升级。 +版本目标同时与初始清单和release-ledger逐包交叉校验。 + +REL-09落实所有版本、适用示例/依赖/锁和CHANGELOG,单独提交。 +REL-02随后重建目标版本候选并绑定新的证据;旧版本的测试报告只保留作历史依据。 +工具链发布文档同时修正为实施后等待用户指导复盘,消除自动启动的旧表述。 diff --git a/refactor/plan.md b/refactor/plan.md index 2aa988604..5ca1d68e9 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -4,7 +4,7 @@ 基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 283 项,范围 22 个包及工作区/示例。 -状态:todo 43 / doing 20 / blocked 0 / done 220 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 +状态:todo 42 / doing 20 / blocked 0 / done 221 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。 @@ -450,7 +450,7 @@ | ID | 范围 / 步骤 | 前置依赖 | 交付物 | 验收条件 | 风险 | 状态 | | --- | --- | --- | --- | --- | --- | --- | | REL-08 | workspace
提前建立逐包发布准入台账 | BASE-08, ENG-07 | 每批包/版本/源码/锁文件/工具/tarball integrity、必需测试/设备证据、限制和回退映射 | 受影响能力缺证据明确阻止对应批次;无关批次可独立准备,旧证据在候选内容变化后失效;站点采用真实构建/URL/资源验收,npm 分发依据历史核实,不从版本清单推断新增发布范围;关联 risks.json 和 third-party.json;受影响 bundle/worker/WASM/font/模型的来源与许可通知缺口必须有审查结论,未决项阻止对应批次 | H | done | -| REL-01 | workspace
提前确定分包版本与差异方案 | REL-08, CORE-21, SITE-03, PKG-CHAPTER-04, PKG-AMBILIGHT-04, PKG-AUDIO-04, PKG-AUTO-THUMB-04, PKG-VTT-THUMB-04, PKG-HLS-04, PKG-DASH-04, PKG-MULTI-SUB-04, PKG-JASSUB-04, PKG-MASK-04, PKG-ASR-04, PKG-ADS-04, PKG-VAST-04, PKG-CAST-04, PKG-DPIP-04, PKG-CANVAS-04, PKG-IFRAME-04, PKG-TOOL-THUMB-04, PKG-DANMUKU-06, PKG-MB-08, PKG-FACTORY-01 | 每包版本/变更日志/依赖/类型差异方案和独立准入状态;按 version-policy.md 冻结各包下一 major(minor/patch 归零)并核实 registry 占用 | 所有包有方案和剩余门槛,未决项明确阻止相应发布;本步骤不声称已经可发布;全部包有 major 目标,版本冲突明确处理,独立准备任务同步 manifest/锁/依赖/日志;按 BASE-05 区分 21 库与文档站分发,不机械把文档站当库上传 npm | H | todo | +| REL-01 | workspace
提前确定分包版本与差异方案 | REL-08, CORE-21, SITE-03, PKG-CHAPTER-04, PKG-AMBILIGHT-04, PKG-AUDIO-04, PKG-AUTO-THUMB-04, PKG-VTT-THUMB-04, PKG-HLS-04, PKG-DASH-04, PKG-MULTI-SUB-04, PKG-JASSUB-04, PKG-MASK-04, PKG-ASR-04, PKG-ADS-04, PKG-VAST-04, PKG-CAST-04, PKG-DPIP-04, PKG-CANVAS-04, PKG-IFRAME-04, PKG-TOOL-THUMB-04, PKG-DANMUKU-06, PKG-MB-08, PKG-FACTORY-01 | 每包版本/变更日志/依赖/类型差异方案和独立准入状态;按 version-policy.md 冻结各包下一 major(minor/patch 归零)并核实 registry 占用 | 所有包有方案和剩余门槛,未决项明确阻止相应发布;本步骤不声称已经可发布;全部包有 major 目标,版本冲突明确处理,独立准备任务同步 manifest/锁/依赖/日志;按 BASE-05 区分 21 库与文档站分发,不机械把文档站当库上传 npm | H | done | | REL-09 | workspace
落实全包下一 major 版本及依赖元数据 | REL-01, DOC-11 | 22 包版本目标落实、适用锁文件/依赖范围/示例/变更日志同步,核实 registry 版本占用 | 版本与 policy 一致,旧核心支持保留;必要拆子任务各自提交,候选构建前完成,不执行 publish | H | todo | | REL-02 | workspace
生成候选 tarball 并验证新旧组合 | REL-01, CORE-22, ENG-07, REL-09, REL-04 | 各候选本地 tarball/integrity 与新旧核心/插件消费者验证报告,外部门槛单独标注 | 隔离安装和可自动化组合通过;设备结论不伪造,最终发布绑定同一候选内容;在目标 major 版本确定后构建 pack,不在测试后改版本;逐包核验完整回退产物、实际候选版本/integrity、应用导入与冻结锁,重跑对应回退并保留报告;缺失历史分发不准入 | H | todo | | REL-03 | workspace
完成真机、外部 SDK 与压力验收 | REL-02, EX-03, SITE-06, MOD-05 | Safari/移动/PiP/Cast/IMA/模型/长播放完整报告 | 包集成与全项目真机/SDK/压力结论齐全才完成本汇总;独立批次先建立自己的完整门槛子任务 | H | todo | @@ -694,6 +694,7 @@ - MOD-DEV-01: [记录](changes/2026-09-14-MOD-DEV-01-dev-server.md) [记录](baselines/dev-server-validation.json) - MOD-03: [记录](changes/2026-09-14-MOD-03-slider-updates.md) [记录](baselines/slider-updates-validation.json) [记录](changes/2026-09-14-MOD-03-performance-acceptance.md) [记录](baselines/core-performance-validation.json) - REL-08: [记录](changes/2026-09-14-REL-08-release-ledger.md) [记录](baselines/release-ledger-validation.json) [记录](release-ledger.md) [记录](release-ledger.json) +- REL-01: [记录](version-plan.md) [记录](version-plan.json) [记录](baselines/version-registry-2026-09-16.json) [记录](changes/2026-09-16-REL-01-version-plan.md) - REL-04: [记录](changes/2026-09-15-REL-04-consumer-checkpoint.md) [记录](rollback-rehearsal.md) [记录](baselines/rollback-consumer-validation.json) [记录](changes/2026-09-15-REL-04-workflows-checkpoint.md) [记录](rollback-inventory.md) [记录](baselines/rollback-workflows-validation.json) [记录](changes/2026-09-15-REL-04-pages-recovery.md) [记录](baselines/pages-recovery-validation.json) [记录](changes/2026-09-15-REL-04-acceptance.md) [记录](baselines/rollback-acceptance-validation.json) - PKG-FACTORY-01: [记录](baselines/factory-assignment-gaps.json) [记录](baselines/factory-compatibility-proposals.json) [记录](factory-compatibility-decision.md) [记录](changes/2026-09-12-PKG-FACTORY-01-decision.md) [记录](type-compatibility-policy.md) [记录](baselines/factory-compatibility-validation.json) [记录](changes/2026-09-13-PKG-FACTORY-01-compatible-types.md) - CORE-25: [记录](changes/2026-09-13-CORE-25-defaults-ssr.md) [记录](baselines/defaults-ssr-validation.json) diff --git a/refactor/progress.md b/refactor/progress.md index 26f5bcdaa..1514bee9a 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,16 @@ # 进度与证据 +## REL-01 全包版本方案冻结 + +22包下一major、变更日志范围、依赖/类型规则、示例计划与剩余准入已写入 +[方案](version-plan.md)。真实registry查询22名及Iframe旧名,未观察到目标或 +更高major稳定版占用;404/撤包不作为名称权限证明。全部包发布准入仍blocked。 +5项registry规则测试、方案校验及lint通过,prepared检查正确拒绝尚未升级的 +manifest。见[记录](changes/2026-09-16-REL-01-version-plan.md)。 +本次没有修改版本号。REL-01 done;221 done、20 doing、42 todo,共283项。 +下一步REL-09落实22包版本、变更日志与本地示例消费,再重建候选。 +完成实施后等待用户指导复盘,不推送、不发布。 + ## PKG-DANMUKU-START-01 首帧漏显修复完成 已解释原安装 WebKit 的首个 readys 在CPU间隔之后才运行的漏显:私有采样窗口 diff --git a/refactor/release-ledger.md b/refactor/release-ledger.md index ecaaacd09..5ee8d09e4 100644 --- a/refactor/release-ledger.md +++ b/refactor/release-ledger.md @@ -24,8 +24,9 @@ REL-08 建立台账及机械校验,不代表任何包已经可以发布。唯 ## 分发和版本边界 -每行明确记录独立下一major目标,初始依据是package-inventory.json。正式版本占用、 -预发布标识和变更日志仍由REL-01/09落实;本步不修改任何包版本。 +每行明确记录独立下一major目标,初始依据是package-inventory.json。REL-01已冻结 +[版本方案](version-plan.md)及registry快照:本地候选使用目标正式数字版本, +实际上传仍需授权、最新占用和名称权限检查。REL-09落实manifest与变更日志。 - 普通npm包使用各自冻结发布记录的name/version/integrity/SHA-256/URL作为历史依据。 core和chapter引用releases.json各自成员;不把工作区版本当作npm版本。 diff --git a/refactor/scripts/version-plan.mjs b/refactor/scripts/version-plan.mjs new file mode 100644 index 000000000..2ecb2940a --- /dev/null +++ b/refactor/scripts/version-plan.mjs @@ -0,0 +1,52 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import path from 'node:path' +import process from 'node:process' +import { fileURLToPath } from 'node:url' + +const root = path.resolve(fileURLToPath(new URL('../../', import.meta.url))) +const read = file => JSON.parse(fs.readFileSync(path.join(root, file), 'utf8')) +const mode = process.argv[2] +assert(['--check', '--prepared'].includes(mode) && process.argv.length === 3, 'Use --check or --prepared') +const plan = read('refactor/version-plan.json') +const ledger = read('refactor/release-ledger.json') +const inventory = read('refactor/package-inventory.json').packages +const registry = read(plan.registrySnapshot) +assert.equal(plan.schemaVersion, 1) +assert.equal(plan.policy.publicationAuthorized, false) +assert.equal(plan.policy.siteNpmPublication, false) +assert.equal(plan.policy.prereleaseSuffix, null) +assert.deepEqual(plan.packages.map(item => item.name).sort(), ledger.packages.map(item => item.name).sort()) +for (const item of plan.packages) { + const original = inventory.find(pkg => pkg.name === item.name) + const row = ledger.packages.find(pkg => pkg.name === item.name) + const observation = registry.observations.find(pkg => pkg.name === item.name) + const manifest = read(`packages/${item.name}/package.json`) + assert.equal(item.sourceVersion, original.version) + assert.equal(item.targetVersion, row.targetVersion) + assert.equal(item.targetVersion, `${Number(original.version.split('.')[0]) + 1}.0.0`) + assert.equal(item.distribution, row.distribution) + assert.equal(observation.target, item.targetVersion) + assert.equal(observation.targetState, 'not-observed', `Target was used: ${item.name}`) + assert.deepEqual(observation.majorConflicts, [], `Registry major conflict: ${item.name}`) + assert.equal(item.registry.ownershipVerified, false) + assert(item.changelog.changes.length && item.maintenanceDocs.length) + assert.equal(item.changelog.path, `packages/${item.name}/CHANGELOG.md`) + assert.equal(item.changelog.heading, `${item.targetVersion} (unreleased)`) + for (const file of item.maintenanceDocs) + assert(fs.existsSync(path.join(root, file)), `Missing maintenance guide: ${file}`) + for (const field of ['dependencies', 'optionalDependencies', 'peerDependencies', 'peerDependenciesMeta', 'devDependencies']) + assert.deepEqual(manifest[field], item.dependencyPolicy.sourceFields[field], `Unplanned dependency change: ${item.name}/${field}`) + assert([item.sourceVersion, item.targetVersion].includes(manifest.version), `Unplanned current version: ${item.name}`) + if (mode === '--prepared') { + assert.equal(manifest.version, item.targetVersion, `Version not prepared: ${item.name}`) + assert(fs.readFileSync(path.join(root, item.changelog.path), 'utf8').includes(item.changelog.heading), `Missing target changelog: ${item.name}`) + } +} +for (const example of plan.examples) { + const manifest = read(example.manifest) + assert.equal(manifest.private, true) + for (const [name, range] of Object.entries(example.dependencies)) + assert((mode === '--prepared' ? [range.planned] : [range.before, range.planned]).includes(manifest.dependencies[name]), `Example dependency not prepared: ${example.manifest}/${name}`) +} +console.log(`Version plan ${mode}: ${plan.packages.length} independent major targets; registry snapshot checked, publication remains unauthorized`) diff --git a/refactor/scripts/version-registry.mjs b/refactor/scripts/version-registry.mjs new file mode 100644 index 000000000..f47a73af8 --- /dev/null +++ b/refactor/scripts/version-registry.mjs @@ -0,0 +1,79 @@ +import assert from 'node:assert/strict' +import { createHash } from 'node:crypto' +import fs from 'node:fs' +import path from 'node:path' +import process from 'node:process' +import { fileURLToPath } from 'node:url' + +const root = path.resolve(fileURLToPath(new URL('../../', import.meta.url))) +const digest = bytes => createHash('sha256').update(bytes).digest('hex') + +export function versionObservation(status, metadata, target) { + assert(status === 200 || status === 404, `Registry status is not an absence observation: ${status}`) + assert(metadata && typeof metadata === 'object' && !Array.isArray(metadata), 'Malformed registry metadata') + if (status === 404) { + assert(metadata.error === 'Not found', 'Unexpected registry 404 response') + return { nameState: 'not-found', targetState: 'not-observed', tags: {}, activeVersions: [], historicalVersions: [], majorConflicts: [], ownershipVerified: false } + } + assert(typeof metadata.name === 'string', 'Registry metadata has no package name') + assert((metadata.versions && typeof metadata.versions === 'object' && !Array.isArray(metadata.versions)) || metadata.time?.unpublished, 'Registry metadata has no versions or unpublish record') + const activeVersions = Object.keys(metadata.versions || {}) + const historicalVersions = [...new Set([ + ...Object.keys(metadata.time || {}).filter(version => /^\d+\.\d+\.\d+(?:-.+)?$/.test(version)), + ...metadata.time?.unpublished?.versions || [], + ])] + const used = new Set([...activeVersions, ...historicalVersions]) + const major = Number(target.split('.')[0]) + return { + nameState: metadata.time?.unpublished ? 'unpublished' : 'published', + targetState: activeVersions.includes(target) ? 'published' : historicalVersions.includes(target) ? 'previously-used' : 'not-observed', + tags: metadata['dist-tags'] || {}, + activeVersions, + historicalVersions, + majorConflicts: [...used].filter(version => /^\d+\.\d+\.\d+$/.test(version) && Number(version.split('.')[0]) >= major), + prereleasesInTargetMajor: [...used].filter(version => version.startsWith(`${major}.`) && version.includes('-')), + unpublished: metadata.time?.unpublished || null, + ownershipVerified: false, + } +} + +export async function observePackage(name, target, fetcher = fetch) { + assert(/^[a-z0-9]+(?:[.-][a-z0-9]+)*$/.test(name), 'Unexpected package name') + assert(/^\d+\.0\.0$/.test(target), 'Expected a frozen next-major version') + const url = `https://registry.npmjs.org/${name}` + const response = await fetcher(url, { headers: { 'accept': 'application/json', 'cache-control': 'no-cache' }, redirect: 'error', signal: AbortSignal.timeout(30000) }) + const bytes = new Uint8Array(await response.arrayBuffer()) + const metadata = JSON.parse(new TextDecoder().decode(bytes)) + if (response.status === 200) + assert.equal(metadata.name, name, 'Registry returned a different package') + return { name, target, url, status: response.status, observedAt: new Date().toISOString(), responseSha256: digest(bytes), responseBytes: bytes.length, ...versionObservation(response.status, metadata, target) } +} + +async function main() { + const [flag, output, ...extra] = process.argv.slice(2) + assert(flag === '--capture' && output && !extra.length, 'Use --capture ') + const destination = path.resolve(root, output) + assert(destination.startsWith(root + path.sep) && !fs.existsSync(destination), 'Snapshot must be a new repository-local file') + const ledger = JSON.parse(fs.readFileSync(path.join(root, 'refactor/release-ledger.json'), 'utf8')) + const targets = ledger.packages.map(row => ({ name: row.name, target: row.targetVersion, distribution: row.distribution })) + targets.push({ name: 'artplayer-plugin-iframe', target: '2.0.0', distribution: 'historical-name-only' }) + const observations = [] + for (let index = 0; index < targets.length; index += 4) { + const batch = targets.slice(index, index + 4) + const results = await Promise.allSettled(batch.map(async item => ({ ...await observePackage(item.name, item.target), distribution: item.distribution }))) + for (let offset = 0; offset < results.length; offset++) { + const result = results[offset] + observations.push(result.status === 'fulfilled' ? result.value : { ...batch[offset], error: String(result.reason), targetState: 'unknown' }) + } + } + const report = { schemaVersion: 1, capturedAt: new Date().toISOString(), registry: 'https://registry.npmjs.org', policy: 'Absence is an observation, not name ownership, reservation or publication authorization. Previously used versions cannot be reused even after unpublish.', observations } + fs.mkdirSync(path.dirname(destination), { recursive: true }) + fs.writeFileSync(destination, `${JSON.stringify(report, null, 2)}\n`) + for (const row of observations) + console.log(`${row.name}: ${row.nameState || 'error'}, latest=${row.tags?.latest || '-'}, target=${row.target} ${row.targetState}, major-conflicts=${row.majorConflicts?.length ?? '?'}`) + if (observations.some(row => row.error || (!['site', 'historical-name-only'].includes(row.distribution) && (row.targetState !== 'not-observed' || row.majorConflicts.length)))) + process.exitCode = 1 +} + +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) + await main() diff --git a/refactor/scripts/version-registry.test.mjs b/refactor/scripts/version-registry.test.mjs new file mode 100644 index 000000000..9d24701eb --- /dev/null +++ b/refactor/scripts/version-registry.test.mjs @@ -0,0 +1,51 @@ +import assert from 'node:assert/strict' +// eslint-disable-next-line test/no-import-node-test -- Release version reuse and registry failure boundaries. +import test from 'node:test' +import { observePackage, versionObservation } from './version-registry.mjs' + +test('Registry version planning rejects active and unpublished version reuse', () => { + assert.equal(versionObservation(200, { name: 'test', versions: { '2.0.0': {} } }, '2.0.0').targetState, 'published') + const unpublished = versionObservation(200, { name: 'test', time: { unpublished: { versions: ['2.0.0'] } } }, '2.0.0') + assert.equal(unpublished.targetState, 'previously-used') + assert.deepEqual(unpublished.majorConflicts, ['2.0.0']) + assert.equal(versionObservation(200, { name: 'test', versions: {}, time: { '2.0.0': '2025-01-01' } }, '2.0.0').targetState, 'previously-used') +}) + +test('A different stable release in the target major prevents silently using an older major plan', () => { + const value = versionObservation(200, { name: 'test', versions: { '2.1.0': {}, '3.0.0': {}, '2.0.0-rc.1': {} } }, '2.0.0') + assert.equal(value.targetState, 'not-observed') + assert.deepEqual(value.majorConflicts, ['2.1.0', '3.0.0']) + assert.deepEqual(value.prereleasesInTargetMajor, ['2.0.0-rc.1']) +}) + +test('Missing names and empty version histories never establish ownership or reservation', () => { + const missing = versionObservation(404, { error: 'Not found' }, '2.0.0') + assert.equal(missing.nameState, 'not-found') + assert.equal(missing.targetState, 'not-observed') + assert.equal(missing.ownershipVerified, false) + assert.equal(versionObservation(200, { name: 'test', versions: {} }, '2.0.0').ownershipVerified, false) +}) + +test('Registry authentication, throttling, server failures and malformed responses are not availability evidence', () => { + for (const status of [401, 403, 429, 500]) + assert.throws(() => versionObservation(status, { error: 'Not found' }, '2.0.0'), /not an absence/) + for (const data of [null, [], {}, { name: 'test' }]) + assert.throws(() => versionObservation(200, data, '2.0.0')) + assert.throws(() => versionObservation(404, { error: 'Forbidden' }, '2.0.0')) +}) + +test('Live probe uses only the public registry and verifies response identity', async () => { + const urls = [] + const fetcher = async (url, options) => { + urls.push(url) + assert.equal(options.redirect, 'error') + assert.equal(options.headers.authorization, undefined) + return new Response(JSON.stringify({ name: 'artplayer', versions: { '5.4.0': {} } }), { status: 200 }) + } + const result = await observePackage('artplayer', '6.0.0', fetcher) + assert.deepEqual(urls, ['https://registry.npmjs.org/artplayer']) + assert.equal(result.targetState, 'not-observed') + assert.match(result.responseSha256, /^[a-f0-9]{64}$/) + await assert.rejects(observePackage('../private', '6.0.0', fetcher), /Unexpected package/) + await assert.rejects(observePackage('other', '6.0.0', fetcher), /different package/) +}) diff --git a/refactor/tasks.json b/refactor/tasks.json index 37b63f137..fa5f43e79 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -4960,11 +4960,16 @@ "PKG-MB-08", "PKG-FACTORY-01" ], - "status": "todo", + "status": "done", "risk": "H", "deliverable": "每包版本/变更日志/依赖/类型差异方案和独立准入状态;按 version-policy.md 冻结各包下一 major(minor/patch 归零)并核实 registry 占用", "acceptance": "所有包有方案和剩余门槛,未决项明确阻止相应发布;本步骤不声称已经可发布;全部包有 major 目标,版本冲突明确处理,独立准备任务同步 manifest/锁/依赖/日志;按 BASE-05 区分 21 库与文档站分发,不机械把文档站当库上传 npm", - "evidence": [] + "evidence": [ + "version-plan.md", + "version-plan.json", + "baselines/version-registry-2026-09-16.json", + "changes/2026-09-16-REL-01-version-plan.md" + ] }, { "id": "REL-09", diff --git a/refactor/toolchain-release.md b/refactor/toolchain-release.md index 9d34904c6..0366b796d 100644 --- a/refactor/toolchain-release.md +++ b/refactor/toolchain-release.md @@ -60,7 +60,7 @@ MOD-01 已完成固定版本隔离评估,结论为保留 Yarn。Bun 1.4.2 普 GitHub CI/CD 的优化属于本次重构范围,按 [CI/CD 规范](github-ci-cd.md) 分离 PR 检查、候选准备、Pages 部署与 npm 发布。新增 CI-01 至 CI-04 交付矩阵/报告、部署、分包发布准备及远端准入验收;第三轮复盘需核对这些结果。 -实现完成后必须执行 [三轮全局复盘](release-reviews.md)(REVIEW-01/02/03),分别核对架构兼容、真实环境和最终 npm 候选内容。REL-05 依赖三轮通过;候选反馈修复后的正式发布重新核对受影响证据,不能直接复用旧候选的验收结果。 +实现完成后等待用户指导启动 [三轮全局复盘](release-reviews.md)(REVIEW-01/02/03),不得自动开始;各轮分别核对架构兼容、真实环境和最终 npm 候选内容。REL-05 依赖三轮通过;候选反馈修复后的正式发布重新核对受影响证据,不能直接复用旧候选的验收结果。 1. BASE-01 确定旧核心和插件的支持矩阵,登记 npm tarball integrity。起点 SHA 不能代替消费者产物基线。 2. REL 阶段为每个发生变化的包生成候选 tarball,用隔离消费者验证,无需先公开发布。 diff --git a/refactor/version-plan.json b/refactor/version-plan.json new file mode 100644 index 000000000..65815308e --- /dev/null +++ b/refactor/version-plan.json @@ -0,0 +1,5212 @@ +{ + "schemaVersion": 1, + "task": "REL-01", + "capturedAt": "2026-09-15T16:24:23.645Z", + "sourceCommit": "267b21226a11930b1dd89508f326956c1e106928", + "registrySnapshot": "refactor/baselines/version-registry-2026-09-16.json", + "policy": { + "basis": "refactor/version-policy.md", + "preparedVersion": "exact next-major stable target", + "prereleaseSuffix": null, + "localCandidate": "Unpublished target-version tarball, not an npm upload.", + "futureCandidateTag": "next", + "futureStableTag": "latest", + "publicationAuthorized": false, + "siteNpmPublication": false, + "versionReuse": "Never overwrite or republish any previously used package@version. Any post-publication content fix needs a new version and new evidence." + }, + "sharedGates": [ + "CI-01", + "CI-03", + "CI-04", + "REL-01", + "REL-09", + "REL-02", + "REL-03", + "REL-04", + "REVIEW-01", + "REVIEW-02", + "REVIEW-03" + ], + "packages": [ + { + "name": "artplayer", + "sourceVersion": "5.4.1", + "targetVersion": "6.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer", + "observedAt": "2026-09-15T16:19:40.759Z", + "latest": "5.4.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/releases.json", + "selector": "releases.0", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer/CHANGELOG.md", + "heading": "6.0.0 (unreleased)", + "changes": [ + "TypeScript subsystems and generated public declarations; preserve root APIs and offer precise /runtime types.", + "Lifecycle, source/event ownership, components, subtitles, playback/display and accessibility fixes; historical consumer matrix retained." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": { + "dependencies": { + "option-validator": "^2.0.6" + } + }, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer.d.ts", + "runtimeSubpath": true, + "sources": "public/ generates types/" + }, + "maintenanceDocs": [ + "packages/artplayer/README.md", + "packages/artplayer/ARCHITECTURE.md", + "packages/artplayer/types/README.md" + ], + "remainingPackageTasks": [], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "apple-safari-media", + "android-media", + "native-fullscreen-pip" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "5.4.1 must be prepared as 6.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-ads", + "sourceVersion": "2.1.0", + "targetVersion": "3.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-ads", + "observedAt": "2026-09-15T16:19:40.741Z", + "latest": "1.0.6", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/ads-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-ads/CHANGELOG.md", + "heading": "3.0.0 (unreleased)", + "changes": [ + "Typed ad lifecycle and cleanup with preserved published defaults.", + "Approved totalDuration type inference correction; migration explanation remains mandatory." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-ads.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-ads/README.md", + "packages/artplayer-plugin-ads/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-ADS-05", + "PKG-ADS-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "ad-skip-content-restore" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "2.1.0 must be prepared as 3.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-ADS-05" + }, + { + "kind": "task", + "detail": "PKG-ADS-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "ADS-DIST-01" + }, + { + "kind": "risk", + "detail": "ADS-MEDIA-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-ambilight", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-ambilight", + "observedAt": "2026-09-15T16:19:40.049Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/ambilight-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-ambilight/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed rendering and cleanup with legacy factory behavior.", + "Published root types retained; precise /runtime entry and older conflicting declaration migration." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-ambilight.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-ambilight/README.md", + "packages/artplayer-plugin-ambilight/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-AMBILIGHT-05", + "PKG-AMBILIGHT-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "canvas-cors-background" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-AMBILIGHT-05" + }, + { + "kind": "task", + "detail": "PKG-AMBILIGHT-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "AMBILIGHT-LIFE-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-asr", + "sourceVersion": "2.1.0", + "targetVersion": "3.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-asr", + "observedAt": "2026-09-15T16:19:40.611Z", + "latest": "2.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/asr-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-asr/CHANGELOG.md", + "heading": "3.0.0 (unreleased)", + "changes": [ + "Typed recognition, media/audio ownership, fallback routing and explicit capture.", + "Preserve capability errors and cleanup; supported devices and WebAudio remain release gates." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-asr.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-asr/README.md", + "packages/artplayer-plugin-asr/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-ASR-05", + "PKG-ASR-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "audio-context-input-lifecycle" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "2.1.0 must be prepared as 3.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-ASR-05" + }, + { + "kind": "task", + "detail": "PKG-ASR-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "SDK-11" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "ASR-CORS-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-audio-track", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-audio-track", + "observedAt": "2026-09-15T16:19:41.038Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/audio-track-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-audio-track/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed dual-media synchronization and owned track listeners.", + "Buffer starvation/recovery validation remains open; do not claim a fully green playback matrix." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "types/artplayer-plugin-audio-track.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-audio-track/README.md", + "packages/artplayer-plugin-audio-track/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-AUDIO-05", + "PKG-AUDIO-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "separate-audio-source-switch" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-AUDIO-05" + }, + { + "kind": "task", + "detail": "PKG-AUDIO-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "AUDIO-SYNC-01" + }, + { + "kind": "risk", + "detail": "AUDIO-DEMO-01" + }, + { + "kind": "risk", + "detail": "AUDIO-BUFFER-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-auto-thumbnail", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-auto-thumbnail", + "observedAt": "2026-09-15T16:19:41.044Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/auto-thumbnail-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-auto-thumbnail/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Separated metadata, frame capture, encoding and plugin cleanup in TypeScript.", + "Native frame readiness/pixel issues remain tracked; migration does not claim all browsers passed." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-auto-thumbnail.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-auto-thumbnail/README.md", + "packages/artplayer-plugin-auto-thumbnail/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-AUTO-THUMB-03", + "PKG-AUTO-THUMB-05", + "PKG-AUTO-THUMB-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "native-first-frame-jpeg" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-AUTO-THUMB-03" + }, + { + "kind": "task", + "detail": "PKG-AUTO-THUMB-05" + }, + { + "kind": "task", + "detail": "PKG-AUTO-THUMB-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-TYPE-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-EXPORT-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-DIST-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-LIFE-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-ENCODE-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-PIXEL-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-chapter", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-chapter", + "observedAt": "2026-09-15T16:19:41.048Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/releases.json", + "selector": "releases.1", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-chapter/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed parsing, chapter UI and lifecycle integration.", + "Preserve chapter selection/events; remaining restart timing and distribution gates are explicit." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-chapter.d.ts", + "runtimeSubpath": false, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-chapter/README.md", + "packages/artplayer-plugin-chapter/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-CHAPTER-05", + "PKG-CHAPTER-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "touch-fullscreen-thumbnails" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-CHAPTER-05" + }, + { + "kind": "task", + "detail": "PKG-CHAPTER-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "CHAPTER-TIMING-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-chromecast", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-chromecast", + "observedAt": "2026-09-15T16:19:41.055Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/chromecast-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-chromecast/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed SDK initialization, session/receiver state and failure ownership.", + "Keep old public plugin surface; physical Cast/receiver verification is separate." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-chromecast.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-chromecast/README.md", + "packages/artplayer-plugin-chromecast/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-CAST-05", + "PKG-CAST-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "cast-receiver-session" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-CAST-05" + }, + { + "kind": "task", + "detail": "PKG-CAST-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "SDK-06" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-danmuku", + "sourceVersion": "5.3.0", + "targetVersion": "6.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-danmuku", + "observedAt": "2026-09-15T16:19:41.565Z", + "latest": "5.3.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/danmuku-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-danmuku/CHANGELOG.md", + "heading": "6.0.0 (unreleased)", + "changes": [ + "Typed input, scheduling, Worker placement, renderer, UI and resource ownership.", + "Fix issue #958 heatmap density and CPU/async/first-frame scheduling loss; retain root published types with precise /runtime." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-danmuku.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-danmuku/README.md", + "packages/artplayer-plugin-danmuku/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-DANMUKU-08", + "PKG-DANMUKU-09" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "mask-fullscreen-pip" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "5.3.0 must be prepared as 6.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-DANMUKU-08" + }, + { + "kind": "task", + "detail": "PKG-DANMUKU-09" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "DANMUKU-SOURCE-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-danmuku-mask", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-danmuku-mask", + "observedAt": "2026-09-15T16:19:41.971Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/danmuku-mask-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-danmuku-mask/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed model/SDK lifecycle, rendering and cancellation.", + "Preserve model behavior; combined native load and final SDK/device resource evidence stay explicit." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": { + "dependencies": { + "@mediapipe/selfie_segmentation": "^0.1.1675465747", + "@tensorflow-models/body-segmentation": "^1.0.2", + "@tensorflow/tfjs-backend-cpu": "^4.21.0", + "@tensorflow/tfjs-backend-webgl": "^4.21.0", + "@tensorflow/tfjs-converter": "^4.21.0", + "@tensorflow/tfjs-core": "^4.21.0" + } + }, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-danmuku-mask.d.ts", + "runtimeSubpath": false, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-danmuku-mask/README.md", + "packages/artplayer-plugin-danmuku-mask/ARCHITECTURE.md", + "packages/artplayer-plugin-danmuku-mask/types/README.md" + ], + "remainingPackageTasks": [ + "PKG-MASK-05", + "PKG-MASK-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "real-model-gpu-cleanup" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-MASK-05" + }, + { + "kind": "task", + "detail": "PKG-MASK-06" + }, + { + "kind": "task", + "detail": "PKG-DANMUKU-08" + }, + { + "kind": "task", + "detail": "PKG-DANMUKU-09" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "SDK-08" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "MASK-LIFETIME-01" + }, + { + "kind": "risk", + "detail": "MASK-MODEL-01" + }, + { + "kind": "risk", + "detail": "MASK-BACKEND-01" + }, + { + "kind": "risk", + "detail": "MASK-DOM-01" + }, + { + "kind": "risk", + "detail": "MASK-NOTICE-01" + }, + { + "kind": "risk", + "detail": "DANMUKU-SOURCE-01" + }, + { + "kind": "risk", + "detail": "MASK-SCHEDULING-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-dash-control", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-dash-control", + "observedAt": "2026-09-15T16:19:41.354Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/dash-control-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-dash-control/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed SDK 4.x/5.x adapter, selector reconciliation and cleanup.", + "Preserve published options/events; distinguish bare-SDK failures from candidate behavior." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-dash-control.d.ts", + "runtimeSubpath": false, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-dash-control/README.md", + "packages/artplayer-plugin-dash-control/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-DASH-05", + "PKG-DASH-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "real-dash-sdk-tracks" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-DASH-05" + }, + { + "kind": "task", + "detail": "PKG-DASH-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "DASH-SDK-01" + }, + { + "kind": "risk", + "detail": "DASH-DEMO-01" + }, + { + "kind": "risk", + "detail": "DASH-SEEK-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-document-pip", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-document-pip", + "observedAt": "2026-09-15T16:19:41.352Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/dpip-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-document-pip/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed document/window lifetime and content restoration.", + "Preserve existing API and DOM ownership; actual document-PiP/device gates remain." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-document-pip.d.ts", + "runtimeSubpath": false, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-document-pip/README.md", + "packages/artplayer-plugin-document-pip/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-DPIP-05", + "PKG-DPIP-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "document-pip-native-window" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-DPIP-05" + }, + { + "kind": "task", + "detail": "PKG-DPIP-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "DPIP-PACK-01" + }, + { + "kind": "risk", + "detail": "DPIP-LIFE-01" + }, + { + "kind": "risk", + "detail": "DPIP-DOM-01" + }, + { + "kind": "risk", + "detail": "DPIP-MEDIA-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-hls-control", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-hls-control", + "observedAt": "2026-09-15T16:19:42.293Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/hls-control-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-hls-control/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed track/quality control and listener/selector lifecycle.", + "Preserve supported hls.js combinations and source-topology cleanup; native worker/device gaps remain." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-hls-control.d.ts", + "runtimeSubpath": false, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-hls-control/README.md", + "packages/artplayer-plugin-hls-control/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-HLS-SDK-01", + "PKG-HLS-05", + "PKG-HLS-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "native-hls-and-worker" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-HLS-SDK-01" + }, + { + "kind": "task", + "detail": "PKG-HLS-05" + }, + { + "kind": "task", + "detail": "PKG-HLS-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-01" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "HLS-ENV-01" + }, + { + "kind": "risk", + "detail": "HLS-CRASH-01" + }, + { + "kind": "risk", + "detail": "HLS-PLAYBACK-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-jassub", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-jassub", + "observedAt": "2026-09-15T16:19:42.245Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/jassub-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-jassub/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed renderer/Worker/font ownership and native drawing compatibility.", + "Preserve root entry and precise /runtime; hybrid late drawing issue remains an explicit blocker." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "types/artplayer-plugin-jassub.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-jassub/README.md", + "packages/artplayer-plugin-jassub/ARCHITECTURE.md", + "packages/artplayer-plugin-jassub/types/README.md" + ], + "remainingPackageTasks": [ + "PKG-JASSUB-05", + "PKG-JASSUB-06", + "PKG-JASSUB-09" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "real-worker-wasm-hybrid" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-JASSUB-05" + }, + { + "kind": "task", + "detail": "PKG-JASSUB-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "task", + "detail": "PKG-JASSUB-09" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "VENDOR-04" + }, + { + "kind": "risk", + "detail": "VENDOR-05" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "SDK-09" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "JASSUB-TYPE-01" + }, + { + "kind": "risk", + "detail": "JASSUB-EXPORT-01" + }, + { + "kind": "risk", + "detail": "JASSUB-HYBRID-01" + }, + { + "kind": "risk", + "detail": "JASSUB-FIREFOX-OFFSCREEN-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-multiple-subtitles", + "sourceVersion": "1.2.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-multiple-subtitles", + "observedAt": "2026-09-15T16:19:42.264Z", + "latest": "1.2.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/multiple-subtitles-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-multiple-subtitles/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed caption parsing, ASS conversion, merging and load cancellation.", + "Retain published root declaration; /runtime describes actual behavior and conflicting older extraction migration." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-multiple-subtitles.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-multiple-subtitles/README.md", + "packages/artplayer-plugin-multiple-subtitles/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-MULTI-SUB-05", + "PKG-MULTI-SUB-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "subtitle-offset-fullscreen" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.2.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-MULTI-SUB-05" + }, + { + "kind": "task", + "detail": "PKG-MULTI-SUB-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-MERGE-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-LIFE-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-EXPORT-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-vast", + "sourceVersion": "1.2.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-vast", + "observedAt": "2026-09-15T16:19:42.264Z", + "latest": "1.0.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/vast-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-vast/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed SDK/loading/disposal and published initialization timing by default.", + "Approved workspace-1.2 opt-in timing and /runtime type migration; SDK/network and device evidence remain separate." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": { + "dependencies": { + "@alugha/ima": "2.1.0", + "@glomex/vast-ima-player": "^1.21.2" + } + }, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-vast.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-vast/README.md", + "packages/artplayer-plugin-vast/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-VAST-05", + "PKG-VAST-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "google-ima-ad-content-restore" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.2.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-VAST-05" + }, + { + "kind": "task", + "detail": "PKG-VAST-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "SDK-07" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "VAST-LIFE-01" + }, + { + "kind": "risk", + "detail": "VAST-DIST-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-plugin-vtt-thumbnail", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-plugin-vtt-thumbnail", + "observedAt": "2026-09-15T16:19:42.581Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/vtt-thumbnail-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-plugin-vtt-thumbnail/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed VTT parsing, sprite lifecycle and cleanup.", + "Preserve published root types and precise /runtime; document supported old-core combinations and name conflicts." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-plugin-vtt-thumbnail.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-plugin-vtt-thumbnail/README.md", + "packages/artplayer-plugin-vtt-thumbnail/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-VTT-THUMB-05", + "PKG-VTT-THUMB-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "touch-fullscreen-chapter" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-VTT-THUMB-05" + }, + { + "kind": "task", + "detail": "PKG-VTT-THUMB-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "VTT-THUMB-DIST-01" + }, + { + "kind": "risk", + "detail": "VTT-THUMB-LIFE-01" + }, + { + "kind": "risk", + "detail": "VTT-THUMB-EXPORT-01" + }, + { + "kind": "risk", + "detail": "VTT-CORE-NAME-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-proxy-canvas", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-proxy-canvas", + "observedAt": "2026-09-15T16:19:42.579Z", + "latest": "1.1.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/canvas-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-proxy-canvas/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed canvas/media shim, source and native subtitle-track ownership.", + "Retain published root types with precise /runtime and documented older type conflicts." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-proxy-canvas.d.ts", + "runtimeSubpath": true, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-proxy-canvas/README.md", + "packages/artplayer-proxy-canvas/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-CANVAS-05", + "PKG-CANVAS-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "canvas-subtitle-document-pip" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-CANVAS-05" + }, + { + "kind": "task", + "detail": "PKG-CANVAS-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-proxy-mediabunny", + "sourceVersion": "1.2.0", + "targetVersion": "2.0.0", + "distribution": "npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-proxy-mediabunny", + "observedAt": "2026-09-15T16:19:42.812Z", + "latest": "1.2.0", + "nameState": "published", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/mb-release.json", + "selector": "release", + "rationale": "Frozen npm tarball provenance; not a new registry availability observation." + }, + "changelog": { + "path": "packages/artplayer-proxy-mediabunny/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed engine/shim, input/HLS, audio/video pipelines and track controls.", + "Preserve media-like event ordering and published entries; native codec/long-duration/device evidence remains scoped." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": { + "dependencies": { + "mediabunny": "^1.43.1" + } + }, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-proxy-mediabunny.d.ts", + "runtimeSubpath": false, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-proxy-mediabunny/README.md", + "packages/artplayer-proxy-mediabunny/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-MB-09", + "PKG-MB-10" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "webcodecs-hls-audio-video" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.2.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-HLS-SDK-01" + }, + { + "kind": "task", + "detail": "PKG-HLS-05" + }, + { + "kind": "task", + "detail": "PKG-HLS-06" + }, + { + "kind": "task", + "detail": "PKG-MB-09" + }, + { + "kind": "task", + "detail": "PKG-MB-10" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-01" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "SDK-10" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "HLS-ENV-01" + }, + { + "kind": "risk", + "detail": "HLS-CRASH-01" + }, + { + "kind": "risk", + "detail": "HLS-PLAYBACK-01" + }, + { + "kind": "risk", + "detail": "MB-LICENSE-01" + }, + { + "kind": "risk", + "detail": "MB-LIFE-01" + }, + { + "kind": "risk", + "detail": "MB-CAP-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-tool-iframe", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "renamed-npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-tool-iframe", + "observedAt": "2026-09-15T16:19:42.578Z", + "latest": null, + "nameState": "not-found", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/iframe-release.json", + "selector": "release", + "publishedName": "artplayer-plugin-iframe", + "rationale": "Frozen published predecessor and documented rename commit; candidate keeps current workspace name. Registry target availability still requires REL-01." + }, + "changelog": { + "path": "packages/artplayer-tool-iframe/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed cross-frame protocol, navigation generations, origin checks and teardown.", + "Preserve the documented migration from artplayer-plugin-iframe; new-name rights and distribution rollback are not inferred from 404." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-tool-iframe.d.ts", + "runtimeSubpath": false, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-tool-iframe/README.md", + "packages/artplayer-tool-iframe/ARCHITECTURE.md" + ], + "remainingPackageTasks": [ + "PKG-IFRAME-05", + "PKG-IFRAME-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "cross-origin-bfcache-device" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-IFRAME-05" + }, + { + "kind": "task", + "detail": "PKG-IFRAME-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "IFRAME-LIFE-01" + }, + { + "kind": "risk", + "detail": "IFRAME-TRUST-01" + }, + { + "kind": "risk", + "detail": "IFRAME-DIST-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-tool-thumbnail", + "sourceVersion": "4.4.0", + "targetVersion": "5.0.0", + "distribution": "recovered-npm", + "registry": { + "url": "https://registry.npmjs.org/artplayer-tool-thumbnail", + "observedAt": "2026-09-15T16:19:43.110Z", + "latest": null, + "nameState": "unpublished", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/thumbnail-release.json", + "selector": "recovered", + "rationale": "Recovered CDN/Git bytes only; original registry tarball and complete archive unavailable. Not an intact rollback artifact." + }, + "changelog": { + "path": "packages/artplayer-tool-thumbnail/CHANGELOG.md", + "heading": "5.0.0 (unreleased)", + "changes": [ + "Typed source/extraction/input/emitter ownership and actual constructor declarations.", + "Approved published-3.5 default with workspace-4.4 opt-in; preserve delay/height, event and input policies and historical creat* names." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": {}, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": "./types/artplayer-tool-thumbnail.d.ts", + "runtimeSubpath": false, + "sources": "types/" + }, + "maintenanceDocs": [ + "packages/artplayer-tool-thumbnail/README.md", + "packages/artplayer-tool-thumbnail/ARCHITECTURE.md", + "packages/artplayer-tool-thumbnail/types/README.md" + ], + "remainingPackageTasks": [ + "PKG-TOOL-THUMB-05", + "PKG-TOOL-THUMB-06" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "native-file-decode-encode" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "4.4.0 must be prepared as 5.0.0 before final candidate validation" + }, + { + "kind": "distribution-history", + "detail": "Historical archive unavailable; recovered content is not a complete rollback tarball" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-TOOL-THUMB-05" + }, + { + "kind": "task", + "detail": "PKG-TOOL-THUMB-06" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-DIST-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "THUMB-LIFE-01" + }, + { + "kind": "risk", + "detail": "THUMB-MEDIA-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:runtime", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:types", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:combinations", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:browser", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + }, + { + "name": "artplayer-vitepress", + "sourceVersion": "1.1.0", + "targetVersion": "2.0.0", + "distribution": "site", + "registry": { + "url": "https://registry.npmjs.org/artplayer-vitepress", + "observedAt": "2026-09-15T16:19:43.095Z", + "latest": null, + "nameState": "not-found", + "targetState": "not-observed", + "ownershipVerified": false + }, + "frozenHistory": { + "file": "refactor/baselines/site-provenance.json", + "rationale": "Existing docs/site build and URL distribution. No npm publication is inferred." + }, + "changelog": { + "path": "packages/artplayer-vitepress/CHANGELOG.md", + "heading": "2.0.0 (unreleased)", + "changes": [ + "Typed site/editor/documentation/build modules and local library declaration generation.", + "Preserve URLs, examples and editor globals; font provenance, site verification and Pages gates remain. No new npm distribution." + ] + }, + "dependencyPolicy": { + "action": "preserve existing runtime/dev/optional/peer declarations; do not introduce a new core-major peer restriction", + "sourceFields": { + "devDependencies": { + "flexsearch": "0.8.158", + "markdown-it": "14.1.0", + "vitepress": "1.6.3", + "vitepress-plugin-search": "1.0.4-alpha.22", + "vue": "3.5.13" + } + }, + "internalWorkspaceDependencies": [] + }, + "declarationPolicy": { + "action": "preserve existing root and legacy declarations, approved type migrations and module resolution; retain accurate runtime subpath where already provided", + "root": null, + "runtimeSubpath": false, + "sources": "browser/ and build/ source types" + }, + "maintenanceDocs": [ + "packages/artplayer-vitepress/README.md" + ], + "remainingPackageTasks": [ + "SITE-04", + "SITE-05", + "SITE-06", + "SITE-07" + ], + "remainingRequirements": [ + "apple-safari-device", + "android-chrome-device", + "mobile-editor-and-site" + ], + "readinessObservation": { + "status": "blocked", + "blockers": [ + { + "kind": "version", + "detail": "1.1.0 must be prepared as 2.0.0 before final candidate validation" + }, + { + "kind": "candidate", + "detail": "No candidate artifact is bound" + }, + { + "kind": "task", + "detail": "CI-01" + }, + { + "kind": "task", + "detail": "CI-03" + }, + { + "kind": "task", + "detail": "CI-04" + }, + { + "kind": "task", + "detail": "PKG-CHAPTER-05" + }, + { + "kind": "task", + "detail": "PKG-CHAPTER-06" + }, + { + "kind": "task", + "detail": "PKG-AMBILIGHT-05" + }, + { + "kind": "task", + "detail": "PKG-AMBILIGHT-06" + }, + { + "kind": "task", + "detail": "PKG-AUDIO-05" + }, + { + "kind": "task", + "detail": "PKG-AUDIO-06" + }, + { + "kind": "task", + "detail": "PKG-AUTO-THUMB-03" + }, + { + "kind": "task", + "detail": "PKG-AUTO-THUMB-05" + }, + { + "kind": "task", + "detail": "PKG-AUTO-THUMB-06" + }, + { + "kind": "task", + "detail": "PKG-VTT-THUMB-05" + }, + { + "kind": "task", + "detail": "PKG-VTT-THUMB-06" + }, + { + "kind": "task", + "detail": "PKG-HLS-SDK-01" + }, + { + "kind": "task", + "detail": "PKG-HLS-05" + }, + { + "kind": "task", + "detail": "PKG-HLS-06" + }, + { + "kind": "task", + "detail": "PKG-DASH-05" + }, + { + "kind": "task", + "detail": "PKG-DASH-06" + }, + { + "kind": "task", + "detail": "PKG-MULTI-SUB-05" + }, + { + "kind": "task", + "detail": "PKG-MULTI-SUB-06" + }, + { + "kind": "task", + "detail": "PKG-JASSUB-05" + }, + { + "kind": "task", + "detail": "PKG-JASSUB-06" + }, + { + "kind": "task", + "detail": "PKG-MASK-05" + }, + { + "kind": "task", + "detail": "PKG-MASK-06" + }, + { + "kind": "task", + "detail": "PKG-ASR-05" + }, + { + "kind": "task", + "detail": "PKG-ASR-06" + }, + { + "kind": "task", + "detail": "PKG-ADS-05" + }, + { + "kind": "task", + "detail": "PKG-ADS-06" + }, + { + "kind": "task", + "detail": "PKG-VAST-05" + }, + { + "kind": "task", + "detail": "PKG-VAST-06" + }, + { + "kind": "task", + "detail": "PKG-CAST-05" + }, + { + "kind": "task", + "detail": "PKG-CAST-06" + }, + { + "kind": "task", + "detail": "PKG-DPIP-05" + }, + { + "kind": "task", + "detail": "PKG-DPIP-06" + }, + { + "kind": "task", + "detail": "PKG-DANMUKU-08" + }, + { + "kind": "task", + "detail": "PKG-DANMUKU-09" + }, + { + "kind": "task", + "detail": "PKG-CANVAS-05" + }, + { + "kind": "task", + "detail": "PKG-CANVAS-06" + }, + { + "kind": "task", + "detail": "PKG-MB-09" + }, + { + "kind": "task", + "detail": "PKG-MB-10" + }, + { + "kind": "task", + "detail": "PKG-IFRAME-05" + }, + { + "kind": "task", + "detail": "PKG-IFRAME-06" + }, + { + "kind": "task", + "detail": "PKG-TOOL-THUMB-05" + }, + { + "kind": "task", + "detail": "PKG-TOOL-THUMB-06" + }, + { + "kind": "task", + "detail": "SITE-04" + }, + { + "kind": "task", + "detail": "SITE-05" + }, + { + "kind": "task", + "detail": "SITE-06" + }, + { + "kind": "task", + "detail": "SITE-07" + }, + { + "kind": "task", + "detail": "REL-01" + }, + { + "kind": "task", + "detail": "REL-09" + }, + { + "kind": "task", + "detail": "REL-02" + }, + { + "kind": "task", + "detail": "REL-03" + }, + { + "kind": "task", + "detail": "REVIEW-01" + }, + { + "kind": "task", + "detail": "REVIEW-02" + }, + { + "kind": "task", + "detail": "REVIEW-03" + }, + { + "kind": "task", + "detail": "PKG-JASSUB-09" + }, + { + "kind": "risk", + "detail": "ENG-PERF-01" + }, + { + "kind": "risk", + "detail": "ENG-PERF-02" + }, + { + "kind": "risk", + "detail": "BASE-DEMO-01" + }, + { + "kind": "risk", + "detail": "BASE-DIST-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-01" + }, + { + "kind": "risk", + "detail": "BASE-SOURCE-02" + }, + { + "kind": "risk", + "detail": "BASE-SITE-01" + }, + { + "kind": "risk", + "detail": "BASE-MEDIA-01" + }, + { + "kind": "risk", + "detail": "VENDOR-04" + }, + { + "kind": "risk", + "detail": "VENDOR-05" + }, + { + "kind": "risk", + "detail": "VENDOR-06" + }, + { + "kind": "risk", + "detail": "SDK-01" + }, + { + "kind": "risk", + "detail": "SDK-02" + }, + { + "kind": "risk", + "detail": "SDK-03" + }, + { + "kind": "risk", + "detail": "SDK-04" + }, + { + "kind": "risk", + "detail": "SDK-05" + }, + { + "kind": "risk", + "detail": "SDK-06" + }, + { + "kind": "risk", + "detail": "SDK-07" + }, + { + "kind": "risk", + "detail": "SDK-08" + }, + { + "kind": "risk", + "detail": "SDK-09" + }, + { + "kind": "risk", + "detail": "SDK-10" + }, + { + "kind": "risk", + "detail": "SDK-11" + }, + { + "kind": "risk", + "detail": "BASE-ENV-01" + }, + { + "kind": "risk", + "detail": "HLS-ENV-01" + }, + { + "kind": "risk", + "detail": "HLS-CRASH-01" + }, + { + "kind": "risk", + "detail": "HLS-PLAYBACK-01" + }, + { + "kind": "risk", + "detail": "AUDIO-SYNC-01" + }, + { + "kind": "risk", + "detail": "AUDIO-DEMO-01" + }, + { + "kind": "risk", + "detail": "AUDIO-BUFFER-01" + }, + { + "kind": "risk", + "detail": "CHAPTER-TIMING-01" + }, + { + "kind": "risk", + "detail": "DASH-SDK-01" + }, + { + "kind": "risk", + "detail": "DASH-DEMO-01" + }, + { + "kind": "risk", + "detail": "DASH-SEEK-01" + }, + { + "kind": "risk", + "detail": "ADS-DIST-01" + }, + { + "kind": "risk", + "detail": "ADS-MEDIA-01" + }, + { + "kind": "risk", + "detail": "VAST-LIFE-01" + }, + { + "kind": "risk", + "detail": "VAST-DIST-01" + }, + { + "kind": "risk", + "detail": "AMBILIGHT-LIFE-01" + }, + { + "kind": "risk", + "detail": "DPIP-PACK-01" + }, + { + "kind": "risk", + "detail": "DPIP-LIFE-01" + }, + { + "kind": "risk", + "detail": "DPIP-DOM-01" + }, + { + "kind": "risk", + "detail": "DPIP-MEDIA-01" + }, + { + "kind": "risk", + "detail": "MB-LICENSE-01" + }, + { + "kind": "risk", + "detail": "MB-LIFE-01" + }, + { + "kind": "risk", + "detail": "MB-CAP-01" + }, + { + "kind": "risk", + "detail": "IFRAME-LIFE-01" + }, + { + "kind": "risk", + "detail": "IFRAME-TRUST-01" + }, + { + "kind": "risk", + "detail": "IFRAME-DIST-01" + }, + { + "kind": "risk", + "detail": "THUMB-LIFE-01" + }, + { + "kind": "risk", + "detail": "THUMB-MEDIA-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-TYPE-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-EXPORT-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-DIST-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-LIFE-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-ENCODE-01" + }, + { + "kind": "risk", + "detail": "AUTO-THUMB-PIXEL-01" + }, + { + "kind": "risk", + "detail": "VTT-THUMB-DIST-01" + }, + { + "kind": "risk", + "detail": "VTT-THUMB-LIFE-01" + }, + { + "kind": "risk", + "detail": "VTT-THUMB-EXPORT-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-MERGE-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-LIFE-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-EXPORT-01" + }, + { + "kind": "risk", + "detail": "JASSUB-TYPE-01" + }, + { + "kind": "risk", + "detail": "JASSUB-EXPORT-01" + }, + { + "kind": "risk", + "detail": "ASR-CORS-01" + }, + { + "kind": "risk", + "detail": "MASK-LIFETIME-01" + }, + { + "kind": "risk", + "detail": "MASK-MODEL-01" + }, + { + "kind": "risk", + "detail": "MASK-BACKEND-01" + }, + { + "kind": "risk", + "detail": "MASK-DOM-01" + }, + { + "kind": "risk", + "detail": "MASK-NOTICE-01" + }, + { + "kind": "risk", + "detail": "DANMUKU-SOURCE-01" + }, + { + "kind": "risk", + "detail": "MASK-SCHEDULING-01" + }, + { + "kind": "risk", + "detail": "JASSUB-HYBRID-01" + }, + { + "kind": "risk", + "detail": "JASSUB-FIREFOX-OFFSCREEN-01" + }, + { + "kind": "risk", + "detail": "VTT-CORE-NAME-01" + }, + { + "kind": "risk", + "detail": "MULTI-SUB-SWITCH-01" + }, + { + "kind": "evidence:build", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:site-urls", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:site-assets", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:editor", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:devices", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:licenses", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:rollback", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:remote-ci", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-01", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-02", + "detail": "Missing candidate-bound evidence" + }, + { + "kind": "evidence:review-03", + "detail": "Missing candidate-bound evidence" + } + ], + "publicationAuthorized": false, + "capturedAt": "2026-09-15T16:24:23.645Z" + } + } + ], + "examples": [ + { + "manifest": "example/react.js/package.json", + "private": true, + "versionChange": false, + "dependencies": { + "artplayer": { + "before": "^5.3.0-beta.4", + "planned": "file:../../packages/artplayer" + }, + "artplayer-plugin-danmuku": { + "before": "^5.2.0", + "planned": "file:../../packages/artplayer-plugin-danmuku" + }, + "artplayer-plugin-document-pip": { + "before": "^1.0.2", + "planned": "file:../../packages/artplayer-plugin-document-pip" + } + } + }, + { + "manifest": "example/vue.js/package.json", + "private": true, + "versionChange": false, + "dependencies": { + "artplayer": { + "before": "^5.3.0-beta.4", + "planned": "file:../../packages/artplayer" + }, + "artplayer-plugin-danmuku": { + "before": "^5.2.0", + "planned": "file:../../packages/artplayer-plugin-danmuku" + }, + "artplayer-plugin-document-pip": { + "before": "^1.0.2", + "planned": "file:../../packages/artplayer-plugin-document-pip" + } + } + } + ], + "lockPolicy": "Yarn Classic 1.22.22; root yarn.lock only. Reinstall frozen after preparing metadata; do not create example lockfiles or change external dependency versions incidentally.", + "nextTask": "REL-09 implements metadata and changelogs. REL-02 rebuilds final target-version candidates and revalidates; old-version results are historical evidence only." +} diff --git a/refactor/version-plan.md b/refactor/version-plan.md new file mode 100644 index 000000000..93c882f62 --- /dev/null +++ b/refactor/version-plan.md @@ -0,0 +1,69 @@ +# 分包版本与迁移方案(REL-01) + +2026-09-16 冻结方案。机器源为 [version-plan.json](version-plan.json),目标沿用用户批准的 [大版本政策](version-policy.md)。这是版本准备方案,22包当前均被正式发布台账阻止发布;任务、风险和实际准入继续以 tasks.json、risks.json、release-ledger.json 为准,不手工维护另一份“已经通过”清单。 + +## 版本和候选编号 + +REL-09 将22个 workspace manifest 设为各自下一 major 的正式数字版本,minor/patch 归零,不给根 private 管理包或两个 private 示例提升版本。本轮本地候选就是未上传的目标版本 tarball,不加 -rc 后缀;不能将此称为已经发布的预发布版本。 + +后续经用户授权公开候选时使用 next 标签,正式推广使用 latest;相同版本只能上传一次,标签推广应使用已验证的同一内容。next 标签不是版本隔离或发布授权,明确选择新版本的消费者仍可取得它。若公开后需要改内容,必须准备新版本并重新验证,不能覆盖或撤包后复用原版本。所有实际发布及标签操作仍等待三轮复盘和单独授权。 + +## 逐包目标与变更日志范围 + +表中源码版本是冻结快照;npm latest 是本次只读 registry 观察,并非新的兼容性基线。REL-09 为每包维护 CHANGELOG.md 的目标版本 unreleased 条目;每条的具体变更、声明策略、维护文档、依赖字段和剩余门槛见机器源。 + +| 包 | 源码 → 目标 | npm latest / 状态 | 变更日志要点 | +| --- | --- | --- | --- | +| artplayer | 5.4.1 → 6.0.0 | 5.4.0 | TypeScript subsystems and generated public declarations; preserve root APIs and offer precise /runtime types. Lifecycle, source/event ownership, components, subtitles, playback/display and accessibility fixes; historical consumer matrix retained. | +| artplayer-plugin-ads | 2.1.0 → 3.0.0 | 1.0.6 | Typed ad lifecycle and cleanup with preserved published defaults. Approved totalDuration type inference correction; migration explanation remains mandatory. | +| artplayer-plugin-ambilight | 1.1.0 → 2.0.0 | 1.1.0 | Typed rendering and cleanup with legacy factory behavior. Published root types retained; precise /runtime entry and older conflicting declaration migration. | +| artplayer-plugin-asr | 2.1.0 → 3.0.0 | 2.1.0 | Typed recognition, media/audio ownership, fallback routing and explicit capture. Preserve capability errors and cleanup; supported devices and WebAudio remain release gates. | +| artplayer-plugin-audio-track | 1.1.0 → 2.0.0 | 1.1.0 | Typed dual-media synchronization and owned track listeners. Buffer starvation/recovery validation remains open; do not claim a fully green playback matrix. | +| artplayer-plugin-auto-thumbnail | 1.1.0 → 2.0.0 | 1.1.0 | Separated metadata, frame capture, encoding and plugin cleanup in TypeScript. Native frame readiness/pixel issues remain tracked; migration does not claim all browsers passed. | +| artplayer-plugin-chapter | 1.1.0 → 2.0.0 | 1.1.0 | Typed parsing, chapter UI and lifecycle integration. Preserve chapter selection/events; remaining restart timing and distribution gates are explicit. | +| artplayer-plugin-chromecast | 1.1.0 → 2.0.0 | 1.1.0 | Typed SDK initialization, session/receiver state and failure ownership. Keep old public plugin surface; physical Cast/receiver verification is separate. | +| artplayer-plugin-danmuku | 5.3.0 → 6.0.0 | 5.3.0 | Typed input, scheduling, Worker placement, renderer, UI and resource ownership. Fix issue #958 heatmap density and CPU/async/first-frame scheduling loss; retain root published types with precise /runtime. | +| artplayer-plugin-danmuku-mask | 1.1.0 → 2.0.0 | 1.1.0 | Typed model/SDK lifecycle, rendering and cancellation. Preserve model behavior; combined native load and final SDK/device resource evidence stay explicit. | +| artplayer-plugin-dash-control | 1.1.0 → 2.0.0 | 1.1.0 | Typed SDK 4.x/5.x adapter, selector reconciliation and cleanup. Preserve published options/events; distinguish bare-SDK failures from candidate behavior. | +| artplayer-plugin-document-pip | 1.1.0 → 2.0.0 | 1.1.0 | Typed document/window lifetime and content restoration. Preserve existing API and DOM ownership; actual document-PiP/device gates remain. | +| artplayer-plugin-hls-control | 1.1.0 → 2.0.0 | 1.1.0 | Typed track/quality control and listener/selector lifecycle. Preserve supported hls.js combinations and source-topology cleanup; native worker/device gaps remain. | +| artplayer-plugin-jassub | 1.1.0 → 2.0.0 | 1.1.0 | Typed renderer/Worker/font ownership and native drawing compatibility. Preserve root entry and precise /runtime; hybrid late drawing issue remains an explicit blocker. | +| artplayer-plugin-multiple-subtitles | 1.2.0 → 2.0.0 | 1.2.0 | Typed caption parsing, ASS conversion, merging and load cancellation. Retain published root declaration; /runtime describes actual behavior and conflicting older extraction migration. | +| artplayer-plugin-vast | 1.2.0 → 2.0.0 | 1.0.0 | Typed SDK/loading/disposal and published initialization timing by default. Approved workspace-1.2 opt-in timing and /runtime type migration; SDK/network and device evidence remain separate. | +| artplayer-plugin-vtt-thumbnail | 1.1.0 → 2.0.0 | 1.1.0 | Typed VTT parsing, sprite lifecycle and cleanup. Preserve published root types and precise /runtime; document supported old-core combinations and name conflicts. | +| artplayer-proxy-canvas | 1.1.0 → 2.0.0 | 1.1.0 | Typed canvas/media shim, source and native subtitle-track ownership. Retain published root types with precise /runtime and documented older type conflicts. | +| artplayer-proxy-mediabunny | 1.2.0 → 2.0.0 | 1.2.0 | Typed engine/shim, input/HLS, audio/video pipelines and track controls. Preserve media-like event ordering and published entries; native codec/long-duration/device evidence remains scoped. | +| artplayer-tool-iframe | 1.1.0 → 2.0.0 | not-found | Typed cross-frame protocol, navigation generations, origin checks and teardown. Preserve the documented migration from artplayer-plugin-iframe; new-name rights and distribution rollback are not inferred from 404. | +| artplayer-tool-thumbnail | 4.4.0 → 5.0.0 | unpublished | Typed source/extraction/input/emitter ownership and actual constructor declarations. Approved published-3.5 default with workspace-4.4 opt-in; preserve delay/height, event and input policies and historical creat* names. | +| artplayer-vitepress | 1.1.0 → 2.0.0 | not-found | Typed site/editor/documentation/build modules and local library declaration generation. Preserve URLs, examples and editor globals; font provenance, site verification and Pages gates remain. No new npm distribution. | + +## 依赖、示例与分发 + +当前22包没有互相声明的 workspace dependencies/peerDependencies。保留已有外部依赖与版本范围,尤其不因核心升到6而新设只支持6的peer限制;声明中的核心类型引用和实际旧核心支持仍由各包测试验证。VitePress开发依赖、MediaBunny、Mask和VAST运行依赖保持现有范围。 + +React/Vue示例各有三项已发布版本依赖:core、Danmuku和Document PiP。REL-09 将仓库内示例指向对应本地包(file:../../packages/),使未发布新版本可以真实安装/构建;原始历史消费夹具保留,隔离tarball验证继续替换其测试来源。示例README同步先构建本地包的步骤;只维护根yarn.lock,不生成示例锁文件。新旧框架消费脚本需重新验证路径处理,不能认为修改package.json就已通过。 + +21个库分别核对原入口、exports/typesVersions、legacy、声明与资源,不机械统一为一种导出形状。核心声明继续从public/生成;已有/runtime入口和已批准的历史类型冲突说明保持。工具Thumbnail保留npm默认和显式workspace模式;VAST保留npm初始化与显式workspace模式;其他已接受的类型差异不借major升级扩大。 + +artplayer-vitepress升至2.0.0,但仍是站点分发,不新增npm发布。Iframe保留旧发布名artplayer-plugin-iframe的冻结来源和回退关联;新名404不证明名称可由当前账号使用。Thumbnail撤包后的历史归档/CSS/恢复门槛仍需完成,不能恢复上传曾使用过的版本。 + +## Registry证据与刷新 + +[2026-09-16只读快照](baselines/version-registry-2026-09-16.json)覆盖22个workspace名及Iframe旧名。所有目标版本均为not-observed,未观察到目标或更高major的稳定版本占用。未观察到占用不等于取得名称权限、保留版本或批准发布;CI-03/04需在实际上传前重新查验并验证发布身份。 + +查询同时读取versions、time及unpublished历史;网络、权限、限流、服务器和格式错误不能当作不存在。npm规定已使用的name@version即使撤包也不能重复使用,见[npm Unpublish Policy](https://docs.npmjs.com/policies/unpublish/)。 + +```sh +node refactor/scripts/version-registry.mjs --capture refactor/.cache/version-registry-.json +node refactor/scripts/version-plan.mjs --check +node refactor/scripts/version-plan.mjs --prepared +``` + +固定Node24.21.0/Yarn1.22.22。capture只读registry并写新的本地证据,不覆盖旧快照;遇到已使用目标、更高major或未知响应退出1。check验证方案与当前清单;prepared还要求22包目标版本、各包CHANGELOG和两个示例依赖全部落地,目前应失败。它们均不代替严格release:preflight,也不执行publish。 + +## 实施顺序与失效规则 + +1. 本任务冻结方案和registry证据,独立提交。 +2. REL-09更新版本、变更日志和适用示例/依赖/锁文件,冻结安装、严格类型和必要构建验证;单独提交。 +3. REL-02重新构建目标版本产物,检查所有入口/资源及新旧消费者并绑定真实候选。旧版本的绿色报告保留为历史证据,不自动适用于新版本产物。 +4. 继续各包组合/分发、设备、CI/CD与站点门槛。完成实施后由用户指导启动复盘,不能自动开展三轮复盘或发布。 diff --git a/refactor/version-policy.md b/refactor/version-policy.md index 2c05565c3..62bb1a28a 100644 --- a/refactor/version-policy.md +++ b/refactor/version-policy.md @@ -4,7 +4,7 @@ ## 目标清单 -以下来自源码提交 a9197f59 的 22 个 package.json,是本次规划快照,并非已核实的 npm 最新版本;package-inventory.json 历史基线保持不变。本任务不修改 manifest。 +以下来自源码提交 a9197f59 的 22 个 package.json,是本次规划快照,并非 npm 最新版本;package-inventory.json 历史基线保持不变。REL-01 已在 [分包版本方案](version-plan.md) 冻结目标、迁移/依赖方案和2026-09-16 registry观察;manifest 由 REL-09 更新。 | 包 | 当前源码版本 | 重构正式目标 | | --- | --- | --- | @@ -43,4 +43,4 @@ 6. 候选版本必须在最终构建/pack/验证前确定,CI-03 校验逐包版本、包内容和发布 tag;不能测试旧版本包后临发布再改版本。版本或依赖变化使相关候选证据失效,必须重跑验证。 7. REVIEW-03 逐包核对目标、声明、入口、版本组合、旧调用及回退产物;release notes 说明本次工程重构采用新 major,但不能笼统声明所有旧 API 已兼容而缺少证据。 -本次决定替代 toolchain-release.md 和 github-ci-cd.md 原先“不自动提升全部 major”的规则。兼容契约与三轮复盘门槛不变;这是版本策略记录,尚未实施升级或发布。 +本次决定替代 toolchain-release.md 和 github-ci-cd.md 原先“不自动提升全部 major”的规则。兼容契约与三轮复盘门槛不变;REL-01已冻结方案,REL-09尚未实施升级,没有发布授权。实施完成后等待用户指导启动复盘。