217 lines
17 KiB
Plaintext
217 lines
17 KiB
Plaintext
Web Blender M6/M7 接续执行记录
|
||
更新时间:2026-08-15(America/New_York)
|
||
|
||
执行规则
|
||
1. 本文件是当前接续入口;每轮先读本文件,再按“唯一下一领取点”直接执行。
|
||
2. 严格按当前里程碑原子任务顺序推进,前一项未通过时不把后一项标为完成。
|
||
3. 每完成一段,写回实际命令、结果、hash、当前计数和下一领取点。
|
||
4. 不覆盖用户已有改动,不提交或改写 git 历史。
|
||
|
||
当前状态
|
||
- M6 正式完成:71/71;剩余:0。
|
||
- M7 正式完成:7/18;剩余:11。
|
||
- 已完成到:M7-07。
|
||
- 唯一下一领取点:M7-08(Worker 崩溃时展示可恢复错误,不清空当前项目列表)。
|
||
- quick lane:READY,7/7 命令通过,总命令耗时 11,455 ms,报告
|
||
release/ci-reports/quick.json。
|
||
- Chromium lane:READY,9/9 命令通过;每个 browser server 使用独立动态端口,报告
|
||
release/ci-reports/chromium.json,总命令耗时 41,003 ms。
|
||
- release lane:READY,25/25 命令通过,总命令耗时 1,334,766 ms,报告
|
||
release/ci-reports/release.json。
|
||
|
||
本轮新增并已验证
|
||
- M6-09A-C:binary archive 解包到 mktemp 后由包内 deployment contract 启动;新浏览器
|
||
context 阻断所有非 loopback 请求,manifest、WASM、CSS、3 个 Worker、字体和基础 UI 冷启动通过。
|
||
- M6-10A-D:真实归档环境完成 OPFS open/edit/save、Worker 重建、离线恢复、继续 edit、
|
||
undo/redo、revision 单调保存和 GLB 严格回读;stable object/data IDs 与 blend SHA-256 已核对。
|
||
- M6-11A-C:binary archive 在独立目录校验 SHA256SUMS、合同、许可证、SBOM、manifest,
|
||
23 个 manifest 文件通过;archive browser smoke 通过并清理 server/profile。
|
||
- M6-12A-D:source archive 在另一个独立目录校验 18,173 个文件,无 pycache/dist/build 输出;
|
||
npm ci、typecheck、build 通过,14 个 production build 文件与 binary app 逐项一致。
|
||
- M6-13A-C:确认 Gitea Actions、自托管 Debian 13 runner、Node 20.19.2、Playwright 1.62.1、
|
||
Chromium 149/Chrome 150、Blender 5.2.0、Emscripten 3.1.69;quick cache 只绑定 lockfile/toolchain。
|
||
- M6-14A-C:P0、main/Offscreen、network、device-loss、OOM、OPFS quota、malicious blend/archive
|
||
共 9 个 Chromium lane 子命令通过,端口均动态分配并由 Playwright 清理。
|
||
- M6-15A:full E2E 126/126、100k/1M/10M geometry、4K/8K texture、600 帧 simulation、
|
||
1M 帧 media、VDB native/server/OPFS/WebGPU/双视口/故障、49/49 acceptance、
|
||
offline reproducibility 和 archive 复验共 19/19 通过。
|
||
- full E2E 首次发现开发服务器错收集 archive-only spec;已将该 spec 限制到
|
||
playwright.archive.config.ts,定向 M6-09 通过后完整 release lane 从头重跑通过。
|
||
- M6-15B/C:release 仅由 main push 或 workflow_dispatch 触发;exit code 17 失败注入
|
||
只生成新 FAILED 报告,不复用旧 READY。
|
||
- M6-16A-C:quick/Chromium/release 三报告联合校验通过,绑定同一 commit、
|
||
lockfile、ledger、engine、archive 和每条日志 SHA-256,retention 固定为 7/14/30 天。
|
||
- M6-17A:DEPLOYMENT.md 已补齐空目录安装和 transport preflight;自动门在 mktemp
|
||
中校验交付 SHA-256、拒绝危险 tar 条目、安装到内容 hash 目录、原子建立 current,
|
||
验证 HTTPS/127.0.0.1 READY 与 public HTTP/file BLOCKED,并从安装后目录验证合同头/range。
|
||
- M6-17B:binary archive 新增 release-metadata.json,绑定 product/engine、IDB schema 6、
|
||
OPFS schema 1、3 个 Worker 和缓存策略;双版本门验证 5->6 前向迁移、Worker 换代、
|
||
失败前置不改 current、成功原子切换、旧 release 保留和项目 SHA-256 不变。
|
||
- M6-17C:回滚合同只原子切换 current 的整套 app/engine release;相同 IDB/OPFS schema
|
||
旧版 READY,IDB 降级和 OPFS 逆迁移稳定 BLOCKED;新版目录、项目 bytes、revision 17 和
|
||
blend SHA-256 全部保留。
|
||
- M6-17D:operations-diagnostics.json 与 DEPLOYMENT.md 表格覆盖 MIME、range、isolation、
|
||
hash、quota、Worker、GPU 七域,21 个信号唯一;检查、预期、恢复和数据安全边界
|
||
与 deployment contract 联合校验,诊断 JSON 已进入 binary archive。
|
||
- M6-17E:operations rehearsal 在同一个全新 mktemp 根内连续执行 8/8 步骤:
|
||
delivery hash/path、空目录安装、deploy HTTP、项目写入、upgrade 切换/HTTP、rollback 切换/HTTP;
|
||
revision 23 与 blend SHA-256 不变,临时根已清理。
|
||
- M6-18A:冻结 `0.1.0-rc.1`、engine `blender-wasm-0.1.0-rc.1` 和 HEAD
|
||
`17ab961485fe2ea1574c5f0b7d3ef9608a2bf424`;RC 生成器先稳定拒绝旧 `0.1.0`
|
||
metadata,再重建并两次复验确定性 binary/source archive。`RC_MANIFEST.json` 与 sidecar
|
||
已绑定 package/package-lock、engine manifest、binary 内 release metadata/SBOM、ledger、
|
||
`SHA256SUMS.txt`、3 个主要构件和 5 个 operations report;binary 25 文件、source 18,185
|
||
文件及 14 个重建产物独立复验通过。
|
||
- M6-18B:新增 RC 发布说明,只列已通过的 P0、双 viewport、single/pthread、OPFS、
|
||
性能/故障、离线交付和 CI/运维能力;自动核对 12 个 V1 family `READY` 与 12 个
|
||
Blender 全域 `BLOCKED`,7 个本地链接全部可解析。`V1_SCOPE.md` 和机器 ledger 已进入
|
||
离线包,binary manifest 复验 28 个文件通过。
|
||
- M6-18C:已知限制明确 Chromium-only、HTTPS/loopback、AUTO/SINGLE/PTHREAD 选择、
|
||
初始化失败单次 fallback、hash fatal 和 release 刷新边界;记录 WASM 16 MiB 初始/2 GiB
|
||
ceiling、origin-bound storage/无最低 quota 保证、纹理 64 MiB/16,384 px/256 项,以及
|
||
VDB/NanoVDB 512 MiB/1 GiB/512 MiB 上限与 adapter 可能更低。限制自动检查与 binary
|
||
29 文件复验通过。
|
||
- M6-18D:发布恢复手册覆盖 SHA256SUMS/RC manifest/归档/三 lane 证据校验、生产
|
||
Save Project 的 OPFS commit + 外部 `.blend` 备份、revision/hash/origin 记录、切换前失败、
|
||
切换后兼容回滚、IDB/OPFS schema 稳定阻断及独立恢复 origin;文档检查、binary 30 文件
|
||
复验和全新临时根 operations rehearsal 8/8 再次通过。
|
||
- M6-18E:quick 从首次 unit hardcoded version 的新 `FAILED` 报告定位并修正后完整重跑
|
||
`READY 7/7`;Chromium `READY 9/9`;release 扩充 RC 文档、5 项 operations 和 manifest
|
||
门后 `READY 25/25`。full E2E 126/126、49/49 acceptance、归档重建/浏览器/独立 source
|
||
rebuild 全部通过;三报告与 RC manifest 联合绑定同一 HEAD、package/lockfile、ledger、
|
||
engine、SBOM、3 份发布文档和最终 archive hash,exit code 17 仍只生成新 `FAILED`。
|
||
- M7-01:新增纯 `user-action-state` 合同,覆盖 IMPORT/OPEN/SAVE/SAVE_AS/EXPORT 和
|
||
IDLE/RUNNING/SUCCEEDED/FAILED/CANCELLED;action identity、允许转换、身份/复用/错误码
|
||
拒绝均为确定性结果。生产 App 已在图片 Main transaction、blend open、OPFS commit、blend
|
||
download 和 GLB export 的真实边界记录状态;保存仍保持先原子提交再下载。unit 4/4、
|
||
Chromium 正负例 2/2、typecheck 和 production build 全部通过。
|
||
- M7-02:新增纯项目动作互斥合同,OPEN/SAVE/CLOSE 冲突矩阵完全对称且独占,冲突统一返回
|
||
`USER_ACTION_CONFLICT`,并细分 REPEATED_OPEN、CONCURRENT_SAVE、CLOSE_DURING_SAVE。
|
||
App 的 open、manual save、autosave 和 close 使用同一 owner lock;同一浏览器任务竞争验证第二次
|
||
open 不替换首个 projectId、双 save 只提交/下载一次、save 中 close 不清空 scene 或终止 Worker,
|
||
提交后继续 edit/save/close 正常。互斥 unit 4/4,联合 unit 8/8、新 Chromium 5/5、既有
|
||
save/autosave 2/2、typecheck 和 build 全部通过。
|
||
- M7-03:新增 `File.stream()` 分块 reader;每个实际 stream chunk 最多按 1 MiB 有界复制,
|
||
进度来自累计真实字节/文件声明大小,每 4 MiB 让出一次 UI 并同步提交紧凑进度状态,不使用
|
||
时间插值。每次 open 有独立 AbortController,读入阶段提供取消按钮;取消稳定进入
|
||
`CANCELLED/OPEN_CANCELLED`,不调用 WebEngine、不替换旧 scene/projectId。621,323-byte 有效
|
||
blend 精确完成,40 MiB 合成输入在中间字节取消;reader unit 3/3,联合 unit 11/11、
|
||
新 Chromium 7/7、既有 save/autosave 2/2、typecheck 和 build 全部通过。
|
||
- M7-04:reader 资源 ledger 在取消返回前执行 stream cancel/release、清零未完成 output,并证明
|
||
live reader/input bytes/staging 全为 0。WebEngine open 改为隔离候选 WASM module/Main handle,
|
||
AbortSignal 通过 cancelOpen request 在 NATIVE_INITIALIZE/NATIVE_OPENED 阶段取消;只有构建
|
||
SceneIR 成功才原子替换当前 Main,取消则释放 native input、销毁候选 handle,当前架构无 OPFS
|
||
import staging,计数恒为 0。native 取消后旧 Basic Main 继续 edit/save;联合 unit 11/11、
|
||
新 Chromium 8/8、既有 open/save/autosave/concurrent-open/isolated-preview 5/5、build 全部通过。
|
||
- M7-05:新增纯 save transaction 合同,冻结 base committed revision/hash,SERIALIZE、OPFS_STAGE、
|
||
SCENE_COMMIT、METADATA_COMMIT 任一失败均只更新 attempt;只有 Storage 返回的 revision/hash 与
|
||
candidate 完全一致才推进 committed。已有基线项目在 after-stage、after-scene-commit、
|
||
before-metadata-commit 故障中用同一原子 writer 回写旧 bytes 后抛错,Worker 重启后旧
|
||
revision/hash/bytes 逐项不变;无基线 M6 journal 前滚仍通过。unit 14/14、新 Chromium 9/9、
|
||
旧 recovery/save/autosave/quota 4/4、build 全部通过。
|
||
- M7-06:新增纯 dirty state,open/recover 建立 current/committed Main revision,只有成功 Main
|
||
transaction 推进 current,匹配 candidate 的成功 save 才对齐 committed;preview、workspace、
|
||
失败 import/open 保持原状态。删除手动 dirty toggle,旧 autosave 测试改用真实 Add Cube。
|
||
unit 17/17、新 Chromium 10/10、真实 Main/save/autosave 3/3、build 全部通过。
|
||
- M7-07:undo/redo 成功后序列化当前 Main 并与最近成功 save 的 blend SHA-256 比较;逻辑
|
||
revision 始终单调增加,内容 hash 相同即 clean、不同即 dirty。save -> edit -> undo clean ->
|
||
redo dirty -> undo clean 的 Chromium 路径通过。联合 unit 18/18、Chromium 10/10、build 通过。
|
||
|
||
待完成任务(严格顺序)
|
||
- M7-08:Worker 崩溃时展示可恢复错误,不清空当前项目列表。
|
||
- M7-09 至 M7-18:Worker/recent projects 恢复、
|
||
存储预算与清理、输入/响应式/双 viewport/键盘可访问性、诊断报告和 30 分钟 soak。
|
||
|
||
M6-15/M6-16 实际验证命令
|
||
- BLENDER_BIN=<official-usd-enabled-blender> BLENDER_ARCHIVE_SHA256=96f6c181...1c48
|
||
CHROME_PATH=<chrome-150> VDB_RESOURCE_ROOT=<vdb-root> npm --prefix web run ci:release
|
||
- node tools/web/check-ci-report.mjs release/ci-reports/quick.json
|
||
release/ci-reports/chromium.json release/ci-reports/release.json
|
||
- npm --prefix web run test:ci-failure-report
|
||
|
||
M7-01 实际验证
|
||
- `npm --prefix web run typecheck`:通过。
|
||
- `WEB_TEST_PORT=5194 npm --prefix web run test:user-actions`:unit 4/4、Chromium 2/2 通过。
|
||
- `npm --prefix web run build`:通过,55 modules transformed。
|
||
- `git diff --check -- web/protocol/user-action-state.ts web/tests/unit/user-action-state.test.mjs
|
||
web/tests/e2e/user-action-state.spec.ts web/app/src/app/App.tsx web/package.json`:通过。
|
||
- `user-action-state.ts` SHA-256:232257fb0e85a6827d71a1acbbf82477ba8c441c224cf994049bde96943c518e。
|
||
- unit/Chromium spec SHA-256:88ace5b65a5bee44d4ab417ea2144391d461117e848b1446da86b1cf0b21e237 /
|
||
9ecb1e63f58c25dc64e0f8738b272b45529212469c9ea2ca660b68d4f0e7b566。
|
||
|
||
M7-02 实际验证
|
||
- `npm --prefix web run typecheck`:通过。
|
||
- `WEB_TEST_PORT=5196 npm --prefix web run test:user-actions`:联合 unit 8/8、Chromium 5/5 通过。
|
||
- `WEB_TEST_PORT=5197 npx --prefix web playwright test --config web/playwright.config.ts
|
||
web/tests/e2e/smoke.spec.ts -g "saves the opened blend|autosaves a dirty project"`:2/2 通过。
|
||
- `npm --prefix web run build`:通过,56 modules transformed。
|
||
- `project-action-mutex.ts` SHA-256:330da0a7253f9bda9f7b43f5df4a252596fe43723c489308b1e0cbb6311aefd4。
|
||
- unit/Chromium spec SHA-256:92af891ddbb54c54c2717a8e8d4466678de2cb7117f413f431a2e32fa2446f0c /
|
||
0eb8f7c40dab623762d04e485348fbdaa68e9782010199e5d1b888f9475d6896。
|
||
|
||
M7-03 实际验证
|
||
- `npm --prefix web run typecheck`:通过。
|
||
- `WEB_TEST_PORT=5206 npm --prefix web run test:user-actions`:联合 unit 11/11、Chromium 7/7 通过。
|
||
- `WEB_TEST_PORT=5207 npx playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts
|
||
-g "saves the opened blend|autosaves a dirty project"`:2/2 通过。
|
||
- `npm --prefix web run build`:通过,57 modules transformed。
|
||
- `file-byte-reader.ts` SHA-256:3472e2a8cc01b6a78dda85d90a0a6f106ee3c0ad0e3c598bd3f6a7cbca14b536。
|
||
- unit/Chromium spec SHA-256:1e86e6f553cafcd2a890eab76f090ba2eb249c21fced88b6f82db80162254bc8 /
|
||
78608c721e5bd66570ae73b13c9c4531fc7d555b226c194188e73cddcde6b370。
|
||
|
||
M7-04 实际验证
|
||
- `npm --prefix web run typecheck`:通过。
|
||
- `WEB_TEST_PORT=5210 npm --prefix web run test:user-actions`:联合 unit 11/11、Chromium 8/8 通过。
|
||
- `WEB_TEST_PORT=5211 npx playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts
|
||
-g "opens a local .blend|serializes concurrent WebEngine init|previews Decimate|saves the opened blend|autosaves"`:5/5 通过。
|
||
- `npm --prefix web run build`:通过,57 modules transformed。
|
||
- WebEngineClient/Worker SHA-256:1e2cac9f9a9ebfb068cb8a7cfeab5100d9534600dcdd703a12d68614940a28e5 /
|
||
331c7854ea75e2def1bf503118c670908d39ce9ede9c5deb5a4432812172582b。
|
||
- Chromium spec SHA-256:467d50dadce0f2b1d8da090fcc9383c642d3fd9fa19d19b53833340d418490a6。
|
||
|
||
M7-05 实际验证
|
||
- `npm --prefix web run typecheck`:通过。
|
||
- `WEB_TEST_PORT=5214 npm --prefix web run test:user-actions`:联合 unit 14/14、Chromium 9/9 通过。
|
||
- `WEB_TEST_PORT=5215 npx playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts
|
||
-g "recovers verified atomic saves|quota exhaustion|saves the opened blend|autosaves"`:4/4 通过。
|
||
- `npm --prefix web run build`:通过,58 modules transformed。
|
||
- save transaction/StorageWorker SHA-256:9c6d932d6d2ce308ae8fbc56ee56296f1b67bd22e76b90a69751813f174bc766 /
|
||
bfde02b78850beb510c7a92fcefb6b3b9f5d2ef4bef09027a7fdc6f737181789。
|
||
- unit/Chromium spec SHA-256:99fde5eb7152e1fe0df8702660724f8457a6423fb1d731f92758670b531cfd96 /
|
||
e453f817b3bae19ddf18c57c4429743e7157d083ab9ebf2e8e523bc6301d226d。
|
||
|
||
M7-06 实际验证
|
||
- `npm --prefix web run typecheck`:通过。
|
||
- `WEB_TEST_PORT=5217 npm --prefix web run test:user-actions`:联合 unit 17/17、Chromium 10/10 通过。
|
||
- `WEB_TEST_PORT=5218 npx playwright test --config web/playwright.config.ts web/tests/e2e/smoke.spec.ts
|
||
-g "Main-authoritative|saves the opened blend|autosaves a dirty project"`:3/3 通过。
|
||
- `npm --prefix web run build`:通过,59 modules transformed。
|
||
- dirty contract/unit/Chromium SHA-256:283d08dd92e7f7afc13ba004982160d23369a42ea487c77c7fc6de803f4c00e7 /
|
||
ab71114adb58fec8387ff8b8ca0a1729681a57e370a995c0ee7e71eeabc3baf2 /
|
||
9980065a202b97975d299ef93312c442f4bc69b8840e899e89b1f802d13967e7。
|
||
|
||
M7-07 实际验证
|
||
- `npm --prefix web run typecheck`:通过。
|
||
- `WEB_TEST_PORT=5220 npm --prefix web run test:user-actions`:联合 unit 18/18、Chromium 10/10 通过。
|
||
- `npm --prefix web run build`:通过,59 modules transformed。
|
||
- dirty contract/unit/Chromium SHA-256:ee1a04a6f43a4c5504657f318249c9c2e27abe47647cef64237b94ba2e56f1ea /
|
||
1e5c6ddeb29ca110b90a01f40a8ceca26e18d7787455dd13aeb8a0da76adb602 /
|
||
9b884c1e975b4ae4b55f6bc80ed191444790d75eccb09718863f24a54fd4aa18。
|
||
|
||
M7-08 立即执行
|
||
- WebEngine/Storage Worker error 统一映射为 recoverable worker fault,不在 error callback 中清空 snapshot、
|
||
recent project 或 committed/dirty identity;所有 pending request 只结算一次。
|
||
- 提供显式“重启并恢复”入口,先重建 Worker,再从当前项目 OPFS commit + operation log 恢复。
|
||
- 添加 Worker 崩溃注入,验证可恢复短错误、项目列表/当前 UI 保留和恢复成功;完成后推进 M7-09。
|
||
|
||
关键当前构件
|
||
- binary archive SHA-256:8af6c782b8e4b31020219597b821160b7634439749c455fd31d9d919676e2e2e
|
||
- source archive SHA-256:ee09b3e43e715b3d5497573bbf63a449cbea146150d56c08c6506afd5fce2871
|
||
- SBOM SHA-256:7d0fb22790c44bada5f01e5ebc12f6050e1c0436a53f58dceb2e979c17bb593a
|
||
- RC manifest SHA-256:862d332b3c931cb5c0898bb7f66e02f0dd4562053b18d0c87a7cea390ebaacdf
|
||
- M6-17E rehearsal report SHA-256:b953dd89165b5dd9260d75c7ec6e982a69cfeea358fbc2ce35c75e99544cac2c
|
||
- quick/Chromium/release report SHA-256:dcaa32be911fa7ed36127b5cb1458bb07dcca19d562cabc64e022f13b094f911 /
|
||
90b19d057957f1edce264c7137f89d6701643e46feb88001054eea1bf0a18eb5 /
|
||
7d28a5018b78ba45935f832388d6b4e632c6198476a2fdcb4a0abef3066c5ec6
|
||
- HEAD commit:17ab961485fe2ea1574c5f0b7d3ef9608a2bf424
|