refactor(dpip): [PKG-DPIP-03] own windows and DOM resources in strict TypeScript

This commit is contained in:
Harvey Zhao committed 2026-09-12 14:22:09 +08:00
1 parent 202351934b
commit 80d37d66f8
31 files changed
+2335 -597

No files matched your search

@@ -0,0 +1,254 @@
{
"schemaVersion": 1,
"task": "PKG-DPIP-03",
"status": "done",
"checks": [
{
"command": "node --test test/dpip-lifecycle.test.js test/dpip.test.js refactor/scripts/dpip-contract.test.mjs",
"result": "pass",
"tests": 84,
"candidate": 20,
"historicalLifecycle": 48,
"historicalContract": 16
},
{
"command": "ARTPLAYER_DPIP_BASELINE=1 node --test test/dpip-lifecycle.test.js",
"result": "expected-historical-failures",
"passed": 3,
"failed": 17
},
{
"command": "yarn build artplayer-plugin-document-pip",
"result": "pass",
"formats": [
"main",
"legacy",
"esm"
],
"generatedFiles": 6
},
{
"command": "ARTPLAYER_DPIP_ARTIFACT=<main or legacy> node --test test/dpip-lifecycle.test.js",
"result": "pass",
"main": 20,
"legacy": 20
},
{
"command": "native Node ESM default import and initializer",
"result": "pass",
"scope": "actual ESM entry import shape; full installed consumer/type matrix remains task04"
},
{
"command": "playwright test test/browser/dpip.spec.js test/browser/dpip-lifecycle.spec.js",
"result": "pass",
"tests": 66,
"scope": "earlier source wide matrix: 48 historical plus 18 candidate; final source refinements are rechecked below with built main"
},
{
"command": "ARTPLAYER_DPIP_ARTIFACT=<main> playwright test test/browser/dpip-lifecycle.spec.js",
"result": "pass",
"tests": 18,
"skipped": 0,
"browsers": [
{
"project": "chromium",
"version": "153.0.8010.12",
"platform": "win32"
},
{
"project": "firefox",
"version": "155.0",
"platform": "win32"
},
{
"project": "webkit",
"version": "26.6",
"platform": "win32"
}
],
"scope": "final actual main artifact, two cores and three engines; native iframe DOM with controlled window APIs, not native Document PiP"
},
{
"command": "focused eslint --no-fix",
"result": "pass"
},
{
"command": "yarn ci:check",
"result": "pass",
"tests": {
"unit": 1006,
"engineering": 14,
"baseline": 116,
"mainTotal": 1136,
"repeatedContractExecutions": 44
},
"strictProductionTypeScriptFiles": 290
}
],
"limitations": [
"Public declarations and export compatibility remain task04; no inferred-type approval is borrowed from Ads.",
"The native DOM iframe matrix controls requestWindow and close; native Document PiP activation, media continuity, proxies and devices remain task05.",
"Restoration falls back to the original document body if the original parent rejects insertion, but cannot guarantee recovery if both reject insertion.",
"The full demo/archive acceptance remains task06."
],
"inputs": [
{
"file": "packages/artplayer-plugin-document-pip/src/control.ts",
"sha256LF": "9fe66b2fd59b50c05355d47a89af828b59eb9ad4e224237c72017170da7f7d65"
},
{
"file": "packages/artplayer-plugin-document-pip/src/index.ts",
"sha256LF": "cbf87010df6982f9b7ea39384f4120af380d26d3e051a96ee9db52eda8c7e1f8"
},
{
"file": "packages/artplayer-plugin-document-pip/src/projection.ts",
"sha256LF": "9a86780b54793427db448d7814d7e4a728d9f65ab3282bb6b476bb6ecedc731f"
},
{
"file": "packages/artplayer-plugin-document-pip/src/resources.ts",
"sha256LF": "6aa31086fd18104b176d6245ec297255c71993fe935db5b44ed649bedd33b8be"
},
{
"file": "packages/artplayer-plugin-document-pip/src/styles.ts",
"sha256LF": "7fed3354c81ccfd70cd70aba5afe8d1d78fa3f7022a3298c65446b5a0a0e6b96"
},
{
"file": "packages/artplayer-plugin-document-pip/src/window-session.ts",
"sha256LF": "cf6bc403caf22ecfea14da7bfa91ddb88a60ed0507d5485035abe48861e1ad17"
},
{
"file": "packages/artplayer-plugin-document-pip/src/style.less",
"sha256LF": "a75ae94a569c8fd6ce925dcc7ab6b22cfa39a4d81decb30cc447dd7108a84a22"
},
{
"file": "packages/artplayer-plugin-document-pip/tsconfig.json",
"sha256LF": "5b53a2bb158e81c5bfd3e2b50e750f7f6e20d0e9aaa6733facec036c15f28ebe"
},
{
"file": "packages/artplayer-plugin-document-pip/.npmignore",
"sha256LF": "145c5fa0341195e21cf13df3423a057282f8ea374e9a1b3065e2280e1ce1c5c1"
},
{
"file": "test/dpip-lifecycle.test.js",
"sha256LF": "bd9fb385a3bfd5d49695fbbaf5faf33d95d255cd63ef176758ccfd972e1f794c"
},
{
"file": "test/helpers/dpip.js",
"sha256LF": "36acf694e49472c927f7e8cf797fc21df27916cb5777b7d84dc280807948988e"
},
{
"file": "test/browser/dpip-helpers.js",
"sha256LF": "2ab9b30a60b809e3476462c3d89cf3eb31f74d321264a661e643321b5cf73d2a"
},
{
"file": "test/browser/dpip-lifecycle.spec.js",
"sha256LF": "813d8d3276283931b19f3046f93249116f3ff1bfe9e3782017b9d51f788166e0"
},
{
"file": "test/browser/dpip.spec.js",
"sha256LF": "fcf79924daca7b694b0265540f8e84355fc9ea81c6dd4d3d33f3749a0881e376"
},
{
"file": "package.json",
"sha256LF": "87ccb964b0247c4558f092ccb897084416f2d1a965703df7e28c1583885a134e"
}
],
"artifacts": [
{
"file": "packages/artplayer-plugin-document-pip/dist/artplayer-plugin-document-pip.js",
"sha256LF": "166931ad0c2c5b9696a4f76dbb441afb396874c1445830b8ed8a58e8e98167ab"
},
{
"file": "docs/compiled/artplayer-plugin-document-pip.js",
"sha256LF": "166931ad0c2c5b9696a4f76dbb441afb396874c1445830b8ed8a58e8e98167ab"
},
{
"file": "packages/artplayer-plugin-document-pip/dist/artplayer-plugin-document-pip.legacy.js",
"sha256LF": "d3f0cbe82ae5bccf571a8112b6803f24d2548c8b24ed839350c95a1f05dfbedb"
},
{
"file": "docs/compiled/artplayer-plugin-document-pip.legacy.js",
"sha256LF": "d3f0cbe82ae5bccf571a8112b6803f24d2548c8b24ed839350c95a1f05dfbedb"
},
{
"file": "packages/artplayer-plugin-document-pip/dist/artplayer-plugin-document-pip.mjs",
"sha256LF": "82b26dcba24d7c550c9edb5481bf2c80864cde09522c7f8b8743be63dbca4c3c"
},
{
"file": "docs/compiled/artplayer-plugin-document-pip.mjs",
"sha256LF": "82b26dcba24d7c550c9edb5481bf2c80864cde09522c7f8b8743be63dbca4c3c"
}
],
"parentCommit": "202351934b1d9511691dcd298c7882ee6fe2c9f6",
"mainSize": {
"previousBytes": 4624,
"candidateBytes": 6874,
"previousGzipBytes": 1776,
"candidateGzipBytes": 2831,
"note": "Additional request cancellation, transactional rollback and cleanup increase plugin size. This is not a full ecosystem performance acceptance."
},
"logs": [
{
"file": "refactor/.cache/dpip03-node-reentry.log",
"sha256": "92189cb71428649ab1687448a324958e002221fe350854d96c359e33c4455a40"
},
{
"file": "refactor/.cache/dpip03-notice-rejection.log",
"sha256": "af2db5c23135434c292ea8d1905aa5578bbcedd9fe5b70780594e2c6e0c69927"
},
{
"file": "refactor/.cache/dpip03-node-final.log",
"sha256": "b63a0f80492f87aa22ab82bdef8da8503fecfb6a3dd5a34bd758659f738bb14e"
},
{
"file": "refactor/.cache/dpip03-old-negative-final.log",
"sha256": "655223967f6d05d1226921923d648875924c62ca9fb2e0960e5c61d77b532cdb"
},
{
"file": "refactor/.cache/dpip03-build-final.log",
"sha256": "71e1ba8c478b29c7a020d8aa107d11bbfb69bf2f08d02a8ae96c45a685284817"
},
{
"file": "refactor/.cache/dpip03-main-lifecycle.log",
"sha256": "87424989382aabc285c18254f188d730edf30c7dc09e2e8f4b6be973cbdad1e4"
},
{
"file": "refactor/.cache/dpip03-legacy-lifecycle.log",
"sha256": "395aab100482170a1671c7652340193cecb2602ea7f0cc0f3ff9ab2b75413341"
},
{
"file": "refactor/.cache/dpip03-esm.log",
"sha256": "9df9f793dfccb511716a2d8ae3b3d9ccc616e1e8f547ebdde8245cafd4e898cb"
},
{
"file": "refactor/.cache/dpip03-lint-final.log",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"file": "refactor/.cache/dpip03-browser.log",
"sha256": "f51123de2b1553e56208893787bfbae15f12b26744513c0faa0529ba879e623a"
},
{
"file": "refactor/.cache/dpip03-browser-artifact-final.log",
"sha256": "a0dd85434da54fd3a10cf4c3de2e136d1da14d792dc615b66958122a440a3768"
},
{
"file": "refactor/.cache/dpip03-ci.log",
"sha256": "723c3c5014bc9fbc3f908c7973cbe6ecc44df8596e252034093ba9d601fb17dd"
},
{
"file": "refactor/.cache/dpip03-final-results/report.json",
"sha256": "c9b4822cda572b23e83ad8fef81b28302598f94eb65b367c85b2ab72f8c14722"
},
{
"file": "refactor/.cache/dpip03-wide-results/report.json",
"sha256": "92be3a027d3782b4336f541186dcc26ea9d728dc12e579df090279b2a6229b08"
}
],
"browserArtifacts": [
{
"file": "refactor/.cache/dpip03-final-results/results/.last-run.json",
"sha256": "91d1c43004802cd49950d78eb11c8fa7d05da8ffffe219a8b13b2f561bc00903"
}
]
}
@@ -0,0 +1,36 @@
# PKG-DPIP-03 严格 TypeScript 与窗口资源
原单文件迁为6个TS模块:index核心门面、window-session请求/窗口状态、projection节点
归属与还原、styles共享样式与跨文档复制、control控件监听器、resources延迟与清理。
分包严格tsconfig接入根typecheck;生产依赖和版本不变,公开声明留04独立验收。
三种构建产物通过仓库脚本重建,.npmignore排除分包tsconfig。
结构迁移保留同步注册和Result字段顺序、能力快照、工厂options浅拷贝、默认值、
右侧index40控件、CSS id/class、同步toggle、open/close Promise<void>和正常事件顺序。
未新增公开destroy方法。Window API类型为局部可选能力,不污染全局Window声明。
DOM/状态模块不依赖Artplayer,新核心仅通过既有接口集成,不提升插件最低核心依赖。
缺陷修复单独由候选测试覆盖:正在申请时coalesce、close/toggle撤销申请并提前结算
调用者、迟到窗口直接关闭、销毁终态、取消100ms定时器、事件重入/初始化失败回收、
adoption错误回滚、占位移动/删除后恢复原parent/sibling、原ownerDocument样式复制。
父节点拒绝插入时尽力恢复到原document.body并报告close失败;原document也拒绝插入
仍无法保证恢复,不声称任意DOM破坏都可以修复。所有清理逐项尝试,不因单一监听器
清理异常而跳过窗口和节点释放。销毁期间保留类清理/还原,禁止新事件/UI/延迟效果。
20项候选测试在旧冻结源码上3项正常契约通过、17项失败;候选全部通过。新加样式
插入重入测试曾发现第一版迁移残留3节点,现追加插入返回后的终态检查与二次清理。
首版记录和修正后记录都保留,不通过放宽断言隐藏失败。
浏览器宽矩阵66项(48历史+18候选)通过,随后释放control宿主引用的调整再次用
最终构建main产物运行18项候选验证。两实际核心为npm5.4.0和候选,三引擎均覆盖。
使用真实iframe DOM与受控窗口API;原生Document PiP/媒体连续性/代理设备组合仍05,
不能把这一步称为原生文档窗口验收。LIFE/DOM风险记录实现修复证据并保持原生验收
缺口开放;STYLE重复注入已有候选正反对照。类型和分发差异仍由04/06完成。
模块维护见包内ARCHITECTURE.md,测试入口与限制见[验证入口](../dpip-validation.md),
结果与哈希见[证据](../baselines/dpip-lifecycle-validation.json)。回退需整体回退src、
分包配置与同批生成产物,保留历史测试;不修改归档基线。不推送、发布或升级版本。
最终复查新增notice setter异常传播兼容用例,修复首版吞掉异常的回归;20项候选在旧源码上3正常通过/17失败。链路使用Promise.then结算,不新增Promise.finally能力要求。最后main产物浏览器与main/legacy受控生命周期重跑覆盖此修正。
最终完整CI1136项(1006单元+14工程+116基线)、44项重复契约观察与290个生产TS严格检查通过;main/legacy各20候选回归、最终main产物18项浏览器通过。main原始字节4624→6874,gzip1776→2831;资源正确性增加了体积,不宣称全项目性能门槛已经通过。本任务done并独立提交,04/05/06继续。
+11
View File
@@ -31,3 +31,14 @@ test/helpers/dpip.js是受控DOM/window边界:验证ownerDocument、节点身
当前WebKit的640宽读数与320宽fixture不同,精确保留为历史观察,待05查清尺寸和媒体
连续性;测试不会宽泛允许任意尺寸。初次错误与修正原因见[02记录](changes/2026-09-12-PKG-DPIP-02-tests.md),
验收状态见[02证据](baselines/dpip-behavior-validation.json)。03必须新增候选修复断言。
## TS实现与候选修复(03)
源码现拆为6个严格TS模块,真实文件地图见包内ARCHITECTURE.md。`yarn test:dpip`同时
执行48项历史与20项候选生命周期测试;`ARTPLAYER_DPIP_BASELINE=1`运行候选用例时,
保留旧源码17失败/3正常通过。正常契约另有16项test:baseline。
`test/browser/dpip-lifecycle.spec.js`为18项候选真实DOM验证;`dpip-helpers.js`共享受控
窗口入口,记录替换前能力,绝不冒充原生Document PiP。`ARTPLAYER_DPIP_ARTIFACT`
选择明确构建文件(不fallback);最终产物证据与宽矩阵历史证据分开保存。
本阶段保留原生窗口和媒体/代理验收门槛,详见[03记录](changes/2026-09-12-PKG-DPIP-03-lifecycle.md)
及[03证据](baselines/dpip-lifecycle-validation.json)。04继续公开类型/导出/安装消费者。
+3 -2
View File
@@ -4,7 +4,7 @@
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 221 项,范围 22 个包及工作区/示例。
状态:todo 120 / doing 6 / blocked 0 / done 95 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
状态:todo 119 / doing 6 / blocked 0 / done 96 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。
@@ -295,7 +295,7 @@
| --- | --- | --- | --- | --- | --- | --- |
| PKG-DPIP-01 | artplayer-plugin-document-pip<br>核对包契约与历史用法 | BASE-05 | width/height/placeholder/fallbackToVideoPiP、open/close/toggle 返回 | 源码/声明/README/demo/发布包差异已登记;公开形状和版本范围冻结 | H | done |
| PKG-DPIP-02 | artplayer-plugin-document-pip<br>建立特有行为与错误测试 | PKG-DPIP-01, ENG-03, ENG-05 | 不支持/拒绝、重复打开、pagehide、核心销毁和视频 PiP fallback | 旧版本行为可重跑,成功/失败/切源/销毁有必要断言 | H | done |
| PKG-DPIP-03 | artplayer-plugin-document-pip<br>整理内部职责与资源 | PKG-DPIP-02, CORE-16, CORE-17 | 窗口生命周期、DOM 迁移、样式与事件 document 重绑分离 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | todo |
| PKG-DPIP-03 | artplayer-plugin-document-pip<br>整理内部职责与资源 | PKG-DPIP-02, CORE-16, CORE-17 | 窗口生命周期、DOM 迁移、样式与事件 document 重绑分离 | 结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过 | H | done |
| PKG-DPIP-04 | artplayer-plugin-document-pip<br>迁移自有源码和公开类型 | PKG-DPIP-03, ENG-04, ENG-06, CORE-07 | Document PiP 可选能力和真实状态/返回类型 | 严格类型检查、旧消费样例通过;声明路径/导出和同步异步兼容 | H | todo |
| PKG-DPIP-05 | artplayer-plugin-document-pip<br>验证新旧核心和组合 | PKG-DPIP-04, CORE-22, PKG-CANVAS-04, PKG-MB-04 | 原生视频及两个 proxy、键盘/焦点/全屏与关闭还原 | 最终核心与原支持范围核心分别通过;设备/SDK 缺证据不能标完成 | H | todo |
| PKG-DPIP-06 | artplayer-plugin-document-pip<br>验证分发并同步文档 | PKG-DPIP-05, ENG-07 | document.pip.js、浏览器能力矩阵、旧接口与恢复证据 | tarball 入口/资源、类型、8082 demo 和 README 一致,有回退记录 | H | todo |
@@ -508,6 +508,7 @@
- PKG-VAST-03: [记录](changes/2026-09-12-PKG-VAST-03-lifecycle.md) [记录](baselines/vast-lifecycle-validation.json) [记录](vast-compatibility-decision.md)
- PKG-DPIP-01: [记录](changes/2026-09-12-PKG-DPIP-01-contract.md) [记录](baselines/dpip-release.json) [记录](baselines/dpip-contract.md) [记录](baselines/dpip-contract-validation.json) [记录](dpip-validation.md)
- PKG-DPIP-02: [记录](changes/2026-09-12-PKG-DPIP-02-tests.md) [记录](baselines/dpip-behavior-validation.json) [记录](dpip-validation.md)
- PKG-DPIP-03: [记录](changes/2026-09-12-PKG-DPIP-03-lifecycle.md) [记录](baselines/dpip-lifecycle-validation.json) [记录](dpip-validation.md)
- PKG-CANVAS-01: [记录](changes/2026-09-12-PKG-CANVAS-01-contract.md) [记录](baselines/canvas-contract.md) [记录](baselines/canvas-release.json) [记录](canvas-validation.md) [记录](baselines/canvas-contract-validation.json)
- PKG-CANVAS-02: [记录](changes/2026-09-12-PKG-CANVAS-02-tests.md) [记录](baselines/canvas-behavior-validation.json) [记录](canvas-validation.md)
- PKG-CANVAS-03: [记录](changes/2026-09-12-PKG-CANVAS-03-lifecycle.md) [记录](baselines/canvas-lifecycle-validation.json) [记录](canvas-validation.md)
+11
View File
@@ -1,5 +1,16 @@
# 进度与证据
## 最新完成:Document PiP-03 严格TS与窗口资源修复
6个模块分离窗口申请/终态、DOM还原、样式、控件与延迟资源。20候选用例在旧源码
3正常通过/17失败,候选20全部通过;48历史和16正常契约继续通过。main/legacy各20
生命周期、三格式构建、原生ESM导入通过。宽矩阵66项通过后,最终main产物18项
真实DOM浏览器复验通过;受控窗口API不等于原生Document PiP,05门槛保留。
完整CI1136项通过,另44项重复契约观察,290生产TS文件严格检查。STYLE风险关闭;
LIFE/DOM记录修复,保留原生组合验收缺口。当前221项:96 done、6 doing、119 todo。
见[本步记录](changes/2026-09-12-PKG-DPIP-03-lifecycle.md)和[证据](baselines/dpip-lifecycle-validation.json)。
下一步04公开类型、两代导出与安装消费者;独立本地提交,不推送/发布。
## 最新完成:Document PiP-02 生命周期历史复现
四实现×12组共48项复现迟到/重复窗口、销毁后效果、DOM回滚失败和样式差异,
+1 -1
View File
@@ -164,5 +164,5 @@
| DPIP-TYPE-01 | open / 已复现 | Document PiP requires options and declares void actions and writable flags that differ from runtime | PKG-DPIP-04 |
| DPIP-LIFE-01 | open / 已复现 | Document PiP has no separate ownership for pending window requests and delayed post-transition callbacks | PKG-DPIP-02, PKG-DPIP-03, PKG-DPIP-05 |
| DPIP-DOM-01 | open / 已复现 | Document PiP copies global-document styles and retains original parent without transactional rollback | PKG-DPIP-02, PKG-DPIP-03, PKG-DPIP-05 |
| DPIP-STYLE-01 | open / 已复现 | Document PiP 1.1.0 and frozen source duplicate style IDs when evaluated before DOMContentLoaded | PKG-DPIP-03 |
| DPIP-STYLE-01 | resolved / 已复现 | Document PiP 1.1.0 and frozen source duplicate style IDs when evaluated before DOMContentLoaded | PKG-DPIP-03 |
| DPIP-MEDIA-01 | open / 已复现 | WebKit reports styled width640 for width320 media in the controlled Document PiP iframe matrix | PKG-DPIP-05 |
+21 -7
View File
@@ -3500,8 +3500,11 @@
"refactor/baselines/dpip-contract.md",
"refactor/changes/2026-09-12-PKG-DPIP-01-contract.md",
"refactor/changes/2026-09-12-PKG-DPIP-02-tests.md",
"refactor/baselines/dpip-behavior-validation.json"
]
"refactor/baselines/dpip-behavior-validation.json",
"refactor/changes/2026-09-12-PKG-DPIP-03-lifecycle.md",
"refactor/baselines/dpip-lifecycle-validation.json"
],
"workspaceState": "Six strict TS modules with candidate fixes for pending requests, terminal effects, partial rollback and style ownership. Candidate versus frozen tests preserve historical failures. Native Document PiP/proxy/device evidence remains task05; current iframe coverage controls the window API."
},
{
"id": "DPIP-DOM-01",
@@ -3520,8 +3523,11 @@
"refactor/baselines/dpip-contract.md",
"refactor/changes/2026-09-12-PKG-DPIP-01-contract.md",
"refactor/changes/2026-09-12-PKG-DPIP-02-tests.md",
"refactor/baselines/dpip-behavior-validation.json"
]
"refactor/baselines/dpip-behavior-validation.json",
"refactor/changes/2026-09-12-PKG-DPIP-03-lifecycle.md",
"refactor/baselines/dpip-lifecycle-validation.json"
],
"workspaceState": "Six strict TS modules with candidate fixes for pending requests, terminal effects, partial rollback and style ownership. Candidate versus frozen tests preserve historical failures. Native Document PiP/proxy/device evidence remains task05; current iframe coverage controls the window API."
},
{
"id": "DPIP-STYLE-01",
@@ -3532,11 +3538,19 @@
"compatibleResolution": "Preserve the style id and injection timing while deduplicating at insertion and releasing loading listeners.",
"closureCriteria": "Historical two-node versus Parcel cached one-node difference stays explicit; candidate has one final style node under duplicate evaluation.",
"confirmation": "reproduced",
"status": "open",
"status": "resolved",
"evidence": [
"refactor/changes/2026-09-12-PKG-DPIP-02-tests.md",
"refactor/baselines/dpip-behavior-validation.json"
]
"refactor/baselines/dpip-behavior-validation.json",
"refactor/changes/2026-09-12-PKG-DPIP-03-lifecycle.md",
"refactor/baselines/dpip-lifecycle-validation.json"
],
"workspaceState": "Six strict TS modules with candidate fixes for pending requests, terminal effects, partial rollback and style ownership. Candidate versus frozen tests preserve historical failures. Native Document PiP/proxy/device evidence remains task05; current iframe coverage controls the window API.",
"resolutionEvidence": [
"refactor/changes/2026-09-12-PKG-DPIP-03-lifecycle.md",
"refactor/baselines/dpip-lifecycle-validation.json"
],
"resolutionRationale": "Candidate and frozen-source comparison verifies one style node and zero retained DOMContentLoaded listeners after duplicate evaluation. Insertion rechecks the shared id; reentrant style insertion cleanup is covered separately. Native window acceptance is unrelated and remains task05."
},
{
"id": "DPIP-MEDIA-01",
+6 -2
View File
@@ -3031,11 +3031,15 @@
"CORE-16",
"CORE-17"
],
"status": "todo",
"status": "done",
"risk": "H",
"deliverable": "窗口生命周期、DOM 迁移、样式与事件 document 重绑分离",
"acceptance": "结构变化和缺陷修复分开记录;原 API/事件/资源生命周期通过",
"evidence": []
"evidence": [
"changes/2026-09-12-PKG-DPIP-03-lifecycle.md",
"baselines/dpip-lifecycle-validation.json",
"dpip-validation.md"
]
},
{
"id": "PKG-DPIP-04",