diff --git a/refactor/README.md b/refactor/README.md
index 800500b7d..207d98775 100644
--- a/refactor/README.md
+++ b/refactor/README.md
@@ -37,6 +37,9 @@
| [任务数据](tasks.json) | 任务状态和依赖的唯一数据来源 |
| [包基线](package-inventory.json) | 包版本、入口、声明、源码清单及对应 demo 的初始快照 |
| [发布基线与重跑说明](baselines/README.md) | 固定 npm tarball、完整性及已知源码/发布差异 |
+| [差异与风险索引](risk-table.md) | 已复现问题、源码事实和待核实事项的责任任务 |
+| [风险维护说明](risk-guide.md) | 证据等级、关闭条件、第三方边界和校验命令 |
+| [第三方来源清单](third-party.json) | 依赖解析、vendor 文件指纹、SDK/CDN 与许可来源缺口 |
## 维护规则
diff --git a/refactor/changes/2026-09-10-BASE-07-risk-register.md b/refactor/changes/2026-09-10-BASE-07-risk-register.md
new file mode 100644
index 000000000..5107a3cc8
--- /dev/null
+++ b/refactor/changes/2026-09-10-BASE-07-risk-register.md
@@ -0,0 +1,19 @@
+# BASE-07:差异与第三方风险台账
+
+日期 2026-09-10;分支 codex/compatible-modernization;起点 e01f39ff。
+
+## 交付
+
+将 15 项已有基线发现与发布来源、站点/素材、vendor 和 SDK 缺口统一为 39 项风险,全部保留 open。逐项记录证据等级、后续任务、兼容处理路线与关闭条件,区分发布包问题和工作区已存在的修复,未把源码观察扩写成完整浏览器复现。
+
+第三方清单覆盖 22 包、9 个直接运行依赖的锁定版本和已安装许可证元数据、8 组内嵌资源的 123 个文件指纹以及 12 个集成边界。上游许可入口与本地来源不确定性分别记录;没有调用外部 SDK、广告、模型或 ASR 服务,没有宣称完成传递依赖/许可证审计。
+
+新增风险/来源校验器、生成索引及两项带负例的 Node 测试,自动并入现有 test:baseline。相关包、核心、站点与发布准入任务已补充接续验收条件。详见 [维护说明](../risk-guide.md)、[风险索引](../risk-table.md)、[机器台账](../risks.json) 与 [第三方清单](../third-party.json)。
+
+## 验证与接续
+
+风险校验和两项专门测试通过;完整 ci:check 通过工具链/计划/链接/只读 lint、21 项既有 Node 测试与 17 项基线测试,共 38 项,无失败或跳过。负例覆盖遗漏基线发现、无任务责任、无证据关闭、越界证据、遗漏包/vendor/SDK、指纹变化与错误锁定版本。没有修改生产源码、声明、依赖或构建产物。
+
+本任务独立本地提交,主题含 BASE-07;不推送/发布。撤销本提交可移除新增台账和校验,原有基线报告不受影响。下一项 BASE-08 完成环境与能力验证矩阵,随后进入必要 TS 工程配置和 chapter 试点;未完成的真机/SDK 验证明确留给对应任务,不阻塞无关源码工作的启动。
+
+用户要求明确报告源码重构进度:截至本任务,生产源码 TS 迁移为零;基础设施和文档任务完成数不能代表源码迁移比例。后续进度必须分别说明。
diff --git a/refactor/plan.md b/refactor/plan.md
index 7b794ec4b..a6bb3ce4f 100644
--- a/refactor/plan.md
+++ b/refactor/plan.md
@@ -4,7 +4,7 @@
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 214 项,范围 22 个包及工作区/示例。
-状态:todo 191 / doing 0 / blocked 0 / done 23 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
+状态:todo 190 / doing 0 / blocked 0 / done 24 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。
@@ -66,7 +66,7 @@
| BASE-04 | workspace
捕获 DOM、CSS 和官方 demo | BASE-02 | 核心模板/类名/变量、键盘/焦点/可访问名称基线及全 demo 路径映射;docs-browser-testing.md 中 HTML/编辑器的脚本来源与存储状态;登记契约/版本/固定测试 ID/命令/报告与负责任务 | 核心/试点用户样式和输入用法已记录,其他 demo 运行状态与未知项明确;使用已发布包和最小可重跑探针启动,不等待后续 ENG 服务 | M | done |
| BASE-05 | workspace
捕获包入口、资源和类型消费 | BASE-01 | 全包 manifest/资源路径清单;核心/试点的 UMD/AMD/ESM/CJS/legacy/i18n 和类型消费者基线;登记契约/版本/固定测试 ID/命令/报告与负责任务;区分库/npm 与站点实际分发类别,SSR import/模板/非浏览器构造错误分别捕获 | 核心/试点隔离消费可运行,其他包由各自契约任务验证,thumbnail tool 差异已登记 | H | done |
| BASE-06 | workspace
记录性能与资源基线 | BASE-03, BASE-04 | 固定媒体/设备测量、包体积、反复装卸资源报告 | 多次采样可重跑,指标和审查阈值确定,不承诺未经测量的收益;使用已发布包和最小可重跑探针启动,不等待后续 ENG 服务 | M | done |
-| BASE-07 | workspace
建立差异和风险台账 | BASE-03, BASE-05 | 销毁/切源/类型差异、vendored 许可和外部 SDK 清单 | 已确认与待复现分开,每项有负责任务及兼容处理路线;纳入 BASE-TYPE-01/02/03/04 和 BASE-DIST-01 的发布/声明/工作区证据;纳入 BASE-PERF-01 销毁后 resize/notice 延迟工作 | H | todo |
+| BASE-07 | workspace
建立差异和风险台账 | BASE-03, BASE-05 | 销毁/切源/类型差异、vendored 许可和外部 SDK 清单 | 已确认与待复现分开,每项有负责任务及兼容处理路线;纳入 BASE-TYPE-01/02/03/04 和 BASE-DIST-01 的发布/声明/工作区证据;纳入 BASE-PERF-01 销毁后 resize/notice 延迟工作 | H | done |
| BASE-08 | workspace
建立消费者与真实环境验证矩阵 | BASE-01, BASE-05 | 每包版本/浏览器/codec/SDK/设备/样本、证据和负责验证任务的矩阵 | 格式兼容与运行能力分开,未知/缺环境不算通过,明确哪些检查阻止哪些批次发布 | H | todo |
## 2 工程保障
@@ -83,7 +83,7 @@
| ENG-07 | workspace
建立 tarball 消费与产物检查 | ENG-04, ENG-06 | 隔离 npm 消费 fixtures、API/声明/入口差分 | 不借 workspace 源码通过,能识别缺文件与默认导出变化 | H | todo |
| ENG-08 | workspace
增加覆盖率、资源与性能报告 | ENG-03, ENG-05, BASE-06 | 覆盖率基线、资源清理断言、性能报告与阈值 | 关键生命周期分支有门槛,报告不靠无意义断言堆数量;将 BASE-06 的同环境多组配对、计时/压缩审查阈值与资源异常分开接入候选,不把历史现象冻结成正常要求 | M | todo |
| ENG-09 | workspace
建立全包依赖影响和文档检查 | ENG-07, DOC-04 | 共享核心/构建影响映射、文档及每任务完成提交的 Git 审计接入;契约-支持版本-测试 ID-命令-候选/报告-任务的覆盖索引 | 核心变化触发必需生态检查;原有 DOC-01 至 04 基线例外明确,后续 done 任务不能缺失独立 commit;计划/已执行/缺证据分开,识别缺少验证归属的公开契约 | M | todo |
-| ENG-10 | workspace
建立历史失败分级和测试可靠性规则 | ENG-03, ENG-04, ENG-05, ENG-07, BASE-07 | 历史失败 ID/环境/旧版复现/负责修复任务、逐模块门槛、受控等待与 trace/retry 规则 | 不靠全局忽略或无理由 skip 隐藏问题,新增回归阻止交付,设备缺口和偶发失败单独可见 | M | todo |
+| ENG-10 | workspace
建立历史失败分级和测试可靠性规则 | ENG-03, ENG-04, ENG-05, ENG-07, BASE-07 | 历史失败 ID/环境/旧版复现/负责修复任务、逐模块门槛、受控等待与 trace/retry 规则 | 不靠全局忽略或无理由 skip 隐藏问题,新增回归阻止交付,设备缺口和偶发失败单独可见;以 risks.json 为统一差异索引;关闭必须有 resolutionEvidence/rationale,已复现、源码事实、未验证分开,登记不等于豁免 | M | todo |
## 2.2 GitHub CI/CD
@@ -115,7 +115,7 @@
| CORE-09 | artplayer
整理 URL 与切源操作 | CORE-04, CORE-06, CORE-08 | url/switch/customType 的操作身份及取消方案 | 并发切源、错误、同 URL、销毁和 Promise 结算有契约;处理 baselines/lifecycle-coverage.md 的 BASE-LIFE-01/02/06 并增加候选正向回归 | H | todo |
| CORE-10 | artplayer
迁移播放与时间/状态属性 | CORE-09 | play/pause/toggle/seek/volume/rate/duration 等模块 | 旧返回值、拒绝、mutex、位置恢复、属性描述符与事件通过 | H | todo |
| CORE-11 | artplayer
整理媒体事件、ready 与重连 | CORE-10 | 媒体转发、重连、UI 响应职责分离 | readiness 次数/顺序、过期重连、原错误参数有回归 | H | todo |
-| CORE-12 | artplayer
迁移模板及公开资源入口 | CORE-06, CORE-04, BASE-04 | template/icons/i18n/style、SSR 与 proxy 挂载 | DOM/CSS/global/样式注入、i18n 子路径及 SSR import 保持;不把 SSR import/useSSR 保持扩大为服务端构造播放器;复跑 BASE-05 的 SSR import/模板、浏览器 useSSR 节点复用和非浏览器构造错误 | H | todo |
+| CORE-12 | artplayer
迁移模板及公开资源入口 | CORE-06, CORE-04, BASE-04 | template/icons/i18n/style、SSR 与 proxy 挂载 | DOM/CSS/global/样式注入、i18n 子路径及 SSR import 保持;不把 SSR import/useSSR 保持扩大为服务端构造播放器;复跑 BASE-05 的 SSR import/模板、浏览器 useSSR 节点复用和非浏览器构造错误;接续 VENDOR-01/02,核对 screenfull/hint 复制版本、修改与分发通知,保留 DOM/CSS/fullscreen 行为 | H | todo |
| CORE-13 | artplayer
迁移组件注册与控件 | CORE-12, CORE-08 | Component/control/layer/contextmenu 的资源与 TS 边界 | add/update/remove、name、selector、mounted/beforeUnmount 通过;处理 BASE-DOM-02 窄容器控件裁切,保留 controls.update 的旧 undefined 返回值 | H | todo |
| CORE-14 | artplayer
拆分设置树、渲染和布局 | CORE-13 | setting model/selection/render/layout 的分批实现 | 不强行统一控件返回值,嵌套选择、默认高亮、更新清理通过;结合 BASE-DOM-02 验证窄容器设置定位 | H | todo |
| CORE-15 | artplayer
迁移字幕获取、解析和渲染 | CORE-11, CORE-13 | subtitle 请求/track/DOM/URL 生命周期与类型 | 过期结果、偏移、cue 数组、原生全屏及错误路径通过 | H | todo |
@@ -209,7 +209,7 @@
| ID | 范围 / 步骤 | 前置依赖 | 交付物 | 验收条件 | 风险 | 状态 |
| --- | --- | --- | --- | --- | --- | --- |
-| PKG-MULTI-SUB-01 | artplayer-plugin-multiple-subtitles
核对包契约与历史用法 | BASE-05 | subtitles/onParser、multipleSubtitles 名称及实际返回方法 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结 | H | todo |
+| PKG-MULTI-SUB-01 | artplayer-plugin-multiple-subtitles
核对包契约与历史用法 | BASE-05 | subtitles/onParser、multipleSubtitles 名称及实际返回方法 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结;接续 VENDOR-03,定位 WebVTT parser 来源/修订及 CC0 头,保留解析/序列化行为 | H | todo |
| PKG-MULTI-SUB-02 | artplayer-plugin-multiple-subtitles
建立特有行为与错误测试 | PKG-MULTI-SUB-01, ENG-03, ENG-05 | VTT/SRT/ASS、编码/重叠 cue/排序/空轨/失败与切换 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | todo |
| PKG-MULTI-SUB-03 | artplayer-plugin-multiple-subtitles
整理内部职责与资源 | PKG-MULTI-SUB-02, CORE-15 | 解析与合并/获取/渲染分离,过期请求及对象 URL 清理 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | todo |
| PKG-MULTI-SUB-04 | artplayer-plugin-multiple-subtitles
迁移自有源码和公开类型 | PKG-MULTI-SUB-03, ENG-04, ENG-06, CORE-07 | 准确 parser/cue/tree/result 类型与真实异步形状 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | todo |
@@ -220,7 +220,7 @@
| ID | 范围 / 步骤 | 前置依赖 | 交付物 | 验收条件 | 风险 | 状态 |
| --- | --- | --- | --- | --- | --- | --- |
-| PKG-JASSUB-01 | artplayer-plugin-jassub
核对包契约与历史用法 | BASE-05 | 选项透传、result.instance、vendor 来源、worker/WASM/font 路径 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结 | H | todo |
+| PKG-JASSUB-01 | artplayer-plugin-jassub
核对包契约与历史用法 | BASE-05 | 选项透传、result.instance、vendor 来源、worker/WASM/font 路径 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结;接续 VENDOR-04/05,核对 wrapper/worker/WASM/font 的独立来源与通知,保持资源路径和选项透传 | H | todo |
| PKG-JASSUB-02 | artplayer-plugin-jassub
建立特有行为与错误测试 | PKG-JASSUB-01, ENG-03, ENG-05 | ASS 字体、时钟/seek/倍率/resize、加载失败和销毁 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | todo |
| PKG-JASSUB-03 | artplayer-plugin-jassub
整理内部职责与资源 | PKG-JASSUB-02, CORE-15, CORE-16 | 仅整理自有 adapter/销毁;保留第三方文件及来源 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | todo |
| PKG-JASSUB-04 | artplayer-plugin-jassub
迁移自有源码和公开类型 | PKG-JASSUB-03, ENG-04, ENG-06, CORE-07 | JASSUB option/instance 的兼容类型包装,vendor JS 例外记录 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | todo |
@@ -231,7 +231,7 @@
| ID | 范围 / 步骤 | 前置依赖 | 交付物 | 验收条件 | 风险 | 状态 |
| --- | --- | --- | --- | --- | --- | --- |
-| PKG-MASK-01 | artplayer-plugin-danmuku-mask
核对包契约与历史用法 | BASE-05 | 模型参数、start/stop、默认下载路径及 mask 样式 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结 | H | todo |
+| PKG-MASK-01 | artplayer-plugin-danmuku-mask
核对包契约与历史用法 | BASE-05 | 模型参数、start/stop、默认下载路径及 mask 样式 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结;接续 SDK-08,分别核实 Yarn 解析版本、未固定版本的模型 solutionPath 和资源来源 | H | todo |
| PKG-MASK-02 | artplayer-plugin-danmuku-mask
建立特有行为与错误测试 | PKG-MASK-01, ENG-03, ENG-05 | 加载期间停止/销毁、重复启动、推理失败、WebGL/CPU 边界 | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | todo |
| PKG-MASK-03 | artplayer-plugin-danmuku-mask
整理内部职责与资源 | PKG-MASK-02, CORE-18, PKG-DANMUKU-07 | 模型加载/推理/画布输出分离,阻止重叠推理与过期写入 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | todo |
| PKG-MASK-04 | artplayer-plugin-danmuku-mask
迁移自有源码和公开类型 | PKG-MASK-03, ENG-04, ENG-06, CORE-07 | 模型 adapter、canvas 和选项的精确类型 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | todo |
@@ -322,7 +322,7 @@
| ID | 范围 / 步骤 | 前置依赖 | 交付物 | 验收条件 | 风险 | 状态 |
| --- | --- | --- | --- | --- | --- | --- |
-| PKG-MB-01 | artplayer-proxy-mediabunny
核对 shim 与媒体契约 | BASE-05 | 全部 option、art.mediabunny、canvas/shim 属性及事件表 | 公开暴露成员和实际发布依赖/资源范围明确 | H | todo |
+| PKG-MB-01 | artplayer-proxy-mediabunny
核对 shim 与媒体契约 | BASE-05 | 全部 option、art.mediabunny、canvas/shim 属性及事件表 | 公开暴露成员和实际发布依赖/资源范围明确;核实 third-party.json 所记录依赖 MPL-2.0 元数据与实际 bundle 的许可/通知范围,不从根 MIT 推断 | H | todo |
| PKG-MB-02 | artplayer-proxy-mediabunny
建立真实媒体与事件基线 | PKG-MB-01, ENG-05, ENG-08 | MP4/WebM/HLS/Blob/Stream、seek/错误/轨道切换样本 | ready 事件顺序、音画同步、超时和释放可重跑 | H | todo |
| PKG-MB-03 | artplayer-proxy-mediabunny
整理 input 与加载取消 | PKG-MB-02, CORE-09 | input.js 源检测、输入资源、Range 与取消 | HLS 检测在 input 边界,旧来源类型和超时保持 | H | todo |
| PKG-MB-04 | artplayer-proxy-mediabunny
整理 VideoShim/EventTarget/Engine 协调 | PKG-MB-03, CORE-06, CORE-11 | shim 描述符、事件桥、加载状态和操作隔离 | 公开属性/同步异步返回与事件重入顺序保持 | H | todo |
@@ -359,7 +359,7 @@
| ID | 范围 / 步骤 | 前置依赖 | 交付物 | 验收条件 | 风险 | 状态 |
| --- | --- | --- | --- | --- | --- | --- |
-| SITE-01 | artplayer-vitepress
清点文档/示例/生成链 | BASE-04, BASE-05 | 中英文文档、插件页面、demo URL、编辑器声明与生成目录清单;六类 HTML 入口、prod/libs/code/example 加载行为及移动重定向 | 所有公开 API/插件有对应页面或明确补充任务;核实 BASE-DEMO-01 的历史 thumbnail 插件来源及 29 示例/36 HTML 路径;明确 BASE-05 所记录站点实际分发与未设 private 的 manifest 意图 | M | todo |
+| SITE-01 | artplayer-vitepress
清点文档/示例/生成链 | BASE-04, BASE-05 | 中英文文档、插件页面、demo URL、编辑器声明与生成目录清单;六类 HTML 入口、prod/libs/code/example 加载行为及移动重定向 | 所有公开 API/插件有对应页面或明确补充任务;核实 BASE-DEMO-01 的历史 thumbnail 插件来源及 29 示例/36 HTML 路径;明确 BASE-05 所记录站点实际分发与未设 private 的 manifest 意图;接续 VENDOR-05/06/07/08 和 BASE-SITE-01/BASE-MEDIA-01,核对字体、Monaco、vConsole、console bundle 与样本来源及分发范围 | M | todo |
| SITE-02 | artplayer-vitepress
整理声明与示例生成器 | SITE-01, ENG-04, ENG-06 | build-ts/build-test 生成链的可验证 TS 脚本 | 不靠字符串拼接掩盖声明错误,生成示例有真实断言或仅标 smoke;替换固定 100ms 成功判定,明确异步错误、清理和生成覆盖限制 | M | todo |
| SITE-03 | artplayer-vitepress
整理 i18n/文档/LLM 生成流程 | SITE-02 | build-i18n/build-docs/build-llm/trans-docs 的任务边界和错误处理 | 原命令兼容、生成可复现,翻译步骤不隐式运行远程服务 | M | todo |
| SITE-04 | artplayer-vitepress
交叉核对逐包持续维护的文档 | 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 | 已随实现更新的中文/英文 API、包内实现地图、旧 JS 示例及已知能力限制的全包核对 | 未把缺环境的能力写成已验证,静态核对不等待设备任务;最终 demo 仍由 EX-03 验收 | M | todo |
@@ -383,7 +383,7 @@
| ID | 范围 / 步骤 | 前置依赖 | 交付物 | 验收条件 | 风险 | 状态 |
| --- | --- | --- | --- | --- | --- | --- |
-| REL-08 | workspace
提前建立逐包发布准入台账 | BASE-08, ENG-07 | 每批包/版本/源码/锁文件/工具/tarball integrity、必需测试/设备证据、限制和回退映射 | 受影响能力缺证据明确阻止对应批次;无关批次可独立准备,旧证据在候选内容变化后失效;站点采用真实构建/URL/资源验收,npm 分发依据历史核实,不从版本清单推断新增发布范围 | H | todo |
+| REL-08 | workspace
提前建立逐包发布准入台账 | BASE-08, ENG-07 | 每批包/版本/源码/锁文件/工具/tarball integrity、必需测试/设备证据、限制和回退映射 | 受影响能力缺证据明确阻止对应批次;无关批次可独立准备,旧证据在候选内容变化后失效;站点采用真实构建/URL/资源验收,npm 分发依据历史核实,不从版本清单推断新增发布范围;关联 risks.json 和 third-party.json;受影响 bundle/worker/WASM/font/模型的来源与许可通知缺口必须有审查结论,未决项阻止对应批次 | 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 | 每包版本/变更日志/依赖/类型差异方案和独立准入状态;按 version-policy.md 冻结各包下一 major(minor/patch 归零)并核实 registry 占用 | 所有包有方案和剩余门槛,未决项明确阻止相应发布;本步骤不声称已经可发布;全部包有 major 目标,版本冲突明确处理,独立准备任务同步 manifest/锁/依赖/日志;按 BASE-05 区分 21 库与文档站分发,不机械把文档站当库上传 npm | H | todo |
| 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 | 各候选本地 tarball/integrity 与新旧核心/插件消费者验证报告,外部门槛单独标注 | 隔离安装和可自动化组合通过;设备结论不伪造,最终发布绑定同一候选内容;在目标 major 版本确定后构建 pack,不在测试后改版本 | H | todo |
@@ -423,6 +423,7 @@
- BASE-04: [记录](changes/2026-09-10-BASE-04-dom.md) [记录](baselines/dom.json) [记录](baselines/dom-coverage.md) [记录](baselines/demo-inventory.json)
- BASE-05: [记录](changes/2026-09-10-BASE-05-consumers.md) [记录](baselines/consumer-coverage.md) [记录](baselines/consumers.json) [记录](baselines/ssr.json) [记录](baselines/distribution.json)
- BASE-06: [记录](changes/2026-09-10-BASE-06-performance.md) [记录](baselines/performance-coverage.md) [记录](baselines/performance.json) [记录](baselines/sizes.json)
+- BASE-07: [记录](changes/2026-09-10-BASE-07-risk-register.md) [记录](risk-guide.md) [记录](risk-table.md) [记录](risks.json) [记录](third-party.json)
- ENG-01: [记录](changes/2026-09-10-ENG-01-reproducible-toolchain.md) [记录](baselines/toolchain-validation.json)
- ENG-PM-01: [记录](changes/2026-09-10-ENG-PM-01-yarn-toolchain.md) [记录](baselines/yarn-validation.json)
- ENG-02: [记录](changes/2026-09-10-ENG-02-readonly-ci.md) [记录](baselines/ci-validation.json)
diff --git a/refactor/progress.md b/refactor/progress.md
index 34bff26b0..57ffffc65 100644
--- a/refactor/progress.md
+++ b/refactor/progress.md
@@ -1,5 +1,11 @@
# 进度与证据
+## 当前实施:BASE-07 风险与第三方来源台账完成
+
+39 项差异/来源缺口已关联责任任务、证据与关闭条件,22 包运行依赖、8 组内嵌资源(123 个文件)及 12 个集成边界可校验。全部风险仍 open,不能把清点完成视为已修复或获准发布。见 [BASE-07](changes/2026-09-10-BASE-07-risk-register.md)。
+
+当前 214 项任务,24 完成、190 待办。生产源码 TS 迁移仍为零;已完成工作主要是规划、工程流程与基线,后续继续单独报告源码迁移进度。BASE-06 已提交 e01f39ff;本轮独立提交 BASE-07。下一任务 BASE-08,随后进入必要 TS 工程配置和 chapter 试点;没有推送或发布。
+
## 当前实施:BASE-06 性能与资源基线完成
内置浏览器两轮各 12 个计时样本和 6 组资源探针已保存;真实播放及基本清理通过,同时复现销毁后 resize 防抖重新安排 notice timer,已分配 CORE-17/04/18。28 个发布 JS 与 85 个工作区 JS 的压缩体积独立记录。阈值只用于复测/审查,无生产优化或无内存泄漏结论。见 [BASE-06](changes/2026-09-10-BASE-06-performance.md)。
diff --git a/refactor/risk-guide.md b/refactor/risk-guide.md
new file mode 100644
index 000000000..ff1da5dee
--- /dev/null
+++ b/refactor/risk-guide.md
@@ -0,0 +1,53 @@
+# 差异、第三方来源与关闭证据
+
+BASE-07 将先前基线发现和第三方来源缺口纳入同一份责任台账。入口为 [风险索引](risk-table.md)、[完整处理与关闭条件](risks.json) 和 [第三方清单](third-party.json)。任务完成代表清点和接续规则建立,不代表其中的问题已经修复。
+
+## 如何读取状态
+
+39 项目前均为 open。reproduced 表示已保存复现结果;source-observed 表示在源码、声明或产物中看到事实;unverified 表示来源、环境或行为仍需取证。证据等级与处理状态互相独立,不能把 39 项全部称为缺陷,也不能因建立了测试基线而自动接受旧缺陷。
+
+其中 15 项来自生命周期、DOM/示例、消费者类型/分发和性能基线;其余包含发布来源、站点分发、素材来源、8 组内嵌资源和 12 个集成边界。每项都列出负责的任务 ID、证据路径、兼容处理路线与关闭条件。具体复现仍以原基线报告为准。
+
+特别注意 BASE-LIFE-06:已发布包的恢复播放拒绝问题不等于当前源码仍然相同。当前 switchMix 使用 silencePromise,已有 playback 测试;迁移必须保留该修复,再对候选进行验证。BASE-TYPE-04 同时涉及 plugins.add 和 toggle,浏览器直接复现、当前源码及类型测试的覆盖不同,不声称每个子差异都独立做过浏览器复现。
+
+resolved 或 accepted-with-scope 必须提供 resolutionEvidence 和 resolutionRationale。校验器检查文件与字段存在;负责人仍须审查证据是否满足对应 closureCriteria。范围接受需要说明受影响能力、有效环境和发布限制,不能用于全局忽略测试、默认放宽兼容契约或掩盖缺少真机证据。ENG-10 接续历史失败分类,REL-08 将未关闭事项映射到受影响的发布批次。
+
+## 清单范围与来源
+
+第三方清单覆盖 22 包的 manifest 依赖,记录 9 个直接运行依赖在当前 yarn.lock 与本地安装中的版本、许可证元数据。文档包的开发依赖另列;根目录私有工具链由工程任务维护。这不是完整传递依赖 SBOM,也不是完整许可证或安全审计。
+
+当前 Mediabunny 解析为 1.56.1,其已安装 manifest 声明 MPL-2.0。TensorFlow 四个直接依赖解析为 4.22.0,不能把声明范围 ^4.21.0 写成实际安装版本。依赖元数据仅是来源证据,实际 bundle 所含代码、NOTICE、源码提供方式等仍由相应包任务核实。
+
+8 组内嵌资源保存 123 个文件指纹:screenfull、hint.less、WebVTT parser、JASSUB wrapper/worker/WASM、JASSUB 字体、Monaco 静态文件、vConsole 和 console bundle。文本按 LF 计算 SHA-256,二进制直接计算;这些指纹用于识别变化,不证明来源或重新分发许可。并未穷举仓库所有视频、图片、模型和字体,剩余样本来源由 BASE-MEDIA-01、SITE-01 和具体集成任务接续。
+
+已核对的上游入口如下,但当前上游分支不能证明本地复制文件的精确版本、修改历史或全部组成:
+
+| 内容 | 当前证据与后续核实 |
+| --- | --- |
+| screenfull | 上游 [MIT license](https://github.com/sindresorhus/screenfull/blob/main/license);本地缺少版本/许可证头,需定位版本与本地差异 |
+| Hint.css | 本地头标 2.7.0,已改为 Less;上游 [MIT license](https://github.com/chinchang/hint.css/blob/master/LICENSE),仍需核对修改与分发通知 |
+| WebVTT parser | 本地保留公共领域/CC0 头;[上游项目](https://github.com/w3c/webvtt.js) 标明 CC0,精确 revision 待定 |
+| JASSUB | [上游 wrapper 许可证](https://github.com/ThaUnknown/jassub/blob/main/LICENSE) 为 MIT;worker/WASM 的库组成、构建来源和字体必须分别核实 |
+| Monaco/vConsole | 本地头标 Monaco 0.30.1、vConsole 3.15.0 及 MIT;Monaco bundle 还包含 DOMPurify 通知,完整组成和 notices 待核对 |
+| console bundle | 可见 Parcel/console-feed 特征,原始构建、版本与组成待定位;不从根 MIT 推导结论 |
+
+12 个集成边界分别为 HLS、DASH、FLV、MPEG-TS、WebTorrent、Cast、IMA、MediaPipe/TensorFlow、JASSUB、Mediabunny、调用方 ASR 服务和 option-validator。清单区分运行依赖、调用方对象、CDN 动态脚本及 worker/model/font URL。Yarn 锁定不能锁住没有固定版本的远端 solutionPath。
+
+ASR 插件向调用方回调输出 PCM,插件本身没有内置 ASR SDK;示例才调用远端服务取得 WebSocket 地址。本次只检查代码,没有访问该服务或其他 SDK/广告/模型运行服务。源码中出现 URL 不等于 SDK、设备、网络或媒体能力已通过测试;BASE-08 接续能力与环境矩阵。
+
+## 迁移与维护方式
+
+1. 先读取对应风险的关闭条件与负责任务,再修改生产实现。历史缺陷可修复,但要明确候选行为、老用法兼容性和回归证据。
+2. 第三方复制代码保持独立边界;优先为调用层建立 TS 类型与适配器。不要把上游压缩代码机械拆分或转写成 TS。替换 vendor 时记录原/新版本、源地址、差异、通知文件和受影响测试。
+3. worker/WASM/font 路径、构造参数、返回实例、DOM/CSS 和媒体事件仍受兼容契约保护。文档静态资源更新也需验证现有编辑器、移动入口和示例。
+4. 有意修改包依赖、vendor 内容或集成范围时,同任务更新 third-party.json 及风险证据;重新计算指纹前先审查差异,不以重写指纹绕过检查。保留 Git 历史中的初始快照。
+5. 修改 risks.json 后运行以下命令生成索引并检查,完成任务时同时提交实现、测试、记录和任务表。
+
+```sh
+node refactor/scripts/risk-register.mjs --write
+node refactor/scripts/risk-register.mjs --check
+node refactor/scripts/plan.mjs --write
+yarn ci:check
+```
+
+校验已包含在 test:baseline 中:保护既有基线发现、任务引用、证据路径、生成索引、包覆盖、依赖解析和内嵌文件指纹。负例覆盖漏项、错误任务、无证据关闭、越界路径、错误哈希和锁文件版本偏移。它不能自动发现所有新的第三方文件或判定许可证合规,新增资源仍须进入人工/AI 审查与包任务验收。
diff --git a/refactor/risk-table.md b/refactor/risk-table.md
new file mode 100644
index 000000000..b66e7ae73
--- /dev/null
+++ b/refactor/risk-table.md
@@ -0,0 +1,45 @@
+# 重构风险与差异索引
+
+由 risks.json 生成;运行 node refactor/scripts/risk-register.mjs --write 更新。状态 open 表示尚缺关闭证据,不等于每项都是已复现缺陷。处理方案、关闭条件与证据见 [机器台账](risks.json),来源与范围见 [维护说明](risk-guide.md)。
+
+| ID | 状态 / 证据等级 | 条目 | 后续任务 |
+| --- | --- | --- | --- |
+| BASE-LIFE-06 | open / 已复现 | Published switch leaves an unhandled rejection and an unsettled promise when resume fails | CORE-09 |
+| BASE-LIFE-01 | open / 已复现 | Superseded switch resolves along with the latest source | CORE-09 |
+| BASE-LIFE-02 | open / 已复现 | Switch remains unsettled during the bounded observation after destroy | CORE-09 |
+| BASE-LIFE-03 | open / 已复现 | Async plugin registers its result after destroy | CORE-08 |
+| BASE-LIFE-04 | open / 已复现 | Destroying an instance twice unregisters a different live instance | CORE-04 |
+| BASE-LIFE-05 | open / 已复现 | Failed constructor leaves initialized markup/listeners until explicit probe cleanup | CORE-04 |
+| BASE-DOM-01 | open / 已复现 | 控件 Tab 不可达 | CORE-23, CORE-17 |
+| BASE-DOM-02 | open / 已复现 | 窄容器中控件裁切 | CORE-13, CORE-14 |
+| BASE-DEMO-01 | open / 源码/产物事实 | 旧 thumbnail 插件示例不对应当前 workspace 包 | SITE-01, EX-03 |
+| BASE-TYPE-01 | open / 已复现 | NodeNext ESM 默认导出与声明互操作失配 | ENG-04, CORE-07, PKG-CHAPTER-04 |
+| BASE-TYPE-02 | open / 已复现 | chapter 可选运行时参数被声明为必填 | PKG-CHAPTER-02 |
+| BASE-TYPE-03 | open / 已复现 | chapter legacy 缺旧模块解析的声明回退 | ENG-04, PKG-CHAPTER-04 |
+| BASE-TYPE-04 | open / 源码/产物事实 | plugins.add / toggle 的旧声明返回值与运行时不同 | CORE-07 |
+| BASE-DIST-01 | open / 源码/产物事实 | thumbnail tool 分发入口与类型文件缺失 | PKG-TOOL-THUMB-01, PKG-TOOL-THUMB-04 |
+| BASE-PERF-01 | open / 已复现 | 销毁后的 resize 防抖重新创建 notice timer | CORE-17, CORE-04, CORE-18 |
+| BASE-SOURCE-01 | open / 源码/产物事实 | 工作区 5.4.1 与采集时真实发布 5.4.0 不同 | BASE-08, REL-01 |
+| BASE-SOURCE-02 | open / 源码/产物事实 | registry gitHead 与发布包版本对应不可靠 | ENG-07, REL-01 |
+| BASE-SITE-01 | open / 源码/产物事实 | 文档站实际为静态站点但 manifest 未设 private | SITE-01, REL-01 |
+| BASE-MEDIA-01 | open / 待取证 | 示例媒体和字体的完整来源/授权链待核实 | BASE-08, SITE-01, EX-03 |
+| VENDOR-01 | open / 待取证 | screenfull 来源、版本与许可闭环 | CORE-12 |
+| VENDOR-02 | open / 待取证 | hint.css 来源、版本与许可闭环 | CORE-12 |
+| VENDOR-03 | open / 待取证 | webvtt-parser 来源、版本与许可闭环 | PKG-MULTI-SUB-01 |
+| VENDOR-04 | open / 待取证 | jassub-code-and-workers 来源、版本与许可闭环 | PKG-JASSUB-01 |
+| VENDOR-05 | open / 待取证 | jassub-font-assets 来源、版本与许可闭环 | PKG-JASSUB-01, SITE-01 |
+| VENDOR-06 | open / 待取证 | monaco-static-assets 来源、版本与许可闭环 | SITE-01, SITE-05 |
+| VENDOR-07 | open / 待取证 | vconsole 来源、版本与许可闭环 | SITE-01 |
+| VENDOR-08 | open / 待取证 | console-bundle 来源、版本与许可闭环 | SITE-01 |
+| SDK-01 | open / 待取证 | hls.js 实际集成验证范围 | PKG-HLS-01, EX-03 |
+| SDK-02 | open / 待取证 | dash.js 实际集成验证范围 | PKG-DASH-01, EX-03 |
+| SDK-03 | open / 待取证 | flv.js 实际集成验证范围 | EX-03 |
+| SDK-04 | open / 待取证 | mpegts.js 实际集成验证范围 | EX-03 |
+| SDK-05 | open / 待取证 | webtorrent 实际集成验证范围 | EX-03 |
+| SDK-06 | open / 待取证 | google-cast 实际集成验证范围 | PKG-CAST-01, PKG-CAST-05 |
+| SDK-07 | open / 待取证 | ima-via-glomex 实际集成验证范围 | PKG-VAST-01, PKG-VAST-05 |
+| SDK-08 | open / 待取证 | mediapipe-tensorflow 实际集成验证范围 | PKG-MASK-01, PKG-MASK-05 |
+| SDK-09 | open / 待取证 | jassub-worker-wasm-fonts 实际集成验证范围 | PKG-JASSUB-01, PKG-JASSUB-05 |
+| SDK-10 | open / 待取证 | mediabunny 实际集成验证范围 | PKG-MB-01, PKG-MB-09 |
+| SDK-11 | open / 待取证 | asr-caller-service 实际集成验证范围 | PKG-ASR-01, PKG-ASR-05, EX-03 |
+| SDK-12 | open / 待取证 | option-validator 实际集成验证范围 | CORE-01, CORE-07 |
diff --git a/refactor/risks.json b/refactor/risks.json
new file mode 100644
index 000000000..ce483d540
--- /dev/null
+++ b/refactor/risks.json
@@ -0,0 +1,613 @@
+{
+ "schemaVersion": 1,
+ "task": "BASE-07",
+ "sourceCommit": "e01f39ff",
+ "updatedAt": "2026-09-10T12:58:34.267Z",
+ "note": "Open means closure evidence is outstanding; source-observed and unverified are not reproduced runtime bugs. A source issue already mitigated in the workspace still requires candidate regression evidence. No accepted-with-scope item is implied by baseline task completion.",
+ "items": [
+ {
+ "id": "BASE-LIFE-06",
+ "title": "Published switch leaves an unhandled rejection and an unsettled promise when resume fails",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "CORE-09"
+ ],
+ "evidence": [
+ "refactor/baselines/lifecycle.json",
+ "refactor/baselines/lifecycle-coverage.md",
+ "test/playback.test.js"
+ ],
+ "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。",
+ "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。",
+ "workspaceState": "Current switchMix uses silencePromise and test/playback.test.js covers resume rejection. Published baseline still reproduces the old failure; preserve the existing workspace mitigation during migration."
+ },
+ {
+ "id": "BASE-LIFE-01",
+ "title": "Superseded switch resolves along with the latest source",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "CORE-09"
+ ],
+ "evidence": [
+ "refactor/baselines/lifecycle.json",
+ "refactor/baselines/lifecycle-coverage.md"
+ ],
+ "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。",
+ "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。"
+ },
+ {
+ "id": "BASE-LIFE-02",
+ "title": "Switch remains unsettled during the bounded observation after destroy",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "CORE-09"
+ ],
+ "evidence": [
+ "refactor/baselines/lifecycle.json",
+ "refactor/baselines/lifecycle-coverage.md"
+ ],
+ "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。",
+ "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。"
+ },
+ {
+ "id": "BASE-LIFE-03",
+ "title": "Async plugin registers its result after destroy",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "CORE-08"
+ ],
+ "evidence": [
+ "refactor/baselines/lifecycle.json",
+ "refactor/baselines/lifecycle-coverage.md"
+ ],
+ "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。",
+ "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。"
+ },
+ {
+ "id": "BASE-LIFE-04",
+ "title": "Destroying an instance twice unregisters a different live instance",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "CORE-04"
+ ],
+ "evidence": [
+ "refactor/baselines/lifecycle.json",
+ "refactor/baselines/lifecycle-coverage.md"
+ ],
+ "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。",
+ "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。"
+ },
+ {
+ "id": "BASE-LIFE-05",
+ "title": "Failed constructor leaves initialized markup/listeners until explicit probe cleanup",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "CORE-04"
+ ],
+ "evidence": [
+ "refactor/baselines/lifecycle.json",
+ "refactor/baselines/lifecycle-coverage.md"
+ ],
+ "compatibleResolution": "按对应 CORE 任务修复,保持合法旧调用;异步取消需明确结算策略,不把 pending 或重复销毁当正常兼容要求。",
+ "closureCriteria": "候选正向回归和旧新差异记录通过;有界观察问题不得仅靠延长等待隐藏。"
+ },
+ {
+ "id": "BASE-DOM-01",
+ "title": "控件 Tab 不可达",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "CORE-23",
+ "CORE-17"
+ ],
+ "evidence": [
+ "refactor/baselines/dom.json"
+ ],
+ "compatibleResolution": "补键盘可达性、焦点及名称,保留旧 DOM/CSS 和快捷键。",
+ "closureCriteria": "真实键盘与焦点回归通过,不只检查静态属性。"
+ },
+ {
+ "id": "BASE-DOM-02",
+ "title": "窄容器中控件裁切",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "CORE-13",
+ "CORE-14"
+ ],
+ "evidence": [
+ "refactor/baselines/dom.json"
+ ],
+ "compatibleResolution": "在保留自定义控件扩展入口下修正布局。",
+ "closureCriteria": "320px 及正常容器的设置/模式操作真实可用。"
+ },
+ {
+ "id": "BASE-DEMO-01",
+ "title": "旧 thumbnail 插件示例不对应当前 workspace 包",
+ "confirmation": "source-observed",
+ "status": "open",
+ "owners": [
+ "SITE-01",
+ "EX-03"
+ ],
+ "evidence": [
+ "docs/assets/example/thumbnail.js",
+ "refactor/baselines/demo-inventory.json"
+ ],
+ "compatibleResolution": "核实旧外部插件和链接,不自动替换为不同 API 的 auto-thumbnail。",
+ "closureCriteria": "示例依赖有来源,旧参数/URL 的保留或迁移解释完整。"
+ },
+ {
+ "id": "BASE-TYPE-01",
+ "title": "NodeNext ESM 默认导出与声明互操作失配",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "ENG-04",
+ "CORE-07",
+ "PKG-CHAPTER-04"
+ ],
+ "evidence": [
+ "refactor/baselines/consumers.json"
+ ],
+ "compatibleResolution": "分配 ESM/CJS 声明入口,保留旧解析模式,避免 any/skipLibCheck 掩盖。",
+ "closureCriteria": "四模式原合法消费通过,NodeNext ESM 对实际默认导出可构造/调用。"
+ },
+ {
+ "id": "BASE-TYPE-02",
+ "title": "chapter 可选运行时参数被声明为必填",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "PKG-CHAPTER-02"
+ ],
+ "evidence": [
+ "refactor/baselines/consumers.json",
+ "refactor/fixtures/api.js"
+ ],
+ "compatibleResolution": "补充兼容可选参数,不删除已接受的配置。",
+ "closureCriteria": "无参数和正确参数编译,错误参数依旧被拒绝,运行时一致。"
+ },
+ {
+ "id": "BASE-TYPE-03",
+ "title": "chapter legacy 缺旧模块解析的声明回退",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "ENG-04",
+ "PKG-CHAPTER-04"
+ ],
+ "evidence": [
+ "refactor/baselines/consumers.json"
+ ],
+ "compatibleResolution": "保留 legacy 文件和导入路径,补旧解析类型回退。",
+ "closureCriteria": "Node10 解析和 NodeNext/Bundler 消费均有正向证据。"
+ },
+ {
+ "id": "BASE-TYPE-04",
+ "title": "plugins.add / toggle 的旧声明返回值与运行时不同",
+ "confirmation": "source-observed",
+ "status": "open",
+ "owners": [
+ "CORE-07"
+ ],
+ "evidence": [
+ "refactor/baselines/consumers.json",
+ "refactor/baselines/public-api.json",
+ "refactor/baselines/lifecycle.json"
+ ],
+ "compatibleResolution": "保留旧声明接受范围并协调精确重载/扩展,不静默把同步注册改成 async。",
+ "closureCriteria": "返回值类型与运行时差异逐项说明,旧合法消费和拒绝传播回归通过。",
+ "scopeNote": "plugins.add synchronous result is browser-reproduced; toggle return comparison also relies on current source/playback tests. Do not claim every declaration mismatch was independently browser-reproduced."
+ },
+ {
+ "id": "BASE-DIST-01",
+ "title": "thumbnail tool 分发入口与类型文件缺失",
+ "confirmation": "source-observed",
+ "status": "open",
+ "owners": [
+ "PKG-TOOL-THUMB-01",
+ "PKG-TOOL-THUMB-04"
+ ],
+ "evidence": [
+ "refactor/baselines/distribution.json"
+ ],
+ "compatibleResolution": "核实真实旧 npm 后保留 .esm.js 等历史路径的兼容入口并补声明。",
+ "closureCriteria": "隔离打包消费者能加载所有原承诺路径,dist 不作为源码直接手改。"
+ },
+ {
+ "id": "BASE-PERF-01",
+ "title": "销毁后的 resize 防抖重新创建 notice timer",
+ "confirmation": "reproduced",
+ "status": "open",
+ "owners": [
+ "CORE-17",
+ "CORE-04",
+ "CORE-18"
+ ],
+ "evidence": [
+ "refactor/baselines/performance.json"
+ ],
+ "compatibleResolution": "为 debounce/晚到 UI 工作建立销毁归属;不靠等待自然过期掩盖。",
+ "closureCriteria": "正常 resize 保持,destroy 后无该回调及新 notice timer。"
+ },
+ {
+ "id": "BASE-SOURCE-01",
+ "title": "工作区 5.4.1 与采集时真实发布 5.4.0 不同",
+ "confirmation": "source-observed",
+ "status": "open",
+ "owners": [
+ "BASE-08",
+ "REL-01"
+ ],
+ "evidence": [
+ "refactor/baselines/releases.json"
+ ],
+ "compatibleResolution": "分别保留工作区与 npm 基线,目标大版本不变;更新发布窗口需新取证。",
+ "closureCriteria": "候选报告明确比较版本与 tarball,不声称工作区版本即已发布。"
+ },
+ {
+ "id": "BASE-SOURCE-02",
+ "title": "registry gitHead 与发布包版本对应不可靠",
+ "confirmation": "source-observed",
+ "status": "open",
+ "owners": [
+ "ENG-07",
+ "REL-01"
+ ],
+ "evidence": [
+ "refactor/baselines/releases.json"
+ ],
+ "compatibleResolution": "以 tarball 内容和可验证的构建来源为准,不能据 gitHead 自动声称复现。",
+ "closureCriteria": "候选 commit、工具链、包内容可关联,旧来源未知仍明确。"
+ },
+ {
+ "id": "BASE-SITE-01",
+ "title": "文档站实际为静态站点但 manifest 未设 private",
+ "confirmation": "source-observed",
+ "status": "open",
+ "owners": [
+ "SITE-01",
+ "REL-01"
+ ],
+ "evidence": [
+ "refactor/baselines/distribution.json"
+ ],
+ "compatibleResolution": "区分站点部署和库 npm 发布;自身 next-major 要求保留。",
+ "closureCriteria": "发布流程显式列出站点处理方式,不机械将其当库发布。"
+ },
+ {
+ "id": "BASE-MEDIA-01",
+ "title": "示例媒体和字体的完整来源/授权链待核实",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "BASE-08",
+ "SITE-01",
+ "EX-03"
+ ],
+ "evidence": [
+ "docs/assets/sample",
+ "docs/assets/jassub"
+ ],
+ "compatibleResolution": "复用现有样本时记录来源;缺许可的公开分发样本需补证据或可兼容替代,不能从文件名猜授权。",
+ "closureCriteria": "候选实际分发样本有来源、许可/使用依据和测试映射。"
+ },
+ {
+ "id": "VENDOR-01",
+ "title": "screenfull 来源、版本与许可闭环",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "CORE-12"
+ ],
+ "evidence": [
+ "refactor/third-party.json",
+ "packages/artplayer/src/libs/screenfull.js"
+ ],
+ "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。"
+ },
+ {
+ "id": "VENDOR-02",
+ "title": "hint.css 来源、版本与许可闭环",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "CORE-12"
+ ],
+ "evidence": [
+ "refactor/third-party.json",
+ "packages/artplayer/src/style/hint.less"
+ ],
+ "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。"
+ },
+ {
+ "id": "VENDOR-03",
+ "title": "webvtt-parser 来源、版本与许可闭环",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-MULTI-SUB-01"
+ ],
+ "evidence": [
+ "refactor/third-party.json",
+ "packages/artplayer-plugin-multiple-subtitles/src/parser.js"
+ ],
+ "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。"
+ },
+ {
+ "id": "VENDOR-04",
+ "title": "jassub-code-and-workers 来源、版本与许可闭环",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-JASSUB-01"
+ ],
+ "evidence": [
+ "refactor/third-party.json",
+ "packages/artplayer-plugin-jassub/src/jassub.es.js",
+ "packages/artplayer-plugin-jassub/worker",
+ "docs/assets/jassub/jassub-worker.js",
+ "docs/assets/jassub/jassub-worker.wasm",
+ "docs/assets/jassub/jassub-worker-modern.wasm"
+ ],
+ "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。"
+ },
+ {
+ "id": "VENDOR-05",
+ "title": "jassub-font-assets 来源、版本与许可闭环",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-JASSUB-01",
+ "SITE-01"
+ ],
+ "evidence": [
+ "refactor/third-party.json",
+ "docs/assets/jassub/default.woff2",
+ "docs/assets/jassub/fonts"
+ ],
+ "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。"
+ },
+ {
+ "id": "VENDOR-06",
+ "title": "monaco-static-assets 来源、版本与许可闭环",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "SITE-01",
+ "SITE-05"
+ ],
+ "evidence": [
+ "refactor/third-party.json",
+ "docs/assets/js/vs"
+ ],
+ "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。"
+ },
+ {
+ "id": "VENDOR-07",
+ "title": "vconsole 来源、版本与许可闭环",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "SITE-01"
+ ],
+ "evidence": [
+ "refactor/third-party.json",
+ "docs/assets/js/vconsole.min.js"
+ ],
+ "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。"
+ },
+ {
+ "id": "VENDOR-08",
+ "title": "console-bundle 来源、版本与许可闭环",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "SITE-01"
+ ],
+ "evidence": [
+ "refactor/third-party.json",
+ "docs/assets/js/console.js"
+ ],
+ "compatibleResolution": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "closureCriteria": "固定上游版本/内容差异、完整组件许可与分发 notices,兼容测试通过;仅当前上游许可证名称不足以关闭。"
+ },
+ {
+ "id": "SDK-01",
+ "title": "hls.js 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-HLS-01",
+ "EX-03"
+ ],
+ "evidence": [
+ "packages/artplayer-plugin-hls-control/src/index.js",
+ "docs/assets/example/hls.control.js"
+ ],
+ "compatibleResolution": "Caller supplies art.hls; homepage demo loads hls.js 1.5.17. Preserve quality/audio selectors and old core integration.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-02",
+ "title": "dash.js 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-DASH-01",
+ "EX-03"
+ ],
+ "evidence": [
+ "packages/artplayer-plugin-dash-control/src/index.js",
+ "docs/assets/example/dash.control.js"
+ ],
+ "compatibleResolution": "Caller supplies art.dash; homepage demo loads dash.js 5.2.1. Preserve representation IDs, Auto/manual and audio topology.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-03",
+ "title": "flv.js 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "EX-03"
+ ],
+ "evidence": [
+ "docs/assets/example/flv.js"
+ ],
+ "compatibleResolution": "Demo dependency flv.js 1.6.2; customType playback/teardown must be tested with actual SDK.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-04",
+ "title": "mpegts.js 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "EX-03"
+ ],
+ "evidence": [
+ "docs/assets/example/mpegts.js"
+ ],
+ "compatibleResolution": "Demo dependency mpegts.js 1.7.3; actual codec/stream/browser support remains unverified.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-05",
+ "title": "webtorrent 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "EX-03"
+ ],
+ "evidence": [
+ "docs/assets/example/webtorrent.js"
+ ],
+ "compatibleResolution": "Demo URL uses webtorrent@1, a moving major selector; preserve caller integration and explicitly capture actual runtime version.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-06",
+ "title": "google-cast 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-CAST-01",
+ "PKG-CAST-05"
+ ],
+ "evidence": [
+ "packages/artplayer-plugin-chromecast/src/index.js"
+ ],
+ "compatibleResolution": "Default remote cast_sender.js?loadCastFramework=1; sdk URL/options and actual Cast device/session behavior require separate validation.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-07",
+ "title": "ima-via-glomex 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-VAST-01",
+ "PKG-VAST-05"
+ ],
+ "evidence": [
+ "packages/artplayer-plugin-vast/src/index.js"
+ ],
+ "compatibleResolution": "@glomex/vast-ima-player loadImaSdk loads external IMA; preserve event/content/ad state and teardown, do not equate mocks with vendor service acceptance.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-08",
+ "title": "mediapipe-tensorflow 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-MASK-01",
+ "PKG-MASK-05"
+ ],
+ "evidence": [
+ "packages/artplayer-plugin-danmuku-mask/src/index.js"
+ ],
+ "compatibleResolution": "Npm dependency versions are separate from unversioned solutionPath CDN assets; keep option override, backend fallback, model result disposal and masks.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-09",
+ "title": "jassub-worker-wasm-fonts 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-JASSUB-01",
+ "PKG-JASSUB-05"
+ ],
+ "evidence": [
+ "packages/artplayer-plugin-jassub/src/index.js",
+ "docs/assets/example/jassub.js"
+ ],
+ "compatibleResolution": "Preserve options pass-through, result.instance and worker/wasm/font URLs. Wrapper, worker and WASM must be a verified compatible set.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-10",
+ "title": "mediabunny 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-MB-01",
+ "PKG-MB-09"
+ ],
+ "evidence": [
+ "packages/artplayer-proxy-mediabunny/src/input.js",
+ "packages/artplayer-proxy-mediabunny/package.json"
+ ],
+ "compatibleResolution": "Preserve native-video-like events, HLS input and topology, codec capability failures and AV sync; actual library/codec environment still requires verification.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-11",
+ "title": "asr-caller-service 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "PKG-ASR-01",
+ "PKG-ASR-05",
+ "EX-03"
+ ],
+ "evidence": [
+ "packages/artplayer-plugin-asr/src/index.js",
+ "docs/assets/example/asr.js"
+ ],
+ "compatibleResolution": "Core plugin supplies PCM to caller onAudioChunk. Example fetches an external ASR endpoint and opens its returned WebSocket; not an embedded ASR SDK or a verified service.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ },
+ {
+ "id": "SDK-12",
+ "title": "option-validator 实际集成验证范围",
+ "confirmation": "unverified",
+ "status": "open",
+ "owners": [
+ "CORE-01",
+ "CORE-07"
+ ],
+ "evidence": [
+ "packages/artplayer/src/index.js"
+ ],
+ "compatibleResolution": "Bundled validation dependency; preserve validation/default/merge behavior and failure cleanup when typing constructor boundaries.",
+ "closureCriteria": "固定 SDK/外部资源版本和环境;成功/失败/切换/销毁有真实证据,设备和网络限制逐项记录。"
+ }
+ ]
+}
diff --git a/refactor/scripts/risk-register.mjs b/refactor/scripts/risk-register.mjs
new file mode 100644
index 000000000..b02a2fec0
--- /dev/null
+++ b/refactor/scripts/risk-register.mjs
@@ -0,0 +1,94 @@
+import assert from 'node:assert/strict'
+import fs from 'node:fs'
+import path from 'node:path'
+import { fileURLToPath } from 'node:url'
+import lockfile from '@yarnpkg/lockfile'
+import { hash, refactorDir } from './releases.mjs'
+
+const root = path.resolve(refactorDir, '..')
+const read = name => JSON.parse(fs.readFileSync(path.join(refactorDir, name), 'utf8'))
+export function referencedFindings() {
+ const files = ['baselines/lifecycle-coverage.md', 'baselines/dom-coverage.md', 'baselines/consumer-coverage.md', 'baselines/performance-coverage.md']
+ return [...new Set(files.flatMap(name => fs.readFileSync(path.join(refactorDir, name), 'utf8').match(/BASE-(?:LIFE|DOM|DEMO|TYPE|DIST|PERF)-\d{2}/g) || []))].sort()
+}
+function evidenceExists(name) {
+ const absolute = path.resolve(root, name)
+ assert(absolute.startsWith(root + path.sep) && fs.existsSync(absolute), `Missing or invalid evidence: ${name}`)
+}
+export function validateRisks(register) {
+ const tasks = new Set(read('tasks.json').tasks.map(task => task.id))
+ const ids = new Set(register.items.map(item => item.id))
+ assert.equal(ids.size, register.items.length, 'Duplicate risk ID')
+ for (const id of referencedFindings()) assert(ids.has(id), `Unregistered baseline finding: ${id}`)
+ for (const item of register.items) {
+ assert(['reproduced', 'source-observed', 'unverified'].includes(item.confirmation))
+ assert(['open', 'resolved', 'accepted-with-scope'].includes(item.status))
+ assert(item.owners.length && item.owners.every(id => tasks.has(id)), `Unowned risk: ${item.id}`)
+ assert(item.evidence.length && item.compatibleResolution && item.closureCriteria, `Incomplete risk: ${item.id}`)
+ item.evidence.forEach(evidenceExists)
+ if (item.status !== 'open') {
+ assert(item.resolutionEvidence?.length && item.resolutionRationale, `Premature closure: ${item.id}`)
+ item.resolutionEvidence.forEach(evidenceExists)
+ }
+ }
+}
+export function assetFingerprints(inputs) {
+ const walk = name => {
+ const absolute = path.resolve(root, name)
+ evidenceExists(name)
+ return fs.statSync(absolute).isDirectory() ? fs.readdirSync(absolute).flatMap(child => walk(`${name}/${child}`)) : [name]
+ }
+ return inputs.flatMap(walk).sort().map(name => {
+ const bytes = fs.readFileSync(path.join(root, name))
+ const text = /\.(?:[cm]?[jt]s|css|less|json|html|svg|txt|md)$/.test(name)
+ return { path: name, algorithm: text ? 'sha256-lf' : 'sha256', sha256: hash(text ? bytes.toString('utf8').replaceAll('\r\n', '\n') : bytes) }
+ })
+}
+export function validateThirdParty(inventory, register) {
+ const tasks = new Set(read('tasks.json').tasks.map(task => task.id))
+ const risks = new Set(register.items.map(item => item.id))
+ const initial = read('package-inventory.json').packages.map(pkg => pkg.name).sort()
+ assert.deepEqual(inventory.packages.map(pkg => pkg.name).sort(), initial, 'External dependency package coverage missing')
+ const lock = lockfile.parse(fs.readFileSync(path.join(root, 'yarn.lock'), 'utf8')).object
+ for (const pkg of inventory.packages) {
+ const current = JSON.parse(fs.readFileSync(path.join(root, 'packages', pkg.name, 'package.json'), 'utf8'))
+ assert.deepEqual(pkg.declaredRuntimeDependencies, current.dependencies || {}, `Update dependency inventory: ${pkg.name}`)
+ assert.deepEqual(pkg.developmentDependencies, current.devDependencies || {}, `Update development dependency inventory: ${pkg.name}`)
+ assert.deepEqual(pkg.resolvedRuntimeDependencies.map(dependency => dependency.name).sort(), Object.keys(current.dependencies || {}).sort(), 'Missing resolved dependency')
+ for (const dependency of pkg.resolvedRuntimeDependencies) {
+ assert.equal(dependency.range, current.dependencies[dependency.name], 'Dependency range changed')
+ const installed = JSON.parse(fs.readFileSync(path.join(root, 'node_modules', dependency.name, 'package.json'), 'utf8'))
+ assert.equal(dependency.lockedVersion, lock[`${dependency.name}@${dependency.range}`]?.version, 'Dependency lock changed; update provenance')
+ assert.equal(dependency.installedVersion, installed.version, 'Installed dependency changed')
+ assert.equal(dependency.manifestLicense, installed.license || null, 'Dependency license metadata changed')
+ }
+ }
+ assert.deepEqual(inventory.vendored.map(vendor => vendor.riskId).sort(), [...risks].filter(id => id.startsWith('VENDOR-')).sort(), 'Missing vendored group')
+ assert.deepEqual(inventory.integrations.map(sdk => sdk.riskId).sort(), [...risks].filter(id => id.startsWith('SDK-')).sort(), 'Missing SDK integration')
+ for (const vendor of inventory.vendored) {
+ assert(risks.has(vendor.riskId) && vendor.owners.length && vendor.owners.every(id => tasks.has(id)))
+ assert(vendor.sourceStatus && vendor.licenseStatus && vendor.updatePolicy)
+ assert.deepEqual(assetFingerprints(vendor.inputs), vendor.fingerprints, `Vendored files changed without reviewed provenance: ${vendor.id}`)
+ }
+ for (const sdk of inventory.integrations) {
+ assert(risks.has(sdk.riskId) && sdk.owners.length && sdk.owners.every(id => tasks.has(id)))
+ assert(sdk.sourceFiles.length && sdk.validationStatus && sdk.contract)
+ sdk.sourceFiles.forEach(evidenceExists)
+ }
+}
+export function renderRisks(register) {
+ const labels = { reproduced: '已复现', 'source-observed': '源码/产物事实', unverified: '待取证' }
+ const escape = text => text.replaceAll('|', '\\|').replaceAll('\n', ' ')
+ return `# 重构风险与差异索引\n\n由 risks.json 生成;运行 node refactor/scripts/risk-register.mjs --write 更新。状态 open 表示尚缺关闭证据,不等于每项都是已复现缺陷。处理方案、关闭条件与证据见 [机器台账](risks.json),来源与范围见 [维护说明](risk-guide.md)。\n\n| ID | 状态 / 证据等级 | 条目 | 后续任务 |\n| --- | --- | --- | --- |\n${register.items.map(item => `| ${item.id} | ${item.status} / ${labels[item.confirmation]} | ${escape(item.title)} | ${item.owners.join(', ')} |`).join('\n')}\n`
+}
+if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
+ assert(process.argv.slice(2).every(arg => ['--check', '--write'].includes(arg)), 'Use --check or --write')
+ const register = read('risks.json')
+ const inventory = read('third-party.json')
+ validateRisks(register)
+ validateThirdParty(inventory, register)
+ const rendered = renderRisks(register)
+ if (process.argv.includes('--write')) fs.writeFileSync(path.join(refactorDir, 'risk-table.md'), rendered)
+ else assert.equal(fs.readFileSync(path.join(refactorDir, 'risk-table.md'), 'utf8').replaceAll('\r\n', '\n'), rendered, 'Regenerate risk-table.md')
+ console.log(`Risk register checked: ${register.items.length} items, ${inventory.vendored.length} vendored groups, ${inventory.integrations.length} integrations; no unresolved item is waived`)
+}
diff --git a/refactor/scripts/risk-register.test.mjs b/refactor/scripts/risk-register.test.mjs
new file mode 100644
index 000000000..d32fdd3f8
--- /dev/null
+++ b/refactor/scripts/risk-register.test.mjs
@@ -0,0 +1,39 @@
+import assert from 'node:assert/strict'
+import fs from 'node:fs'
+import path from 'node:path'
+import test from 'node:test'
+import { renderRisks, validateRisks, validateThirdParty } from './risk-register.mjs'
+import { refactorDir } from './releases.mjs'
+
+const read = name => JSON.parse(fs.readFileSync(path.join(refactorDir, name), 'utf8'))
+test('Risk register rejects omitted findings, missing owners and unsupported closure', () => {
+ const register = read('risks.json')
+ validateRisks(register)
+ assert.equal(fs.readFileSync(path.join(refactorDir, 'risk-table.md'), 'utf8').replaceAll('\r\n', '\n'), renderRisks(register))
+ for (const mutate of [
+ value => value.items = value.items.filter(item => item.id !== 'BASE-LIFE-04'),
+ value => value.items[0].owners = ['NO-SUCH-TASK'],
+ value => value.items[0].status = 'resolved',
+ value => value.items[0].evidence = ['../outside-workspace'],
+ ]) {
+ const changed = structuredClone(register)
+ mutate(changed)
+ assert.throws(() => validateRisks(changed))
+ }
+})
+test('Third-party provenance cannot silently omit copied assets, SDKs or change fingerprints', () => {
+ const register = read('risks.json')
+ const inventory = read('third-party.json')
+ validateThirdParty(inventory, register)
+ for (const mutate of [
+ value => value.packages.pop(),
+ value => value.vendored.pop(),
+ value => value.integrations.pop(),
+ value => value.vendored[0].fingerprints[0].sha256 = 'incorrect',
+ value => value.packages.find(pkg => pkg.resolvedRuntimeDependencies.length).resolvedRuntimeDependencies[0].lockedVersion = '0.0.0',
+ ]) {
+ const changed = structuredClone(inventory)
+ mutate(changed)
+ assert.throws(() => validateThirdParty(changed, register))
+ }
+})
diff --git a/refactor/tasks.json b/refactor/tasks.json
index 2977661a2..60f3682cf 100644
--- a/refactor/tasks.json
+++ b/refactor/tasks.json
@@ -391,11 +391,17 @@
"BASE-03",
"BASE-05"
],
- "status": "todo",
+ "status": "done",
"risk": "H",
"deliverable": "销毁/切源/类型差异、vendored 许可和外部 SDK 清单",
"acceptance": "已确认与待复现分开,每项有负责任务及兼容处理路线;纳入 BASE-TYPE-01/02/03/04 和 BASE-DIST-01 的发布/声明/工作区证据;纳入 BASE-PERF-01 销毁后 resize/notice 延迟工作",
- "evidence": []
+ "evidence": [
+ "changes/2026-09-10-BASE-07-risk-register.md",
+ "risk-guide.md",
+ "risk-table.md",
+ "risks.json",
+ "third-party.json"
+ ]
},
{
"scope": [
@@ -611,7 +617,7 @@
"BASE-07"
],
"deliverable": "历史失败 ID/环境/旧版复现/负责修复任务、逐模块门槛、受控等待与 trace/retry 规则",
- "acceptance": "不靠全局忽略或无理由 skip 隐藏问题,新增回归阻止交付,设备缺口和偶发失败单独可见"
+ "acceptance": "不靠全局忽略或无理由 skip 隐藏问题,新增回归阻止交付,设备缺口和偶发失败单独可见;以 risks.json 为统一差异索引;关闭必须有 resolutionEvidence/rationale,已复现、源码事实、未验证分开,登记不等于豁免"
},
{
"id": "CI-01",
@@ -910,7 +916,7 @@
"status": "todo",
"risk": "H",
"deliverable": "template/icons/i18n/style、SSR 与 proxy 挂载",
- "acceptance": "DOM/CSS/global/样式注入、i18n 子路径及 SSR import 保持;不把 SSR import/useSSR 保持扩大为服务端构造播放器;复跑 BASE-05 的 SSR import/模板、浏览器 useSSR 节点复用和非浏览器构造错误",
+ "acceptance": "DOM/CSS/global/样式注入、i18n 子路径及 SSR import 保持;不把 SSR import/useSSR 保持扩大为服务端构造播放器;复跑 BASE-05 的 SSR import/模板、浏览器 useSSR 节点复用和非浏览器构造错误;接续 VENDOR-01/02,核对 screenfull/hint 复制版本、修改与分发通知,保留 DOM/CSS/fullscreen 行为",
"evidence": []
},
{
@@ -1854,7 +1860,7 @@
"status": "todo",
"risk": "H",
"deliverable": "subtitles/onParser、multipleSubtitles 名称及实际返回方法",
- "acceptance": "源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结",
+ "acceptance": "源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结;接续 VENDOR-03,定位 WebVTT parser 来源/修订及 CC0 头,保留解析/序列化行为",
"evidence": []
},
{
@@ -1958,7 +1964,7 @@
"status": "todo",
"risk": "H",
"deliverable": "选项透传、result.instance、vendor 来源、worker/WASM/font 路径",
- "acceptance": "源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结",
+ "acceptance": "源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结;接续 VENDOR-04/05,核对 wrapper/worker/WASM/font 的独立来源与通知,保持资源路径和选项透传",
"evidence": []
},
{
@@ -2063,7 +2069,7 @@
"status": "todo",
"risk": "H",
"deliverable": "模型参数、start/stop、默认下载路径及 mask 样式",
- "acceptance": "源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结",
+ "acceptance": "源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结;接续 SDK-08,分别核实 Yarn 解析版本、未固定版本的模型 solutionPath 和资源来源",
"evidence": []
},
{
@@ -2953,7 +2959,7 @@
"status": "todo",
"risk": "H",
"deliverable": "全部 option、art.mediabunny、canvas/shim 属性及事件表",
- "acceptance": "公开暴露成员和实际发布依赖/资源范围明确",
+ "acceptance": "公开暴露成员和实际发布依赖/资源范围明确;核实 third-party.json 所记录依赖 MPL-2.0 元数据与实际 bundle 的许可/通知范围,不从根 MIT 推断",
"evidence": []
},
{
@@ -3334,7 +3340,7 @@
"status": "todo",
"risk": "M",
"deliverable": "中英文文档、插件页面、demo URL、编辑器声明与生成目录清单;六类 HTML 入口、prod/libs/code/example 加载行为及移动重定向",
- "acceptance": "所有公开 API/插件有对应页面或明确补充任务;核实 BASE-DEMO-01 的历史 thumbnail 插件来源及 29 示例/36 HTML 路径;明确 BASE-05 所记录站点实际分发与未设 private 的 manifest 意图",
+ "acceptance": "所有公开 API/插件有对应页面或明确补充任务;核实 BASE-DEMO-01 的历史 thumbnail 插件来源及 29 示例/36 HTML 路径;明确 BASE-05 所记录站点实际分发与未设 private 的 manifest 意图;接续 VENDOR-05/06/07/08 和 BASE-SITE-01/BASE-MEDIA-01,核对字体、Monaco、vConsole、console bundle 与样本来源及分发范围",
"evidence": []
},
{
@@ -3616,7 +3622,7 @@
"ENG-07"
],
"deliverable": "每批包/版本/源码/锁文件/工具/tarball integrity、必需测试/设备证据、限制和回退映射",
- "acceptance": "受影响能力缺证据明确阻止对应批次;无关批次可独立准备,旧证据在候选内容变化后失效;站点采用真实构建/URL/资源验收,npm 分发依据历史核实,不从版本清单推断新增发布范围"
+ "acceptance": "受影响能力缺证据明确阻止对应批次;无关批次可独立准备,旧证据在候选内容变化后失效;站点采用真实构建/URL/资源验收,npm 分发依据历史核实,不从版本清单推断新增发布范围;关联 risks.json 和 third-party.json;受影响 bundle/worker/WASM/font/模型的来源与许可通知缺口必须有审查结论,未决项阻止对应批次"
},
{
"id": "REL-01",
diff --git a/refactor/third-party.json b/refactor/third-party.json
new file mode 100644
index 000000000..76076d2bc
--- /dev/null
+++ b/refactor/third-party.json
@@ -0,0 +1,1178 @@
+{
+ "schemaVersion": 1,
+ "task": "BASE-07",
+ "sourceCommit": "e01f39ff",
+ "capturedAt": "2026-09-10T12:58:34.266Z",
+ "note": "Maintained provenance inventory. Unknown versions/licenses remain open. No complete legal, security or runtime audit is claimed; remote services were not invoked. Fingerprints cover selected copied assets, not every repository media file.",
+ "packages": [
+ {
+ "name": "artplayer",
+ "declaredRuntimeDependencies": {
+ "option-validator": "^2.0.6"
+ },
+ "resolvedRuntimeDependencies": [
+ {
+ "name": "option-validator",
+ "range": "^2.0.6",
+ "lockedVersion": "2.0.6",
+ "installedVersion": "2.0.6",
+ "manifestLicense": "MIT",
+ "licenseEvidence": "Installed package manifest claim; bundled notice and transitive/license review remain with the owning package."
+ }
+ ],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-ads",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-ambilight",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-asr",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-audio-track",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-auto-thumbnail",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-chapter",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-chromecast",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-danmuku",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-danmuku-mask",
+ "declaredRuntimeDependencies": {
+ "@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"
+ },
+ "resolvedRuntimeDependencies": [
+ {
+ "name": "@mediapipe/selfie_segmentation",
+ "range": "^0.1.1675465747",
+ "lockedVersion": "0.1.1675465747",
+ "installedVersion": "0.1.1675465747",
+ "manifestLicense": "Apache-2.0",
+ "licenseEvidence": "Installed package manifest claim; bundled notice and transitive/license review remain with the owning package."
+ },
+ {
+ "name": "@tensorflow-models/body-segmentation",
+ "range": "^1.0.2",
+ "lockedVersion": "1.0.2",
+ "installedVersion": "1.0.2",
+ "manifestLicense": "Apache-2.0",
+ "licenseEvidence": "Installed package manifest claim; bundled notice and transitive/license review remain with the owning package."
+ },
+ {
+ "name": "@tensorflow/tfjs-backend-cpu",
+ "range": "^4.21.0",
+ "lockedVersion": "4.22.0",
+ "installedVersion": "4.22.0",
+ "manifestLicense": "Apache-2.0",
+ "licenseEvidence": "Installed package manifest claim; bundled notice and transitive/license review remain with the owning package."
+ },
+ {
+ "name": "@tensorflow/tfjs-backend-webgl",
+ "range": "^4.21.0",
+ "lockedVersion": "4.22.0",
+ "installedVersion": "4.22.0",
+ "manifestLicense": "Apache-2.0",
+ "licenseEvidence": "Installed package manifest claim; bundled notice and transitive/license review remain with the owning package."
+ },
+ {
+ "name": "@tensorflow/tfjs-converter",
+ "range": "^4.21.0",
+ "lockedVersion": "4.22.0",
+ "installedVersion": "4.22.0",
+ "manifestLicense": "Apache-2.0",
+ "licenseEvidence": "Installed package manifest claim; bundled notice and transitive/license review remain with the owning package."
+ },
+ {
+ "name": "@tensorflow/tfjs-core",
+ "range": "^4.21.0",
+ "lockedVersion": "4.22.0",
+ "installedVersion": "4.22.0",
+ "manifestLicense": "Apache-2.0",
+ "licenseEvidence": "Installed package manifest claim; bundled notice and transitive/license review remain with the owning package."
+ }
+ ],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-dash-control",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-document-pip",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-hls-control",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-jassub",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-multiple-subtitles",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-vast",
+ "declaredRuntimeDependencies": {
+ "@glomex/vast-ima-player": "^1.21.2"
+ },
+ "resolvedRuntimeDependencies": [
+ {
+ "name": "@glomex/vast-ima-player",
+ "range": "^1.21.2",
+ "lockedVersion": "1.21.2",
+ "installedVersion": "1.21.2",
+ "manifestLicense": "Apache-2.0",
+ "licenseEvidence": "Installed package manifest claim; bundled notice and transitive/license review remain with the owning package."
+ }
+ ],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-plugin-vtt-thumbnail",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-proxy-canvas",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-proxy-mediabunny",
+ "declaredRuntimeDependencies": {
+ "mediabunny": "^1.43.1"
+ },
+ "resolvedRuntimeDependencies": [
+ {
+ "name": "mediabunny",
+ "range": "^1.43.1",
+ "lockedVersion": "1.56.1",
+ "installedVersion": "1.56.1",
+ "manifestLicense": "MPL-2.0",
+ "licenseEvidence": "Installed package manifest claim; bundled notice and transitive/license review remain with the owning package."
+ }
+ ],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-tool-iframe",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-tool-thumbnail",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {}
+ },
+ {
+ "name": "artplayer-vitepress",
+ "declaredRuntimeDependencies": {},
+ "resolvedRuntimeDependencies": [],
+ "developmentDependencies": {
+ "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"
+ }
+ }
+ ],
+ "vendored": [
+ {
+ "id": "screenfull",
+ "riskId": "VENDOR-01",
+ "inputs": [
+ "packages/artplayer/src/libs/screenfull.js"
+ ],
+ "owners": [
+ "CORE-12"
+ ],
+ "sourceStatus": "Local filename/implementation identifies screenfull; exact upstream revision not established.",
+ "licenseStatus": "Current upstream license is MIT; local copied file lacks a license header. Exact version and notice coverage remain unverified.",
+ "upstreamSources": [
+ "https://github.com/sindresorhus/screenfull/blob/main/license"
+ ],
+ "upstreamReviewedAt": "2026-09-10",
+ "updatePolicy": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "fingerprints": [
+ {
+ "path": "packages/artplayer/src/libs/screenfull.js",
+ "algorithm": "sha256-lf",
+ "sha256": "2332b50c0c6364d5c99080be0f5739255e4b9e465d2cca40f761adce9a1908f8"
+ }
+ ]
+ },
+ {
+ "id": "hint.css",
+ "riskId": "VENDOR-02",
+ "inputs": [
+ "packages/artplayer/src/style/hint.less"
+ ],
+ "owners": [
+ "CORE-12"
+ ],
+ "sourceStatus": "Local header names Hint.css 2.7.0, 2021-10-01; code is scoped/adapted in Less.",
+ "licenseStatus": "Local copyright header and current upstream MIT license observed; exact upstream diff and shipped notices pending.",
+ "upstreamSources": [
+ "https://github.com/chinchang/hint.css/blob/master/LICENSE"
+ ],
+ "upstreamReviewedAt": "2026-09-10",
+ "updatePolicy": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "fingerprints": [
+ {
+ "path": "packages/artplayer/src/style/hint.less",
+ "algorithm": "sha256-lf",
+ "sha256": "e2dc4940e6b212d8da75a404fd5ff1ad894008457677bc37554c6b64b735bc31"
+ }
+ ]
+ },
+ {
+ "id": "webvtt-parser",
+ "riskId": "VENDOR-03",
+ "inputs": [
+ "packages/artplayer-plugin-multiple-subtitles/src/parser.js"
+ ],
+ "owners": [
+ "PKG-MULTI-SUB-01"
+ ],
+ "sourceStatus": "Local WebVTTParser/Serializer and CC0 header correspond to the upstream family; exact revision/diff unknown.",
+ "licenseStatus": "Local public-domain/CC0 dedication present; upstream repository identifies CC0-1.0.",
+ "upstreamSources": [
+ "https://github.com/w3c/webvtt.js",
+ "https://raw.githubusercontent.com/w3c/webvtt.js/master/parser.js"
+ ],
+ "upstreamReviewedAt": "2026-09-10",
+ "updatePolicy": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "fingerprints": [
+ {
+ "path": "packages/artplayer-plugin-multiple-subtitles/src/parser.js",
+ "algorithm": "sha256-lf",
+ "sha256": "ba582074d57fa2d72880e6e4253fe14646787916b2b68e2a1e748e685cf96ab1"
+ }
+ ]
+ },
+ {
+ "id": "jassub-code-and-workers",
+ "riskId": "VENDOR-04",
+ "inputs": [
+ "packages/artplayer-plugin-jassub/src/jassub.es.js",
+ "packages/artplayer-plugin-jassub/worker",
+ "docs/assets/jassub/jassub-worker.js",
+ "docs/assets/jassub/jassub-worker.wasm",
+ "docs/assets/jassub/jassub-worker-modern.wasm"
+ ],
+ "owners": [
+ "PKG-JASSUB-01"
+ ],
+ "sourceStatus": "JASSUB example links upstream; exact wrapper/worker/WASM build version and subcomponent graph not established.",
+ "licenseStatus": "Current upstream wrapper LICENSE is MIT; this does not certify linked WASM libraries, fonts, or the exact local build.",
+ "upstreamSources": [
+ "https://github.com/ThaUnknown/jassub/blob/main/LICENSE"
+ ],
+ "upstreamReviewedAt": "2026-09-10",
+ "updatePolicy": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "fingerprints": [
+ {
+ "path": "docs/assets/jassub/jassub-worker-modern.wasm",
+ "algorithm": "sha256",
+ "sha256": "8a8b37463713d1f2ddbc1fbb8a35889d9565e5a6670851758b46b2216d8e513c"
+ },
+ {
+ "path": "docs/assets/jassub/jassub-worker.js",
+ "algorithm": "sha256-lf",
+ "sha256": "0fb9a83f96fc39426e733a94f3e7fe4e37099324c08328450ba032b653e85707"
+ },
+ {
+ "path": "docs/assets/jassub/jassub-worker.wasm",
+ "algorithm": "sha256",
+ "sha256": "73880d99ba9260ac39fc4476491cf254ca784c76f3af2fb03f3f9be8065ad3c0"
+ },
+ {
+ "path": "packages/artplayer-plugin-jassub/src/jassub.es.js",
+ "algorithm": "sha256-lf",
+ "sha256": "b973508ade00b5b9cea2f299d49f4943003372729be7350b6938e44fddb32038"
+ },
+ {
+ "path": "packages/artplayer-plugin-jassub/worker/jassub-worker-modern.wasm",
+ "algorithm": "sha256",
+ "sha256": "8a8b37463713d1f2ddbc1fbb8a35889d9565e5a6670851758b46b2216d8e513c"
+ },
+ {
+ "path": "packages/artplayer-plugin-jassub/worker/jassub-worker.js",
+ "algorithm": "sha256-lf",
+ "sha256": "0fb9a83f96fc39426e733a94f3e7fe4e37099324c08328450ba032b653e85707"
+ },
+ {
+ "path": "packages/artplayer-plugin-jassub/worker/jassub-worker.wasm",
+ "algorithm": "sha256",
+ "sha256": "73880d99ba9260ac39fc4476491cf254ca784c76f3af2fb03f3f9be8065ad3c0"
+ }
+ ]
+ },
+ {
+ "id": "jassub-font-assets",
+ "riskId": "VENDOR-05",
+ "inputs": [
+ "docs/assets/jassub/default.woff2",
+ "docs/assets/jassub/fonts"
+ ],
+ "owners": [
+ "PKG-JASSUB-01",
+ "SITE-01"
+ ],
+ "sourceStatus": "Mixed named font files; version/source provenance unavailable from file names alone.",
+ "licenseStatus": "Font redistribution rights are unverified; do not infer licenses from root MIT or font names.",
+ "upstreamSources": [],
+ "upstreamReviewedAt": null,
+ "updatePolicy": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "fingerprints": [
+ {
+ "path": "docs/assets/jassub/default.woff2",
+ "algorithm": "sha256",
+ "sha256": "886929903707c5bb28b07cd2eed69921b3d5ef5c49c73a0dd1e187ebf6546a4c"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/Averia Sans Libre Light.ttf",
+ "algorithm": "sha256",
+ "sha256": "df4ca526f9a941afda1f9c5a275695beb066a531f5b008c1e28ddc2c5f6e4390"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/Averia Serif Simple Light.ttf",
+ "algorithm": "sha256",
+ "sha256": "fb6398238298a7010920e1c216f7b29bc920477bc810f8bcc677ae4e6f411b4b"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/FRABK.TTF",
+ "algorithm": "sha256",
+ "sha256": "9ad3d0e5ef31c4a9a98cb0e169e4e625286aa34c712add3e001c0100138730d4"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/Gramond.ttf",
+ "algorithm": "sha256",
+ "sha256": "072859788bc577d35df2e852225c52cc5670339a4859d86b5edb96b1724a2177"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/Lato-Regular.ttf",
+ "algorithm": "sha256",
+ "sha256": "6f6940be0835c3ddec9199e5fc42be4cbc61ebcfd58c623fdf719366253f1780"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/SlatePro-Medium.otf",
+ "algorithm": "sha256",
+ "sha256": "56aa0fc2878bf782c10e5bba6dc45de1982a572d14ba9e10cd9d5a4414b6171e"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/allison-script.regular.otf",
+ "algorithm": "sha256",
+ "sha256": "97cd66bb6f89bdd32af2a9592f439536c85aa7553516514e2623bb1e81c65bd6"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/architext.regular.ttf",
+ "algorithm": "sha256",
+ "sha256": "a6b8e33ce190ee9c871590b982cff37e137b303bb73dcab55ef3ff7154ba143a"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/arial.ttf",
+ "algorithm": "sha256",
+ "sha256": "c9b76220a5be42ead4733611e417cd65c5fd8aeaa33eb56576ac378a37d130a1"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/chawp.otf",
+ "algorithm": "sha256",
+ "sha256": "9107241585a4328ce1438dfeabbfb1a8d0cd513dab6902be9a1a5774eab607c6"
+ },
+ {
+ "path": "docs/assets/jassub/fonts/default.woff2",
+ "algorithm": "sha256",
+ "sha256": "886929903707c5bb28b07cd2eed69921b3d5ef5c49c73a0dd1e187ebf6546a4c"
+ }
+ ]
+ },
+ {
+ "id": "monaco-static-assets",
+ "riskId": "VENDOR-06",
+ "inputs": [
+ "docs/assets/js/vs"
+ ],
+ "owners": [
+ "SITE-01",
+ "SITE-05"
+ ],
+ "sourceStatus": "Local headers name Monaco build 0.30.1 (829382514cb1065f5ebb90f436e1c6103e153953).",
+ "licenseStatus": "Headers identify MIT; editor.main also includes third-party notices such as DOMPurify. Full component/notice closure is pending.",
+ "upstreamSources": [],
+ "upstreamReviewedAt": null,
+ "updatePolicy": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "fingerprints": [
+ {
+ "path": "docs/assets/js/vs/base/browser/ui/codicons/codicon/codicon.ttf",
+ "algorithm": "sha256",
+ "sha256": "ff6b888d65cfd8077d49c6c704c1bfc8f2ce1ed71db9c583c63e0a49f046c79c"
+ },
+ {
+ "path": "docs/assets/js/vs/base/worker/workerMain.js",
+ "algorithm": "sha256-lf",
+ "sha256": "3ebdb68f45f9fed1c587901c9db42dd70e8a552421e330f39116fc7b078ba67e"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/abap/abap.js",
+ "algorithm": "sha256-lf",
+ "sha256": "49638217243bab4ed7d928d194bafe334abb614777440bf46f8636b9e5dfe0a4"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/apex/apex.js",
+ "algorithm": "sha256-lf",
+ "sha256": "034f340001e4c340b80e18abe45c990564931c4a061b4e74de86c012fb7d7a21"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/azcli/azcli.js",
+ "algorithm": "sha256-lf",
+ "sha256": "be50c776891279c9717db0d48a20d6d99f07cb60d2d8d279422fa917826683cf"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/bat/bat.js",
+ "algorithm": "sha256-lf",
+ "sha256": "3ec5d66f73ee7e7dc2b43db5999a768d1a54e933de9f507015fe7709a184adee"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/bicep/bicep.js",
+ "algorithm": "sha256-lf",
+ "sha256": "59d02b8930e36e2cbc3e472e263f881a82d84da292a79faf1d379cb060a2d7e1"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/cameligo/cameligo.js",
+ "algorithm": "sha256-lf",
+ "sha256": "f93cd405c71f97f26b4739f7f917b242e82a993ad42884422a43bf27d5b413e2"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/clojure/clojure.js",
+ "algorithm": "sha256-lf",
+ "sha256": "9e99cf86bcfb25c1b33bac9e26e11e4646868fa753356c7d737cfb24b7b1e49c"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/coffee/coffee.js",
+ "algorithm": "sha256-lf",
+ "sha256": "90d6aae23c9f5e4f335df5cb57634fa0193a102629deb88b98f238b4025f0551"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/cpp/cpp.js",
+ "algorithm": "sha256-lf",
+ "sha256": "ece3d119688eaf8a37fffae388118b12f8724ac2c3c8ff10d44caf2e91026424"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/csharp/csharp.js",
+ "algorithm": "sha256-lf",
+ "sha256": "d6367d0d67c0612cf37d25319e00cda2e4e38869a3c3200b1bfcd856cfe7fb4b"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/csp/csp.js",
+ "algorithm": "sha256-lf",
+ "sha256": "01241c709a7dddc0b5cedffb6dcf913a5d95c826eb68e2c27f114640719af7df"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/css/css.js",
+ "algorithm": "sha256-lf",
+ "sha256": "1f8468a126f6bfdc43d49a75e0ae758de913ebf55e685165adb6d069a454de5c"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/dart/dart.js",
+ "algorithm": "sha256-lf",
+ "sha256": "6b410bbe17b8ebcaed969bdfcf8049df6fe863482756ae73d2aebb919630034c"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/dockerfile/dockerfile.js",
+ "algorithm": "sha256-lf",
+ "sha256": "315769a72a2877f8ddddf9497a2e7e259e8df51cc38232ddf76fbe4556c0d7cd"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/ecl/ecl.js",
+ "algorithm": "sha256-lf",
+ "sha256": "fc412fe18e564cff17e9a0bcd5674ba15c49f4739417cf589ce1c546b21033a9"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/elixir/elixir.js",
+ "algorithm": "sha256-lf",
+ "sha256": "130d310090d723f51111d573000a72aa26fe44c9d79e6d04d12524e6631cfb6b"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/flow9/flow9.js",
+ "algorithm": "sha256-lf",
+ "sha256": "fafd88d973aed314454cd7d842b270125553f7a7613bb068c3c799a21ac61b64"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/fsharp/fsharp.js",
+ "algorithm": "sha256-lf",
+ "sha256": "32027afd4be75ddeca6c7beb9b52eda07d59afe3ea39a84f0696a6b3d074dcbf"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/go/go.js",
+ "algorithm": "sha256-lf",
+ "sha256": "c93466a4479ee8aa5e3ec70a89b469db1277b801d1551d40ad700d5abd367363"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/graphql/graphql.js",
+ "algorithm": "sha256-lf",
+ "sha256": "60a8825e939ca81540eb6ac00b17867b3e55af97bff99a9fa40c422a4281bdcf"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/handlebars/handlebars.js",
+ "algorithm": "sha256-lf",
+ "sha256": "5a174247aa64c7a064fc977365bb1c7161b4c97e559a6121773188c25df9d9a2"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/hcl/hcl.js",
+ "algorithm": "sha256-lf",
+ "sha256": "6053e90b8aa918c9744f41dcb1c0e58229a4946f0968a39b00776c3893538f54"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/html/html.js",
+ "algorithm": "sha256-lf",
+ "sha256": "6e7ae0ce7f07ec01c64db1368869715c115690e40fb5c183d5ced0d2716038bd"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/ini/ini.js",
+ "algorithm": "sha256-lf",
+ "sha256": "ecdb5c36a38a8b68af6384789c380d0e28b5b3df86de9c3419d348e688b8810e"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/java/java.js",
+ "algorithm": "sha256-lf",
+ "sha256": "8fd9c491b67dfa9ab831ed71a3973cc6ffc840f438f41114a794163672f4cf9c"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/javascript/javascript.js",
+ "algorithm": "sha256-lf",
+ "sha256": "bbd7fb1b714d347704eae4c74cb36c352876864f2103a69af3965f32c1c982c6"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/julia/julia.js",
+ "algorithm": "sha256-lf",
+ "sha256": "ef3783cbb81cee25697c0bddc9476813b593fb64712c21bc60099c8109c748f0"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/kotlin/kotlin.js",
+ "algorithm": "sha256-lf",
+ "sha256": "31b082803acb08622aa2dd736dca42772f6a0d3224fdb7c0e9c3e1f17800ca32"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/less/less.js",
+ "algorithm": "sha256-lf",
+ "sha256": "5ba9296cc5c6a7699028ac6e263631eb9284f80bfbffe99a4429f6c85dfc0589"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/lexon/lexon.js",
+ "algorithm": "sha256-lf",
+ "sha256": "2be27259788a7a4a6fb94a59150b47d169ef6e04933f76977e568c4cb0227f57"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/liquid/liquid.js",
+ "algorithm": "sha256-lf",
+ "sha256": "f4454c09b7e66ab2ffd81451aef2f12c79c0011839e19bcdb0fce42928acce6b"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/lua/lua.js",
+ "algorithm": "sha256-lf",
+ "sha256": "f39154e727c8d3df5c70ecab1737c0a07df3011977288ba4adc7d25c8ef639b5"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/m3/m3.js",
+ "algorithm": "sha256-lf",
+ "sha256": "a3b616444441f34b90b4e06a6a3a845f2804da67220c19721b9461140eb7f074"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/markdown/markdown.js",
+ "algorithm": "sha256-lf",
+ "sha256": "47ae9f567af2e69e682d14703bf4ad5428708464edb3d30791f3255a2863a52e"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/mips/mips.js",
+ "algorithm": "sha256-lf",
+ "sha256": "fcc6104a8c7092794744a1472511cd348d585d1cba0421e61e5eb8e0c58af186"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/msdax/msdax.js",
+ "algorithm": "sha256-lf",
+ "sha256": "f98e43f6600e629bfc354196006a02f9f9cc26480de064cc480e3bc885beb283"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/mysql/mysql.js",
+ "algorithm": "sha256-lf",
+ "sha256": "1cafe5b6c81234fc6680a421dd6290ec590ce03b9e525eacb0936a78ab50aeae"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/objective-c/objective-c.js",
+ "algorithm": "sha256-lf",
+ "sha256": "7cfdb8b492b6f1c5a1d83fefc3bd349bb1acdd489516534aefacd553c2850e75"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/pascal/pascal.js",
+ "algorithm": "sha256-lf",
+ "sha256": "f2886264f5ad42d173ef18e8ea961f674090be7513f48af95dcef4eb1191cac3"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/pascaligo/pascaligo.js",
+ "algorithm": "sha256-lf",
+ "sha256": "3d3317429e0837f6960e33829a2c2fd62119ca1514ad735f62345da8fd1dd817"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/perl/perl.js",
+ "algorithm": "sha256-lf",
+ "sha256": "317b527f0ade315a7cb066eac72672e5f2ba6d0c02c6014be052c32fb6566aed"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/pgsql/pgsql.js",
+ "algorithm": "sha256-lf",
+ "sha256": "f58b4ab8529e311f7f98f690ed39e13de22f3ae29cc8916bf99c21ac86917970"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/php/php.js",
+ "algorithm": "sha256-lf",
+ "sha256": "3d7d187fb2e3b959adfda7b7557ccda4b6f690f838babc525cabffbe0dda7dd0"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/pla/pla.js",
+ "algorithm": "sha256-lf",
+ "sha256": "6138b0b0a1be95370c00afe6eca5022ea10e8b0f11f1db9382163f28975373e6"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/postiats/postiats.js",
+ "algorithm": "sha256-lf",
+ "sha256": "5b18eac81236e88ffca2e67e527fa1d6fb42f53a4df42c1fbeb37312a9ec2fe4"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/powerquery/powerquery.js",
+ "algorithm": "sha256-lf",
+ "sha256": "fb9705793a687b03fe08605f19c3f1019d83cf06394a8381db541bda92e230d4"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/powershell/powershell.js",
+ "algorithm": "sha256-lf",
+ "sha256": "b80339b4a8450fd3a5bb5bf3817fb1b67fe6202690fc1ce97ef22336bcd7053b"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/protobuf/protobuf.js",
+ "algorithm": "sha256-lf",
+ "sha256": "18f13fbd6b421023eec480901e48354d249bc9c3dce9d0e0cc842cbab4393fd3"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/pug/pug.js",
+ "algorithm": "sha256-lf",
+ "sha256": "dbce9bb879b84cf3bf8bd05643a4d3d2ae6ded03b4a9234a0e8d2ebfab6ade44"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/python/python.js",
+ "algorithm": "sha256-lf",
+ "sha256": "b0c9cb9c96d3b289b4ee1bb6ca921e810d87ec2967ebaf8608d5570865ac6524"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/qsharp/qsharp.js",
+ "algorithm": "sha256-lf",
+ "sha256": "6cf9e660e8082f7a8dff4e8041c58c5e9fed1e622e0301b359886a5148c15327"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/r/r.js",
+ "algorithm": "sha256-lf",
+ "sha256": "889684005db07d8b2e8c6f17d54b7bbf1bd67ad948b0b9ca411c2e55ba3433dd"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/razor/razor.js",
+ "algorithm": "sha256-lf",
+ "sha256": "da07ee116d392fbf97f5adc9d4f1fd46e5bbbe9765949c8cb9a6f6a4917ce6cb"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/redis/redis.js",
+ "algorithm": "sha256-lf",
+ "sha256": "286518ee6a7e76356149bebfbcdc19d2d30c19a5fa48d4bfcbf2f7a946783bd0"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/redshift/redshift.js",
+ "algorithm": "sha256-lf",
+ "sha256": "8b865d41e76c227f3e1eb3bc74f8e9cf24627b449cc94164c803c1e515a9bbfd"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/restructuredtext/restructuredtext.js",
+ "algorithm": "sha256-lf",
+ "sha256": "32c72e9b8fa318289b628efee24bc5b573e3f74f8ab7dd544dead1b3545fc351"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/ruby/ruby.js",
+ "algorithm": "sha256-lf",
+ "sha256": "93a9fbda62d9b4ef5537de37d7b4c77a89d8e2b0a2193dddac534ce98da47b5f"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/rust/rust.js",
+ "algorithm": "sha256-lf",
+ "sha256": "6352c16af73494a44e09b5ccad8a61c0369933d94881fcf58a7e8a75a27315cf"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/sb/sb.js",
+ "algorithm": "sha256-lf",
+ "sha256": "7323046d28f72e54b5abda684d4ec67d55b688a0b5e1d23ffe1d675c1c141b69"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/scala/scala.js",
+ "algorithm": "sha256-lf",
+ "sha256": "57309bc0e00edda2c4edb5fd255e042e1ef6ce8d51f51c7e822a74268e04f444"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/scheme/scheme.js",
+ "algorithm": "sha256-lf",
+ "sha256": "3fe89a5618aa1c4eafa5c65aad212fcf2ba34e302de73df7db0867ba01dbd866"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/scss/scss.js",
+ "algorithm": "sha256-lf",
+ "sha256": "b01dfbdbd787642ed55a3ca7b0b89b2edb80e4aa486d89fee0ba748124dad4f9"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/shell/shell.js",
+ "algorithm": "sha256-lf",
+ "sha256": "39063f662fa62eb543e5d8f9b792b31d14c484abafd9a67943dae52fc9f5ce36"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/solidity/solidity.js",
+ "algorithm": "sha256-lf",
+ "sha256": "e25859bb2a1babe193f03028489c95296b1bfe98a92dcb450d4c539661b5a86d"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/sophia/sophia.js",
+ "algorithm": "sha256-lf",
+ "sha256": "4ba061aa0beb82ba64efeb6bd1128da0d3445ac8cfc26d3f4591c66df0fa4bb0"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/sparql/sparql.js",
+ "algorithm": "sha256-lf",
+ "sha256": "162783ddf2dd67384d379ebf485f6ed0cafd820e892e4d89e82c8ba8617390c4"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/sql/sql.js",
+ "algorithm": "sha256-lf",
+ "sha256": "3b1decbf86cb0b163070cc144e826f104ba10468798b36e6d0e64257a35fd1f8"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/st/st.js",
+ "algorithm": "sha256-lf",
+ "sha256": "b3ac35684d5668c2d08105cec31f43e8d897e4ab94103d8bd64ac804d256c20c"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/swift/swift.js",
+ "algorithm": "sha256-lf",
+ "sha256": "288a0ad2974e332bb873bacbb2a284f8f39cdc7d12b1fd5e3c46699147a63633"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/systemverilog/systemverilog.js",
+ "algorithm": "sha256-lf",
+ "sha256": "40b18f15d29e3201142eb02fd5cc5ad690b32386bbe5dc0a874fd68a2f176f41"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/tcl/tcl.js",
+ "algorithm": "sha256-lf",
+ "sha256": "317b63a872ce538d4eef5dae701641670fd3f99dfc0439465d444b2992b69bea"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/twig/twig.js",
+ "algorithm": "sha256-lf",
+ "sha256": "c3442379367d5ef43f1377a14e3c6a04ec451dabb05bed200571ea6dc328dfa0"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/typescript/typescript.js",
+ "algorithm": "sha256-lf",
+ "sha256": "25dd318efd5aada375fdf391c488bd0b5ec0d665ba16e49f1e7968217ad01139"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/vb/vb.js",
+ "algorithm": "sha256-lf",
+ "sha256": "41d3d863c8b955c53eddb8724866a487d3632995114c77c0e9bc416227d148bf"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/xml/xml.js",
+ "algorithm": "sha256-lf",
+ "sha256": "95ddef452d5ff87f5c9f807d56f3f74964727677b5a55baa13a0a4870e2ae850"
+ },
+ {
+ "path": "docs/assets/js/vs/basic-languages/yaml/yaml.js",
+ "algorithm": "sha256-lf",
+ "sha256": "a6ffa854247873af58df3ad550bbdd474b2d8dbc1d1c730fce4e44dfcb5f9b62"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.css",
+ "algorithm": "sha256-lf",
+ "sha256": "6240d544d93236ac40dd3bd1ee49afbd27cb43e056c24c04a0c2cb37f1fd4587"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.js",
+ "algorithm": "sha256-lf",
+ "sha256": "05a50ed50bb013b6e7a82d25686186aa7bdff8b8209c7badab00e046b5e99618"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.de.js",
+ "algorithm": "sha256-lf",
+ "sha256": "e31a518baf29ffce15a27ac80a6b5406ebf21c76657f3344f46c9ac0e6d0c202"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.es.js",
+ "algorithm": "sha256-lf",
+ "sha256": "f86887a1575bc71f035e92eb68b3d4e8c4e351d93f3b98520660933fed984007"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.fr.js",
+ "algorithm": "sha256-lf",
+ "sha256": "673214777e1ba3518abe1bbde8b5250cb18d65257054c8adf9cb5e1e49918d27"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.it.js",
+ "algorithm": "sha256-lf",
+ "sha256": "66df8e46d4aa40b5393489efda7e8aee5ad5589fdf68fef03832e665f0aabc9c"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.ja.js",
+ "algorithm": "sha256-lf",
+ "sha256": "4688d4dfa1ddf91cbfa7005e1110b12f79315706e7d56463c96e8bc688a3d60d"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.js",
+ "algorithm": "sha256-lf",
+ "sha256": "4d4915b0ff284b77938d3be70b9000911554fc451263a7baa594d199ef170a0e"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.ko.js",
+ "algorithm": "sha256-lf",
+ "sha256": "a6d39e2202fa271bfd5e04b83a5265bbe7ef73a945471c9e9fcb65ff8f1a8663"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.ru.js",
+ "algorithm": "sha256-lf",
+ "sha256": "345850b05cc97c0c1978df43ee996a32da7cd33ba1a85be3b6958884a8307040"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.zh-cn.js",
+ "algorithm": "sha256-lf",
+ "sha256": "30ce784d1733d424e221009e097760b813e629d63579bddb62f7a4f229b9011f"
+ },
+ {
+ "path": "docs/assets/js/vs/editor/editor.main.nls.zh-tw.js",
+ "algorithm": "sha256-lf",
+ "sha256": "ab5c148283e9afd0577afb5e522e45c6c2b323a0a12215b71f92155fbf003b74"
+ },
+ {
+ "path": "docs/assets/js/vs/language/css/cssMode.js",
+ "algorithm": "sha256-lf",
+ "sha256": "c0f3a99395d07b421ef75f6eb78389c6ef29477f6a05556f9b94e2bb918dd6c1"
+ },
+ {
+ "path": "docs/assets/js/vs/language/css/cssWorker.js",
+ "algorithm": "sha256-lf",
+ "sha256": "073e09f9301dcf147e40ef675e3f18d8cc29de9f49673ec8d17711569144552d"
+ },
+ {
+ "path": "docs/assets/js/vs/language/html/htmlMode.js",
+ "algorithm": "sha256-lf",
+ "sha256": "91f7b295ddc3b0b679c669b84865f3ace79fdd30bfcd814f2960c06f3e24d600"
+ },
+ {
+ "path": "docs/assets/js/vs/language/html/htmlWorker.js",
+ "algorithm": "sha256-lf",
+ "sha256": "0b14f0af7ae7ab85732574fb384496dae3e85d28f953188cc842eec468a8a457"
+ },
+ {
+ "path": "docs/assets/js/vs/language/json/jsonMode.js",
+ "algorithm": "sha256-lf",
+ "sha256": "9abacb664dcd8564f28ef004465da0f4b3c551b2741424bf42e61c0a26e61adb"
+ },
+ {
+ "path": "docs/assets/js/vs/language/json/jsonWorker.js",
+ "algorithm": "sha256-lf",
+ "sha256": "0eb929c56d44afddb3030c011913010311ce34e5eadb1129a3ce9cbafd4c771d"
+ },
+ {
+ "path": "docs/assets/js/vs/language/typescript/tsMode.js",
+ "algorithm": "sha256-lf",
+ "sha256": "35d94edaf7982c8b59c95cda38c5ebffcf93479ee91a5c9820b9bf60719351c2"
+ },
+ {
+ "path": "docs/assets/js/vs/language/typescript/tsWorker.js",
+ "algorithm": "sha256-lf",
+ "sha256": "95d7d318d3b6076692705bda50f69ccf2981aae6b06f240de5ac642f32970bf4"
+ },
+ {
+ "path": "docs/assets/js/vs/loader.js",
+ "algorithm": "sha256-lf",
+ "sha256": "be92515f6d2cbfc75cd240076246e8ccf6f698269c0402e367d2ee371655bbeb"
+ }
+ ]
+ },
+ {
+ "id": "vconsole",
+ "riskId": "VENDOR-07",
+ "inputs": [
+ "docs/assets/js/vconsole.min.js"
+ ],
+ "owners": [
+ "SITE-01"
+ ],
+ "sourceStatus": "Local header identifies vConsole 3.15.0 and Tencent copyright.",
+ "licenseStatus": "Local header identifies MIT; original tarball correspondence and deployment notices not yet verified.",
+ "upstreamSources": [],
+ "upstreamReviewedAt": null,
+ "updatePolicy": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "fingerprints": [
+ {
+ "path": "docs/assets/js/vconsole.min.js",
+ "algorithm": "sha256-lf",
+ "sha256": "671f47427e1e3048919147c765e9fb71e4ea40d79a8c2829089f499d3e9b9bf4"
+ }
+ ]
+ },
+ {
+ "id": "console-bundle",
+ "riskId": "VENDOR-08",
+ "inputs": [
+ "docs/assets/js/console.js"
+ ],
+ "owners": [
+ "SITE-01"
+ ],
+ "sourceStatus": "Parcel bundle contains console-feed identifiers; originating source/build/dependency versions unresolved.",
+ "licenseStatus": "Root MIT is not sufficient evidence for all bundled components; inventory and notices pending.",
+ "upstreamSources": [],
+ "upstreamReviewedAt": null,
+ "updatePolicy": "Keep separate from owned TS migration. Verify source/version/diff and license notices before replacement; preserve API/CSS/worker URLs and run owning package tests.",
+ "fingerprints": [
+ {
+ "path": "docs/assets/js/console.js",
+ "algorithm": "sha256-lf",
+ "sha256": "e00bbf82bf08c452825690372ded39a9b60f4baf438f0e7ce8300e9bc4629c03"
+ }
+ ]
+ }
+ ],
+ "integrations": [
+ {
+ "id": "hls.js",
+ "riskId": "SDK-01",
+ "owners": [
+ "PKG-HLS-01",
+ "EX-03"
+ ],
+ "sourceFiles": [
+ "packages/artplayer-plugin-hls-control/src/index.js",
+ "docs/assets/example/hls.control.js"
+ ],
+ "contract": "Caller supplies art.hls; homepage demo loads hls.js 1.5.17. Preserve quality/audio selectors and old core integration.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "dash.js",
+ "riskId": "SDK-02",
+ "owners": [
+ "PKG-DASH-01",
+ "EX-03"
+ ],
+ "sourceFiles": [
+ "packages/artplayer-plugin-dash-control/src/index.js",
+ "docs/assets/example/dash.control.js"
+ ],
+ "contract": "Caller supplies art.dash; homepage demo loads dash.js 5.2.1. Preserve representation IDs, Auto/manual and audio topology.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "flv.js",
+ "riskId": "SDK-03",
+ "owners": [
+ "EX-03"
+ ],
+ "sourceFiles": [
+ "docs/assets/example/flv.js"
+ ],
+ "contract": "Demo dependency flv.js 1.6.2; customType playback/teardown must be tested with actual SDK.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "mpegts.js",
+ "riskId": "SDK-04",
+ "owners": [
+ "EX-03"
+ ],
+ "sourceFiles": [
+ "docs/assets/example/mpegts.js"
+ ],
+ "contract": "Demo dependency mpegts.js 1.7.3; actual codec/stream/browser support remains unverified.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "webtorrent",
+ "riskId": "SDK-05",
+ "owners": [
+ "EX-03"
+ ],
+ "sourceFiles": [
+ "docs/assets/example/webtorrent.js"
+ ],
+ "contract": "Demo URL uses webtorrent@1, a moving major selector; preserve caller integration and explicitly capture actual runtime version.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "google-cast",
+ "riskId": "SDK-06",
+ "owners": [
+ "PKG-CAST-01",
+ "PKG-CAST-05"
+ ],
+ "sourceFiles": [
+ "packages/artplayer-plugin-chromecast/src/index.js"
+ ],
+ "contract": "Default remote cast_sender.js?loadCastFramework=1; sdk URL/options and actual Cast device/session behavior require separate validation.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "ima-via-glomex",
+ "riskId": "SDK-07",
+ "owners": [
+ "PKG-VAST-01",
+ "PKG-VAST-05"
+ ],
+ "sourceFiles": [
+ "packages/artplayer-plugin-vast/src/index.js"
+ ],
+ "contract": "@glomex/vast-ima-player loadImaSdk loads external IMA; preserve event/content/ad state and teardown, do not equate mocks with vendor service acceptance.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "mediapipe-tensorflow",
+ "riskId": "SDK-08",
+ "owners": [
+ "PKG-MASK-01",
+ "PKG-MASK-05"
+ ],
+ "sourceFiles": [
+ "packages/artplayer-plugin-danmuku-mask/src/index.js"
+ ],
+ "contract": "Npm dependency versions are separate from unversioned solutionPath CDN assets; keep option override, backend fallback, model result disposal and masks.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "jassub-worker-wasm-fonts",
+ "riskId": "SDK-09",
+ "owners": [
+ "PKG-JASSUB-01",
+ "PKG-JASSUB-05"
+ ],
+ "sourceFiles": [
+ "packages/artplayer-plugin-jassub/src/index.js",
+ "docs/assets/example/jassub.js"
+ ],
+ "contract": "Preserve options pass-through, result.instance and worker/wasm/font URLs. Wrapper, worker and WASM must be a verified compatible set.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "mediabunny",
+ "riskId": "SDK-10",
+ "owners": [
+ "PKG-MB-01",
+ "PKG-MB-09"
+ ],
+ "sourceFiles": [
+ "packages/artplayer-proxy-mediabunny/src/input.js",
+ "packages/artplayer-proxy-mediabunny/package.json"
+ ],
+ "contract": "Preserve native-video-like events, HLS input and topology, codec capability failures and AV sync; actual library/codec environment still requires verification.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "asr-caller-service",
+ "riskId": "SDK-11",
+ "owners": [
+ "PKG-ASR-01",
+ "PKG-ASR-05",
+ "EX-03"
+ ],
+ "sourceFiles": [
+ "packages/artplayer-plugin-asr/src/index.js",
+ "docs/assets/example/asr.js"
+ ],
+ "contract": "Core plugin supplies PCM to caller onAudioChunk. Example fetches an external ASR endpoint and opens its returned WebSocket; not an embedded ASR SDK or a verified service.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ },
+ {
+ "id": "option-validator",
+ "riskId": "SDK-12",
+ "owners": [
+ "CORE-01",
+ "CORE-07"
+ ],
+ "sourceFiles": [
+ "packages/artplayer/src/index.js"
+ ],
+ "contract": "Bundled validation dependency; preserve validation/default/merge behavior and failure cleanup when typing constructor boundaries.",
+ "validationStatus": "Source integration observed; complete real SDK/service/device matrix not yet verified.",
+ "demoPathsSource": "refactor/baselines/demo-inventory.json"
+ }
+ ]
+}