Files
ArtPlayer/refactor/release-ledger.md
T

136 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 逐包发布准入台账
REL-08 建立台账及机械校验,不代表任何包已经可以发布。唯一登记源是
[release-ledger.json](release-ledger.json),覆盖全部22个workspace包。任务状态仍由
[tasks.json](tasks.json)维护,问题和来源继续使用[风险](risks.json)及
[第三方清单](third-party.json)。不要再创建一份手工维护的“已通过”状态表。
## 命令与退出语义
使用固定Node/Yarn,所有命令只读生产文件,不安装、构建、部署或发布:
| 命令 | 行为 |
| --- | --- |
| `yarn check:release-ledger` | 验证登记结构并计算当前缺口;合法台账即退出0,包仍可显示blocked;已加入ci:check |
| `yarn report:release-ledger` | 同样计算,并在新的`.cache/release-ledger-*/report.json`保存报告,不覆盖旧报告 |
| `yarn release:preflight --packages artplayer,artplayer-plugin-chapter` | 严格工具链后检查明确批次;任一包缺证据或不匹配即退出1;遗漏参数检查全部包 |
| `yarn test:release-ledger` | 反向回归,包括过期/错误候选、设备替身、缺失许可和站点输出漂移;同时由test:baseline发现 |
空选择、未知包、重复包会拒绝执行,不能意外通过空批次。普通结构检查通过和严格
准入通过含义不同,CI-03必须使用strict入口,不能使用check的退出0代替发布判断。
即使全部机械条件满足,状态也只叫`evidence-complete`,`publicationAuthorized`
恒为false。三轮复盘仍需实读底层证据;本工具不能判断一份人为编造的报告是否真实,
也不能自动取得设备、执行测试或授权npm发布。
## 分发和版本边界
每行明确记录独立下一major目标,初始依据是package-inventory.json。正式版本占用、
预发布标识和变更日志仍由REL-01/09落实;本步不修改任何包版本。
- 普通npm包使用各自冻结发布记录的name/version/integrity/SHA-256/URL作为历史依据。
core和chapter引用releases.json各自成员;不把工作区版本当作npm版本。
- iframe明确关联旧发布名`artplayer-plugin-iframe`和改名记录。新候选仍核验现有
workspace名`artplayer-tool-iframe`;改名范围、目标可用性和回退演练不能省略。
- Thumbnail工具只有恢复的CDN/Git内容,旧tarball和完整归档缺失。历史分发门槛保持
blocked,不能将缺失CSS/归档解释为从未发布;REL-02 的正式逐包候选验收需要完整、已验证的回退方案。
- artplayer-vitepress按站点构建、URL、编辑器、资源和设备验收。列入版本策略不授权
新增npm发布。站点候选是构建文件清单,不能绑定一个npm tarball冒充站点验收。
历史依据映射不联网刷新,也不代替现有冻结归档验证器、registry检查或回退演练。
每包都有rollback.basis和strategy;严格准入另要求候选绑定的rollback执行报告。
REL-04 完成的是提前演练。REL-02 直接依赖它,并负责正式每批实际候选的逐包回退;
REVIEW-03 复核相同候选内容。早期任务完成不会补齐缺失历史归档或报告,候选版本、
integrity、输入指纹不一致的 rollback 报告仍被拒绝,远端恢复仍受 CI-04 约束。
## 候选绑定
所有初始candidate均为null,evidence为空。先完成目标版本准备和对应实际构建/pack,
在构建快照中计算输入指纹,再登记真实文件;不能只复制当前指纹到旧产物冒充重建。
build报告和REVIEW-03负责审查构建来源及实际内容对应关系。
候选登记字段:
```text
candidate.kind = npm-tarball | site-manifest
candidate.path = 仓库内真实候选文件路径
candidate.version = 已准备的目标版本
candidate.sourceCommit = 实际构建来源的40位Git提交
candidate.inputFingerprint = 构建/验证输入指纹
candidate.integrity = 候选文件实际sha512-base64 SRI
```
npm候选会读取真实tarball并检查路径、重复成员、package.json名称和版本。站点
site-manifest文件包含package、version、outputRoot和files,每个file为path/sha256。
outputRoot必须在仓库内;目录完整文件集须等于files,新增、缺失、替换或符号链接输出
均拒绝。清单SRI和每个实际部署文件字节分别验证;URL正确性仍必须有site-urls报告。
`inputFingerprint`包含本包、其实际依赖闭包,以及共享构建/工具链/测试/CI输入。
依赖来自impact-model的显式关系和源码/声明/manifest扫描;未解释动态导入按全部包
保守处理。站点还包含docs及example。第三方清单、本校验器、兼容/环境/版本/复盘
契约以及固定release/SDK/历史core配置也参与输入指纹;不断新增的普通validation
报告不作为构建输入,避免报告包含自己而无法完成绑定。
文本按明确扩展名和已知文本文件归一CRLF为LF,使Windows/Linux文本签出可以比较;
报告同时保留原始字节SHA-256。字体/WASM/媒体等其他输入不作文本转换,候选SRI、
站点实际输出、报告及其底层附件始终按原始字节校验。指纹不是单独的HEAD比较:
未提交修改也进入计算,无关包源码的变化不使其他依赖闭包失效。共享测试或工程输入
变化则保守地使所有相关候选失效,这是有意避免漏验;不用于省略现有CI检查。
报告包含完整sourceCommit、锁文件哈希、实际Node、配置packageManager、实际Yarn
user-agent、声明工具版本和输入文件表。声明工具版本不是自动证明所有已安装依赖
正确;strict命令先运行现有check:toolchain,并要求真正通过Yarn1.22.22和固定Node执行。
## 必需报告
库的必需门槛:build/runtime/types/combinations/browser/devices/licenses/rollback/
remote-ci/review-01/review-02/review-03。站点用site-urls/site-assets/editor替换库接口
门槛;三轮复盘、真实设备、许可和回退仍然必需。
每个`evidence.<gate>`只登记`{ path, sha256 }`,指向审阅后的标准JSON封套。不能
直接把任意历史validation.json挂入。封套必须包含:
| 字段 | 约束 |
| --- | --- |
| schemaVersion | 1 |
| package/version/gate | 与被验收包、当前版本和门槛精确匹配 |
| candidateIntegrity/inputFingerprint | 与实际候选及当前输入一致 |
| result | pass;未知、失败和skip不能转为通过 |
| checks | 非空`{ id, result, mode }`列表,全部必要项pass;不能通过删除原失败项缩小范围 |
| environment | 实际OS/浏览器/执行环境;设备项须有device、os、browser、emulated:false |
| command/reviewedBy | 实际执行命令及审阅归属,不填计划命令或假身份 |
| artifacts | 非空底层结果`{ path, sha256 }`列表,读取文件验证实际字节 |
devices还必须逐项覆盖该包extraRequirements,所有模式为native;viewport或mock不
能冒充设备/能力通过。remote-ci须有`remote:true`和实际GitHub Actions run URL,
且仍需审阅远端结果附件。URL本身不证明远端成功,本工具不会联网读取它。
licenses须覆盖所有适用vendor、SDK/外部集成及直接运行依赖ID,例如
`dependency:artplayer:option-validator`。哈希只能说明来源字节,不能证明授权;
来源/完整通知和实际bundle、worker、WASM、字体、模型分发的结论必须在附件中审查。
三轮报告不能复用同一封套充数,因为gate字段必须精确匹配。旧任务done或旧报告存在
不自动提供候选证据:历史任务索引会显示,但historicalEvidenceAcceptedForCandidate
恒为false。候选内容、源码、锁文件、共享测试或工程输入变化后,相关封套会失效。
## 任务、风险和批次范围
每包需关闭其依赖闭包的实施/组合/分发任务和共享准备、远端CI、回退及三轮复盘。
风险先按具体包责任定位,只有没有具体包责任的全局风险才扩展全包;例如HLS问题
同时由REVIEW-02负责,不会仅因此直接阻止无关Cast包的局部准备。核心问题通过依赖
闭包影响其消费者。第三方资产使用同样范围映射,未决风险阻止相应批次。
当前共享三轮完整复盘尚未完成,所以任何包都没有发布就绪结论。逐包可独立准备
候选和收集材料,不能借分批删除项目整体要求。未来如正式拆分独立批次复盘,须按
release-reviews.md新建任务和明确范围,并更新本台账模型及反向测试,不能删共享门槛。
## 维护地图
- `scripts/release-ledger-model.mjs`:纯门槛、范围、依赖闭包和阻断计算。
- `scripts/release-ledger.mjs`:只读文件/归档/输入指纹,装配当前报告和CLI。
- `scripts/release-ledger.test.mjs`:合成合格控制与逐项失败反例,真实临时tar/site文件
验证;这些测试不算任何产品包的设备或发布验收。
- `release-ledger.json`:历史分发、目标、能力、回退及候选/证据绑定,初始无候选。
更改门槛先核对兼容、环境、版本和复盘契约;不要把当前红灯改成绿色来证明工具有效。
ci:check只做结构校验,strict红灯是当前产品验收尚未完成的正确结果。