Checkpoint web parity through Chromium input tasks
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

This commit is contained in:
mes123456
2026-08-19 10:39:03 -04:00
parent 5a11045ca5
commit 380cbed4ff
634 changed files with 41862 additions and 212 deletions

41
docs/tasks/M13-04F.md Normal file
View File

@@ -0,0 +1,41 @@
# M13-04F受限且脱敏的 Blender 输出
- `task`: `M13-04F`
- `parent`: `M13-04E`
- `status`: `done`
## 目标
为真实 Blender server job 建立有界 stdout/stderr receipt输出超出预算时截断并过滤凭据和
内部绝对路径;仍保持 `execution=DISABLED`,不发布 job 结果。
## 输入
- manifest`tests/golden/M13-04E/manifest.json`
- 生产启动:`tools/web/server-job-startup.py`
- 工作区合同:`tools/web/server-job-isolation.mjs`
- 最小运行时:固定 Blender 5.2 `--background --factory-startup`
## 范围
- 做:固定 stdout/stderr 字节预算、截断标记、凭据/内部路径脱敏和稳定 receipt 字段。
- 不做:取消进程、进程树清理、超时/OOM 错误映射、OPFS 结果提交;这些分别属于 G-J。
## 验收
```text
npm --prefix web run test:server-job-output-redaction
```
验收必须包含正常输出、超长输出、token/API key、Unix/Windows 风格内部路径和空流负例;真实
输出不可把 source path、环境变量值或完整命令行泄露到 report。
## 产物和交接
报告、checker、unit/E2E如适用、package hash 和 manifest 写入 `tests/golden/M13-04F/`
成功后 manifest 的 `nextTask` 必须为 `M13-04G`
## 回滚
移除输出 receipt/脱敏实现、专项测试、checker、package 命令、报告、manifest 和状态页;将
`M13-04E` 恢复为队列尾。

37
docs/tasks/M13-04G.md Normal file
View File

@@ -0,0 +1,37 @@
# M13-04G取消 Blender 进程树
- `task`: `M13-04G`
- `parent`: `M13-04F`
- `status`: `done`
## 目标
取消真实 Blender server job 时终止整个 process tree等待子进程退出并清理一次性 job 目录;
不得留下孤儿进程或临时文件。
## 输入
- manifest`tests/golden/M13-04F/manifest.json`
- process receiptM13-04F 输出 receipt
- job 目录:`tools/web/server-job-isolation.mjs`
## 范围
-Abort/cancel 到 process-group/tree 的映射、幂等等待、目录清理和 orphan 计数。
- 不做timeout/OOM/signal 分类和结果 hash 校验;分别属于 H/I。
## 验收
```text
npm --prefix web run test:server-job-cancellation
```
必须有真实长运行 fixture、取消竞态、重复取消、子进程和目录残留负例。
## 产物和交接
成功后生成 `tests/golden/M13-04G/` 证据manifest 的 `nextTask``M13-04H`
## 回滚
删除取消控制器、专项测试、checker、报告、manifest、package 命令和状态页,恢复 M13-04F 队列尾。

37
docs/tasks/M13-04H.md Normal file
View File

@@ -0,0 +1,37 @@
# M13-04H稳定化进程故障码
- `task`: `M13-04H`
- `parent`: `M13-04G`
- `status`: `done`
## 目标
把真实 Blender job 的 timeout、OOM、非零退出和 signal 结果转换为稳定、可诊断且不泄露内部
细节的错误码;旧项目 revision 不得被错误结果覆盖。
## 输入
- manifest`tests/golden/M13-04G/manifest.json`
- cancel/cleanup receiptM13-04G
- resource limits`tools/web/server-job-resource-budget.mjs`
## 范围
- 做:故障分类优先级、退出状态映射、旧 revision 保持和统一错误 receipt。
- 不做:成功结果进入 OPFS、重试幂等分别属于 I/J。
## 验收
```text
npm --prefix web run test:server-job-fault-codes
```
覆盖 wall timeout、memory/OOM、SIGTERM/SIGKILL、普通非零退出和无法识别状态并验证清理完成。
## 产物和交接
成功后生成 `tests/golden/M13-04H/` 证据manifest 的 `nextTask``M13-04I`
## 回滚
删除故障映射、测试、checker、报告、manifest、package 命令和状态页,恢复 M13-04G 队列尾。

37
docs/tasks/M13-04I.md Normal file
View File

@@ -0,0 +1,37 @@
# M13-04I校验并提交 server 结果
- `task`: `M13-04I`
- `parent`: `M13-04H`
- `status`: `done`
## 目标
仅当 source、settings、Blender build 和 output hash 全部匹配请求时,才把 server job 结果绑定到
OPFS任何篡改、过期或重放都 fail-closed。
## 输入
- manifest`tests/golden/M13-04H/manifest.json`
- source/output receiptM13-04H
- OPFS 提交合同:项目现有原子保存协议
## 范围
- 做:四项 hash 绑定、结果版本检查、临时文件到正式对象的原子提交和失败清理。
- 不做:同一 request 的重复提交策略;交给 J。
## 验收
```text
npm --prefix web run test:server-job-result-binding
```
覆盖 source/settings/build/output 任一 hash 变化、旧 revision、部分输出和 OPFS quota 失败。
## 产物和交接
成功后生成 `tests/golden/M13-04I/` 证据manifest 的 `nextTask``M13-04J`
## 回滚
删除结果绑定实现、测试、checker、报告、manifest、package 命令和状态页,恢复 M13-04H 队列尾。

37
docs/tasks/M13-04J.md Normal file
View File

@@ -0,0 +1,37 @@
# M13-04Jserver request 幂等重试
- `task`: `M13-04J`
- `parent`: `M13-04I`
- `status`: `done`
## 目标
同一 request 重试只能复用或确认同一个已验证结果,不得把两个冲突结果绑定到同一项目;不同
request 必须保持隔离。
## 输入
- manifest`tests/golden/M13-04I/manifest.json`
- verified resultM13-04I
- request/result identityM13-04A 至 M13-04I 的 receipts
## 范围
-request identity、重试窗口、重复提交、冲突输出和并发绑定策略。
- 不做:新增 Blender 能力或放宽脚本执行策略M13 全程仍需显式安全门。
## 验收
```text
npm --prefix web run test:server-job-idempotency
```
覆盖成功重试、失败后重试、并发重复、同 request 冲突 output 和跨项目 request 误用。
## 产物和交接
成功后生成 `tests/golden/M13-04J/` 证据manifest 的 `nextTask``M13-05A`
## 回滚
删除幂等键/绑定策略、测试、checker、报告、manifest、package 命令和状态页,恢复 M13-04I 队列尾。

39
docs/tasks/M13-05A.md Normal file
View File

@@ -0,0 +1,39 @@
# M13-05ACSP 默认拒绝策略
- `task`: `M13-05A`
- `parent`: `M13-04J`
- `status`: `done`
## 目标
为部署服务器和生产构建统一声明 CSP拒绝 inline script、eval、data script 和未声明 origin
所有响应(包括 404都必须携带相同策略。
## 输入
- manifest`tests/golden/M13-04J/manifest.json`
- 部署合同:`docs/web/deployment-contract.json`
- 入口与构建:`web/app/index.html``web/app/vite.config.ts`
## 范围
- 做:`default-src/script-src/worker-src/connect-src` same-origin 约束、`object-src/base-uri/frame-ancestors`
拒绝规则、源代码/构建产物扫描和 HTTP 响应检查。
- 不做:按资源类型拆分 Worker/WASM/font/image/media 策略;交给 M13-05B。
## 验收
```text
npm --prefix web run test:csp-policy
node tools/web/check-deployment-contract.mjs
npm --prefix web run typecheck
npm --prefix web run build
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M13-05A/`;下一任务由 manifest 的 `nextTask` 指向 `M13-05B`
## 回滚
恢复部署合同、HTTP 头、checker、报告、manifest、package 命令和状态页;将 `M13-04J` 恢复为队列尾。

28
docs/tasks/M13-05B.md Normal file
View File

@@ -0,0 +1,28 @@
# M13-05B资源类型 CSP 矩阵
- `task`: `M13-05B`
- `parent`: `M13-05A`
- `status`: `done`
## 目标
分别验证 Worker、WASM、font、image、media 资源只能从同源加载WASM 使用显式
`wasm-unsafe-eval` 编译能力JavaScript `eval` 仍被拒绝。`data:``blob:` 和跨源连接必须被
浏览器 CSP 阻断。
## 验收
```text
npm --prefix web run test:csp-resource-policy
node tools/web/check-deployment-contract.mjs
npm --prefix web run typecheck
npm --prefix web run build
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M13-05B/`;下一任务由 manifest 的 `nextTask` 指向 `M13-05C`
## 回滚
恢复资源 CSP、MIME 合同、checker、报告、manifest、package 命令和状态页;将 `M13-05A` 恢复为队列尾。

27
docs/tasks/M13-05C.md Normal file
View File

@@ -0,0 +1,27 @@
# M13-05C依赖分类 inventory
- `task`: `M13-05C`
- `parent`: `M13-05B`
- `status`: `done`
## 目标
`web/package.json``web/package-lock.json` 的真实 npm 依赖闭包分别生成 production、build
和 test inventory。每个包绑定 package path、版本、resolved、integrity 和所属类别;共享包显式
记录,不允许未分类或依赖树漂移。
## 验收
```text
npm --prefix web run test:dependency-inventory
npm --prefix web run typecheck
npm --prefix web run build
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M13-05C/`;下一任务由 manifest 的 `nextTask` 指向 `M13-05D`
## 回滚
移除 inventory 生成器、checker、报告、manifest、package 命令和状态页;将 `M13-05B` 恢复为队列尾。

26
docs/tasks/M13-05D.md Normal file
View File

@@ -0,0 +1,26 @@
# M13-05D依赖严重性门和例外
- `task`: `M13-05D`
- `parent`: `M13-05C`
- `status`: `done`
## 目标
冻结依赖 severity 门和统一例外合同。`BLOCKER/HIGH` 默认阻断,`MEDIUM` 进入 review`LOW`
进入 tracking任何 finding 的例外必须有 owner、期限、理由和替代控制过期或字段缺失稳定拒绝。
## 验收
```text
npm --prefix web run test:dependency-severity-policy
npm --prefix web run typecheck
npm --prefix web run build
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M13-05D/`;下一任务由 manifest 的 `nextTask` 指向 `M13-05E`
## 回滚
移除 severity policy、checker、报告、manifest、package 命令和状态页;将 `M13-05C` 恢复为队列尾。

27
docs/tasks/M13-05E.md Normal file
View File

@@ -0,0 +1,27 @@
# M13-05E供应链发布绑定
- `task`: `M13-05E`
- `parent`: `M13-05D`
- `status`: `done`
## 目标
将 SPDX 2.3 SBOM、第三方 notices、package/lockfile、source offer、binary/source archive、
`SHA256SUMS.txt` 和当前 commit 绑定到机器可验证报告。对应源码归档必须包含构建输入且与发布包
独立校验。
## 验收
```text
npm --prefix web run test:supply-chain-binding
npm --prefix web run test:binary-archive
npm --prefix web run test:source-archive
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M13-05E/`;下一任务由 manifest 的 `nextTask` 指向 `M13-05F`
## 回滚
移除供应链 checker、报告、manifest、package 命令和状态页;将 `M13-05D` 恢复为队列尾。

26
docs/tasks/M13-05F.md Normal file
View File

@@ -0,0 +1,26 @@
# M13-05F恶意输入矩阵
- `task`: `M13-05F`
- `parent`: `M13-05E`
- `status`: `done`
## 目标
使用生产解析器和既有负例路径验证 malicious blend、image、font、media、archive、node graph、
script manifest 和 GLB。每类必须返回稳定拒绝码不得提取 archive、执行脚本或发布迟到结果。
## 验收
```text
npm --prefix web run test:malicious-input-matrix
npm --prefix web run typecheck
npm --prefix web run build
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M13-05F/`;下一任务由 manifest 的 `nextTask` 指向 `M13-05G`
## 回滚
移除矩阵 checker、报告、manifest、package 命令和状态页;将 `M13-05E` 恢复为队列尾。

25
docs/tasks/M13-05G.md Normal file
View File

@@ -0,0 +1,25 @@
# M13-05Gfuzz 崩溃最小化与回归固化
- `task`: `M13-05G`
- `parent`: `M13-05F`
- `status`: `done`
## 目标
使用固定 seed 对 blend、image、font、node 和 script manifest 生产解析路径执行确定性 fuzz
回放。崩溃必须先保存可重放的最小样本;修复后样本进入长期回归 corpus。本任务不启用脚本执行。
## 验收
```text
npm --prefix web run test:fuzz-regression
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M13-05G/`;本轮 5 个域各 16 个用例,共 80 个用例,零崩溃、
零最小回归样本。下一任务由 manifest 的 `nextTask` 指向 `M13-05H`
## 回滚
移除 fuzz runner、checker、报告、manifest、package 命令和本状态页;将 `M13-05F` 恢复为队列尾。

24
docs/tasks/M13-05H.md Normal file
View File

@@ -0,0 +1,24 @@
# M13-05H审计记录完整性
- `task`: `M13-05H`
- `parent`: `M13-05G`
- `status`: `done`
## 目标
审计记录必须按严格递增的时间和连续 sequence 写入,每个 request ID 只能出现一次;每条记录的
digest 绑定前一条 entry hash任何重放、时间倒退、sequence 或 hash-chain 篡改都稳定拒绝。
## 验收
```text
npm --prefix web run test:script-audit-integrity
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M13-05H/`;下一任务由 manifest 的 `nextTask` 指向 `M14-01A`
## 回滚
移除审计完整性 checker、unit、报告、manifest、package 命令和本状态页;将 `M13-05G` 恢复为队列尾。

24
docs/tasks/M14-01A.md Normal file
View File

@@ -0,0 +1,24 @@
# M14-01A冻结 Chromium、engine 与 archive 身份
- `task`: `M14-01A`
- `parent`: `M13-05H`
- `status`: `done`
## 目标
冻结当前 Chromium 版本、可加载的 engine manifest/variant 资源、离线 binary/source archive 和
`SHA256SUMS.txt`。验收必须对实际文件逐项复算 SHA-256不能只读取描述性 metadata。
## 验收
```text
npm --prefix web run test:chromium-freeze
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M14-01A/`;下一任务由 manifest 的 `nextTask` 指向 `M14-01B`
## 回滚
移除 Chromium freeze checker、报告、manifest、package 命令和本状态页;将 `M13-05H` 恢复为队列尾。

25
docs/tasks/M14-01B.md Normal file
View File

@@ -0,0 +1,25 @@
# M14-01BFirefox capability probe
- `task`: `M14-01B`
- `parent`: `M14-01A`
- `status`: `done`
## 目标
在真实 Firefox 上探测 WASM、Worker、OPFS、IndexedDB、WebGL2、WebGPU、OffscreenCanvas 和
COOP/COEP isolation。每项都记录实际浏览器、平台和 GPU/adapter 信息;缺失能力只能为
`BLOCKED``UNAVAILABLE`,不能按 user-agent 推断支持。
## 验收
```text
npm --prefix web run test:firefox-capability
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M14-01B/`;下一任务由 manifest 的 `nextTask` 指向 `M14-01C`
## 回滚
移除 Firefox probe、报告、manifest、package 命令和本状态页;将 `M14-01A` 恢复为队列尾。

25
docs/tasks/M14-01C.md Normal file
View File

@@ -0,0 +1,25 @@
# M14-01CWebKit capability probe
- `task`: `M14-01C`
- `parent`: `M14-01B`
- `status`: `done`
## 目标
在真实 Playwright WebKit 上使用与 Chromium/Firefox 相同的生产资源和隔离头,探测 WASM、Worker、
OPFS、IndexedDB、WebGL2、WebGPU、OffscreenCanvas 和 COOP/COEP isolation。缺失能力只能记录为
`BLOCKED``UNAVAILABLE`
## 验收
```text
npm --prefix web run test:webkit-capability
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M14-01C/`;下一任务由 manifest 的 `nextTask` 指向 `M14-01D`
## 回滚
移除 WebKit probe、报告、manifest、package 命令和本状态页;将 `M14-01B` 恢复为队列尾。

27
docs/tasks/M14-01D.md Normal file
View File

@@ -0,0 +1,27 @@
# M14-01Dprobe identity and GPU/OS adapter recording
- `task`: `M14-01D`
- `parent`: `M14-01C`
- `status`: `in_progress`
## 目标
在真实 Chromium 生产构建上记录浏览器、运行时 OS、WebGL renderer/vendor 和 WebGPU adapter
身份。身份必须来自实际 API 探测;缺失的 WebGPU adapter 只能记录为 `BLOCKED`,不能按
浏览器或 user-agent 推断能力。报告同时绑定当前 production worker/WASM 资源 hash避免把
不同构建的 GPU 结果混在一起。
## 验收
```text
npm --prefix web run test:probe-identity
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M14-01D/`。完成后 manifest 的 `nextTask` 指向下一颗
最小任务;在本任务通过前不更新浏览器支持声明。
## 回滚
移除 probe checker、报告、manifest、package 命令和本状态页;将 `M14-01C` 保持为队列尾。

20
docs/tasks/M14-01E.md Normal file
View File

@@ -0,0 +1,20 @@
# M14-01EChromium WebGPU fail-closed boundary
- `task`: `M14-01E`
- `parent`: `M14-01D`
- `status`: `in_progress`
## 目标
在 Chromium 中验证 WebGPU 不可用时,依赖 WebGPU 的渲染能力返回稳定 `BLOCKED`,而已验证的
WebGL2 bounded Eevee/Main 路径仍保持 `READY`。本任务不启动 Firefox 或 WebKit。
## 验收
```text
npm --prefix web run test:chromium-webgpu-boundary
```
## 产物和交接
报告和 manifest 位于 `tests/golden/M14-01E/`;通过后从 manifest 的 `nextTask` 继续。

16
docs/tasks/M14-04A.md Normal file
View File

@@ -0,0 +1,16 @@
# M14-04AChromium GPU/memory budget device tier selection
- `task`: `M14-04A`
- `parent`: `M14-01E`
- `status`: `in_progress`
## 目标
在 Chromium 中根据真实探测到的 GPU/adapter、设备内存和硬件并发选择声明的预算档位缺失
或不可信的能力必须降级到保守档位不能自动扩容。Firefox/WebKit 不在本项目范围内。
## 验收
```text
npm --prefix web run test:chromium-device-budget
```

17
docs/tasks/M14-04B.md Normal file
View File

@@ -0,0 +1,17 @@
# M14-04BChromium DPR 1/1.5/2/3 canvas and raycast consistency
- `task`: `M14-04B`
- `parent`: `M14-04A`
- `status`: `in_progress`
## 目标
在 Chromium 主线程 WebGL2 视口中验证 DPR 1、1.5、2、3 的 canvas backing dimensions、CSS
尺寸和 raycast coordinate mapping 保持稳定,不因 DPR 改变逻辑坐标或选择结果。Firefox/WebKit
不在本项目范围内。
## 验收
```text
npm --prefix web run test:chromium-dpr-consistency
```

17
docs/tasks/M14-04C.md Normal file
View File

@@ -0,0 +1,17 @@
# M14-04CChromium mouse/touch/pen pointer identity and cancellation contract
- `task`: `M14-04C`
- `parent`: `M14-04B`
- `status`: `in_progress`
## 目标
为 Chromium 生产输入路径建立统一 pointer observationmouse、touch、pen 分别保留
`pointerType``pointerId``pressure``tiltX``tiltY``button``buttons` 和 cancel 状态;
未知或越界值 fail-closed不把触控/笔事件伪装成 mouse。Firefox/WebKit 不在本项目范围内。
## 验收
```text
npm --prefix web run test:chromium-pointer-contract
```

16
docs/tasks/M14-04D.md Normal file
View File

@@ -0,0 +1,16 @@
# M14-04DChromium IME composition guard for incomplete operators
- `task`: `M14-04D`
- `parent`: `M14-04C`
- `status`: `in_progress`
## 目标
在 Chromium 的生产编辑器输入路径中IME compositionstart/update 期间不触发未完成的
operatorcompositionend 后才允许提交最终文本。Firefox/WebKit 不在本项目范围内。
## 验收
```text
npm --prefix web run test:chromium-ime-guard
```

17
docs/tasks/M14-04E.md Normal file
View File

@@ -0,0 +1,17 @@
# M14-04EChromium US/non-US/dead-key/modifier keymap fixture
- `task`: `M14-04E`
- `parent`: `M14-04D`
- `status`: `in_progress`
## 目标
固定 Chromium 生产路径的 key identity 解析US 与非 US 字符、dead key、Shift/Ctrl/Alt/Meta
修饰键必须保留原始 `key`/`code`/`location`/修饰键,不把字符布局推断为另一种物理按键。
Firefox/WebKit 不在本项目范围内。
## 验收
```text
npm --prefix web run test:chromium-keymap-fixture
```

56
docs/tasks/M14-04F.md Normal file
View File

@@ -0,0 +1,56 @@
# M14-04FChromium touch modal cancel / two-finger navigation / pen commit
- `task`: `M14-04F`
- `parent`: `M14-04E`
- `status`: `in_progress`
## 目标
在 Chromium 输入状态层固定三条边界:触控 modal 取消不提交 Main双指手势只产生一次
navigation session笔 stroke 的 pointerup 只允许一个 Main commit重复 up/cancel 不重复提交。
Firefox/WebKit 不在本项目范围内。
## 输入
- 上一个 manifest`tests/golden/M14-04E/manifest.json`
- 协议入口:`web/protocol/input-modal.ts`
- 单测入口:`web/tests/unit/input-modal.test.mjs`
- Chromium 检查器:`tools/web/check-chromium-input-modal.mjs`
- 当前报告:`tests/golden/M14-04F/chromium-input-modal-report.json`
## 细分门
1. **协议门**:固定 `InputModalState`、pointer ID 校验、touch/pen 状态转移和稳定计数。
2. **触控门**`pointercancel` 清理活动 pointer不产生 Main commit。
3. **双指门**:从一个 pointer 进入两个 pointer 时只增加一次 navigation session重复 down、
pointer 顺序和单指结束不得重复创建 session。
4. **笔门**:同一笔 stroke 的第一个合法 `pointerup` 最多产生一次 Main commitlate up/cancel
不得重复提交或改变 revision。
5. **生产接线门**:主线程与 Offscreen 生产输入路径必须真正消费协议;不能只在测试中调用纯函数。
6. **浏览器证据门**Chromium checker 必须读取真实 modal 状态、Main revision/commit counter 或
等价生产诊断,而不是仅记录派发了几个 `PointerEvent`
7. **交接门**focused 命令、必要的 typecheck/build、report、manifest、status 和回滚路径齐全。
协议单测和事件派发通过,只能关闭前四个门的一部分;在生产接线和真实状态断言完成前,任务保持
`in_progress`,不得根据报告中的固定保证字段直接改为 `done`
## 验收
```text
npm --prefix web run test:chromium-input-modal
```
必要的补充门:
```text
npm --prefix web run typecheck
npm --prefix web run build
git diff --check
```
## 产物和交接
- 报告:`tests/golden/M14-04F/chromium-input-modal-report.json`
- manifest`tests/golden/M14-04F/manifest.json`
- 状态页:完成或阻断后新增 `docs/status/M14-04F.md`
- 下一任务:只读取 manifest 的 `nextTask`,不能从长期计划手工推导