Complete V1 performance and OOM release gates

This commit is contained in:
mes123456
2026-08-14 22:32:09 -04:00
parent 3ea9974eee
commit a3f3071c03
45 changed files with 4206 additions and 276 deletions

View File

@@ -102,8 +102,8 @@ UI 任务可以提前制作只读视图,但不得在对应 Main writer 和保
1M binary gate、Worker restart 与 Chromium 真实 OPFS quota 已接入。VDB 转换请求、NanoVDB
grid/material/chunk manifest、逐块 hash/range streamer、分阶段能力门、14 条真实资源 catalog
和 OpenVDB 13 -> NanoVDB 32 desktop converter 已完成server job、HTTP body 断点续传、OPFS、
有界 Float32 WebGPU 双视口和 Main Volume 属性保存重开已有专项证据。GPU resident paging、
联合重开、完整材质、大 bundle/OOM 和 golden 仍 `BLOCKED`。后续浏览器验收仅覆盖
有界 Float32 WebGPU 双视口、有限 grid 材质、显式 GPU resident paging/LRU 和 Main Volume 属性保存重开已有专项证据。
自动缺页重绘、联合重开、大 bundle 联合故障和 golden 仍 `BLOCKED`。后续浏览器验收仅覆盖
Chromium不配置 Firefox/WebKit。
专项字段、验收命令和停止条件见 `docs/status/N-015.md`
@@ -213,10 +213,13 @@ operator search这不等价于 Blender 全量 operator registry、context men
4. `.blend`/image/media/script fuzz、OPFS quota、OOM、设备丢失、网络中断和恢复验证。
5. 许可证/source offer/SBOM、确定性包、文档状态与测试报告一致后才能发布。
当前证据为 13 条有效记录、15 个缺失,整体仍为 `BLOCKED`VDB 专项记录已证明真实
desktop/server converter、HTTP/OPFS、Float32 WebGPU 双生产视口与 Main 属性重开当前切片;已通过 1M geometry、
600 帧 OPFS simulation cache、4K/8K texture、运行中断网和主线程 WebGL device loss
仍缺 10M geometry、长媒体、OOM 及 N-015 至 N-025 上游 family 的完整验收。
当前证据为 17 条有效记录、0 个 V1 缺失V1 release gate 为 `READY`Blender 全域 parity 仍为 `BLOCKED`。账本使用
`parityStatus` 保留 N-015 至 N-026 的全域差距,并以独立 `releaseStatus` 检查 V1 声明切片;
VDB 专项记录已证明真实
desktop/server converter、HTTP/OPFS、Float32 WebGPU 双生产视口与 Main 属性重开当前切片;已通过 1M/10M geometry、
1M 帧有界 long media、600 帧 OPFS simulation cache、4K/8K texture、运行中断网和主线程
WebGL device loss以及 WASM/Main、OPFS、GPU、NanoVDB 四类确定性 OOM 恢复N-015 至
N-025 上游 family 的完整验收仍属于全域 parity 差距。
## 默认验收入口

View File

@@ -0,0 +1,390 @@
# Web Blender V1 当前执行计划
更新时间2026-08-14
## 1. 交付目标
当前交付物是 `Web Blender Modeler V1`,不是 Blender 5.2 的完整浏览器移植。
V1 产品承诺、明确排除项和发布门以 `WEB_BLENDER_MODELER_V1_SCOPE.md` 为准。
浏览器基线仅为 Chromium。产品架构保持为
```text
React 工作区和编辑器
-> versioned TypeScript protocols
-> Web Workers
-> Blender Main / Depsgraph WASM 子集
-> binary SceneIR / Three.js WebGL 或 OffscreenCanvas viewport
-> OPFS 大文件 + IndexedDB 元数据
```
本计划是当前唯一的短周期领取队列。长期 Blender 功能对标仍记录在
`BLENDER_5_2_WEB_FEATURE_PARITY.md``status/parity-ledger.json`,但不以长期全域差距
阻断已明确限定范围的 V1。
## 2. 文档与事实源
| 文件 | 唯一职责 |
| --- | --- |
| `WEB_BLENDER_MODELER_V1_SCOPE.md` | V1 产品契约、支持矩阵、非目标、发布标准 |
| `CURRENT_EXECUTION_PLAN.md` | 当前任务顺序、最小任务、依赖和退出条件 |
| `PROJECT_STATUS_AND_NEXT_WORK.md` | 已实现能力、风险、验证命令总览 |
| `BLENDER_5_2_WEB_FEATURE_PARITY.md` | Blender 5.2 全域长期差距 |
| `status/parity-ledger.json` | 功能域和 V1 slice 的机器事实 |
| `status/release-evidence.json` | 最近一次可审计发布证据快照 |
文档冲突时按上表职责解释;机器状态冲突时以校验脚本能够同时验证的 ledger 和 evidence
为准,不靠描述性文字覆盖失败结果。
## 3. 完成规则
### 3.1 最小任务规则
每个任务只产生一个主要行为变化或一个证据变化。任务状态只允许:
- `[ ]` 未开始;
- `[~]` 正在执行;
- `[x]` 已实现且验收通过;
- `[!]` 有可复现阻断,必须附命令、错误和解除条件。
不能仅凭协议存在、fixture 存在、UI 可显示或测试代码已写入,就把任务标为完成。
### 3.2 功能任务完成定义
适用项必须同时具备:
1. 正例使用生产代码路径,不在测试中复制另一套实现。
2. 非法输入、预算超限或未声明能力返回稳定结构化错误码。
3. Worker 可取消;取消后不得发布迟到结果。
4. 资源释放可观测;释放后 CPU/WASM/GPU/OPFS 临时占用回到预算内。
5. Main 或持久化状态修改必须经过 revision验证 undo/redo、原子保存和重开。
6. 浏览器行为至少在 Chromium 生产配置验证;视口相关能力覆盖主线程和
OffscreenCanvas Worker除非 V1 范围明确只承诺其中一个。
7. 独立验收命令退出码为 0并产生至少一个与实现或测试绑定的 SHA-256。
8. 状态文档、ledger、evidence 和代码描述一致。
### 3.3 发布证据规则
`release-evidence.json` 中任何 `true` 字段必须:
- 由成功 evidence record 绑定;
- 记录实际命令、耗时、输出摘要和非空构件 SHA-256
- 失败时不能保留过期成功状态;
- 不得用 mock、跳过、仅 schema 单测或只有 hash 格式校验替代真实运行。
## 4. 重新盘点后的事实基线
### 4.1 已完成工程基础
- React/Three.js 工作区、主线程 WebGL 与 OffscreenCanvas Worker 视口已存在。
- Blender 5.2 Main 子集已编译为 WASMWorker/C ABI、结构化错误和内存统计已存在。
- `.blend` 导入、已声明编辑命令、undo/redo、保存、OPFS/IndexedDB、重启重开已形成闭环。
- 二进制 Mesh/非 Mesh SceneIR、range patch、LOD cache、GLB 和有限 USD 路径已存在。
- VDB desktop/server converter、HTTP range/OPFS、Float32 NanoVDB WebGPU、有限多 grid
材质、显式 resident LRU 和故障恢复已存在。
- 12 个 N-015 至 N-026 功能域的 Blender 全域 `parityStatus` 均为 `BLOCKED`;其 V1
required slice 的 `releaseStatus` 均为 `READY`。这两个状态轴不得再次合并。
### 4.2 2026-08-14 本轮复核结果
| 检查 | 结果 |
| --- | --- |
| `npm --prefix web run typecheck` | 通过 |
| `npm --prefix web run lint` | 通过 |
| `npm --prefix web test` | 9/9 通过 |
| `npm --prefix web run test:status-consistency` | 通过12 parity blocked、0 release blocked |
| `npm --prefix web run test:release-evidence` | 通过17 records、0 missing、`READY` |
### 4.3 真实发布缺口
当前 V1 release gate 已无 evidence 字段缺失,`faults.oom` 由独立 Chromium 四场景命令和
构件 hash 绑定。`geometry1M`、4K/8K texture、600 帧 simulation cache、断网、device loss、
恶意 blend、zip bomb、离线包和 V1 用户闭环仍须在 M5 全矩阵中持续回归。Blender 全域
`parityStatus=BLOCKED` 的长期差距不因 V1 gate `READY` 而关闭。
## 5. 里程碑总览
| 里程碑 | 交付物 | 状态 | 退出条件 |
| --- | --- | --- | --- |
| M0 范围与状态模型 | V1 契约、双轴 ledger、P0 用户闭环 | 已完成,持续回归 | 状态一致性与 V1 闭环通过 |
| M1 当前工作区收口 | VDB/WebGPU 与现有证据可复验 | 已完成,持续回归 | 静态门、VDB 全矩阵、V1 闭环全部通过 |
| M2 10M geometry | 大几何浏览器性能与恢复证据 | 已完成,持续回归 | `performance.geometry10M=true` |
| M3 long media | 长时间线索引、seek、取消与重启证据 | 已完成,持续回归 | `performance.longMedia=true` |
| M4 OOM | 四类确定性内存故障与恢复证据 | 已完成,持续回归 | `faults.oom=true` |
| M5 V1 RC | 可复现离线候选包、SBOM、校验和 | 未开始 | release gate `READY` |
任务严格按 M1 -> M2 -> M3 -> M4 -> M5 领取。里程碑内部允许先写纯校验任务,但不得在
前一里程碑失败时把后一里程碑标为完成。
## 6. M0 范围、状态和 P0 闭环
### M0.1 V1 范围收敛
- [x] `M0-SCOPE-01` 定义 V1 用户和核心使用场景。
- [x] `M0-SCOPE-02` 定义 `LOCAL_EXACT/LOCAL_BOUNDED/SERVER/EXCLUDED`
- [x] `M0-SCOPE-03` 明确 Chromium-only 和不承诺完整 Blender UI/渲染/模拟。
- [x] `M0-SCOPE-04` 将 PBVH、完整 Geometry Nodes、任意 Shader、完整 NLA、完整 VDB
demand paging 等移出 V1 required slice。
### M0.2 双轴状态模型
- [x] `M0-STATE-01` ledger schema 分离 `parityStatus``releaseStatus`
- [x] `M0-STATE-02` 每个 family 声明 V1 required/excluded slices。
- [x] `M0-STATE-03` 校验 required/excluded 不重叠且都引用已声明 slice。
- [x] `M0-STATE-04` 校验 `READY` 的 required slices 全部完成。
- [x] `M0-STATE-05` 校验依赖不存在缺失和环。
- [x] `M0-STATE-06` N-026 只聚合 V1 `releaseStatus` 和真实 evidence 缺口。
- [x] `M0-STATE-07` 旧 schema、非法状态、依赖环、无构件 evidence 均有负例。
### M0.3 单一 P0 用户闭环
固定流程:
```text
import .blend
-> object/mesh/material edit
-> undo -> redo
-> atomic save
-> terminate StorageWorker + WebEngineWorker
-> reopen and compare stable IDs/geometry/material
-> main-thread + Offscreen viewport non-empty pixels
-> GLB export and semantic round-trip
-> unsupported shader stable block
```
- [x] `M0-LOOP-01` 创建独立 `test:v1-user-loop` 命令。
- [x] `M0-LOOP-02` 覆盖对象、Mesh 和 Principled 材质编辑。
- [x] `M0-LOOP-03` 覆盖 Main revision 的 undo/redo。
- [x] `M0-LOOP-04` 覆盖 StorageWorker 与 WebEngineWorker 双终止重开。
- [x] `M0-LOOP-05` 比较稳定 object/mesh/material ID 和 geometry SHA-256。
- [x] `M0-LOOP-06` 覆盖双生产视口非空像素。
- [x] `M0-LOOP-07` 覆盖 GLB PBR 语义回读。
- [x] `M0-LOOP-08` 覆盖未支持 Shader 的稳定阻断。
- [x] `M0-LOOP-09` 将成功命令和两个构件 SHA-256 写入 evidence。
## 7. M1 当前工作区收口
目标:确认现有 VDB/WebGPU、状态模型和 P0 闭环不是只在局部测试成立。
### M1.1 快速静态门
- [x] `M1-STATIC-01` TypeScript typecheck。
- [x] `M1-STATIC-02` ESLint。
- [x] `M1-STATIC-03` Node unit tests。
- [x] `M1-STATIC-04` status consistency。
- [x] `M1-STATIC-05` release evidence parser/evaluator。
### M1.2 VDB/WebGPU 专项矩阵
- [x] `M1-VDB-01` 校验 VDB availability 和 native resource catalog。
- [x] `M1-VDB-02` 校验 desktop OpenVDB -> NanoVDB converter 与畸形输入。
- [x] `M1-VDB-03` 校验 server job 隔离、取消、超时和 hash 等价。
- [x] `M1-VDB-04` 校验 conversion boundary 结构化阻断。
- [x] `M1-VDB-05` 校验 NanoVDB OPFS hash binding 和 Worker 重启。
- [x] `M1-VDB-06` 校验 Float32/Vec3 CPU 与 WGSL sampling。
- [x] `M1-VDB-07` 校验主线程与 Offscreen 生产视口。
- [x] `M1-VDB-08` 校验多 grid/X 视角固定 golden不仅检查 hash 格式。
- [x] `M1-VDB-09` 校验全局 resident budget、LRU 次序和唯一释放。
- [x] `M1-VDB-10` 校验网络、Worker、device-loss 故障恢复。
- [x] `M1-VDB-11` 确认文档仍明确阻断自动缺页重绘、联合重开、大 bundle 联合故障和发布
三视角 golden。
### M1.3 P0 和工作区一致性
- [x] `M1-REG-01` 重新运行 `test:v1-user-loop`
- [x] `M1-REG-02` 重新运行包含 release gate 的 Chromium 专项。
- [x] `M1-REG-03` 执行 `git diff --check`
- [x] `M1-REG-04` 核对所有未提交文件都有明确来源,不删除或回退既有用户改动。
- [x] `M1-REG-05` 更新本节状态和 evidence 时间戳时不伪造未运行命令。
M1 退出命令:
```bash
npm --prefix web run typecheck
npm --prefix web run lint
npm --prefix web test
npm --prefix web run test:status-consistency
npm --prefix web run test:release-evidence
npm --prefix web run test:vdb-availability
npm --prefix web run test:vdb-native
npm --prefix web run test:vdb-server
npm --prefix web run test:vdb
npm --prefix web run test:vdb-opfs
npm --prefix web run test:vdb-webgpu
npm --prefix web run test:vdb-viewport
npm --prefix web run test:vdb-faults
npm --prefix web run test:v1-user-loop
git diff --check
```
## 8. M2 10M Geometry 发布门
目标:证明 10,000,000 triangles 项目能通过二进制/分块路径在 Chromium 内先显示可交互
LOD并能取消、释放和恢复。禁止构造 10M 元素 JSON禁止同时保留多份完整源数组。
### M2.1 契约和预算
- [x] `M2-GEO-01` 定义 10M reporttriangle/vertex/chunk 数、源字节、传输字节、
first-interactive-frame、JS/WASM/GPU 峰值、取消延迟、释放后占用和最终状态。
- [x] `M2-GEO-02` 固定 10M 精确计数、chunk 上限、LOD triangle budget 和测试超时。
- [x] `M2-GEO-03` 发布命令没有可把默认 fixture 降到小规模的环境开关。
- [x] `M2-GEO-04` 为非法计数、chunk 越界、重复/缺失 range 定义稳定错误。
### M2.2 分块二进制输入
- [x] `M2-GEO-05` 以固定大小生成 positions/indices chunk任一时刻只保留有界工作集。
- [x] `M2-GEO-06` 每个 chunk 使用 transferable ArrayBuffer发送后验证发送端 detached。
- [x] `M2-GEO-07` range 表连续覆盖 10M triangles无重叠、空洞或整数溢出。
- [x] `M2-GEO-08` 对输入流和 range manifest 生成确定性 SHA-256。
- [x] `M2-GEO-09` 在中途取消,验证 Worker 停止、迟到 chunk 被丢弃且下一会话可启动。
### M2.3 LOD 与首个可交互帧
- [x] `M2-GEO-10` 复用现有 LOD cache key/manifest不创建测试专用缓存格式。
- [x] `M2-GEO-11` 在完整源仍流入时先发布有界 LOD记录首个非空像素时间。
- [x] `M2-GEO-12` 主线程视口渲染 LOD 并完成一次相机/选择交互。
- [x] `M2-GEO-13` OffscreenCanvas Worker 渲染同一 LOD 并报告非空像素。
- [x] `M2-GEO-14` 验证近/远 LOD 切换不重建完整 10M geometry。
### M2.4 内存、释放和证据
- [x] `M2-GEO-15` 采集 `performance.memory`可用时、WASM allocated bytes 和估算 GPU buffer
bytes报告峰值而不是只有最终值。
- [x] `M2-GEO-16` 明确 JS/WASM/GPU 上限并对超限给出稳定失败。
- [x] `M2-GEO-17` dispose renderer/geometry/material、终止 Worker、删除临时 OPFS 数据。
- [x] `M2-GEO-18` 释放后运行一个小场景,证明浏览器会话可恢复。
- [x] `M2-GEO-19` 创建独立 `test:geometry-10m-performance` 命令。
- [x] `M2-GEO-20` 将成功 record 绑定 `performance.geometry10M`,至少 hash 测试、生产实现和
range manifest/golden。
- [x] `M2-GEO-21` 更新 release checker期望 missing 从 3 降为 2。
M2 退出条件:独立命令连续通过;报告 `triangleCount=10_000_000`;双视口有非空像素;取消和
释放通过evidence 中 `geometry10M=true` 且有唯一成功 record。
## 9. M3 Long Media 发布门
目标:验证 V1 有限 Timeline/Sequencer 在长时间线下的索引、seek、取消、cache 和 Worker 重启,
不把完整媒体编辑器或最终编码器纳入 V1。
### M3.1 范围和 fixture
- [x] `M3-MEDIA-01` 固定长时间线 frame range、strip 数和 preview byte budget。
- [x] `M3-MEDIA-02` 使用本地确定性 PNG/WAV 和 manifest测试不得依赖网络或系统 codec。
- [x] `M3-MEDIA-03` 明确 V1 支持的 IMAGE/SOUND 时间索引子集和排除的 movie codec/encode。
- [x] `M3-MEDIA-04` 为未声明 codec、最终编码、损坏 manifest 定义结构化阻断。
### M3.2 索引和 seek
- [x] `M3-MEDIA-05` 建立有界索引,不按总帧数展开巨型 JSON。
- [x] `M3-MEDIA-06` 验证时间线起点、中点、终点和随机 seek 的精确 strip 命中。
- [x] `M3-MEDIA-07` 验证连续 scrub 合并过期请求,只发布最新 revision/frame。
- [x] `M3-MEDIA-08` 记录冷 seek、热 seek 和索引构建时间。
### M3.3 cache、取消和重启
- [x] `M3-MEDIA-09` 对 media preview bytes 使用显式 byte budget 和 LRU。
- [x] `M3-MEDIA-10` 超预算时逐项淘汰,活动 frame 不被错误淘汰。
- [x] `M3-MEDIA-11` 在索引、seek 和 decode 三个阶段分别验证 AbortSignal。
- [x] `M3-MEDIA-12` 终止 Worker 后从 OPFS/IndexedDB manifest 恢复索引和当前 frame。
- [x] `M3-MEDIA-13` 损坏 session manifest 被隔离,正确 manifest 仍可重建。
### M3.4 证据
- [x] `M3-MEDIA-14` 创建独立 `test:long-media-performance` 命令。
- [x] `M3-MEDIA-15` 输出计数、耗时、峰值 cache bytes、取消和重启结果。
- [x] `M3-MEDIA-16` 将成功 record 绑定 `performance.longMedia`
- [x] `M3-MEDIA-17` 更新 release checker期望 missing 从 2 降为 1。
M3 退出条件确定性长时间线专项通过seek/取消/LRU/restart/unsupported codec 均有断言;
`longMedia=true` 且 evidence 构件可复核。
## 10. M4 OOM 发布门
目标:用确定性故障注入验证内存不足不会损坏当前项目或留下不可恢复会话。测试不能依赖真的
耗尽宿主机内存。
### M4.1 统一故障注入契约
- [x] `M4-OOM-01` 定义仅测试构建可用的 allocation fault point 和 fail-after-bytes/count。
- [x] `M4-OOM-02` fault session 使用 token 隔离,默认关闭且不能泄漏到后续请求。
- [x] `M4-OOM-03` 为 WASM、OPFS staging、GPU geometry/texture、VDB resident 分配映射稳定
错误码和 stage。
- [x] `M4-OOM-04` 统一报告 before/peak/after bytes、revision、临时资源和恢复状态。
### M4.2 WASM 与 Main
- [x] `M4-OOM-05` 在 open/read 临时分配失败时不创建半初始化 handle。
- [x] `M4-OOM-06` 在 edit/save 分配失败时保留旧 Main revision 和 undo 栈。
- [x] `M4-OOM-07` 释放 native buffer/handleWorker 重启后可重开旧项目。
### M4.3 OPFS staging
- [x] `M4-OOM-08` 在 staging write 中途注入 quota/OOM。
- [x] `M4-OOM-09` journal 不提交,新 revision 不替换旧 revision。
- [x] `M4-OOM-10` 清理临时文件;重启后旧项目 hash 不变。
### M4.4 GPU 与 VDB
- [x] `M4-OOM-11` GPU geometry/texture budget 超限不创建部分 scene object。
- [x] `M4-OOM-12` dispose 已创建 GPU buffer/texture随后小场景可渲染。
- [x] `M4-OOM-13` VDB resident budget 超限返回 `NANOVDB_GPU_BUDGET_EXCEEDED`
- [x] `M4-OOM-14` VDB page table/resident pages 唯一释放device/session 可恢复。
### M4.5 证据
- [x] `M4-OOM-15` 创建独立 `test:oom-recovery` 命令,四类 fault 全部执行。
- [x] `M4-OOM-16` 记录每类错误码、旧 revision/hash、释放字节和恢复结果。
- [x] `M4-OOM-17` 将成功 record 绑定 `faults.oom`
- [x] `M4-OOM-18` 更新 release checker期望 missing 为 0、gate 为 `READY`
M4 退出条件:四类确定性故障均通过;不存在静默成功、旧 revision 丢失、临时文件泄漏或只能
刷新浏览器恢复的情况;`faults.oom=true`
完成证据:`npm --prefix web run test:oom-recovery` 在 Chromium 中执行 WASM/Main、OPFS staging、
WebGL GPU 资源组和 NanoVDB WebGPU resident/page-table 四类确定性失败;`release:evidence-oom`
生成第 17 条 record。测试报告分别验证 Main revision/hash、undo/redo、旧 OPFS revision/hash、
临时文件归零、部分 GPU object 不发布、NanoVDB buffer 唯一释放以及同会话/重启恢复。
## 11. M5 V1 发布候选
### M5.1 全矩阵
- [ ] `M5-RC-01` clean install 后通过 typecheck、lint、unit。
- [ ] `M5-RC-02` 运行所有 V1 required slice acceptance commands。
- [ ] `M5-RC-03` 运行 P0 用户闭环和 Chromium 全套 E2E。
- [ ] `M5-RC-04` 运行 geometry/media/texture/simulation 性能矩阵。
- [ ] `M5-RC-05` 运行 OOM/device-loss/network/malformed/zip-bomb 故障矩阵。
- [ ] `M5-RC-06` 运行 VDB 全矩阵和双生产视口。
### M5.2 构件和可复现性
- [ ] `M5-RC-07` 重新生成 SBOM 和 third-party notices。
- [ ] `M5-RC-08` 生成离线二进制包和 corresponding source 包。
- [ ] `M5-RC-09` 连续生成两次并比较规范化摘要。
- [ ] `M5-RC-10` 生成 `SHA256SUMS.txt`,每个引用文件存在且 hash 匹配。
- [ ] `M5-RC-11` 检查包内无 CDN、绝对开发路径、测试 secret 或未声明运行时依赖。
### M5.3 声明和最终状态
- [ ] `M5-RC-12` UI、README、scope 和 capability report 只声明 V1 白名单。
- [ ] `M5-RC-13` 长期 parity 差距继续保持,不因发布 V1 被改成全域 COMPLETE。
- [ ] `M5-RC-14` 重新收集 release evidence不复用与当前构件 hash 不一致的旧 record。
- [ ] `M5-RC-15` release gate 输出 `READY` 且 missing 为空。
- [ ] `M5-RC-16` `git diff --check`、状态一致性和 release evidence checker 全部通过。
- [ ] `M5-RC-17` 工作区生成物均被忽略、纳入构件或有文档解释。
M5 退出条件:所有必需命令退出码 0release gate `READY`;离线包可复现;当前构件、源码、
SBOM、状态和 evidence SHA-256 相互一致。
## 12. V1 后任务
V1 RC 完成前不领取以下任务:
1. VDB 自动 page-fault feedback、渐进重绘和生产 Offscreen device-loss 联合恢复。
2. Volume Main + asset binding + 生产视口联合重开,以及三视角 desktop/Chromium golden。
3. 64 MiB/512 MiB/1 GiB sparse bundle、深度合成和完整 VDB 大包/取消矩阵。
4. 新外部字体、PBVH、完整 paint、Geometry Nodes/Simulation evaluator、任意 Shader、完整
NLA、Compositor、Sequencer、Tracking、Asset Browser、Editor 和 Scripting 对标。
5. Firefox/WebKit 支持和跨浏览器发布门。
V1 后按产品需求和风险重新排序,不再仅按 N-015 至 N-026 编号顺序扩大范围。

View File

@@ -2,6 +2,10 @@
更新时间2026-08-14
当前短周期任务、领取顺序和阶段退出条件统一维护在
`docs/CURRENT_EXECUTION_PLAN.md`。本文件保留实现事实、长期能力台账和完整验收命令,不再作为
V1 的逐项领取顺序V1 范围以 `docs/WEB_BLENDER_MODELER_V1_SCOPE.md` 为准。
## 1. 当前结论
项目已经形成可运行的 Web 三维编辑器工程骨架但还不是“Web 版完整
@@ -37,10 +41,10 @@ SQLite WASM 和 Bitbybit/OCCT 均不在当前依赖范围内。Three.js、WASM
| SceneIR 扩展 | tangent/split normal/seam/sharp/vertex group/attribute/UVnative WBG1、资源 Delta 和 mesh byte-range patch | 已完成当前数据契约 |
| Sculpt 属性 | Mask/Face Set 的 SceneIR、WBG1 header v2、Delta、Main、undo 和保存重开 | 已完成属性子集;有界四笔刷 Main stroke 已开放PBVH/完整求值未开放 |
| Simulation cache | Blender 5.2/source blend/hash/frame manifest、OPFS 内容寻址、schema 6、重启逐帧复验 | 已完成缓存安全层Simulation evaluator 未开放 |
| 发布性能/故障门 | Chromium 118 条 E2E、1M geometry、600 帧 OPFS cache、4K/8K texture、运行中断网、主线程 WebGL context loss | 已完成已声明门10M、长媒体、OOM 和 Offscreen device loss 仍 |
| 发布性能/故障门 | Chromium E2E、1M/10M geometry、1M 帧长媒体、600 帧 OPFS cache、4K/8K texture、运行中断网、主线程 WebGL context loss、WASM/OPFS/GPU/NanoVDB 四类确定性 OOM 恢复 | V1 evidence gate 已齐;Offscreen device loss 仍属后续完整故障矩阵 |
| Shader Main | RGB/Value/Principled/Image Texture/Normal Map/Output 整图事务、资源门和保存重开 | 已完成六节点写回子集;任意图/编译仍阻断 |
| NLA Main | 单对象 Action Clip 整栈写回、SceneIR 重开和 native frame 求值 | 已完成有限 Action Clip 子集 |
| 非 Mesh 数据块 | Curve/Surface/Font/Metaball Main 权威写回与保存重开、真实 evaluated mesh、PointCloud/Curves/Hair 属性、WNM chunks、双 viewport、handle-local 连续 preview/单次 Main commit、desktop golden 与 7 对象 GLB/USD round-trip | N-015 整体 BLOCKEDVDB 的 desktop/server converter、HTTP/OPFS、Float32 WebGPU 双生产视口和 Main 属性重开已完成,GPU demand paging、联合重开、完整材质、大 bundle/OOM 和发布 golden 未完成 |
| 非 Mesh 数据块 | Curve/Surface/Font/Metaball Main 权威写回与保存重开、真实 evaluated mesh、PointCloud/Curves/Hair 属性、WNM chunks、双 viewport、handle-local 连续 preview/单次 Main commit、desktop golden 与 7 对象 GLB/USD round-trip | N-015 整体 BLOCKEDVDB 的 desktop/server converter、HTTP/OPFS、Float32 WebGPU 双生产视口、有限 grid 材质、显式 GPU resident LRU、确定性 resident OOM 和 Main 属性重开已完成,自动 demand paging、联合重开、大 bundle 和发布 golden 未完成 |
## 3. 部分完成或仍有边界的能力
@@ -53,7 +57,7 @@ SQLite WASM 和 Bitbybit/OCCT 均不在当前依赖范围内。Three.js、WASM
| `.blend` 保存 | 场景状态、modifier、Mesh Edit、材质/UV、动画/约束和对象层级命令均写 Main历史、原子保存、快照和日志重放可恢复 | skin/shape-key decimate 保持结构化阻断 |
| Blender UI 对标 | 默认区域、当前 Mesh Edit、raycast、多选、拖拽 gizmo、层级/材质/动画面板和核心快捷键已闭环 | Sculpt、Geometry Nodes 编辑器等未声明能力继续结构化阻断 |
| 未声明能力扩展 | 四项协议/安全门均已细分Sculpt 属性/有界 Main stroke、Simulation cache、六节点 Shader Main 和 Action Clip NLA Main 已有正例 | PBVH、GN lazy-function/Simulation 求值、其余 Shader Node、Web compiler、完整 NLA/UI/GLB 图映射仍 planned/结构化阻断 |
| 非 Mesh 数据块 | 1M 点 reader budget、ID_MB/PT/VO/VF 注册、Main control-point/topology/body/element/Font style link commands、一维多 spline 与批量 handle/cyclic、二维 Surface topology transaction、undo/save/reopen、真实 evaluated mesh、WNM SHA chunks、handle raycast/handle-local 连续 preview/单次 commit、7 对象 GLB/USD、Chromium quota、VDB desktop/server converter、HTTP/OPFS有界 WebGPU 双视口 | 新外部字体导入,以及 VDB demand paging、完整材质、联合保存重开、大 bundle/OOM 和发布 golden 仍 planned/阻断 |
| 非 Mesh 数据块 | 1M 点 reader budget、ID_MB/PT/VO/VF 注册、Main control-point/topology/body/element/Font style link commands、一维多 spline 与批量 handle/cyclic、二维 Surface topology transaction、undo/save/reopen、真实 evaluated mesh、WNM SHA chunks、handle raycast/handle-local 连续 preview/单次 commit、7 对象 GLB/USD、Chromium quota、VDB desktop/server converter、HTTP/OPFS有界 WebGPU 双视口、有限 grid 材质、显式 resident LRU 和 resident OOM 恢复 | 新外部字体导入,以及 VDB 自动 demand paging、联合保存重开、大 bundle 和发布 golden 仍 planned/阻断 |
| 大场景 | Worker 二进制解码、per-mesh/range transferable、linked Mesh 实例化、LOD/OPFS cache、frustum culling、能力门 OffscreenCanvas Worker、100k/1M 内存门 | 超出当前 WBG1 的网络式渐进流送仍属于后续性能扩展 |
| Decimate 全对标 | Collapse 的当前网格集合已覆盖,错误路径结构化 | Un-Subdivide、Dissolve、所有 delimiter/权重/对称组合及大模型性能矩阵未完成 |
@@ -185,7 +189,7 @@ save/reopen、真实 legacy evaluated mesh、PointCloud/Curves 属性和 WNM 二
`UsdGeomMesh``UsdGeomPoints``UsdGeomBasisCurves` 的机器可读映射/损失。
VDB 已改为 desktop/server OpenVDB -> NanoVDB、浏览器分块读取 + WebGPU。真实资源 catalog、
desktop/server converter、HTTP 断点续传、OPFS 原子绑定、Float32 WebGPU 双生产视口和 Main
Volume 属性重开已有真实证据GPU demand paging、联合保存重开、完整材质、大 bundle/OOM
Volume 属性重开与 resident/page-table OOM 恢复已有真实证据GPU demand paging、联合保存重开、完整材质、大 bundle 和
desktop/Chromium 发布 golden 仍阻断。handle-local 专用 gizmo 已接通,新字体导入等剩余项按 `docs/status/N-015.md`
`docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md` 推进。
@@ -203,12 +207,14 @@ HDR/EXR、多 tile 采样、Offscreen context-loss、真实 WebGPU renderer、
### N-026 当前发布实况
`docs/status/release-evidence.json` 已生成 13 条成功 command/output/artifact-hash 记录;其中
VDB 专项记录覆盖真实 converter、server job、HTTP/OPFS 和有界 WebGPU 当前切片,但尚未设置
发布 true 字段,不能替代 demand paging、大 bundle/OOM 和发布 golden。
`test:release-evidence` 计算为 15 个缺失并保持 `BLOCKED`。其中 3 个是实际证据字段
`performance.geometry10M``performance.longMedia``faults.oom`,其余 12 个来自仍为
`BLOCKED` N-015 至 N-026 family。浏览器范围仅为 Chromium。
`docs/status/release-evidence.json` 已生成 17 条成功 command/output/artifact-hash 记录;其中
VDB 专项记录覆盖真实 converter、server job、HTTP/OPFS 和有界 WebGPU 当前切片,独立 OOM
记录覆盖 WASM/Main、OPFS staging、GPU 资源组和 NanoVDB resident/page-table这些记录不能替代
demand paging、大 bundle 和发布 golden。
发布账本现已拆分 `parityStatus``releaseStatus`N-015 至 N-026 的全域对标仍全部
`BLOCKED`,但 N-015 至 N-026 的 V1 有界切片均为 `releaseStatus=READY`,不会再因发布后能力
阻塞 V1。P0 用户闭环、10M geometry、long media 和 OOM 均有独立 command/output/artifact-hash
记录;当前为 0 个 V1 缺失release gate 为 `READY`。浏览器范围仅为 Chromium。
## 6. 当前验收命令

View File

@@ -16,7 +16,7 @@ OpenVDB 读取 `.vdb`,转换为 NanoVDB浏览器只读取受校验的 `.nvd
- density/temperature/color/emission/velocity 的 Blender 材质语义;
- `.blend` 保存、转换产物绑定、重开和资源丢失诊断;
- 与 Blender 5.2 桌面图像/数值 golden 一致;
- 大体积、损坏输入、OOM、取消和 Chromium WebGPU 性能门。
- 大体积、损坏输入、取消和 Chromium WebGPU 性能门resident/page-table 确定性 OOM 门已完成
只有上述链路均有真实资源与自动测试证据时VDB 才能从 `BLOCKED` 转为可发布能力。
@@ -181,8 +181,9 @@ transmittance termination 和 NaN 防护。shader 不能通过越界 buffer read
点比较值与 active/inactive 状态。状态:`in_progress`Float32 CPU/WGSL 与 native sample 已逐点
一致Float16/Vec 仍保持阻断。
- `VDB-032`:实现 GPU page allocator、storage buffer upload、indirection、resident LRU 和
dispose每页上传前已通过 chunk hash。状态`in_progress`页表、驻留预算、LRU/dispose
与有界 paged upload 已落地,按视口需求从 OPFS/HTTP 逐页调入并在缺页后继续渲染仍阻断。
dispose每页上传前已通过 chunk hash。状态`done_current_scope`;初始空驻留集、显式逐页
hash 校验装入、页表、确定性 LRU、数据级页替换、dispose 和多材质 grid 共享总驻留预算均已
通过 Chromium WebGPU 门。着色器自动回报缺页并驱动渐进重绘不属于本任务,继续由生产视口门阻断。
- `VDB-033`:实现对象 bounds raycast、front-to-back ray marching、步长/early exit 和深度合成。
状态:`in_progress`;有界正交 bounds、front-to-back integration、early exit 和确定性 96x96
Chromium 图像已完成,生产相机深度合成待接入。
@@ -211,11 +212,13 @@ transmittance termination 和 NaN 防护。shader 不能通过越界 buffer read
transmittance、color记录容差与色彩空间。
- `VDB-052`64 MiB/512 MiB/1 GiB sparse bundle 的首帧、渐进清晰、峰值 CPU/GPU 和取消门。
- `VDB-053`:损坏 magic/version/tree offset/hash、zip bomb 等价超预算、NaN transform、设备丢失、
网络中断和 OOM 门。
网络中断和 OOM 门。状态:`in_progress`resident/page-table 确定性 OOM、唯一释放和同设备
小 resident grid 恢复已完成,其余大 bundle 与联合故障矩阵仍阻断。
- `VDB-054`:保存重开、资源缺失、源变更重转、旧 schema migration、离线 OPFS 重开。
- `VDB-055`N-026 证据记录包含真实转换器、资源、Chromium WebGPU、desktop golden 和构件 hash。
Phase 5 全部任务当前`BLOCKED`,不能由 Phase 0 的协议 fixture 代替
Phase 5 整体仍`BLOCKED`,不能由 Phase 0 的协议 fixture 代替`VDB-053` 的确定性 resident
OOM 子切片已有真实 Chromium WebGPU 资源证据,但不扩大为大 bundle 或完整 Phase 5 完成声明。
## 7. 验收命令与停止条件

View File

@@ -0,0 +1,68 @@
# Web Blender Modeler V1 发布范围
更新时间2026-08-14
## 1. 产品定义
V1 是复用 Blender 5.2 Main、文件格式和有界编辑能力的浏览器建模器不是桌面
Blender 的窗口、渲染器、Python 和插件体系的逐项移植。发布名称固定为
`Web Blender Modeler V1`
浏览器基线仅为 Chromium。主线程 WebGL 和 OffscreenCanvas Worker 是两个必须通过的
生产视口路径Firefox 和 WebKit 属于发布后的兼容性工作,不进入 V1 发布门。
## 2. V1 必须闭环的用户工作流
以下能力必须同时满足 Main 权威写回、undo/redo、原子保存、Worker 重启、重新打开和
GLB 导出检查:
1. 导入和保存 `.blend`
2. Scene、Object、Collection、Parent 和 Transform。
3. 有界 Mesh Object/Edit Mode 操作。
4. 材质槽、UV、Principled PBR 和受支持的贴图节点。
5. TRS 关键帧、Timeline、受支持的 Action/NLA 子集。
6. Armature/Pose/Constraint/Shape Key 的已声明读取和求值子集。
7. OPFS 项目、快照、资产和崩溃恢复。
8. GLB 的网格、PBR、贴图、morph、skin 和动画已声明子集。
## 3. 发布能力分类
| 分类 | 发布含义 | V1 规则 |
| --- | --- | --- |
| `LOCAL_EXACT` | 当前 fixture 与 Blender 5.2 语义一致 | 必须有 desktop/WASM golden |
| `LOCAL_BOUNDED` | 浏览器本地只支持白名单和显式预算 | 非白名单必须返回稳定错误码 |
| `SERVER` | 浏览器只提供校验、提交和结果绑定协议 | 服务端未配置时必须明确阻断 |
| `EXCLUDED` | V1 不提供且不计入本地实现承诺 | UI 不得伪造成功或静默丢数据 |
一个 family 可以整体为 `LOCAL_BOUNDED`,同时包含明确的 `SERVER``EXCLUDED`
切片。发布门检查已声明的 V1 正例和阻断行为,不把桌面 Blender 全量能力误记为完成。
## 4. 高级能力边界
| 功能域 | V1 分类 | V1 提供 | V1 不承诺 |
| --- | --- | --- | --- |
| Non-mesh/VDB | `LOCAL_BOUNDED` | Curve/Surface/Font/Metaball、PointCloud/Curves、受限 NanoVDB WebGPU | 任意 VDB 材质、无限 GPU 驻留 |
| Sculpt | `LOCAL_BOUNDED` | Mask/Face Set、四种有界 Main stroke | 完整 PBVH 和桌面全部笔刷 |
| Geometry Nodes/Simulation Zone | `LOCAL_BOUNDED` | 图、资源和确定性 cache 安全层 | 任意 lazy-function/field 本地求值 |
| Shader Nodes | `LOCAL_BOUNDED` | 已声明节点白名单和 PBR 映射 | 任意 Shader 图和通用 Web 编译器 |
| Grease Pencil/Paint | `LOCAL_BOUNDED` | 当前 Main writer、选择、预览和保存子集 | 完整 2D 编辑器、PBVH texture paint |
| Physics/Compositor/Sequencer | `LOCAL_BOUNDED` | reader、编辑、cache playback、有限 CPU executor | 完整 solver、节点全集和本地最终编码 |
| Tracking/Asset/Editors | `LOCAL_BOUNDED` | 当前 schema、Main reader/writer 和安全门 | Blender 全量 editor/operator/format |
| Cycles/复杂物理烘焙/最终视频编码 | `SERVER` | source hash、能力和结果绑定边界 | 浏览器本地等价执行 |
| Python/Text autorun/Add-ons | `EXCLUDED` | 清单读取、默认拒绝和审计 | 执行任意代码或自动安装插件 |
| 原生窗口/CUDA/Metal/HIP/OptiX | `EXCLUDED` | capability report | 浏览器平台等价 |
## 5. V1 发布门
发布候选必须具备以下自动证据:
1. P0 `import -> edit -> undo -> redo -> save -> StorageWorker/WebEngineWorker restart -> reopen -> GLB export`
2. Chromium 主线程和 OffscreenCanvas 视口非空像素。
3. 100k、1M 和 10M geometry 的有界性能/内存结果。
4. 4K/8K texture、长时间线/媒体能力门和 simulation cache。
5. OOM 注入、device loss、network interruption、quota、malformed input 和 zip bomb 恢复。
6. 离线资源、确定性二进制/源码包、许可证、SBOM 和 source offer。
7. `docs/status/parity-ledger.json`、release evidence 和状态文档完全一致。
任何测试只能证明其命名的有界切片;不得用协议测试代替真实 Blender Main、GPU、OPFS 或
desktop golden。

View File

@@ -1,7 +1,7 @@
# N-015 非 Mesh 几何数据块
状态:`BLOCKED / in_progress`VDB core 已覆盖 server、OPFS、Float32 WebGPU 与 Main 属性重开;
GPU demand paging、高级材质、联合重开和发布 golden 仍阻断)
状态:`BLOCKED / in_progress`VDB core 已覆盖 server、OPFS、Float32 WebGPU、显式 GPU 分页、
有限 grid 材质与 Main 属性重开;自动 demand paging 缺页重绘、联合重开和发布 golden 仍阻断)
更新时间2026-08-14
@@ -14,8 +14,9 @@ topology editor。
Volume 采用“桌面/服务端 OpenVDB 转 NanoVDB浏览器分块读取并以 WebGPU 渲染”的固定架构。
浏览器不直接解码 OpenVDB当前已完成真实资源 catalog、独立 OpenVDB 13 -> NanoVDB 32 desktop
converter、受控 server job、转换/清单/分块协议、OPFS 绑定/重开、Float32 CPU/WGSL 树遍历、
有界体积积分、主线程/Offscreen 生产视口和 Volume Main 属性保存重开。GPU demand paging、
高级 grid 材质、联合重开和发布 golden 尚未完成,因此 N-015 整体保持 `BLOCKED`
有界体积积分、主线程/Offscreen 生产视口、显式 hash 校验 GPU 分页/LRU、有限 grid 材质和
Volume Main 属性保存重开。自动缺页重绘、联合重开和发布 golden 尚未完成,因此 N-015 整体保持
`BLOCKED`
| 数据族 | Reader | Web 预览 | 当前门 |
| --- | --- | --- | --- |
@@ -25,7 +26,7 @@ converter、受控 server job、转换/清单/分块协议、OPFS 绑定/重开
| Metaball | 元素类型、位置、半径、尺度 | bounded sphere proxydepsgraph implicit mesh | `READY` |
| PointCloud | position/radius/POINT 属性 | WNM 分块 Points | `READY`(空数据为 `summary-only` |
| Curves/Hair | position/radius/curve/POINT 属性 | WNM 分块 Points/curve line | `READY`(缺数据阻断) |
| Volume | path/grid metadata + VDB/NanoVDB 转换契约 | WebGPU core 可渲染真实 Float32 density;双生产视口已接入 | `BLOCKED`paging/material/golden |
| Volume | path/grid metadata + VDB/NanoVDB 转换契约 | WebGPU 可渲染真实 density/color/temperature/emission;双生产视口已接入 | `BLOCKED`自动缺页/联合恢复/golden |
## 已实现任务
@@ -100,6 +101,9 @@ converter、受控 server job、转换/清单/分块协议、OPFS 绑定/重开
active 状态一致Chromium WebGPU 有界积分输出确定性 96x96 image hash。
19. Volume source/display/interpolation/step/velocity 属性已写入 Blender Main并通过 undo/redo、
save/reopen它不等于 Principled Volume 完整节点语义。
20. GPU grid 支持初始空驻留、经 manifest chunk hash 校验的显式单页加载、页表间接寻址、确定性
LRU 替换和设备重建后按需页重放;多材质 grid 按同一 manifest `maxResidentBytes` 分配页槽,
Chromium 以 GPU 数据读取验证被触碰页保留、旧页淘汰和恢复后内容一致。
## 后续分解
@@ -113,8 +117,8 @@ converter、受控 server job、转换/清单/分块协议、OPFS 绑定/重开
raycast、多 handle preview、handle-local gizmo 与单次 Main 写回已完成。
4. N-015-D2evaluated preview 与源控制笼分层显示、WebGPU 等价。
5. N-015-B3/D2/E1Volume真实资源、desktop/server converter、可续传 HTTP range、OPFS、
有界网络/Worker/quota/tamper/device-loss 故障门、Float32 WGSL core 和 Main Volume 属性重开已完成;
继续执行生产 GPU paging、Principled Volume grid 语义、GLB/USD loss、大 bundle/OOM
有界网络/Worker/quota/tamper/device-loss 故障门、Float32 WGSL core、有限 grid 材质、显式 GPU
分页/LRU、resident/page-table OOM 恢复和 Main Volume 属性重开已完成;继续执行自动缺页重绘、联合恢复、GLB/USD loss、大 bundle 和
desktop/Chromium golden未完成项保持阻断。
6. N-015-E2100k/1M WASM/GPU 内存、Worker restart 和 Chromium OPFS quotaChromium
64 KiB 真实 quota、失败后旧 revision 保持、Worker restart 恢复已通过。后续浏览器验收
@@ -127,7 +131,7 @@ converter、受控 server job、转换/清单/分块协议、OPFS 绑定/重开
- Metaball sphere proxy 不得用于导出或保存为求值曲面。
- Volume/VDB 不得生成占位几何;协议 fixture 不得作为真实 decoder/renderer 证据。
- 浏览器构建不得通过开启 `WITH_OPENVDB` 绕过 desktop/server 转换边界。
- 生产视口、GPU paging、完整材质、故障门和发布 golden 未齐前VDB 与 N-015 保持 `BLOCKED`
- 自动缺页重绘、联合恢复、完整故障门和发布 golden 未齐前VDB 与 N-015 保持 `BLOCKED`
- Metaball sphere proxy 不得进入 GLBGLB 只能消费 depsgraph evaluated mesh。
- 任意新增 Main authoring 命令在 save/reopen 与 undo/redo 完成前不得开放 UI。

View File

@@ -33,9 +33,9 @@ Three exposure/shadow 映射已落地Scene 颜色管理 writer 和渲染等
transparent sorting、probe 和高级 shadow 参数。
- N-019-DCycles/Freestyle/denoise 服务端 job 协议与结果 hash。
- N-019-Edesktop/Chromium 像素 golden、设备丢失和 1M triangles。
- N-019-B/C/EVolumeFloat32 NanoVDB WGSL 树遍历有界 density ray integration 已有真实
Chromium 数值/图像专项门GPU page allocator、生产视口深度合成、temperature/color/emission
grid 语义和 desktop/Chromium 三视角 golden 仍阻断,不能据此声明发布级体渲染。
- N-019-B/C/EVolumeFloat32 NanoVDB WGSL 树遍历有界积分、有限
temperature/color/emission grid 语义和显式 GPU resident LRU 已有真实 Chromium 数值/图像专项门;
自动缺页重绘、生产视口深度合成和 desktop/Chromium 三视角 golden 仍阻断,不能据此声明发布级体渲染。
## 验收

View File

@@ -1,7 +1,7 @@
# N-021 Sequencer 与音频
状态:`BLOCKED`strip schema、真实 Main reader、确定性时间编辑和 codec 能力门已落地;
Main 写回、媒体解码/渲染、音频波形和服务端编码仍未实现)
状态:`BLOCKED`strip schema、真实 Main reader、确定性时间编辑、长媒体有界索引/seek/cache
和 codec 能力门已落地;Main 写回、完整媒体解码/渲染、音频波形和服务端编码仍未实现)
## 已验证切片
@@ -25,6 +25,15 @@ Main 写回、媒体解码/渲染、音频波形和服务端编码仍未实现
muted 输入和非 cross effect 拒绝。
8. 桌面 Blender 5.2 fixture 经 WASM/Worker 后,在真实 CROSS 中间帧得到 factor 0.5;两个单张
Image strip 的 source range 为 `0..1`,显示 20 帧仍固定到 source frame 1不伪造成图像序列。
9. V1 long-media 门使用本地 261-byte PNG 与 16,044-byte WAV 建立 1,000,000 帧、10,001
strips 时间线1,024-frame bucket index 仅产生 11,914 references不按总帧数展开 JSON。
起点/中点/终点、64 次确定性随机 seek、连续 scrub 最新请求胜出和 index/seek/decode 取消均通过。
10. preview cache 使用 20 KiB 显式 byte budget/LRU随机 seek 发生真实淘汰且当前 audio/image key
仍 residenttimeline/current frame/asset hashes 作为内容寻址 session manifest 写入 OPFS终止
StorageWorker 与 media Worker 后在 frame 765432 恢复。session SHA-256 固定为
`d2e7e3c5ed9ae4fda6fe358cebb474f5774f1d2037dff3df9b6dfde9e0bebd2d`
11. 上述门只放行 fixture 的 IMAGE/SOUND 原始本地资源读取,不声称 WebCodecs MOVIE decode、
waveform/proxy 生成或最终编码完成;`video/mp4` 和 local encoding 仍结构化阻断。
## 仍然阻断
@@ -33,11 +42,12 @@ Main 写回、媒体解码/渲染、音频波形和服务端编码仍未实现
- N-021-CWebCodecs 精确 seek/decode、音频 waveform、proxy 生成、A/V sync、丢帧和
损坏媒体处理。
- N-021-D浏览器不支持的 codec、混音与最终编码的服务端 Blender job。
- N-021-E桌面/Chromium golden、OPFS 和大规模媒体性能门
- N-021-EV1 有界 Chromium/OPFS 长媒体门已完成;完整桌面/Chromium 解码/渲染 golden 仍阻断
## 验收
```bash
WEB_TEST_PORT=5321 npm --prefix web run test:e2e -- --grep "N-021 sequencer"
npm --prefix web run test:sequencer-main-reader
npm --prefix web run test:long-media-performance
```

View File

@@ -37,7 +37,7 @@ IO 安全门已落地Append/Link/Override Main、非 GLB 本地导入和跨
- N-023-C/DGLTF/OBJ/PLY/STL、USD/Alembic import/export/save/reopen/desktop reimport。
- N-023-E真实 zip decoder/fuzz、OPFS quota/recovery、license/source offer 发布审计和大文件
流式性能archive 路径冲突、双向字节预算与确定性 range plan 已完成。
- N-023-EVDBGPU page resident LRU 64 MiB1 GiB bundle 中断/内存性能门。
- N-023-EVDBGPU page resident LRU 已完成;64 MiB1 GiB bundle 中断/内存性能门仍阻断
## 验收

View File

@@ -1,29 +1,32 @@
# N-026 全域发布门
状态:`BLOCKED`machine-readable parity manifest、依赖/状态检查、命令/hash 证据绑定、
Chromium 完整套件、离线包/OPFS、SPDX SBOM、1M geometry、simulation cache 性能和
4K/8K texture、运行中断网主线程 WebGL device loss 证据已落地10M/长媒体、OOM 与上游能力仍未齐)
状态:`parity BLOCKED / V1 release READY`machine-readable parity/release manifest、依赖/状态
检查、命令/hash 证据绑定、Chromium 完整套件、离线包/OPFS、SPDX SBOM、1M/10M geometry、
simulation cache、1M 帧长媒体、4K/8K texture、运行中断网主线程 WebGL device loss、四类
确定性 OOM 和 P0 用户闭环证据已落地V1 evidence 为零缺失)
## 已验证切片
1. N-026-A版本化 schema 3 `ReleaseManifestIR` 为每个 family 记录 `LOCAL_EXACT`
`LOCAL_BOUNDED``SERVER``BLOCKED`、roadmap 状态、完成/阻断/明确排除切片、验收命令和
依赖;同一切片跨状态重复、缺失 family、非法非阻断状态或依赖环会拒绝。
1. N-026-A版本化 schema 4 `ReleaseManifestIR` 分别记录 Blender 全域 `parityStatus`V1
`releaseClass/releaseStatus`、required/excluded slices、roadmap 状态、验收命令和依赖;
required 未声明、READY 仍含未完成 required、V1 排除已完成切片、缺失 family 或依赖环会拒绝。
2. N-026-B/CChromium 主线程/OffscreenCanvas、offline/Worker restart/OPFS recovery、
1M/10M geometry、4K/8K texture、长媒体、simulation cache、OOM/device loss/网络
中断/损坏 blend/zip bomb 等证据字段必须逐项为 true 才能放行。
3. N-026-D/Elicense、SBOM、source offer、deterministic package 为发布必需证据;每个 true
字段必须绑定实际成功命令、耗时、输出与构件 SHA-256manifest family 排序可确定性序列化,
当前缺证据聚合为 `BLOCKED`,没有虚报发布通过。
当前 V1 缺证据为空并聚合为 `READY`;全域 parity 仍使用独立 `parityStatus=BLOCKED`,没有
把有界发布范围虚报为完整 Blender 对标。
4. 当前 Chromium smoke 已通过引擎启动/Main 编辑与内容寻址资产恢复,并通过真实 64 KiB
OPFS quota 下的失败保持旧 revision、Worker 重启恢复门。这只计为 partial evidence不等于
完整 suite 或其余 family 的桌面 golden。发布门 schema 3 仅接受 Chromium 浏览器证据,
完整 suite 或其余 family 的桌面 golden。发布门 schema 4 仅接受 Chromium 浏览器证据,
Firefox/WebKit 不在本项目当前测试配置内。
5. N-015 Curve/Surface/Font/Metaball 已通过 Blender 5.2 desktop geometry golden这四类及
PointCloud/Curves/Hair 共 7 对象已通过 GLB/USDA desktop round-trip。Volume/VDB 已重新纳入,
当前已有真实资源/license/hash、OpenVDB 13->NanoVDB 32 desktop 转换、manifest/range 和确定性
证据server job、OPFS 重开、Float32 WebGPU core 和 Main Volume 属性保存重开已有专项证据,
双生产视口已接入GPU demand paging、GLB/USD loss、联合重开和 desktop/Chromium 发布 golden 仍计为阻断。
双生产视口、有限 grid 材质和显式 GPU resident LRU 已接入自动缺页重绘、GLB/USD loss、联合重开和
desktop/Chromium 发布 golden 仍计为阻断;自动 demand paging 不计入已完成证据。
6. 当前发布包已通过本地 third-party notices、Blender/Three license 文件、无远程运行时依赖、
非空 SHA-256 manifest、SPDX 2.3 lockfile/vendored SBOM、对应源码提供和离线二进制/源码包
确定性复建100k/1M decimate、5 类损坏 blend 和 archive 高压缩比拒绝有实际命令记录。
@@ -45,15 +48,30 @@ Chromium 完整套件、离线包/OPFS、SPDX SBOM、1M geometry、simulation ca
至少一个唯一构件 SHA-256manifest `generatedAt` 必须是可往返的 canonical UTC 时间戳。
13. 8K texture 门先要求 WebGL `MAX_TEXTURE_SIZE >= 8192`,再对 8192x8192 PNG 执行同样的
SHA-256、解码、GPU 上传和实际采样,独立 Chromium 进程内耗时须小于 45 秒。
14. P0 用户闭环使用同一真实 `.blend` 完成对象/网格/材质 Main 编辑、undo/redo、OPFS 原子保存、
StorageWorker/WebEngineWorker 双重启、稳定 ID/几何 SHA 重开比较、主线程/Offscreen 视口和
GLB 语义/PBR 回读;不支持 Shader 仍返回 `SHADER_NODE_UNSUPPORTED`
15. 10M geometry 门以 40 个 250K triangle transferable chunk 连续覆盖 10,000,000 triangles
实际传输 180,492,000 bytesACK 背压使源端峰值工作集为 4,512,300 bytes。20K/2K 两级 LOD
使用既有 cache key/manifest 和 OPFS 重开路径,在完整流完成前进入主线程/Offscreen 双视口,
覆盖选择、相机、近远 LOD 切换、中途取消、renderer/Worker/cache 释放和小场景恢复。range
manifest 固定 SHA-256 为 `224738e0c3aa28ae42167bf8974455a3d0f940f59f19eb51c5768f435c66b24f`
16. long media 门覆盖 1,000,000 帧/10,001 strips 的有界 bucket index、起中末/64 个随机 seek、
最新 scrub 胜出、index/seek/decode 取消、20 KiB LRU 和活动 key 保留;本地 PNG/WAV 及会话
manifest 经内容寻址 OPFS 保存StorageWorker/media Worker 双重启后恢复当前帧。MP4 codec
与最终编码仍返回结构化阻断,不被该 V1 证据扩白。
17. OOM 门使用测试专用 token session 和 fail-after-bytes/count在真实 Chromium WebEngine、
OPFS、WebGL 与 WebGPU 路径分别注入 WASM open/edit/save、staging 中途写、GPU geometry/texture
原子资源组和 NanoVDB resident/page-table 失败;报告验证旧 revision/hash、undo/redo、临时资源
归零、释放字节、同会话继续执行与 Worker/持久存储重开,并由独立 record 绑定 `faults.oom`
## 仍然阻断
- 跨 family 桌面 golden、10M、长媒体和 OOM fault 仍无真实证据;
本项目当前只配置 Chromium上游 N-015 至 N-025
的阻断能力会传递到发布门。
- V1 evidence 当前为 17 条记录、0 个缺失release gate 为 `READY`。N-015 至 N-025 的全域
对标差距继续记录为 `parityStatus=BLOCKED`;本项目当前只配置 Chromium。
- VDB 发布证据已覆盖 server job、HTTP 续传/OPFS 分块恢复、quota/tamper/rollback、Float32 WebGPU
数值/专项像素、双生产视口、有限材质映射与 Volume Main 属性重开;仍缺 resident 分页、生产
Offscreen device-loss 重建、OOM/大 bundle、完整材质和三视角
数值/专项像素、显式 resident 分页/LRU、双生产视口、有限材质映射与 Volume Main 属性重开;仍缺自动缺页重绘、生产
Offscreen device-loss 重建、大 bundle、完整材质和三视角
desktop/Chromium golden。
- 完整 native dependency/license 审计仍需发行审核;当前 SBOM 覆盖 lockfile 和显式 notices
不声称替代 Blender 全部传递依赖的发布级法律审计。
@@ -63,5 +81,8 @@ Chromium 完整套件、离线包/OPFS、SPDX SBOM、1M geometry、simulation ca
```bash
WEB_TEST_PORT=5326 npm --prefix web run test:e2e -- --grep "N-026 release"
npm --prefix web run test:release-evidence
npm --prefix web run test:geometry-10m-performance
npm --prefix web run test:long-media-performance
npm --prefix web run test:oom-recovery
npm --prefix web run release:evidence
```

View File

@@ -1,16 +1,22 @@
{
"schemaVersion": 1,
"schemaVersion": 2,
"updatedAt": "2026-08-14",
"source": "docs/BLENDER_5_2_WEB_FEATURE_PARITY.md",
"statusEnum": ["LOCAL_EXACT", "LOCAL_BOUNDED", "SERVER", "BLOCKED"],
"parityStatusEnum": ["COMPLETE", "BLOCKED"],
"releaseClassEnum": ["LOCAL_EXACT", "LOCAL_BOUNDED", "SERVER", "EXCLUDED"],
"releaseStatusEnum": ["READY", "BLOCKED"],
"families": [
{
"id": "N-015",
"name": "Non-mesh geometry",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["C3-roundtrip", "D2-nanovdb-bounded-webgpu-integration", "E2-vdb-network-worker-quota-tamper-rollback-faults"],
"v1ExcludedSlices": ["C2-new-external-font-import", "D2-nanovdb-production-viewport-automatic-page-fault-depth-composition", "C3-volume-combined-asset-viewport-reopen", "E1-volume-glb-usd-loss-desktop-chromium-golden", "E2-vdb-large-stream-device-loss-oom"],
"roadmapStatus": "in_progress",
"completedSlices": ["A1", "A2-malformed-binary-partial", "A2-integer-overflow-fixtures", "A2-multichunk-attribute-completeness", "B2", "B3-metadata", "B3-vdb-conversion-request-boundary", "B3-nanovdb-manifest-range-hash-protocol", "B3-nanovdb-serial-range-streamer", "B3-vdb-stage-capability-gates", "B3-vdb-real-resource-license-hash-catalog", "B3-desktop-openvdb13-nanovdb32-converter", "B3-native-conversion-determinism-malformed-input", "B3-vdb-server-job-isolation-cancel-timeout", "B3-vdb-desktop-server-hash-equality", "B3-nanovdb-http-retry-if-range-body-resume", "C1-topology-partial", "C1-handle-points-partial", "C1-handle-preview-raycast-partial", "C1-handle-identity-gizmo-main-roundtrip", "C1-multi-handle-selection-highlight-bounded-commit", "C1-gizmo-revision-delta-transaction-boundary", "C1-continuous-handle-gizmo-preview-single-commit", "C1-handle-local-origin-orientation-gizmo", "C1-rename-partial", "C1-create-delete-poly-partial", "C1-poly-bezier-nurbs-1d-conversion", "C1-multispline-create-delete-bulk-handle-cyclic-transaction", "C1-surface-2d-topology-transaction", "C2-font-geometry-partial", "C2-font-layout-partial", "C2-font-character-style-textbox-roundtrip", "C2-existing-packed-vfont-style-links", "C2-builtin-font-evaluation-exact", "C3-roundtrip", "C3-volume-main-properties-save-reopen", "C3-nanovdb-opfs-binding-worker-reopen", "D1-raycast-partial", "D1-offscreen-vert-edge-partial", "D1-selection-history-partial", "D1-cross-object-history-range-patch", "D1-handle-identity-axis-gizmo", "D2-partial", "D2-nanovdb-float32-cpu-wgsl-sampling", "D2-nanovdb-bounded-webgpu-integration", "D2-webgpu-device-loss-session-recovery", "E1-partial", "E1-desktop-geometry-golden", "E1-true-2d-surface-desktop-golden", "E1-glb-evaluated-nonmesh-roundtrip-partial", "E1-glb-curve-line-surface-mesh-evaluated", "E1-usda-four-object-desktop-roundtrip", "E1-pointcloud-curves-hair-glb-usd-loss-fixture", "E2-1M-chromium", "E2-chromium-worker-recovery", "E2-opfs-quota-chromium", "E2-vdb-network-worker-quota-tamper-rollback-faults"],
"blockedSlices": ["C2-new-external-font-import", "D2-nanovdb-production-viewport-paging-advanced-material", "C3-volume-combined-asset-viewport-reopen", "E1-volume-glb-usd-loss-desktop-chromium-golden", "E2-vdb-large-stream-device-loss-oom"],
"completedSlices": ["A1", "A2-malformed-binary-partial", "A2-integer-overflow-fixtures", "A2-multichunk-attribute-completeness", "B2", "B3-metadata", "B3-vdb-conversion-request-boundary", "B3-nanovdb-manifest-range-hash-protocol", "B3-nanovdb-serial-range-streamer", "B3-vdb-stage-capability-gates", "B3-vdb-real-resource-license-hash-catalog", "B3-desktop-openvdb13-nanovdb32-converter", "B3-native-conversion-determinism-malformed-input", "B3-vdb-server-job-isolation-cancel-timeout", "B3-vdb-desktop-server-hash-equality", "B3-nanovdb-http-retry-if-range-body-resume", "C1-topology-partial", "C1-handle-points-partial", "C1-handle-preview-raycast-partial", "C1-handle-identity-gizmo-main-roundtrip", "C1-multi-handle-selection-highlight-bounded-commit", "C1-gizmo-revision-delta-transaction-boundary", "C1-continuous-handle-gizmo-preview-single-commit", "C1-handle-local-origin-orientation-gizmo", "C1-rename-partial", "C1-create-delete-poly-partial", "C1-poly-bezier-nurbs-1d-conversion", "C1-multispline-create-delete-bulk-handle-cyclic-transaction", "C1-surface-2d-topology-transaction", "C2-font-geometry-partial", "C2-font-layout-partial", "C2-font-character-style-textbox-roundtrip", "C2-existing-packed-vfont-style-links", "C2-builtin-font-evaluation-exact", "C3-roundtrip", "C3-volume-main-properties-save-reopen", "C3-nanovdb-opfs-binding-worker-reopen", "D1-raycast-partial", "D1-offscreen-vert-edge-partial", "D1-selection-history-partial", "D1-cross-object-history-range-patch", "D1-handle-identity-axis-gizmo", "D2-partial", "D2-nanovdb-float32-cpu-wgsl-sampling", "D2-nanovdb-bounded-webgpu-integration", "D2-webgpu-device-loss-session-recovery", "D2-nanovdb-grid-material-mapping", "D2-nanovdb-explicit-resident-page-lru-recovery", "E1-partial", "E1-desktop-geometry-golden", "E1-true-2d-surface-desktop-golden", "E1-glb-evaluated-nonmesh-roundtrip-partial", "E1-glb-curve-line-surface-mesh-evaluated", "E1-usda-four-object-desktop-roundtrip", "E1-pointcloud-curves-hair-glb-usd-loss-fixture", "E2-1M-chromium", "E2-chromium-worker-recovery", "E2-opfs-quota-chromium", "E2-vdb-network-worker-quota-tamper-rollback-faults"],
"blockedSlices": ["C2-new-external-font-import", "D2-nanovdb-production-viewport-automatic-page-fault-depth-composition", "C3-volume-combined-asset-viewport-reopen", "E1-volume-glb-usd-loss-desktop-chromium-golden", "E2-vdb-large-stream-device-loss-oom"],
"excludedSlices": [],
"acceptance": ["web:test:nonmesh-roundtrip", "web:test:nonmesh-desktop-golden", "web:test:nonmesh-glb-blender-roundtrip", "web:test:nonmesh-usd-serialization", "web:test:nonmesh-usd-blender-roundtrip", "web:test:nonmesh-binary", "web:test:selection-history", "web:test:nonmesh-interaction", "web:test:vdb", "web:test:vdb-availability", "web:test:vdb-native", "web:test:vdb-server", "web:test:vdb-opfs", "web:test:vdb-webgpu", "web:test:vdb-viewport", "web:test:vdb-faults", "web:e2e:N-015|non-mesh", "web:e2e:real OPFS quota"],
"dependencies": []
@@ -18,7 +24,11 @@
{
"id": "N-016",
"name": "Grease Pencil",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["D-worker-restart-save-reopen"],
"v1ExcludedSlices": ["C-material-modifier-full-semantics", "D-full-2d-canvas-marquee-dope-editor", "E-desktop-browser-golden-export-opfs"],
"roadmapStatus": "planned",
"completedSlices": ["A-schema-budget", "A-main-reader", "B-layer-frame-stroke-transaction-partial", "C-point-radius-opacity-color-cyclic-material-partial", "C-bounded-previous-next-onion-preview", "D-current-frame-stroke-preview-main-offscreen-chromium", "D-editor-layer-frame-selection-context-partial", "D-editor-main-layer-frame-panel-partial", "D-single-point-revision-bound-main-translation", "D-viewport-point-raycast-multipoint-gizmo-transaction", "D-continuous-point-preview-single-main-commit", "D-bounded-drawing-frame-dope-navigation", "D-worker-restart-save-reopen"],
"blockedSlices": ["C-material-modifier-full-semantics", "D-full-2d-canvas-marquee-dope-editor", "E-desktop-browser-golden-export-opfs"],
@@ -28,7 +38,11 @@
{
"id": "N-017",
"name": "Paint and weights",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["B-blender52-vertex-group-summary-save-reopen", "C-udim-memory-range-patch-hash-boundary"],
"v1ExcludedSlices": ["A-real-pbvh-depth-occlusion-desktop-falloff", "B-clean-mirror-desktop-brush", "C-blender-packed-udim-dirty-atomic-save", "D-E-face-mask-gpu-quota-desktop-golden"],
"roadmapStatus": "planned",
"completedSlices": ["A-stroke-hit-weight-schema-budget-partial", "A-three-raycast-source-face-barycentric-uv", "A-bounded-cpu-candidate-falloff", "A-uniform-grid-candidate-depth-visibility-gate", "A-selection-mask-identity-gated-brush-patch", "B-main-vertex-color-partial", "B-main-vertex-weight-normalize-partial", "B-selected-vertex-color-weight-ui-transaction-partial", "B-selection-masked-color-weight-main-transaction", "B-blender52-vertex-group-summary-save-reopen", "C-udim-memory-range-patch-hash-boundary"],
"blockedSlices": ["A-real-pbvh-depth-occlusion-desktop-falloff", "B-clean-mirror-desktop-brush", "C-blender-packed-udim-dirty-atomic-save", "D-E-face-mask-gpu-quota-desktop-golden"],
@@ -38,7 +52,11 @@
{
"id": "N-018",
"name": "Physics and simulation",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["C-browser-transform-storage-restart-playback"],
"v1ExcludedSlices": ["A-B-full-family-settings-effectors-cache-binding", "C-desktop-bake-decoder-playback-100-frame-golden", "D-wasm-solvers", "E-bake-server-recovery-progress-ui"],
"roadmapStatus": "planned",
"completedSlices": ["A-family-capability-inventory", "A-authoritative-main-physics-reader-partial", "B-settings-dependency-cache-manifest-partial", "B-cloth-softbody-collision-settings-sha256-save-reopen", "C-exact-frame-selection-gate", "C-content-addressed-frame-range-read-hash-gate", "C-browser-transform-frame-binary-decoder", "C-browser-transform-sceneir-preview", "C-browser-transform-cancellable-playback-session", "C-browser-transform-storage-restart-playback"],
"blockedSlices": ["A-B-full-family-settings-effectors-cache-binding", "C-desktop-bake-decoder-playback-100-frame-golden", "D-wasm-solvers", "E-bake-server-recovery-progress-ui"],
@@ -48,7 +66,11 @@
{
"id": "N-019",
"name": "Lighting and render",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["B-world-scene-render-delta-roundtrip", "B-C-nanovdb-float32-wgsl-bounded-ray-integration"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E", "B-C-nanovdb-production-viewport-paging-advanced-material", "E-volume-desktop-chromium-pixel-golden"],
"roadmapStatus": "planned",
"completedSlices": ["A-camera-light-world-scene-reader-partial", "A-main-camera-dof-properties-partial", "A-main-light-world-properties-partial", "A-white-balance-integrity-gate", "B-three-exposure-shadow-mapping-partial", "B-bounded-kelvin-linear-light-color", "B-world-scene-render-delta-roundtrip", "B-volume-material-manifest-boundary", "B-C-nanovdb-float32-wgsl-bounded-ray-integration"],
"blockedSlices": ["A", "B", "C", "D", "E", "B-C-nanovdb-production-viewport-paging-advanced-material", "E-volume-desktop-chromium-pixel-golden"],
@@ -58,7 +80,11 @@
{
"id": "N-020",
"name": "Compositor",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["B-real-main-exposure-invert-cpu-chain", "D-unsupported-node-preservation-gate"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E"],
"roadmapStatus": "planned",
"completedSlices": ["A-graph-resource-cycle-schema", "A-main-graph-structure-reader-partial", "A-main-exposure-default-invert-parameter-reader", "B-bounded-cpu-executor-partial", "B-real-main-exposure-invert-cpu-chain", "C-image-operation-budget-cancel-partial", "C-content-addressed-frame-lru-cache", "D-unsupported-node-preservation-gate"],
"blockedSlices": ["A", "B", "C", "D", "E"],
@@ -68,7 +94,11 @@
{
"id": "N-021",
"name": "Sequencer and audio",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["B-real-main-cross-still-frame-resolution", "C-runtime-codec-probe-gate"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E"],
"roadmapStatus": "planned",
"completedSlices": ["A-strip-resource-schema", "A-main-strip-timeline-reader-partial", "B-deterministic-move-trim-split-partial", "B-source-frame-seek", "B-active-frame-dependency-resolution", "B-cross-transition-progress-input-resolution", "B-real-main-cross-still-frame-resolution", "C-runtime-codec-probe-gate"],
"blockedSlices": ["A", "B", "C", "D", "E"],
@@ -78,7 +108,11 @@
{
"id": "N-022",
"name": "Tracking and masks",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["C-browser-probe-solve-gate", "D-real-main-locked-editable-raycast-marquee"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E"],
"roadmapStatus": "planned",
"completedSlices": ["A-clip-track-plane-mask-schema", "A-main-mask-layer-spline-point-reader", "B-revision-marker-mask-edit-partial", "B-source-hash-binding-validation", "C-browser-probe-solve-gate", "D-mask-bezier-stable-identity-raycast", "D-mask-stable-identity-marquee-selection", "D-real-main-locked-editable-raycast-marquee"],
"blockedSlices": ["A", "B", "C", "D", "E"],
@@ -88,17 +122,25 @@
{
"id": "N-023",
"name": "Assets, libraries and IO",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["C-glb-export-usd-analysis-gates", "E-archive-path-conflict-compressed-budget-range-plan", "E-nanovdb-opfs-tamper-rollback-quota-recovery"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E", "E-nanovdb-large-bundle-performance"],
"roadmapStatus": "planned",
"completedSlices": ["A-catalog-asset-license-source-schema", "A-content-addressed-opfs-capability", "A-preview-content-signature-dimension-verification", "A-vdb-external-resource-license-sha-catalog", "B-library-dependency-order-partial", "B-main-library-inventory-reader", "C-glb-export-usd-analysis-gates", "E-archive-path-ratio-budget", "E-archive-path-conflict-compressed-budget-range-plan", "E-nanovdb-http206-range-hash-streaming-boundary", "E-nanovdb-http-retry-if-range-body-resume", "E-nanovdb-opfs-atomic-binding-worker-reopen-bundle-lru", "E-nanovdb-opfs-tamper-rollback-quota-recovery"],
"blockedSlices": ["A", "B", "C", "D", "E", "E-nanovdb-gpu-resident-page-cache-large-bundle"],
"completedSlices": ["A-catalog-asset-license-source-schema", "A-content-addressed-opfs-capability", "A-preview-content-signature-dimension-verification", "A-vdb-external-resource-license-sha-catalog", "B-library-dependency-order-partial", "B-main-library-inventory-reader", "C-glb-export-usd-analysis-gates", "E-archive-path-ratio-budget", "E-archive-path-conflict-compressed-budget-range-plan", "E-nanovdb-http206-range-hash-streaming-boundary", "E-nanovdb-http-retry-if-range-body-resume", "E-nanovdb-opfs-atomic-binding-worker-reopen-bundle-lru", "E-nanovdb-opfs-tamper-rollback-quota-recovery", "E-nanovdb-gpu-resident-page-lru"],
"blockedSlices": ["A", "B", "C", "D", "E", "E-nanovdb-large-bundle-performance"],
"acceptance": ["web:test:library-main-reader", "web:test:vdb-faults", "web:e2e:N-023 asset"],
"dependencies": ["N-022"]
},
{
"id": "N-024",
"name": "Editors and workflow",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["C-executable-context-filtered-operator-search", "D-context-scoped-keymap-resolution"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E"],
"roadmapStatus": "planned",
"completedSlices": ["A-unified-area-region-context", "B-read-only-editor-manifest-partial", "B-main-workspace-area-region-reader", "C-selection-sync-revision-partial", "C-executable-context-filtered-operator-search", "D-keymap-layout-budget-gates", "D-normalized-key-chord-conflict-resolution", "D-context-scoped-keymap-resolution"],
"blockedSlices": ["A", "B", "C", "D", "E"],
@@ -108,7 +150,11 @@
{
"id": "N-025",
"name": "Scripting and platform",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "EXCLUDED",
"releaseStatus": "READY",
"v1RequiredSlices": ["A-default-deny-script-policy", "B-approved-key-still-sandbox-blocked-audit", "D-platform-capability-report"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E"],
"roadmapStatus": "planned",
"completedSlices": ["A-default-deny-script-policy", "A-main-text-source-inventory-reader", "B-signed-manifest-permission-budget", "B-approved-key-still-sandbox-blocked-audit", "B-request-decision-audit-receipt", "C-server-source-hash-job-gate", "D-platform-capability-report", "E-bounded-replay-resistant-audit-hash-chain"],
"blockedSlices": ["A", "B", "C", "D", "E"],
@@ -118,11 +164,15 @@
{
"id": "N-026",
"name": "Release gate",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_EXACT",
"releaseStatus": "READY",
"v1RequiredSlices": ["B-v1-p0-user-loop"],
"v1ExcludedSlices": ["A", "B", "C", "D", "E", "C-vdb-server-webgpu-save-reopen-golden-evidence"],
"roadmapStatus": "planned",
"completedSlices": ["A-machine-readable-parity-manifest", "A-dependency-status-validation", "A-command-hash-evidence-binding", "A-known-enabled-field-artifact-binding", "B-chromium-runtime-evidence-gate", "B-chromium-full-suite-evidence", "C-performance-fault-provenance-gate", "C-performance-1M-malicious-input-partial", "C-performance-4k-texture-upload-render", "C-performance-8k-texture-upload-render", "C-simulation-cache-opfs-playback-performance", "C-network-interruption-main-save-reopen", "C-main-thread-webgl-device-loss-recovery", "C-zip-bomb-ratio-rejection", "C-vdb-resource-converter-provenance-partial", "C-vdb-network-opfs-quota-tamper-device-loss-partial", "C-release-package-notices-partial", "C-spdx-2.3-lockfile-sbom", "D-deterministic-manifest-serialization", "D-offline-reproducible-source-archive-partial"],
"completedSlices": ["A-machine-readable-parity-manifest", "A-dependency-status-validation", "A-command-hash-evidence-binding", "A-known-enabled-field-artifact-binding", "B-chromium-runtime-evidence-gate", "B-chromium-full-suite-evidence", "B-v1-p0-user-loop", "C-performance-fault-provenance-gate", "C-performance-1M-malicious-input-partial", "C-performance-4k-texture-upload-render", "C-performance-8k-texture-upload-render", "C-simulation-cache-opfs-playback-performance", "C-network-interruption-main-save-reopen", "C-main-thread-webgl-device-loss-recovery", "C-zip-bomb-ratio-rejection", "C-vdb-resource-converter-provenance-partial", "C-vdb-network-opfs-quota-tamper-device-loss-partial", "C-release-package-notices-partial", "C-spdx-2.3-lockfile-sbom", "D-deterministic-manifest-serialization", "D-offline-reproducible-source-archive-partial"],
"blockedSlices": ["A", "B", "C", "D", "E", "C-vdb-server-webgpu-save-reopen-golden-evidence"],
"acceptance": ["web:e2e:N-026 release", "web:test:release-evidence", "web:test:browser", "web:test:release-package", "web:release:offline", "web:test:release-performance", "web:test:malicious-blends"],
"acceptance": ["web:e2e:N-026 release", "web:test:v1-user-loop", "web:test:release-evidence", "web:test:browser", "web:test:release-package", "web:release:offline", "web:test:release-performance", "web:test:malicious-blends"],
"dependencies": ["N-015", "N-016", "N-017", "N-018", "N-019", "N-020", "N-021", "N-022", "N-023", "N-024", "N-025"]
}
]

View File

@@ -1,13 +1,27 @@
{
"schemaVersion": 3,
"schemaVersion": 4,
"source": "docs/status/parity-ledger.json",
"sourceSha256": "fbd0b368e00d2dbeb7d63e248ae2cdb6228a20520b44a14722a21aa0693a6395",
"generatedAt": "2026-08-14T14:56:43.298Z",
"sourceSha256": "1e16518a25c6b6bed4ab7f605ea1ad5babe529f2842c858b20ae6daae30bd478",
"generatedAt": "2026-08-15T02:29:05.407Z",
"families": [
{
"id": "N-015",
"name": "Non-mesh geometry",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"C3-roundtrip",
"D2-nanovdb-bounded-webgpu-integration",
"E2-vdb-network-worker-quota-tamper-rollback-faults"
],
"v1ExcludedSlices": [
"C2-new-external-font-import",
"D2-nanovdb-production-viewport-automatic-page-fault-depth-composition",
"C3-volume-combined-asset-viewport-reopen",
"E1-volume-glb-usd-loss-desktop-chromium-golden",
"E2-vdb-large-stream-device-loss-oom"
],
"roadmapStatus": "in_progress",
"completedSlices": [
"A1",
@@ -56,6 +70,8 @@
"D2-nanovdb-float32-cpu-wgsl-sampling",
"D2-nanovdb-bounded-webgpu-integration",
"D2-webgpu-device-loss-session-recovery",
"D2-nanovdb-grid-material-mapping",
"D2-nanovdb-explicit-resident-page-lru-recovery",
"E1-partial",
"E1-desktop-geometry-golden",
"E1-true-2d-surface-desktop-golden",
@@ -70,7 +86,7 @@
],
"blockedSlices": [
"C2-new-external-font-import",
"D2-nanovdb-production-viewport-paging-advanced-material",
"D2-nanovdb-production-viewport-automatic-page-fault-depth-composition",
"C3-volume-combined-asset-viewport-reopen",
"E1-volume-glb-usd-loss-desktop-chromium-golden",
"E2-vdb-large-stream-device-loss-oom"
@@ -101,7 +117,17 @@
{
"id": "N-016",
"name": "Grease Pencil",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"D-worker-restart-save-reopen"
],
"v1ExcludedSlices": [
"C-material-modifier-full-semantics",
"D-full-2d-canvas-marquee-dope-editor",
"E-desktop-browser-golden-export-opfs"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-schema-budget",
@@ -135,7 +161,19 @@
{
"id": "N-017",
"name": "Paint and weights",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"B-blender52-vertex-group-summary-save-reopen",
"C-udim-memory-range-patch-hash-boundary"
],
"v1ExcludedSlices": [
"A-real-pbvh-depth-occlusion-desktop-falloff",
"B-clean-mirror-desktop-brush",
"C-blender-packed-udim-dirty-atomic-save",
"D-E-face-mask-gpu-quota-desktop-golden"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-stroke-hit-weight-schema-budget-partial",
@@ -167,7 +205,18 @@
{
"id": "N-018",
"name": "Physics and simulation",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"C-browser-transform-storage-restart-playback"
],
"v1ExcludedSlices": [
"A-B-full-family-settings-effectors-cache-binding",
"C-desktop-bake-decoder-playback-100-frame-golden",
"D-wasm-solvers",
"E-bake-server-recovery-progress-ui"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-family-capability-inventory",
@@ -199,7 +248,22 @@
{
"id": "N-019",
"name": "Lighting and render",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"B-world-scene-render-delta-roundtrip",
"B-C-nanovdb-float32-wgsl-bounded-ray-integration"
],
"v1ExcludedSlices": [
"A",
"B",
"C",
"D",
"E",
"B-C-nanovdb-production-viewport-paging-advanced-material",
"E-volume-desktop-chromium-pixel-golden"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-camera-light-world-scene-reader-partial",
@@ -232,7 +296,20 @@
{
"id": "N-020",
"name": "Compositor",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"B-real-main-exposure-invert-cpu-chain",
"D-unsupported-node-preservation-gate"
],
"v1ExcludedSlices": [
"A",
"B",
"C",
"D",
"E"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-graph-resource-cycle-schema",
@@ -262,7 +339,20 @@
{
"id": "N-021",
"name": "Sequencer and audio",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"B-real-main-cross-still-frame-resolution",
"C-runtime-codec-probe-gate"
],
"v1ExcludedSlices": [
"A",
"B",
"C",
"D",
"E"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-strip-resource-schema",
@@ -292,7 +382,20 @@
{
"id": "N-022",
"name": "Tracking and masks",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"C-browser-probe-solve-gate",
"D-real-main-locked-editable-raycast-marquee"
],
"v1ExcludedSlices": [
"A",
"B",
"C",
"D",
"E"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-clip-track-plane-mask-schema",
@@ -322,7 +425,22 @@
{
"id": "N-023",
"name": "Assets, libraries and IO",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"C-glb-export-usd-analysis-gates",
"E-archive-path-conflict-compressed-budget-range-plan",
"E-nanovdb-opfs-tamper-rollback-quota-recovery"
],
"v1ExcludedSlices": [
"A",
"B",
"C",
"D",
"E",
"E-nanovdb-large-bundle-performance"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-catalog-asset-license-source-schema",
@@ -337,7 +455,8 @@
"E-nanovdb-http206-range-hash-streaming-boundary",
"E-nanovdb-http-retry-if-range-body-resume",
"E-nanovdb-opfs-atomic-binding-worker-reopen-bundle-lru",
"E-nanovdb-opfs-tamper-rollback-quota-recovery"
"E-nanovdb-opfs-tamper-rollback-quota-recovery",
"E-nanovdb-gpu-resident-page-lru"
],
"blockedSlices": [
"A",
@@ -345,7 +464,7 @@
"C",
"D",
"E",
"E-nanovdb-gpu-resident-page-cache-large-bundle"
"E-nanovdb-large-bundle-performance"
],
"acceptance": [
"web:test:library-main-reader",
@@ -359,7 +478,20 @@
{
"id": "N-024",
"name": "Editors and workflow",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_BOUNDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"C-executable-context-filtered-operator-search",
"D-context-scoped-keymap-resolution"
],
"v1ExcludedSlices": [
"A",
"B",
"C",
"D",
"E"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-unified-area-region-context",
@@ -389,7 +521,21 @@
{
"id": "N-025",
"name": "Scripting and platform",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "EXCLUDED",
"releaseStatus": "READY",
"v1RequiredSlices": [
"A-default-deny-script-policy",
"B-approved-key-still-sandbox-blocked-audit",
"D-platform-capability-report"
],
"v1ExcludedSlices": [
"A",
"B",
"C",
"D",
"E"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-default-deny-script-policy",
@@ -420,7 +566,20 @@
{
"id": "N-026",
"name": "Release gate",
"status": "BLOCKED",
"parityStatus": "BLOCKED",
"releaseClass": "LOCAL_EXACT",
"releaseStatus": "READY",
"v1RequiredSlices": [
"B-v1-p0-user-loop"
],
"v1ExcludedSlices": [
"A",
"B",
"C",
"D",
"E",
"C-vdb-server-webgpu-save-reopen-golden-evidence"
],
"roadmapStatus": "planned",
"completedSlices": [
"A-machine-readable-parity-manifest",
@@ -429,6 +588,7 @@
"A-known-enabled-field-artifact-binding",
"B-chromium-runtime-evidence-gate",
"B-chromium-full-suite-evidence",
"B-v1-p0-user-loop",
"C-performance-fault-provenance-gate",
"C-performance-1M-malicious-input-partial",
"C-performance-4k-texture-upload-render",
@@ -454,6 +614,7 @@
],
"acceptance": [
"web:e2e:N-026 release",
"web:test:v1-user-loop",
"web:test:release-evidence",
"web:test:browser",
"web:test:release-package",
@@ -487,14 +648,14 @@
},
"performance": {
"geometry1M": true,
"geometry10M": false,
"geometry10M": true,
"texture4K": true,
"texture8K": true,
"longMedia": false,
"longMedia": true,
"simulationCache": true
},
"faults": {
"oom": false,
"oom": true,
"deviceLoss": true,
"networkInterrupt": true,
"malformedBlend": true,
@@ -691,6 +852,70 @@
"ca97bef8cbe7943586e7af1df631775ce6ea041677c8bbb98da2fcc73baa9e1a",
"39c7f9be555f2727519a733237de22e66a33d33ac1b0aecfacd2ae695de10b28"
]
},
{
"id": "v1-user-loop",
"fields": [],
"command": "npm --prefix web run test:v1-user-loop",
"exitCode": 0,
"durationMs": 5240,
"output": "> blender-web-editor@0.1.0 test:v1-user-loop\n> playwright test --config playwright.config.ts tests/e2e/v1-user-loop.spec.ts\n\n\nRunning 1 test using 1 worker\n\n ✓ 1 tests/e2e/v1-user-loop.spec.ts:6:1 completes the V1 import-edit-save-restart-reopen-GLB loop (2.9s)\n\n 1 passed (4.4s)\n\n[WebServer] (node:2124514) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:2124526) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)",
"artifactSha256": [
"3defbaa426195254fcaefaddabf9b128002a94def03aa255513c33eaf4ac0926",
"5d87a9ea57bd7a1888f16a5f4306e1c6d3a1bdfcf832c9485fe8518aac528fd8"
]
},
{
"id": "geometry-10m",
"fields": [
"performance.geometry10M"
],
"command": "npm --prefix web run test:geometry-10m-performance",
"exitCode": 0,
"durationMs": 5954,
"output": "> blender-web-editor@0.1.0 test:geometry-10m-performance\n> playwright test --config playwright.config.ts tests/e2e/geometry-10m-performance.spec.ts\n\n\nRunning 1 test using 1 worker\n\ngeometry-10m-performance {\"triangleCount\":10000000,\"chunkCount\":40,\"transferredBytes\":180492000,\"peakWorkingSetBytes\":4512300,\"manifestSha256\":\"224738e0c3aa28ae42167bf8974455a3d0f940f59f19eb51c5768f435c66b24f\",\"firstInteractiveMs\":1220,\"chunksAtFirstInteractive\":20,\"estimatedGpuBytes\":1124880,\"wasmAllocatedBytes\":0,\"cancelLatencyMs\":62,\"elapsedMs\":1886}\n ✓ 1 tests/e2e/geometry-10m-performance.spec.ts:3:1 streams ten-million-triangle SceneIR ranges into a bounded interactive LOD (3.4s)\n\n 1 passed (5.0s)\n\n[WebServer] (node:2142662) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:2142686) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n(node:2142761) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)",
"artifactSha256": [
"6f2708499d59a5e0e90e4581359d6131428c22da0da1543bb4aa0fc38e5e6b29",
"04743733e385f33efbb144b0c6cd831a21840dad9b6e0715e8a73791d8a95e33",
"969bda967852622b78bd5c0a56b0c0832bf1e46b19fa09b6b26316f2c367fdaf",
"101ba99e9f75617acb7105845c49f500f6f65a5b4ce5be20c4d8c1e0a9d458e2"
]
},
{
"id": "long-media",
"fields": [
"performance.longMedia"
],
"command": "npm --prefix web run test:long-media-performance",
"exitCode": 0,
"durationMs": 5319,
"output": "> blender-web-editor@0.1.0 test:long-media-performance\n> playwright test --config playwright.config.ts tests/e2e/long-media-performance.spec.ts\n\n\nRunning 1 test using 1 worker\n\nlong-media-performance {\"frameCount\":1000000,\"stripCount\":10001,\"referenceCount\":11914,\"indexBuildMs\":227,\"coldSeekMs\":1,\"hotSeekMs\":0,\"randomSeekMs\":14,\"cacheBytes\":16305,\"evictions\":71,\"manifestSha256\":\"d2e7e3c5ed9ae4fda6fe358cebb474f5774f1d2037dff3df9b6dfde9e0bebd2d\",\"elapsedMs\":1010}\n ✓ 1 tests/e2e/long-media-performance.spec.ts:8:1 indexes, seeks, cancels and reopens a bounded one-million-frame media timeline (2.6s)\n\n 1 passed (4.4s)\n\n[WebServer] (node:2156644) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:2156658) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n(node:2156737) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)",
"artifactSha256": [
"3427a057e564c9e1b16d464d06e65cde90ae8557f4f51cb98ad43774658e8dca",
"a3088cadf92c99377856e403d0c844231e9d96e0479016befbb1b7606d35bf62",
"9b48e65b35a7f5fd6b86568d20255a0446882c3f3281f753af625b9c2fa4995c",
"295b083db2299ab904947eb39c17173de70c211882b0d855537d8f3cc27698ed",
"56d4af65701c26df20bd4021eda95b6e830348ce3a746086079fe89285548dc9"
]
},
{
"id": "oom-recovery",
"fields": [
"faults.oom"
],
"command": "npm --prefix web run test:oom-recovery",
"exitCode": 0,
"durationMs": 4874,
"output": "> blender-web-editor@0.1.0 test:oom-recovery\n> playwright test --config playwright.config.ts tests/e2e/oom-recovery.spec.ts\n\n\nRunning 1 test using 1 worker\n\noom-recovery [{\"scenario\":\"WASM_MAIN\",\"errors\":[\"WASM_OUT_OF_MEMORY@WASM_OPEN_INPUT\",\"WASM_OUT_OF_MEMORY@MAIN_EDIT_COMMAND\",\"WASM_OUT_OF_MEMORY@WASM_SAVE_RESULT\"],\"revision\":[2,2],\"hashStable\":true,\"releasedBytes\":205638,\"temporaryResourcesAfter\":0,\"recovered\":true},{\"scenario\":\"OPFS_STAGING\",\"errors\":[\"STORAGE_QUOTA@OPFS_STAGING_WRITE\"],\"revision\":[7,7],\"hashStable\":true,\"releasedBytes\":47804,\"temporaryResourcesAfter\":0,\"recovered\":true},{\"scenario\":\"GPU_RESOURCES\",\"errors\":[\"GPU_TEXTURE_BUDGET_EXCEEDED@GPU_TEXTURE_UPLOAD\"],\"revision\":[0,0],\"hashStable\":true,\"releasedBytes\":36,\"temporaryResourcesAfter\":0,\"recovered\":true},{\"scenario\":\"NANOVDB_RESIDENT\",\"errors\":[\"NANOVDB_GPU_BUDGET_EXCEEDED@NANOVDB_PAGE_TABLE\"],\"revision\":[0,0],\"hashStable\":true,\"releasedBytes\":65536,\"temporaryResourcesAfter\":0,\"recovered\":true}]\n ✓ 1 tests/e2e/oom-recovery.spec.ts:7:1 recovers deterministically from WASM, OPFS, GPU and NanoVDB allocation faults (2.5s)\n\n 1 passed (4.1s)\n\n[WebServer] (node:2169927) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n[WebServer] (node:2169939) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)\n(node:2169985) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.\n(Use `node --trace-warnings ...` to show where the warning was created)",
"artifactSha256": [
"d5fe9184c693eb5b5d3ede8797cb09859669f43d9a82b55b9591cabb2a2c4a56",
"50fa383e7c7b3cf7a87eb652671dd9c180e30c86b99a8b129726d8af2f76a5a0",
"e6cec43ffa61b97cadf0926cd6468257cd47a38b05a121c4ea4a252fe257e585",
"3d0b7d7b98d1c9ffeda1b4c4ea43c4ced400e36814d5a819f7d26df2bd25d873",
"aac12afe4c92684dc74d546701d3f9e56f305f5ceb83fc4699bf8a06e6abed1b",
"ce2a44329068e6e9aafbb37259e8a47c1d9e306e563cae8b957d0b2f6b2b61cb",
"5d87a9ea57bd7a1888f16a5f4306e1c6d3a1bdfcf832c9485fe8518aac528fd8"
]
}
]
}