diff --git a/packages/artplayer-vitepress/README.md b/packages/artplayer-vitepress/README.md index 4c092ae89..637b1c0e4 100644 --- a/packages/artplayer-vitepress/README.md +++ b/packages/artplayer-vitepress/README.md @@ -21,7 +21,14 @@ not a VitePress page. Keep both URL surfaces compatible. | `docs/public/style.css` | Documentation presentation | Copied into the built site | Edit Markdown and public sources here. Do not edit the generated repository -`docs/document/`. The current inventory contains 36 Markdown pages: 18 Chinese +HTML directly. After adding a guide, rebuild the site, record its new HTML path +in `refactor/baselines/demo-additions.json` with its owner task and either the known +`introducedBy` commit or the pre-change HEAD as `introducedAfter` for a new page, +and run `node refactor/scripts/demos.mjs --check`. Preserve the frozen BASE-04 +inventory. Also refresh and check the current site inventory; the two inventories +serve different purposes. Neither path check replaces browser navigation tests. + +The generated site lives in `docs/document/`. The current inventory contains 36 Markdown pages: 18 Chinese and 18 English. Danmuku, HLS, DASH, Audio Track and VTT Thumbnail have dedicated guides and navigation in both languages. Other plugins currently use their package README, architecture notes and linked editor examples; navigation links alone are not complete API documentation. diff --git a/refactor/baselines/demo-additions.json b/refactor/baselines/demo-additions.json index 57ec0fc12..b1ac86d4e 100644 --- a/refactor/baselines/demo-additions.json +++ b/refactor/baselines/demo-additions.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, - "note": "Append-only additions to BASE-04. This records path ownership, not browser acceptance; the original 29-example snapshot remains unchanged.", + "note": "Append-only example and HTML additions to BASE-04. Records path ownership and introduction commits, not browser acceptance; the original 29-example/36-HTML snapshot stays unchanged.", "examples": [ { "source": "docs/assets/example/asr.local.js", @@ -10,5 +10,79 @@ "finalDemoOwner": "EX-03", "note": "Local audio capture demo with simulated subtitles; does not contact a recognition service. No menu link. Runtime evidence remains with the owning task." } + ], + "pages": [ + { + "source": "docs/document/en/plugin/audio-track.html", + "route": "/document/en/plugin/audio-track.html", + "introducedBy": "d3349e83f24fdea3fa55fdfa6254cb1587fc5a26", + "owner": "SITE-AUDIO-01", + "finalDemoOwner": "EX-03", + "note": "Generated guide. Guide-specific browser evidence belongs to the owner; this entry does not complete full demo/release acceptance." + }, + { + "source": "docs/document/en/plugin/danmuku.html", + "route": "/document/en/plugin/danmuku.html", + "introducedBy": "ea3174daa28e698af3db2ff36aecf4ef2da54470", + "owner": "SITE-DANMUKU-01", + "finalDemoOwner": "EX-03", + "note": "Generated guide. Guide-specific browser evidence belongs to the owner; this entry does not complete full demo/release acceptance." + }, + { + "source": "docs/document/en/plugin/dash-control.html", + "route": "/document/en/plugin/dash-control.html", + "introducedBy": "319dccb60593f6206418dc04b27b1170767fa716", + "owner": "SITE-DASH-01", + "finalDemoOwner": "EX-03", + "note": "Generated guide. Guide-specific browser evidence belongs to the owner; this entry does not complete full demo/release acceptance." + }, + { + "source": "docs/document/en/plugin/hls-control.html", + "route": "/document/en/plugin/hls-control.html", + "introducedBy": "4ea0ba94ae51d14d353bc57a3222a8c19b11ac66", + "owner": "SITE-HLS-01", + "finalDemoOwner": "EX-03", + "note": "Generated guide. Guide-specific browser evidence belongs to the owner; this entry does not complete full demo/release acceptance." + }, + { + "source": "docs/document/en/plugin/vtt-thumbnail.html", + "route": "/document/en/plugin/vtt-thumbnail.html", + "introducedBy": "9ba3c82f99e6bad0e858f6c2e1d8624dfb725c8c", + "owner": "SITE-VTT-01", + "finalDemoOwner": "EX-03", + "note": "Generated guide. Guide-specific browser evidence belongs to the owner; this entry does not complete full demo/release acceptance." + }, + { + "source": "docs/document/plugin/audio-track.html", + "route": "/document/plugin/audio-track.html", + "introducedBy": "d3349e83f24fdea3fa55fdfa6254cb1587fc5a26", + "owner": "SITE-AUDIO-01", + "finalDemoOwner": "EX-03", + "note": "Generated guide. Guide-specific browser evidence belongs to the owner; this entry does not complete full demo/release acceptance." + }, + { + "source": "docs/document/plugin/dash-control.html", + "route": "/document/plugin/dash-control.html", + "introducedBy": "319dccb60593f6206418dc04b27b1170767fa716", + "owner": "SITE-DASH-01", + "finalDemoOwner": "EX-03", + "note": "Generated guide. Guide-specific browser evidence belongs to the owner; this entry does not complete full demo/release acceptance." + }, + { + "source": "docs/document/plugin/hls-control.html", + "route": "/document/plugin/hls-control.html", + "introducedBy": "4ea0ba94ae51d14d353bc57a3222a8c19b11ac66", + "owner": "SITE-HLS-01", + "finalDemoOwner": "EX-03", + "note": "Generated guide. Guide-specific browser evidence belongs to the owner; this entry does not complete full demo/release acceptance." + }, + { + "source": "docs/document/plugin/vtt-thumbnail.html", + "route": "/document/plugin/vtt-thumbnail.html", + "introducedBy": "9ba3c82f99e6bad0e858f6c2e1d8624dfb725c8c", + "owner": "SITE-VTT-01", + "finalDemoOwner": "EX-03", + "note": "Generated guide. Guide-specific browser evidence belongs to the owner; this entry does not complete full demo/release acceptance." + } ] } diff --git a/refactor/baselines/site-routes-validation.json b/refactor/baselines/site-routes-validation.json new file mode 100644 index 000000000..a58cb147a --- /dev/null +++ b/refactor/baselines/site-routes-validation.json @@ -0,0 +1,335 @@ +{ + "task": "SITE-ROUTES-01", + "baselineCommit": "876fa4c32882c8ae27ed15d1bc8507ae75d55eae", + "environment": { + "node": "24.21.0", + "yarn": "1.22.22", + "typescript": "5.9.3", + "platform": "Windows" + }, + "scope": "Full local ci:check on the existing installation, before failure and after route-ledger repair. No new installation, ci:build, coverage, browser matrix, remote job or release acceptance.", + "before": { + "exitCode": 1, + "path": "refactor/.cache/ci-check-876fa4c3.log", + "sha256": "b463f7d7c04cfc5b23ea2504a622300063c219ff384991a14b666f90081650bd", + "tests": [ + 2937, + 170, + 618 + ], + "passed": [ + 2937, + 170, + 617 + ], + "failed": [ + 0, + 0, + 1 + ], + "skipped": [ + 0, + 0, + 0 + ], + "canceled": [ + 0, + 0, + 0 + ], + "todo": [ + 0, + 0, + 0 + ], + "durationsMs": [ + 59471.0185, + 24736.7005, + 139417.8916 + ] + }, + "after": { + "exitCode": 0, + "path": "refactor/.cache/ci-check-site-routes-final.log", + "sha256": "351243244c4415ebb1b6a1cafb0e7b5e7428e73c707faeb365afe33da431c592", + "tests": [ + 2937, + 170, + 619 + ], + "passed": [ + 2937, + 170, + 619 + ], + "failed": [ + 0, + 0, + 0 + ], + "skipped": [ + 0, + 0, + 0 + ], + "canceled": [ + 0, + 0, + 0 + ], + "todo": [ + 0, + 0, + 0 + ], + "durationsMs": [ + 48705.6332, + 24768.6579, + 159316.7625 + ], + "finalYarnSeconds": 476.52 + }, + "targetedBefore": { + "path": "refactor/.cache/site-routes-before.log", + "sha256": "06f1c24bd2ad95bd67236030d2bd08ebc35ae61aca2e52adae7386b014795fc4", + "tests": [ + 3 + ], + "passed": [ + 0 + ], + "failed": [ + 3 + ], + "skipped": [ + 0 + ], + "canceled": [ + 0 + ], + "todo": [ + 0 + ], + "durationsMs": [ + 127.1716 + ] + }, + "targetedAfter": { + "path": "refactor/.cache/site-routes-after.log", + "sha256": "931b7025249bb7e151c3ff9d04651a799e884b74c5fa1c8f5a993ebd1bed9d49", + "tests": [ + 3 + ], + "passed": [ + 3 + ], + "failed": [ + 0 + ], + "skipped": [ + 0 + ], + "canceled": [ + 0 + ], + "todo": [ + 0 + ], + "durationsMs": [ + 153.284 + ] + }, + "lint": { + "path": "refactor/.cache/site-routes-lint.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "files": [ + { + "path": "refactor/baselines/demo-inventory.json", + "sha256": "ffbb50e14dc008819b3674802aa26fac5643ea78205103d25d268dece8bafb61" + }, + { + "path": "refactor/baselines/demo-additions.json", + "sha256": "6c2027bd0a035704ac6c13790bc3e2719a9a621ca19f1509216b4868b1a289da" + }, + { + "path": "refactor/scripts/demos.mjs", + "sha256": "4e63262e1b3a173148c775222e5f0494f270ca97bf216ae51754105c0d014053" + }, + { + "path": "refactor/scripts/demos.test.mjs", + "sha256": "f0e549b9072b506ef65f2869a684b89d4130cf912b8a3583b125a785a49b305b" + }, + { + "path": "refactor/docs-browser-testing.md", + "sha256": "d458d87bcc5f58930a14a4d189b9aff27f04dd8c614049874d76e9b725cc53b7" + }, + { + "path": "packages/artplayer-vitepress/README.md", + "sha256": "8457b4d12991646648a925dc1cc1674895801ec8f03891450feca923aeb7413f" + } + ], + "historicalInventoryUnchanged": true, + "introductions": [ + { + "source": "docs/document/en/plugin/audio-track.html", + "commit": "d3349e83f24fdea3fa55fdfa6254cb1587fc5a26", + "parentContainsPath": false, + "addedByCommit": true + }, + { + "source": "docs/document/en/plugin/danmuku.html", + "commit": "ea3174daa28e698af3db2ff36aecf4ef2da54470", + "parentContainsPath": false, + "addedByCommit": true + }, + { + "source": "docs/document/en/plugin/dash-control.html", + "commit": "319dccb60593f6206418dc04b27b1170767fa716", + "parentContainsPath": false, + "addedByCommit": true + }, + { + "source": "docs/document/en/plugin/hls-control.html", + "commit": "4ea0ba94ae51d14d353bc57a3222a8c19b11ac66", + "parentContainsPath": false, + "addedByCommit": true + }, + { + "source": "docs/document/en/plugin/vtt-thumbnail.html", + "commit": "9ba3c82f99e6bad0e858f6c2e1d8624dfb725c8c", + "parentContainsPath": false, + "addedByCommit": true + }, + { + "source": "docs/document/plugin/audio-track.html", + "commit": "d3349e83f24fdea3fa55fdfa6254cb1587fc5a26", + "parentContainsPath": false, + "addedByCommit": true + }, + { + "source": "docs/document/plugin/dash-control.html", + "commit": "319dccb60593f6206418dc04b27b1170767fa716", + "parentContainsPath": false, + "addedByCommit": true + }, + { + "source": "docs/document/plugin/hls-control.html", + "commit": "4ea0ba94ae51d14d353bc57a3222a8c19b11ac66", + "parentContainsPath": false, + "addedByCommit": true + }, + { + "source": "docs/document/plugin/vtt-thumbnail.html", + "commit": "9ba3c82f99e6bad0e858f6c2e1d8624dfb725c8c", + "parentContainsPath": false, + "addedByCommit": true + } + ], + "totals": { + "historicalExamples": 29, + "addedExamples": 1, + "historicalHtml": 36, + "addedHtml": 9, + "packages": 22 + }, + "checks": [ + "yarn check:toolchain --strict", + "yarn check:commits --report", + "yarn check:impact --report", + "yarn check:ci", + "yarn test:contracts", + "yarn check:contracts --report", + "yarn check:plan", + "yarn check:release-ledger", + "yarn typecheck:release", + "yarn check:rollback-inventory", + "yarn lint", + "yarn typecheck:library", + "yarn typecheck:scaffold", + "yarn typecheck:docs-tools", + "yarn check:docs-smoke", + "yarn check:editor-types", + "yarn check:llm", + "yarn check:vconsole", + "yarn check:console", + "yarn check:site-notices", + "yarn typecheck:site-assets", + "yarn check:site-assets", + "yarn check:types", + "yarn typecheck", + "yarn typecheck:react", + "yarn lint:react", + "yarn typecheck:vue", + "yarn lint:vue", + "yarn test" + ], + "branchImpact": { + "path": "refactor/.cache/ci-check-876fa4c3-branch-impact.json", + "sha256": "3ef8de607e99b1438edb0ef2aaf3aa47b536803e4772b8fcea939c461e75b62a", + "capturedBeforeFix": true, + "range": "explicit-base", + "head": "876fa4c32882c8ae27ed15d1bc8507ae75d55eae", + "base": "40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f", + "changedPaths": 3288, + "affectedPackages": [ + "artplayer", + "artplayer-plugin-ads", + "artplayer-plugin-ambilight", + "artplayer-plugin-asr", + "artplayer-plugin-audio-track", + "artplayer-plugin-auto-thumbnail", + "artplayer-plugin-chapter", + "artplayer-plugin-chromecast", + "artplayer-plugin-danmuku", + "artplayer-plugin-danmuku-mask", + "artplayer-plugin-dash-control", + "artplayer-plugin-document-pip", + "artplayer-plugin-hls-control", + "artplayer-plugin-jassub", + "artplayer-plugin-multiple-subtitles", + "artplayer-plugin-vast", + "artplayer-plugin-vtt-thumbnail", + "artplayer-proxy-canvas", + "artplayer-proxy-mediabunny", + "artplayer-tool-iframe", + "artplayer-tool-thumbnail", + "artplayer-vitepress" + ], + "requiredCIJobs": [ + "browser-consumers", + "browser-smoke", + "checks", + "coverage" + ], + "reviewRequired": true, + "unknownPathCount": 650, + "installedConsumerGaps": [ + "artplayer-plugin-ads", + "artplayer-plugin-ambilight", + "artplayer-plugin-asr", + "artplayer-plugin-audio-track", + "artplayer-plugin-auto-thumbnail", + "artplayer-plugin-chromecast", + "artplayer-plugin-danmuku", + "artplayer-plugin-danmuku-mask", + "artplayer-plugin-dash-control", + "artplayer-plugin-document-pip", + "artplayer-plugin-hls-control", + "artplayer-plugin-jassub", + "artplayer-plugin-multiple-subtitles", + "artplayer-plugin-vast", + "artplayer-plugin-vtt-thumbnail", + "artplayer-proxy-canvas", + "artplayer-proxy-mediabunny", + "artplayer-tool-iframe", + "artplayer-tool-thumbnail" + ] + }, + "limitations": [ + "Historical baseline tests deliberately reproduce old defects; passing them does not mean old artifacts are fixed.", + "introducedBy/introducedAfter format is validated, but normal checker does not perform Git provenance verification; the nine current entries were verified separately.", + "No runtime or generated site content changed; existing guide browser evidence remains with its original task.", + "Full CI/CD, generic installed consumers, physical devices and publication remain pending." + ] +} diff --git a/refactor/changes/2026-09-15-SITE-ROUTES-01-html-inventory.md b/refactor/changes/2026-09-15-SITE-ROUTES-01-html-inventory.md new file mode 100644 index 000000000..98b2cd599 --- /dev/null +++ b/refactor/changes/2026-09-15-SITE-ROUTES-01-html-inventory.md @@ -0,0 +1,73 @@ +# SITE-ROUTES-01:新增 HTML 路径登记与完整本地 CI + +基线 `876fa4c32882c8ae27ed15d1bc8507ae75d55eae`,本轮先在干净工作区运行完整 +`yarn ci:check`,再修复真实失败并完整重跑。 + +## 失败与修复 + +首轮运行时单元2937项、工程/文档170项通过,最后的历史基线618项中617通过、 +1失败。demos.test.mjs 检查发现当前45个HTML比BASE-04冻结的36个多了九个。 +SITE-DANMUKU/HLS/DASH/AUDIO/VTT的指南工作更新了当前site-inventory,却没有 +同步历史demo台账的增量;此前增量机制只支持JS示例。 + +保持demo-inventory.json的历史内容、指纹和36个路径完全不变,在demo-additions.json +增加pages数组,登记EN Danmuku一页及HLS/DASH/Audio/VTT各两页。每条包含实际路径、 +路由、责任任务、EX-03最终责任和引入依据。逐一用Git核实九个introducedBy提交确实 +新增对应HTML,且其父提交不存在该路径;没有随意填一个能读取文件的后续commit。 + +校验将历史与增量合并后对照实际HTML集合,继续拒绝漏项和删除,额外拒绝重复路径、 +越界路径、错误route、未知task或最终责任、缺少/歧义的引入依据。不使用自动重拍 +快照、忽略新页面、只检查历史集合子集等方式消除失败。 + +新页面同次提交无法包含自己的未来Git哈希,因此新增记录也可用introducedAfter +注明修改前HEAD,配合owner跟踪后续提交;与introducedBy二选一。该字段只是起点, +不冒充实际引入commit。两种引用均检查40位哈希格式;日常校验不自动核实Git语义, +登记时的人工/工具审查仍必要。本次九条全部使用已核实的introducedBy。 + +强化测试:已有增量负例先要求原数据验证通过,避免由于无关HTML漂移使全部 +assert.throws假通过。新增HTML用例覆盖正例、introducedAfter及八类无效元数据。 +改动前针对三个测试全失败,修改后三个测试全部通过。 + +维护方式写入docs-browser-testing.md与VitePress README;没有改播放器、插件、 +公开类型、页面内容、媒体或已验证浏览器交互,也没有新增依赖或重建站点。 + +## 完整验证 + +Node24.21.0 / Yarn Classic1.22.22 / TypeScript5.9.3 / Windows。 +最终完整ci:check退出0,用时476.52秒。 + +| 阶段 | 最终结果 | +| --- | --- | +| 运行时单元集合 | 2937 pass / 0 fail | +| 工程与文档集合 | 170 pass / 0 fail | +| 历史基线集合 | 619 pass / 0 fail | +| 全部上述集合 | 无skip、cancel或todo;这些是执行次数,不声明互不重复的契约数量 | +| 生产TS检查 | 416个文件;不把未迁移JS计入TS数量 | +| 消费者类型 | TS5.9.3的node10-commonjs、nodenext-cjs、bundler-esm、nodenext-esm及TS4.3.5的node10-commonjs通过 | +| React/Vue | 类型与lint通过 | +| 其余串联检查 | 工具链、提交、影响映射、CI规则、契约、计划、发布台账、回退清单、lint、生成声明/编辑器/文档/许可产物等通过 | +| 定向台账回归与lint | 3项通过、lint退出0 | + +完整命令会在任一子命令失败时停止;保留首轮非零日志和最终日志,未删失败测试或 +放宽超时。最终运行期间没有修改测试与校验实现。完成状态和本记录在通过后登记, +再执行最终计划/风险校验及提交审计。 + +另外从重构起点40fcda6到本轮基线做了明确Git范围的影响分析:3288路径、22包, +四个必需CI作业全部保留,650个未分类路径保守触发全包审查。此分析是在修复前 +干净HEAD上取得;本地ci:check默认worktree报告为零变化,不能用它代表分支无影响。 +通用隔离Node/类型消费者仍只覆盖core/chapter,影响模型明确列出19个库包缺口。 +这些限制不因本地ci:check通过而消失。 + +本次不是新冻结安装,也没有执行ci:build、coverage、完整浏览器矩阵、实际新tarball +消费或远端GitHub Actions。CI-01继续doing;设备/SDK/原生像素问题及三轮发布复盘 +仍按原任务处理,不能把本次检查当成完整CI/CD或npm发布准入完成。 + +完整输入哈希、阶段统计、Git引入核实及原/最终日志见 +[site-routes-validation.json](../baselines/site-routes-validation.json)。 + +## 状态与回退 + +SITE-ROUTES-01完成,SITE-04保留原依赖并追加该子任务;关闭SITE-HTML-INVENTORY-01。 +当前213 done / 21 doing / 43 todo,共277。没有改变版本、依赖或锁文件;没有push、 +部署或发布。回退该独立提交将恢复原校验器和增量文件,但九条文档路径仍存在, +因此旧的HTML覆盖失败也会恢复;冻结的BASE-04快照始终不变。 diff --git a/refactor/docs-browser-testing.md b/refactor/docs-browser-testing.md index 49303dc5c..13963ee2a 100644 --- a/refactor/docs-browser-testing.md +++ b/refactor/docs-browser-testing.md @@ -60,4 +60,16 @@ IFRAME-05 的 `yarn test:iframe-history` 使用8085的独立缓存页面及完 [完整路径台账](baselines/demo-inventory.json) 已覆盖 29 个示例、36 个 HTML 和 22 包,包括生成文档、独立 upscaler 与站点验证页面。源脚本/菜单参数与 editor prod/ts/code/log 规则已有记录;这些官方入口尚未运行,运行时实际存储值和网络来源仍待 EX-03 采集。 +以上是冻结的 BASE-04 快照。新增页面和示例应写入 +[增量台账](baselines/demo-additions.json),不得重拍历史快照来消除覆盖失败。 +当前增量包含 asr.local 示例和九个生成文档 HTML,合计30示例、45 HTML。 +每个新增HTML登记 source、对应route、引入依据、责任task和finalDemoOwner。 +已提交页面用introducedBy记录实际引入commit;与页面同次提交的新记录用introducedAfter +记录修改前的HEAD,配合owner任务追踪引入,避免要求提交包含自身未来的Git哈希。 +两字段只能选一项;introducedAfter只是起点,不代表实际引入commit已确定。 +运行 `node refactor/scripts/demos.mjs --check` 以及 `node --test refactor/scripts/demos.test.mjs`; +校验保留所有历史路径,并拒绝未登记、重复、越界或缺少责任的新增页面。 +提交来源在登记时用Git核实;校验器检查提交ID格式,不把它当作已完成语义审查。 +各指南的实际浏览器结果保留在各自任务证据中;路径登记本身不新增浏览器通过结论。 + 独立发布包夹具的 DOM/CSS、Tab/热键、设置与网页全屏已在内置浏览器两次实测,见 [覆盖及问题](baselines/dom-coverage.md)。它没有运行 Monaco,不代表编辑器 Run 或官方 chapter demo 通过。thumbnail 无菜单示例依赖不在当前 workspace 的旧插件,已交 SITE-01/EX-03 核实。 diff --git a/refactor/plan.md b/refactor/plan.md index 4627578bc..f0712597e 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -2,9 +2,9 @@ > 由 tasks.json 生成。请修改数据后运行 `node refactor/scripts/plan.mjs --write`,不要手改本表。 -基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 276 项,范围 22 个包及工作区/示例。 +基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 277 项,范围 22 个包及工作区/示例。 -状态:todo 43 / doing 21 / blocked 0 / done 212 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 +状态:todo 43 / doing 21 / blocked 0 / done 213 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。 @@ -35,7 +35,7 @@ | artplayer-proxy-mediabunny | 1.2.0 | PKG-MB-01, PKG-MB-02, PKG-MB-03, PKG-MB-04, PKG-MB-05, PKG-MB-06, PKG-MB-07, PKG-MB-08, PKG-MB-09, PKG-MB-10 | | artplayer-tool-iframe | 1.1.0 | PKG-IFRAME-01, PKG-IFRAME-02, PKG-IFRAME-03, PKG-IFRAME-04, PKG-IFRAME-05, PKG-IFRAME-06 | | artplayer-tool-thumbnail | 4.4.0 | PKG-TOOL-THUMB-01, PKG-TOOL-THUMB-02, PKG-TOOL-THUMB-03, PKG-TOOL-THUMB-04, PKG-TOOL-THUMB-05, PKG-TOOL-THUMB-06, PKG-TOOL-THUMB-07 | -| artplayer-vitepress | 1.1.0 | SITE-01, SITE-SMOKE-01, SITE-02, SITE-LOAD-01, SITE-AI-DOCS-01, SITE-BUILD-01, SITE-03, SITE-DANMUKU-01, SITE-HLS-01, SITE-DASH-01, SITE-04, SITE-05, SITE-06, SITE-07, SITE-VCONSOLE-01, ENG-LINT-02, SITE-CONSOLE-01, SITE-AUDIO-01, SITE-VTT-01 | +| artplayer-vitepress | 1.1.0 | SITE-01, SITE-SMOKE-01, SITE-02, SITE-LOAD-01, SITE-AI-DOCS-01, SITE-BUILD-01, SITE-03, SITE-DANMUKU-01, SITE-HLS-01, SITE-DASH-01, SITE-04, SITE-05, SITE-06, SITE-07, SITE-VCONSOLE-01, ENG-LINT-02, SITE-CONSOLE-01, SITE-AUDIO-01, SITE-VTT-01, SITE-ROUTES-01 | ## 0 规划 @@ -409,7 +409,7 @@ | SITE-BUILD-01 | artplayer, artplayer-vitepress, workspace
重构 i18n 与文档构建的暂存、替换和 Yarn 编排 | SITE-AI-DOCS-01 | 严格 TS 构建模块、编译后替换产物与失败回退,固定 Yarn 子进程和旧构建入口 | 旧 i18n 删除后失败有复现;失败不改变既有产物;语言集合、UMD/ESM/历史别名兼容;文档子进程退出码准确并完成真实 VitePress 构建;不隐式翻译、不修改播放器 API | M | done | | SITE-03 | artplayer-vitepress
整理 i18n/文档/LLM 生成流程 | SITE-02, SITE-LOAD-01, SITE-AI-DOCS-01, SITE-BUILD-01 | build-i18n/build-docs/build-llm/trans-docs 的任务边界和错误处理;桌面 common.js 自有 UI 的 TS 迁移与模块拆分 | 原命令兼容、生成可复现,翻译步骤不隐式运行远程服务;覆盖移动 loader 失败恢复 define、脚本依赖顺序、localhost/127.0.0.1 Run Code 目标和语言重定向;桌面剩余 UI 完成 TS 职责拆分并回归运行、导入与持久设置 | M | done | | SITE-DANMUKU-01 | artplayer-vitepress, artplayer-plugin-danmuku
核对弹幕双语指南并补齐英文入口 | SITE-03, PKG-DANMUKU-07 | 按实现修正中文调用说明,新增英文完整选项/API/热力图/类型指南和导航;同步生成站点与LLM资料,新增双语示例浏览器验收 | 旧中文URL和标题保留;实际方法返回、加载语义、回调与points边界准确;双语页面、Run Code及示例实测,完整插件组合和设备验收不冒充完成 | L | done | -| 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, SITE-DANMUKU-01, SITE-HLS-01, SITE-DASH-01, SITE-AUDIO-01, SITE-VTT-01 | 已随实现更新的中文/英文 API、包内实现地图、旧 JS 示例及已知能力限制的全包核对 | 未把缺环境的能力写成已验证,静态核对不等待设备任务;最终 demo 仍由 EX-03 验收;按 SITE-01 声明成员/候选标题清单逐项语义核对,补齐缺失的双语插件说明和 Danmuku 英文入口 | 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, SITE-DANMUKU-01, SITE-HLS-01, SITE-DASH-01, SITE-AUDIO-01, SITE-VTT-01, SITE-ROUTES-01 | 已随实现更新的中文/英文 API、包内实现地图、旧 JS 示例及已知能力限制的全包核对 | 未把缺环境的能力写成已验证,静态核对不等待设备任务;最终 demo 仍由 EX-03 验收;按 SITE-01 声明成员/候选标题清单逐项语义核对,补齐缺失的双语插件说明和 Danmuku 英文入口 | M | todo | | SITE-05 | artplayer-vitepress
构建文档站和验证链接/示例 | SITE-04, EX-01, EX-02, SITE-07, SITE-VCONSOLE-01, SITE-CONSOLE-01 | VitePress 构建、链接与嵌入 demo 检查 | 文档构建、链接、嵌入路径与声明注入通过;真实完整 demo 保留 EX-03 独立门槛;核对 ENG-PM-01 登记的搜索 peer 范围和真实搜索行为 | M | todo | | SITE-06 | artplayer-vitepress
文档站交付验收 | SITE-05 | 维护指南和站点变更记录 | 未手改 generated 目录,旧 URL 可用、部署与检查分离 | M | todo | | SITE-07 | artplayer-vitepress, workspace
整理站点第三方资产与来源说明 | SITE-01 | Monaco/vConsole/console bundle/字体和样本的冻结来源、可复现构建或替代与站点 notices | 接续 SITE-01 的字节与换行差异证据;完整许可随实际分发,consoleLog/global/CSS/worker 与旧 URL 兼容;缺字体/媒体使用依据明确处置;资产变更后执行编辑器/移动/字幕/示例回归,不以来源指纹替代授权或运行证据 | H | doing | @@ -418,6 +418,7 @@ | EX-03 | workspace
验证全部原生 demo 与外部播放集成 | EX-01, EX-02, PKG-CHAPTER-06, PKG-AMBILIGHT-06, PKG-AUDIO-06, PKG-AUTO-THUMB-06, PKG-VTT-THUMB-06, PKG-HLS-06, PKG-DASH-06, PKG-MULTI-SUB-06, PKG-JASSUB-06, PKG-MASK-06, PKG-ASR-06, PKG-ADS-06, PKG-VAST-06, PKG-CAST-06, PKG-DPIP-06, PKG-DANMUKU-09, PKG-CANVAS-06, PKG-MB-10, PKG-IFRAME-06, PKG-TOOL-THUMB-06 | 8082 全 demo、HLS/DASH/FLV/MPEGTS/WebTorrent 集成记录 | 旧 URL/参数/脚本加载保持;网络/SDK 限制明确,不静默跳过;覆盖编辑器重复 Run 和 ESM/i18n/mobile/iframe,记录实际候选脚本及状态隔离证据;依据 BASE-04 路径台账逐项消除 not-run,处理 BASE-DEMO-01 | H | todo | | SITE-VCONSOLE-01 | artplayer-vitepress, workspace
修复 vConsole 日志帧与延迟面板销毁竞态 | SITE-01 | 冻结上游 bundle 的可复现 TS 生命周期补丁、旧红新绿回归、来源及生成检查;销毁后虚拟列表布局续段停止 | 最后日志插件移除后取消 RAF 并隔离旧队列;延迟面板不得写入已销毁或替换插件;三引擎移动页与 UMD 入口通过,维护声明与原有许可缺口分别记录;原生 ResizeObserver 布局与挂起 timer 旧红新绿 | M | done | | SITE-CONSOLE-01 | artplayer-vitepress, workspace
迁移控制台自有 TS 源码并修复日志生命周期 | SITE-03 | 从冻结 console.js 恢复自有入口/视图的 TS 模块、受控第三方边界与可验证构建;修复滚动回调、多容器 hook 所有权和原生 Error 消息丢失 | 保留 consoleLog 返回组件、React/ReactDOM/Parcel 全局及 DOM/CSS/日志对象语义;旧版复现与候选正确行为分开验证;多容器、卸载/重挂、外部 hook、错误/滚动及真实编辑器组合通过;架构与生成文档同批更新,不以冻结 vendor 代替 SITE-07 许可闭环 | H | done | +| SITE-ROUTES-01 | artplayer-vitepress, workspace
将新增文档HTML纳入保留历史的路径覆盖台账 | BASE-04, SITE-03 | 不覆盖BASE-04的HTML增量台账、准确路由/责任校验及完整CI证据 | 复现完整ci:check的路径覆盖失败;新页面必须显式登记,拒绝漏项/重复/错误路由/越界/缺任务和提交,保留旧页面保护及浏览器验收边界 | M | done | ## 6 文档和示例 @@ -532,7 +533,7 @@ - ENG-09: [记录](changes/2026-09-12-ENG-09-integration.md) [记录](baselines/engineering-integration.json) - ENG-10: [记录](changes/2026-09-10-ENG-10-test-reliability.md) [记录](test-reliability.md) - ENG-11: [记录](build-analysis.md) [记录](baselines/bundle-attribution.json) [记录](changes/2026-09-11-ENG-11-build-analysis.md) -- CI-01: [记录](ci-setup.md) [记录](changes/2026-09-13-CI-01-matrix-summary.md) [记录](baselines/ci-matrix-validation.json) [记录](changes/2026-09-13-CI-01-node-consumers.md) [记录](baselines/node-consumer-validation.json) [记录](changes/2026-09-14-CI-01-installed-full.md) [记录](baselines/ci-installed-full-validation.json) [记录](changes/2026-09-14-CI-01-source-chromium.md) [记录](baselines/ci-source-chromium-validation.json) [记录](changes/2026-09-15-CI-01-ads-installed.md) [记录](baselines/ci-ads-installed-validation.json) [记录](changes/2026-09-15-CI-01-subtitles-installed.md) [记录](baselines/ci-subtitles-installed-validation.json) [记录](changes/2026-09-15-CI-01-adaptive-installed.md) [记录](baselines/ci-adaptive-installed-validation.json) [记录](changes/2026-09-15-CI-01-asr-cast-installed.md) [记录](baselines/ci-asr-cast-installed-validation.json) [记录](changes/2026-09-15-CI-01-mediabunny-installed.md) [记录](baselines/ci-mediabunny-installed-validation.json) [记录](changes/2026-09-15-CI-01-jassub-installed.md) [记录](baselines/ci-jassub-installed-validation.json) [记录](changes/2026-09-15-CI-01-danmuku-installed.md) [记录](baselines/ci-danmuku-installed-validation.json) [记录](changes/2026-09-15-CI-01-browser-matrix.md) [记录](baselines/ci-browser-matrix-validation.json) [记录](changes/2026-09-15-CI-01-iframe-installed.md) [记录](baselines/ci-iframe-installed-validation.json) [记录](changes/2026-09-15-CI-01-vast-installed.md) [记录](baselines/ci-vast-installed-validation.json) [记录](changes/2026-09-15-CI-01-rendering-policy.md) [记录](baselines/ci-rendering-policy-validation.json) +- CI-01: [记录](ci-setup.md) [记录](changes/2026-09-13-CI-01-matrix-summary.md) [记录](baselines/ci-matrix-validation.json) [记录](changes/2026-09-13-CI-01-node-consumers.md) [记录](baselines/node-consumer-validation.json) [记录](changes/2026-09-14-CI-01-installed-full.md) [记录](baselines/ci-installed-full-validation.json) [记录](changes/2026-09-14-CI-01-source-chromium.md) [记录](baselines/ci-source-chromium-validation.json) [记录](changes/2026-09-15-CI-01-ads-installed.md) [记录](baselines/ci-ads-installed-validation.json) [记录](changes/2026-09-15-CI-01-subtitles-installed.md) [记录](baselines/ci-subtitles-installed-validation.json) [记录](changes/2026-09-15-CI-01-adaptive-installed.md) [记录](baselines/ci-adaptive-installed-validation.json) [记录](changes/2026-09-15-CI-01-asr-cast-installed.md) [记录](baselines/ci-asr-cast-installed-validation.json) [记录](changes/2026-09-15-CI-01-mediabunny-installed.md) [记录](baselines/ci-mediabunny-installed-validation.json) [记录](changes/2026-09-15-CI-01-jassub-installed.md) [记录](baselines/ci-jassub-installed-validation.json) [记录](changes/2026-09-15-CI-01-danmuku-installed.md) [记录](baselines/ci-danmuku-installed-validation.json) [记录](changes/2026-09-15-CI-01-browser-matrix.md) [记录](baselines/ci-browser-matrix-validation.json) [记录](changes/2026-09-15-CI-01-iframe-installed.md) [记录](baselines/ci-iframe-installed-validation.json) [记录](changes/2026-09-15-CI-01-vast-installed.md) [记录](baselines/ci-vast-installed-validation.json) [记录](changes/2026-09-15-CI-01-rendering-policy.md) [记录](baselines/ci-rendering-policy-validation.json) [记录](changes/2026-09-15-SITE-ROUTES-01-html-inventory.md) [记录](baselines/site-routes-validation.json) - CI-02: [记录](changes/2026-09-14-CI-02-pages-artifact.md) [记录](baselines/pages-artifact-validation.json) [记录](pages-deployment.md) - PILOT-01: [记录](changes/2026-09-10-PILOT-01-chapter.md) [记录](baselines/pilot-validation.json) - CORE-01: [记录](changes/2026-09-10-CORE-01-typed-utils.md) [记录](baselines/core-utils-validation.json) @@ -728,3 +729,4 @@ - SITE-AUDIO-01: [记录](changes/2026-09-15-SITE-AUDIO-01-guides.md) [记录](baselines/audio-docs-validation.json) - SITE-VTT-01: [记录](changes/2026-09-15-SITE-VTT-01-guides.md) [记录](baselines/vtt-docs-validation.json) - PKG-AUTO-THUMB-13: [记录](changes/2026-09-15-PKG-AUTO-THUMB-13-registration.md) [记录](baselines/auto-thumbnail-registration-validation.json) +- SITE-ROUTES-01: [记录](changes/2026-09-15-SITE-ROUTES-01-html-inventory.md) [记录](baselines/site-routes-validation.json) diff --git a/refactor/progress.md b/refactor/progress.md index fe809efd2..fe8675d41 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,20 @@ # 进度与证据 +## SITE-ROUTES-01 路径增量台账及完整本地CI + +完整ci:check复现最后基线集合1项失败:九个新增指南HTML没有进入历史demo路径台账。 +保留BASE-04快照,增加显式pages增量、任务/路由/提交依据校验和有效负例;实际Git +逐一核实九个引入提交。未来同次提交的新页面可登记修改前HEAD,避免自引用哈希。 + +最终完整ci:check退出0,476.52秒:运行时2937、工程170、历史基线619通过; +416生产TS、旧/新类型模式、React/Vue、lint及串联产物检查通过。三个定向台账 +测试通过。见[记录](changes/2026-09-15-SITE-ROUTES-01-html-inventory.md)和[证据](baselines/site-routes-validation.json)。 + +这是现有安装的本地检查,不是完整浏览器/coverage/构建/远端CI或发布验收。 +分支影响分析涉及22包,650未分类路径仍保守审查,通用安装消费者19包缺口保留。 +CI-01仍doing;213 done、21 doing、43 todo,共277,无推送/部署/发布。 + + ## PKG-AUTO-THUMB-13 阻止销毁后迟到注册 修复保留registrar在宿主销毁后仍新增三个监听器、迟到元数据创建隐藏视频的问题。 diff --git a/refactor/risk-table.md b/refactor/risk-table.md index 79ecc6ee3..2f1d1e030 100644 --- a/refactor/risk-table.md +++ b/refactor/risk-table.md @@ -287,3 +287,4 @@ | DASH-EXAMPLE-01 | resolved / 已复现 | DASH示例重复销毁SDK、无MSE仍注册插件且空语言回调抛错 | SITE-DASH-01, EX-03 | | CI-BROWSER-MODE-01 | resolved / 已复现 | Installed browser validation can inherit rendering substitutions and direct config loading bypasses launcher diagnostic policy | CI-01 | | AUTO-THUMB-REGISTRATION-01 | resolved / 已复现 | Delayed direct factory installation on a destroyed host retains subscriptions and can restart hidden decoding | PKG-AUTO-THUMB-13 | +| SITE-HTML-INVENTORY-01 | resolved / 已复现 | New documentation HTML is missing from historical demo route coverage, failing the complete local CI check | SITE-ROUTES-01 | diff --git a/refactor/risks.json b/refactor/risks.json index 2fe53bd9b..615c1dba8 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -6754,6 +6754,25 @@ "refactor/baselines/auto-thumbnail-registration-validation.json" ], "resolutionRationale": "Two prechange Node failures and both real-core Chromium failures reproduce retained subscriptions and native video creation. Source193, main/legacy88 each and three-engine42 each pass after the entry guard; live/absent-flag hosts retain successful generation. Public types and first-frame/device gates remain unchanged." + }, + { + "id": "SITE-HTML-INVENTORY-01", + "title": "New documentation HTML is missing from historical demo route coverage, failing the complete local CI check", + "confirmation": "reproduced", + "status": "resolved", + "owners": [ + "SITE-ROUTES-01" + ], + "evidence": [ + "refactor/changes/2026-09-15-SITE-ROUTES-01-html-inventory.md", + "refactor/baselines/site-routes-validation.json" + ], + "compatibleResolution": "Keep BASE-04 immutable and explicitly track introduced pages, route identity and task ownership; preserve omission and deletion checks.", + "closureCriteria": "Old complete CI failure and final full local CI success with negative coverage tests; historical snapshot unchanged.", + "resolutionEvidence": [ + "refactor/baselines/site-routes-validation.json" + ], + "resolutionRationale": "Nine actual Git additions recorded. Three targeted tests pass with positive controls and invalid metadata cases. Full ci:check passes 2937 runtime, 170 engineering and 619 baseline invocations after the old 617/618 baseline failure; no runtime or browser-acceptance scope expansion." } ] } diff --git a/refactor/scripts/demos.mjs b/refactor/scripts/demos.mjs index 2c474b9cd..ff1b3b7f0 100644 --- a/refactor/scripts/demos.mjs +++ b/refactor/scripts/demos.mjs @@ -39,6 +39,16 @@ export function validateDemoInventory(inventory, additions = JSON.parse(read('re assert.equal(inventory.schemaVersion, 1) assert.equal(additions.schemaVersion, 1) const taskIds = new Set(JSON.parse(read('refactor/tasks.json')).tasks.map(task => task.id)) + const addedPages = additions.pages ?? [] + assert(Array.isArray(addedPages), 'Invalid added pages') + for (const page of addedPages) { + assert(/^docs\/(?:[a-z0-9][a-z0-9._-]*\/)*[a-z0-9][a-z0-9._-]*\.html$/.test(page.source), 'Invalid added HTML path') + const references = ['introducedBy', 'introducedAfter'].filter(key => Object.hasOwn(page, key)) + assert.equal(references.length, 1, 'Page requires one introduction reference') + assert(/^[a-f0-9]{40}$/.test(page[references[0]]), 'Missing page introduction commit') + assert(taskIds.has(page.owner) && page.finalDemoOwner === 'EX-03', 'Missing added page owner') + assert.equal(page.route, `/${page.source.slice(5)}`.replace(/index\.html$/, ''), 'Added page route does not match its HTML path') + } for (const addition of additions.examples) { assert(/^docs\/assets\/example\/[a-z0-9.]+\.js$/.test(addition.source), 'Invalid added example path') assert(/^[a-f0-9]{40}$/.test(addition.introducedBy), 'Missing introduction commit') @@ -48,7 +58,9 @@ export function validateDemoInventory(inventory, additions = JSON.parse(read('re const sources = [...inventory.examples, ...additions.examples].map(item => item.source) assert.equal(new Set(sources).size, sources.length, 'Duplicate baseline/addition paths') assert.deepEqual(sources.sort(), fs.readdirSync(path.join(root, 'docs/assets/example')).filter(name => name.endsWith('.js')).map(name => `docs/assets/example/${name}`).sort(), 'Demo file coverage drift') - assert.deepEqual(inventory.pages.map(item => item.source).sort(), htmlFiles(), 'HTML route coverage drift') + const pages = [...inventory.pages, ...addedPages].map(item => item.source) + assert.equal(new Set(pages).size, pages.length, 'Duplicate baseline/addition HTML paths') + assert.deepEqual(pages.sort(), htmlFiles(), 'HTML route coverage drift') assert.deepEqual(inventory.examples.flatMap(item => item.menuLinks).sort(), menuLinks().sort(), 'Editor link coverage drift') assert.deepEqual(inventory.packages.map(item => item.name).sort(), JSON.parse(read('refactor/package-inventory.json')).packages.map(item => item.name).sort(), 'Package demo coverage drift') const names = new Set(inventory.examples.map(item => item.name)) @@ -70,6 +82,6 @@ if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.me const inventory = JSON.parse(fs.readFileSync(filename, 'utf8')) validateDemoInventory(inventory) const additions = JSON.parse(read('refactor/baselines/demo-additions.json')) - console.log(`Demo coverage: ${inventory.examples.length} historical + ${additions.examples.length} added examples, ${inventory.pages.length} HTML paths, ${inventory.packages.length} packages; no browser pass implied`) + console.log(`Demo coverage: ${inventory.examples.length} historical + ${additions.examples.length} added examples, ${inventory.pages.length} historical + ${additions.pages?.length || 0} added HTML paths, ${inventory.packages.length} packages; no browser pass implied`) } } diff --git a/refactor/scripts/demos.test.mjs b/refactor/scripts/demos.test.mjs index 530eae015..54eddcba4 100644 --- a/refactor/scripts/demos.test.mjs +++ b/refactor/scripts/demos.test.mjs @@ -24,6 +24,7 @@ test('Demo inventory rejects missing files, routes and ecosystem packages', () = test('Demo additions require complete paths, specific routes and task ownership', () => { const inventory = JSON.parse(fs.readFileSync(path.join(refactorDir, 'baselines/demo-inventory.json'), 'utf8')) const additions = JSON.parse(fs.readFileSync(path.join(refactorDir, 'baselines/demo-additions.json'), 'utf8')) + assert.doesNotThrow(() => validateDemoInventory(inventory, additions)) for (const mutate of [ value => value.examples.pop(), value => value.examples.push(value.examples[0]), @@ -37,3 +38,29 @@ test('Demo additions require complete paths, specific routes and task ownership' assert.throws(() => validateDemoInventory(inventory, changed)) } }) + +test('Added HTML pages retain exact routes, unique paths and accountable introductions', () => { + const inventory = JSON.parse(fs.readFileSync(path.join(refactorDir, 'baselines/demo-inventory.json'), 'utf8')) + const additions = JSON.parse(fs.readFileSync(path.join(refactorDir, 'baselines/demo-additions.json'), 'utf8')) + assert.doesNotThrow(() => validateDemoInventory(inventory, additions)) + const pending = structuredClone(additions) + delete pending.pages[0].introducedBy + pending.pages[0].introducedAfter = JSON.parse(fs.readFileSync(path.join(refactorDir, 'tasks.json'), 'utf8')).baselineCommit + assert.doesNotThrow(() => validateDemoInventory(inventory, pending), 'A new page can record its pre-change baseline without requiring its own future commit hash') + for (const [mutate, error] of [ + [value => value.pages.pop(), /HTML route coverage drift/], + [value => value.pages.push(value.pages[0]), /Duplicate baseline\/addition HTML paths/], + [value => value.pages[0].source = 'docs/document/../private.html', /Invalid added HTML path/], + [value => value.pages[0].route += '?ignored=1', /Added page route does not match its HTML path/], + [value => value.pages[0].owner = 'UNKNOWN-01', /Missing added page owner/], + [value => value.pages[0].finalDemoOwner = 'SITE-01', /Missing added page owner/], + [value => value.pages[0].introducedBy = '', /Missing page introduction commit/], + [value => value.pages[0].introducedAfter = value.pages[0].introducedBy, /Page requires one introduction reference/], + [value => delete value.pages[0].introducedBy, /Page requires one introduction reference/], + [value => value.pages = false, /Invalid added pages/], + ]) { + const changed = structuredClone(additions) + mutate(changed) + assert.throws(() => validateDemoInventory(inventory, changed), error) + } +}) diff --git a/refactor/tasks.json b/refactor/tasks.json index de22ce388..017c6d72e 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -784,7 +784,9 @@ "changes/2026-09-15-CI-01-vast-installed.md", "baselines/ci-vast-installed-validation.json", "changes/2026-09-15-CI-01-rendering-policy.md", - "baselines/ci-rendering-policy-validation.json" + "baselines/ci-rendering-policy-validation.json", + "changes/2026-09-15-SITE-ROUTES-01-html-inventory.md", + "baselines/site-routes-validation.json" ] }, { @@ -4516,7 +4518,8 @@ "SITE-HLS-01", "SITE-DASH-01", "SITE-AUDIO-01", - "SITE-VTT-01" + "SITE-VTT-01", + "SITE-ROUTES-01" ], "status": "todo", "risk": "M", @@ -5947,6 +5950,27 @@ "changes/2026-09-15-PKG-AUTO-THUMB-13-registration.md", "baselines/auto-thumbnail-registration-validation.json" ] + }, + { + "id": "SITE-ROUTES-01", + "phase": "6 文档与消费者", + "title": "将新增文档HTML纳入保留历史的路径覆盖台账", + "scope": [ + "artplayer-vitepress", + "workspace" + ], + "dependsOn": [ + "BASE-04", + "SITE-03" + ], + "status": "done", + "risk": "M", + "deliverable": "不覆盖BASE-04的HTML增量台账、准确路由/责任校验及完整CI证据", + "acceptance": "复现完整ci:check的路径覆盖失败;新页面必须显式登记,拒绝漏项/重复/错误路由/越界/缺任务和提交,保留旧页面保护及浏览器验收边界", + "evidence": [ + "changes/2026-09-15-SITE-ROUTES-01-html-inventory.md", + "baselines/site-routes-validation.json" + ] } ] }