Advance M7 workflows and release operations
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-15 17:43:53 -04:00
parent 17ab961485
commit 7c16b279ae
103 changed files with 8064 additions and 429 deletions

View File

@@ -1,6 +1,6 @@
# Web Blender V1 当前执行计划
更新时间2026-08-14
更新时间2026-08-15
## 1. 交付目标
@@ -110,21 +110,25 @@ React 工作区和编辑器
| 交付 | 离线 binary/source archive、SBOM、SHA-256 可复现 | 正式部署模板、持续发布流水线、跨机器复验待做 | 本地 V1 RC 已收口 |
2026-08-15 重新执行 `typecheck``lint`、14 个 Node tests、status consistency、release
evidence checker 和 `git diff --check`,均退出 0。acceptance runner 解析 12 个 family 的
50 条声明,去重为 49 条命令并全部通过,命令总耗时 454,106 ms清单 SHA-256 为
`74c01764987c3dce0601a20cdf494f8076102f6d54262a1d13df953abee96160`。官方 Blender 5.2.0
evidence checker 和 `git diff --check`,均退出 0。M6-03 后 acceptance runner 再次解析 12 个
family 的 50 条声明,去重为 49 条命令并全部通过,命令总耗时 480,169 ms清单 SHA-256 为
`d5fb0a7b2df92b076f8b05ccd68903d60e3352b9423b0c1404065f6cbcbdd45c`。官方 Blender 5.2.0
Linux archive SHA-256 为 `96f6c181a30f4950607839dc84d42a354b250d8a0231b098b59b7bc69c351c48`
运行时 `USD=True`desktop USD roundtrip 已通过。
最终 release evidence 生成时间为 `2026-08-15T04:43:09.832Z`17 条 record 均为 exit code 0、
非空输出和非空构件 hash总命令耗时 553,427 ms。`v1-user-loop` record 已绑定上述 acceptance
第一次重跑误用了本地 `USD=False` Blender结果为 48/49该失败证据未标 READY。修正为上述
官方 runtime 后完整重跑 49 条,而不是手改失败记录。当前 release evidence 生成时间为
`2026-08-15T05:37:25.215Z`17 条 record 均为 exit code 0、非空输出和非空构件 hash
总命令耗时 553,577 ms。`v1-user-loop` record 已绑定上述 acceptance
清单 hash。
### 4.4 当前阻断与决策顺序
1. `P0`V1 本地 RC 已无阻断;下一领取点为 `M6-01` 部署响应头合同
2. `P1`当前离线包已在本机连续两次可复现,还缺独立目录/独立机器复验和真实 HTTP 部署门。
3. `P1`pthread/single-thread 的生产选择、隔离头、fallback 和缓存升级合同尚未形成发布证据
1. `P0`V1 可部署 RC 已完成 M6 71/71M7 已完成 7/18下一领取点为 `M7-08` Worker 崩溃恢复
2. `P1`binary/source archive 已在独立目录复验quick/Chromium/release 三条
CI lane 与 RC manifest 已联合校验;发布/限制/恢复和运维合同均已进入离线包
3. `P1`pthread/single-thread、真实 HTTP、缓存升级、归档离线、OPFS 断网和空目录
deploy/upgrade/rollback 均已有可复验证据M7 开始核心项目体验硬化。
4. `P2`:完整 Blender 功能域继续受 VDB demand paging、PBVH、Geometry Nodes evaluator、
通用 Shader、完整编辑器/渲染/媒体和安全脚本边界阻断。
@@ -146,9 +150,19 @@ loss、恶意 blend、zip bomb、离线包和 V1 用户闭环均已在最终 M5
| M3 long media | 长时间线索引、seek、取消与重启证据 | 已完成,持续回归 | `performance.longMedia=true` |
| M4 OOM | 四类确定性内存故障与恢复证据 | 已完成,持续回归 | `faults.oom=true` |
| M5 V1 RC | 可复现离线候选包、SBOM、校验和 | 已完成,持续回归 | release gate `READY`、49/49 acceptance |
| M6 可部署 RC | 双 WASM 运行时选择、真实 HTTP、离线包、CI、运维合同 | 已完成71/71 | single/pthread 可解释,真实部署与归档 P0 通过 |
| M7 核心体验硬化 | 项目状态机、恢复、存储、输入和可访问性 | 进行中7/18 | 30 分钟编辑/保存/重开 soak 通过 |
| M8 VDB 自动分页 | GPU 缺页反馈、range/OPFS、LRU、双视口恢复 | 未开始 | 64 MiB sparse bundle 与三视角 golden 通过 |
| M9 非 Mesh/GP/Paint | 字体、Curve、Grease Pencil、Paint 增量闭环 | 未开始 | 每个新增 writer 独立通过 Main/undo/save/golden |
| M10 GN/Shader/NLA/Simulation | 白名单求值、cache、编译与阻断 | 未开始 | 四域分别通过 desktop/WASM/fault 门 |
| M11 Render/Compositor/Media | 灯光、渲染、合成、媒体执行边界 | 未开始 | 本地白名单与 server 边界均可审计 |
| M12 Asset/IO/Editors | 资产、格式、编辑器和上下文工作流 | 未开始 | 每个格式/editor 有独立 round-trip 或稳定阻断 |
| M13 Scripting/Security | 脚本默认拒绝、服务端隔离、CSP、供应链 | 未开始 | 恶意输入矩阵和 release 安全门通过 |
| M14 跨浏览器/设备 | Firefox、WebKit、触控、笔、HiDPI、IME | 未开始 | 新浏览器进入 quick/P0/full CI 后才声明支持 |
| M15 全域审计 | Blender 5.2 全域差距和下一发布 | 未开始 | 逐 family 审计,不由聚合 release gate 反推完成 |
任务严格按 M1 -> M2 -> M3 -> M4 -> M5 领取。里程碑内部允许先写纯校验任务,但不得在
前一里程碑失败时把后一里程碑标为完成。
M0 至 M5 已完成并转入持续回归;当前严格领取 M6。里程碑内部允许先写纯校验任务,但不得在
前一里程碑失败时把后一里程碑标为完成M7 至 M15 不得绕过 M6 发布合同扩功能
## 6. M0 范围、状态和 P0 闭环
@@ -448,9 +462,9 @@ M5 按 `PREP -> STATIC -> ACCEPT -> LOOP -> PERF -> FAULT -> VDB -> PACKAGE -> A
- [x] `M5-ACCEPT-19` 使用 SHA-256 校验的官方 USD-enabled Blender 5.2 重跑 desktop USD
roundtrip归档 hash 和 executable hash 均写入 acceptance evidence。
- [x] `M5-ACCEPT-20` 运行完整 acceptance runner50 declarations、49 unique、49 passed、
0 failed总命令耗时 454,106 ms。
0 failedM6-03 后复验总命令耗时 480,169 ms。
- [x] `M5-ACCEPT-21` 将 acceptance evidence SHA-256
`74c01764987c3dce0601a20cdf494f8076102f6d54262a1d13df953abee96160` 绑定到最终
`d5fb0a7b2df92b076f8b05ccd68903d60e3352b9423b0c1404065f6cbcbdd45c` 绑定到最终
`v1-user-loop` release record。
### M5.3 P0 用户闭环和 Chromium 回归
@@ -525,7 +539,7 @@ M5 按 `PREP -> STATIC -> ACCEPT -> LOOP -> PERF -> FAULT -> VDB -> PACKAGE -> A
- [x] `M5-AUDIT-03` 确认 12 个 family 仍为 `parityStatus=BLOCKED`
- [x] `M5-AUDIT-04` 确认 12 个 V1 required slice 均为 `releaseStatus=READY`
- [x] `M5-AUDIT-05` 运行完整 `release:evidence`,用本轮命令输出和构件 hash 替换旧 records
当前生成时间 `2026-08-15T04:43:09.832Z`17 条 record总命令耗时 553,427 ms。
当前生成时间 `2026-08-15T05:37:25.215Z`17 条 record总命令耗时 553,577 ms。
- [x] `M5-AUDIT-06` 检查 17 条 evidence record 均为 exit code 0、非空输出和非空构件 hash。
- [x] `M5-AUDIT-07` 检查 evidence 的 ledger SHA-256 与当前文件完全一致。
- [x] `M5-AUDIT-08` 运行 `test:release-evidence`,结果 `READY``missing=[]`
@@ -541,7 +555,7 @@ SBOM、状态和 evidence SHA-256 相互一致。
M5 最终 archive SHA-256binary
`f2903a75026a0a28615aeb5f4834a3859af83022c82bc50e28437dcbed68e549`source
`9a9c1b505c68a618de842be7c248f628b104b11b80e8a40d111f62540fcba327`。下一任务:`M6-01`
`9a9c1b505c68a618de842be7c248f628b104b11b80e8a40d111f62540fcba327`当前下一任务:`M7-08`
## 12. V1 后原子里程碑
@@ -551,40 +565,157 @@ M5 最终 archive SHA-256binary
### M6 可部署 RC
M6 固定按 `runtime -> HTTP -> cache/offline -> archive -> CI -> operations` 串行推进。每个
任务只验证一个行为;上一小里程碑未通过时,不把后一小里程碑的准备工作记为完成。
#### M6.1 single-thread 无隔离启动
- [x] `M6-01` 新建机器可读部署合同,固定 MIME、缓存、COOP、COEP、CORP 和 Range 响应头;
`node tools/web/check-deployment-contract.mjs`、typecheck、lint 和 production build 通过。
- [x] `M6-02` 复用 `CapabilityGateResult` 新增纯函数 `gateWasmThreadingCapability`;仅当
`crossOriginIsolated``SharedArrayBuffer``Worker` 同时可用时放行 pthread 引擎,
缺失项逐条返回稳定结构single-thread 初始化路径不调用该门。
- [ ] `M6-03` 验证 single-thread 引擎在无隔离环境启动
- [ ] `M6-04` 验证 pthread 引擎只在隔离和 SharedArrayBuffer 可用时启动。
- [ ] `M6-05` 验证 pthread 初始化失败回退 single-thread且不重复打开项目
- [ ] `M6-06` engine JS/WASM、Worker、CSS 和 fixture 固定正确 MIME。
- [ ] `M6-07` 为 WASM 与大资产验证 byte-range 206、`Content-Range` 和稳定 ETag
- [ ] `M6-08` 验证版本更新后旧 HTML 不加载新旧混合 hash 资源。
- [ ] `M6-09` 验证完全断网冷启动离线包,不访问 CDN 或外部字体
- [ ] `M6-10` 验证断网重开 OPFS 项目、编辑、保存和 GLB 导出
- [ ] `M6-11` 在全新临时目录解包 binary archive 并运行 browser smoke。
- [ ] `M6-12` 在全新临时目录解包 source archive 并核对 source offer/SBOM
- [ ] `M6-13` 建立 CI quick lanetypecheck、lint、unit、status、evidence schema。
- [ ] `M6-14` 建立 CI Chromium laneP0 用户闭环、双视口和 fault smoke。
- [ ] `M6-15` 建立 CI release lane全 E2E、性能、离线复现和 acceptance evidence。
- [ ] `M6-16` 所有 CI lane 输出机器可读 JSON 和构件 SHA-256。
- [ ] `M6-17` 写部署/升级/回滚 runbook命令在空目录实测。
- [ ] `M6-18` 生成 RC 版本号、变更说明、已知限制和恢复说明。
- [x] `M6-03A` 增加仅供测试使用的无隔离 Vite profile默认 dev/preview 仍强制部署合同头
- [x] `M6-03B` 在独立 Chromium context 断言文档响应没有 COOP/COEP/CORP
`crossOriginIsolated=false``SharedArrayBuffer` 不可用、`Worker` 可用
- [x] `M6-03C` 断言当前 engine manifest 为 `memory.shared=false`,网络请求不包含 pthread
JS/WASM/worker 资产
- [x] `M6-03D` 在上述环境等待 single-thread WebEngine 返回 `ready`,同时证明 pthread gate
`BLOCKED`,从行为上保证 single-thread 不受该门阻断
- [x] `M6-03E` 使用真实 `basic_scene.blend` 完成 open 和一个 Main edit证明不是只加载 UI shell
M6.1 退出条件:专项命令一次启动独立无隔离服务器,以上五项同进程通过,退出码为 0
#### M6.2 pthread 选择与回退
- [x] `M6-04A` 扩展 engine manifest schema显式声明 single/pthread variant、JS、WASM、
pthread worker、shared memory 和每个文件 SHA-256v2 纯校验器固定 256 至 32768 pages、
variant 资源隔离和稳定错误路径21 个专项正负例断言通过。生产 manifest/安装路径保持 v1
无隔离 single-thread 专项回归通过。
- [x] `M6-04B` 安装脚本从两个独立构建目录复制 variant 资产到显式 single/pthread URL
生成绑定四个物理文件 SHA-256 的生产 schema v2 manifest同目录和缺失资产负例不会改写目标
Node 专项、manifest/local dependency、build 和无隔离 Chromium 回归通过。旧 single Worker 入口
只作为 `M6-05` fallback 接线前的完整 Main 兼容路径保留。
- [x] `M6-04C` 新增纯函数选择 engine variant输入仅为 manifest、用户策略和平台能力
frozen input 重复调用结果一致,未知策略稳定拒绝。
- [x] `M6-04D` `AUTO` 在完整 pthread gate `READY` 时选择 pthread隔离、SharedArrayBuffer 或
Worker 任一缺失时选择 single五组能力矩阵通过。
- [x] `M6-04E` `PTHREAD_REQUIRED` 在任一能力缺失时返回 `selectedVariant=null` 和原样 M6-02
结构,不向调用方暴露可请求的 pthread URL。
- [x] `M6-04F` 隔离 Chromium 实际加载 pthread JS/WASM校验 manifest hash、
`SharedArrayBuffer`、pool worker 二次 JS 请求和 native handle 创建/释放。
- [x] `M6-04G` 同一 manifest 在无隔离 Chromium 由 AUTO 实际加载 single JS/WASM确认非共享
内存、无 pthread 请求,并继续用完整 single Main 打开和编辑真实 `.blend`
- [x] `M6-05A` 为 pthread factory 增加仅测试可用的确定性初始化失败注入点。
- [x] `M6-05B` `AUTO` 下 pthread 初始化失败只回退一次 single不形成重试循环。
- [x] `M6-05C` fallback 前终止已创建的 pthread worker、timer 和 pending request。
- [x] `M6-05D` fallback 过程中未打开项目时只初始化;已有待打开项目时只执行一次 open。
- [x] `M6-05E` fallback 结果公开 selected/attempted/fallbackReasonUI 不显示 pthread READY。
M6.2 退出条件isolated pthread、unisolated single、forced failure fallback 三个专项测试均通过,
每种路径的资产请求、Worker 数和 open 次数可断言。
#### M6.3 HTTP MIME 与 byte range
- [x] `M6-06A` 从 deployment contract 生成测试用扩展名到 MIME 的唯一映射,不复制常量。
- [x] `M6-06B` 对 HTML、JS、CSS、WASM、JSON、PNG、WAV、BLEND、NVDB 分别执行 GET。
- [x] `M6-06C` 对 engine JS/WASM、pthread worker 和 fixture 分别执行 HEAD断言状态与
`Content-Type`,且 HEAD 无响应体。
- [x] `M6-06D` MIME 错误时测试必须报告 URL、expected、actual不能只返回布尔失败。
- [x] `M6-07A` 对 WASM、BLEND、NVDB 各执行一个闭区间 range断言 `206` 和精确字节。
- [x] `M6-07B` 分别验证 open-ended 与 suffix range若合同不支持则稳定返回 `416`
- [x] `M6-07C` malformed、倒序、越界和 multi-range 分别返回 `416`,不得返回截断的 `200`
- [x] `M6-07D` `206` 同时具有 `Accept-Ranges``Content-Range``Content-Length` 和强 ETag。
- [x] `M6-07E` 相同内容跨请求 ETag 稳定;内容变化后 ETag 必须变化。
- [x] `M6-07F` `If-Range` 匹配时返回对应 `206`,不匹配时返回完整 `200`
- [x] `M6-07G` 中断后从精确 offset 续传并校验合并后的 SHA-256不复用旧 revision 字节。
M6.3 退出条件:同一真实 HTTP server 同时通过 MIME 和 range 正负例矩阵。
#### M6.4 缓存、升级与离线运行
- [x] `M6-08A` HTML 和 engine manifest 固定 `no-cache`,每次启动都能重新验证版本。
- [x] `M6-08B` content-hashed JS/CSS/Worker 固定 immutable稳定 engine URL 必须重新验证 hash。
- [x] `M6-08C` manifest 为每个 variant 绑定同一 releaseId禁止跨 release 混用 JS/WASM/worker。
- [x] `M6-08D` 模拟发布切换:旧 HTML 只加载旧 manifest 全套或明确刷新,不加载混合版本。
- [x] `M6-08E` hash 不匹配时保持旧项目未打开并返回稳定错误,不进入 fallback 的错误 variant。
`npm --prefix web run test:deployment-cache` 从 production build 临时副本启动合同服务器:`/`
`/index.html`、manifest 和 4 个 stable engine 资源均为 `no-cache`;实际构建的入口 JS、CSS 和
3 个 Worker 共 5 项均具有 Vite 内容 hash 且为 immutable。HTML、manifest、stable engine 对相同
ETag 返回无 body `304`,换代后对旧 ETag 返回完整 `200` 和新 ETag临时换代不改写 `web/dist`
- [x] `M6-09A` 从 binary archive 解包后使用合同服务器启动,不读取工作区文件。
- [x] `M6-09B` 新浏览器 profile 冷启动时拦截所有非 loopback 请求,断言请求数为 0。
- [x] `M6-09C` 断开外网但保留本地合同服务器,完成 manifest、WASM、字体和基础 UI 冷启动。
- [x] `M6-10A` 在线创建 OPFS 项目、编辑并原子保存,记录 revision、blend hash 和 stable IDs。
- [x] `M6-10B` 重建 Worker 并切换到外网断开状态,从 OPFS 重开同一 revision。
- [x] `M6-10C` 离线重开后继续 Main edit、undo/redo 和保存revision 单调增加。
- [x] `M6-10D` 离线导出 GLB 并严格回读,且无非 loopback 请求。
M6.4 退出条件版本切换负例、archive 冷启动和 OPFS 离线闭环分别有独立命令与报告。
#### M6.5 归档独立复验
- [x] `M6-11A` 使用 `mktemp -d` 解包 binary archive禁止引用仓库 `web/dist`
- [x] `M6-11B` 校验 `SHA256SUMS.txt`、deployment contract、license、SBOM 和 binary manifest。
- [x] `M6-11C` 从临时目录启动合同服务器并运行 browser smoke退出后释放端口和临时 profile。
- [x] `M6-12A` 在另一个空临时目录解包 corresponding source archive。
- [x] `M6-12B` 校验 source offer 指向的版本、许可证、lockfile、CMake 与 Web 源码全部存在。
- [x] `M6-12C` 扫描 source archive拒绝 build、dist、release、cache、trace、绝对开发路径和凭据。
- [x] `M6-12D` 从 source archive 执行 lockfile install、typecheck、build并比对可重现清单。
M6.5 退出条件binary/source 两个归档均在独立目录复验,报告包含 archive 与关键文件 SHA-256。
#### M6.6 CI 分层与机器报告
- [x] `M6-13A` 确定仓库实际 CI provider、runner OS、Node/Chrome/Blender/Emscripten 版本矩阵。
- [x] `M6-13B` quick lane 从 lockfile 安装,执行 typecheck、lint、unit、status 和 evidence schema。
- [x] `M6-13C` quick lane 缓存只以 lockfile/toolchain key 命中,不缓存 release evidence。
- [x] `M6-14A` Chromium lane 执行 P0 user loop 和主线程/Offscreen 双视口 smoke。
- [x] `M6-14B` Chromium lane 执行 network、device-loss、OOM、quota 与 malicious-input fault smoke。
- [x] `M6-14C` Chromium lane 每个 browser server 使用独立动态端口,失败后也必须清理。
- [x] `M6-15A` release lane 顺序执行全 E2E、性能矩阵、VDB、acceptance 和离线复现。
- [x] `M6-15B` release lane 只在受保护 ref 或显式 dispatch 运行,不由普通 quick push 重复触发。
- [x] `M6-15C` 任一 release 子命令失败时证据状态为失败,不能上传旧 READY JSON。
- [x] `M6-16A` 三条 lane 均输出 schema-versioned JSON命令、exitCode、duration、environment。
- [x] `M6-16B` 报告绑定 commit、lockfile、ledger、engine、archive 和测试构件 SHA-256。
- [x] `M6-16C` 上传前运行 schema 与 hash checker报告和构件采用固定 retention。
2026-08-15 完整 release lane 的 19/19 子命令通过,总命令耗时
1,245,732 msfull E2E 126/126V1 acceptance 49/49。quick 6/6、Chromium 9/9 和
release 19/19 报告由 `check-ci-report.mjs` 联合校验,同时绑定 commit
`17ab961485fe2ea1574c5f0b7d3ef9608a2bf424`。失败注入返回 exit code 17 并仅写入
`FAILED` 报告。当前 binary/source archive SHA-256 分别为
`ca09540e8f5c0157bb85d62c98aeb3291ea195a29585bc8e05afb308747a8ff5`
`95b3a747425081a205b1966c004a08da4cb37aab7ba0a649ff076713f7010f74`
M6.6 退出条件fresh runner 上 quick/Chromium/release 三条 lane 通过,失败注入不会保留成功证据。
#### M6.7 运维与 RC 冻结
- [x] `M6-17A` 部署 runbook 从空目录安装 binary archive并验证 HTTPS/loopback 前置条件。
- [x] `M6-17B` 升级 runbook 覆盖新旧 manifest、cache、OPFS schema 和 Worker 版本切换。
- [x] `M6-17C` 回滚 runbook 保留项目数据,只回滚 app/engine releaseId并验证旧版可读策略。
- [x] `M6-17D` 故障诊断表覆盖 MIME、range、isolation、hash、quota、Worker 和 GPU 错误。
- [x] `M6-17E` 在一个全新临时目录逐条实跑部署、升级、回滚命令并记录输出。
- [x] `M6-18A` 固定 RC semver、commit、releaseId、binary/source/SBOM SHA-256。
- [x] `M6-18B` 变更说明只列已验证 V1 能力,并链接明确 excluded/server/blocked 清单。
- [x] `M6-18C` 已知限制包含 Chromium-only、single/pthread 选择、存储和 GPU 预算。
- [x] `M6-18D` 发布恢复说明包含项目备份、升级失败回滚和证据校验命令。
- [x] `M6-18E` 最终运行 quick、Chromium、release lane所有结果绑定同一 RC commit。
M6 退出条件:离线包和一个真实 HTTP 部署均通过同一 P0 流程single/pthread 选择可解释;
CI 可从 lockfile 和对应源码重现当前 binary/source hash。
### M7 核心项目体验硬化
- [ ] `M7-01` 记录 import/open/save/save-as/export 五个用户动作的状态机。
- [ ] `M7-02` 对重复 open、并发 save 和 close-during-save 建立互斥规则。
- [ ] `M7-03` 大文件导入显示真实字节进度并支持取消。
- [ ] `M7-04` 取消 import 后释放 input buffer、native handle 和 staging 文件。
- [ ] `M7-05` save 中断时旧 revision 和旧 hash 保持不变。
- [ ] `M7-06` dirty state 只由成功 Main transaction 改变。
- [ ] `M7-07` undo 回到保存 revision 时 dirty state 清除。
- [x] `M7-01` 记录 import/open/save/save-as/export 五个用户动作的状态机。
- [x] `M7-02` 对重复 open、并发 save 和 close-during-save 建立互斥规则。
- [x] `M7-03` 大文件导入显示真实字节进度并支持取消。
- [x] `M7-04` 取消 import 后释放 input buffer、native handle 和 staging 文件。
- [x] `M7-05` save 中断时旧 revision 和旧 hash 保持不变。
- [x] `M7-06` dirty state 只由成功 Main transaction 改变。
- [x] `M7-07` undo 回到保存 revision 时 dirty state 清除。
- [ ] `M7-08` Worker 崩溃时展示可恢复错误,不清空当前项目列表。
- [ ] `M7-09` 重启 Worker 后恢复 selection、frame、workspace 和项目 revision。
- [ ] `M7-10` recent projects 对缺失/损坏 OPFS 条目执行隔离和修复提示。