Align VDB status and release evidence

This commit is contained in:
mes123456
2026-08-14 18:27:57 -04:00
parent 68d50f810f
commit 3ea9974eee
8 changed files with 85 additions and 21 deletions

View File

@@ -213,10 +213,10 @@ operator search这不等价于 Blender 全量 operator registry、context men
4. `.blend`/image/media/script fuzz、OPFS quota、OOM、设备丢失、网络中断和恢复验证。
5. 许可证/source offer/SBOM、确定性包、文档状态与测试报告一致后才能发布。
当前证据为 13 条有效记录、15 个缺失,整体仍为 `BLOCKED`新增 VDB 边界记录证明
转换/manifest/range 协议与显式阻断;已通过 1M geometry、
当前证据为 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-016 至 N-025 上游 family 的完整验收。
仍缺 10M geometry、长媒体、OOM 及 N-015 至 N-025 上游 family 的完整验收。
## 默认验收入口
@@ -231,5 +231,6 @@ npm --prefix web run lint
npm --prefix web test
npm --prefix web run test:authoring-roundtrip
npm --prefix web run test:capability-gates
npm --prefix web run test:status-consistency
npm --prefix web run test:e2e
```

View File

@@ -40,7 +40,7 @@ SQLite WASM 和 Bitbybit/OCCT 均不在当前依赖范围内。Three.js、WASM
| 发布性能/故障门 | Chromium 118 条 E2E、1M geometry、600 帧 OPFS cache、4K/8K texture、运行中断网、主线程 WebGL context loss | 已完成已声明门10M、长媒体、OOM 和 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 资源 catalog、desktop OpenVDB->NanoVDB 与分块协议已完成server/WebGPU/保存重开/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 双生产视口和 Main 属性重开已完成GPU demand paging、联合重开、完整材质、大 bundle/OOM 和发布 golden 未完成 |
## 3. 部分完成或仍有边界的能力
@@ -53,7 +53,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/NanoVDB 协议与 desktop converter | 新外部字体导入及 VDB server job、WebGPU renderer、材质、保存重开 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 双视口 | 新外部字体导入,以及 VDB demand paging、完整材质、联合保存重开、大 bundle/OOM 和发布 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/权重/对称组合及大模型性能矩阵未完成 |
@@ -184,8 +184,9 @@ save/reopen、真实 legacy evaluated mesh、PointCloud/Curves 属性和 WNM 二
主线程与 OffscreenCanvas 消费同一 chunksGLB 只接受真实 evaluated meshUSD 提供
`UsdGeomMesh``UsdGeomPoints``UsdGeomBasisCurves` 的机器可读映射/损失。
VDB 已改为 desktop/server OpenVDB -> NanoVDB、浏览器分块读取 + WebGPU。真实资源 catalog、
desktop converter 和协议/range 基础件已接通,但 server job、renderer、材质、保存重开和 golden 仍阻断handle-local 专用 gizmo
已接通,新字体导入等剩余项按 `docs/status/N-015.md`
desktop/server converter、HTTP 断点续传、OPFS 原子绑定、Float32 WebGPU 双生产视口和 Main
Volume 属性重开已有真实证据GPU demand paging、联合保存重开、完整材质、大 bundle/OOM
desktop/Chromium 发布 golden 仍阻断。handle-local 专用 gizmo 已接通,新字体导入等剩余项按 `docs/status/N-015.md`
`docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md` 推进。
### PBR-001 至 PBR-012 模型物理渲染(核心切片 done_current_scope资产/高级渲染安全门 in_progress
@@ -203,10 +204,11 @@ HDR/EXR、多 tile 采样、Offscreen context-loss、真实 WebGPU renderer、
### N-026 当前发布实况
`docs/status/release-evidence.json` 已生成 13 条成功 command/output/artifact-hash 记录;其中
VDB 边界记录没有设置发布 true 字段,只证明 Phase 0 协议门。
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-016 至 N-026 family。浏览器范围仅为 Chromium。
`BLOCKED` 的 N-015 至 N-026 family。浏览器范围仅为 Chromium。
## 6. 当前验收命令

View File

@@ -1,6 +1,6 @@
# VDB -> NanoVDB -> WebGPU 实施方案
更新时间2026-08-13
更新时间2026-08-14
## 1. 范围与完成定义
@@ -181,12 +181,14 @@ 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。`BLOCKED`
dispose每页上传前已通过 chunk hash。状态:`in_progress`页表、驻留预算、LRU/dispose
与有界 paged upload 已落地,按视口需求从 OPFS/HTTP 逐页调入并在缺页后继续渲染仍阻断。
- `VDB-033`:实现对象 bounds raycast、front-to-back ray marching、步长/early exit 和深度合成。
状态:`in_progress`;有界正交 bounds、front-to-back integration、early exit 和确定性 96x96
Chromium 图像已完成,生产相机深度合成待接入。
- `VDB-034`:接入主线程/Offscreen renderer 的相同 volume scene deltadevice loss 后重建已
验证页面。`BLOCKED`
- `VDB-034`:接入主线程/Offscreen renderer 的相同 volume scene delta状态:`done_current_scope`
双生产视口已消费相同 hash-bound asset 并输出非空像素。生产 Offscreen WebGPU device-loss
自动重建和 demand-page 恢复继续由故障门阻断。
### Phase 4材质、Main 与导出
@@ -234,7 +236,8 @@ npm --prefix web run test:vdb-faults
阶段停止条件:
- 新增资源若无许可证/来源/hash不得进入 VDB catalog 或 golden。
- desktop converter 已构建server job API 未实现时 `SERVER_CONVERSION` 保持 `BLOCKED`
- desktop/server converter 已构建并有 hash 等价证据;未配置受控 endpoint 时运行时
`SERVER_CONVERSION` 仍保持 `BLOCKED`
- 无 CPU reference sample 对照WGSL traversal 不得进入 `READY`
- 仅能显示 box/point proxy体渲染仍为 `BLOCKED`
- 未验证 material mapping、Main 保存重开或 desktop/Chromium goldenN-015 与 N-019 仍为

View File

@@ -1,7 +1,7 @@
# N-015 非 Mesh 几何数据块
状态:`BLOCKED / in_progress`VDB core 已覆盖 server、OPFS、Float32 WebGPU 与 Main 属性重开;
生产视口、高级材质、分页和发布 golden 仍阻断)
GPU demand paging、高级材质、联合重开和发布 golden 仍阻断)
更新时间2026-08-14
@@ -14,8 +14,8 @@ topology editor。
Volume 采用“桌面/服务端 OpenVDB 转 NanoVDB浏览器分块读取并以 WebGPU 渲染”的固定架构。
浏览器不直接解码 OpenVDB当前已完成真实资源 catalog、独立 OpenVDB 13 -> NanoVDB 32 desktop
converter、受控 server job、转换/清单/分块协议、OPFS 绑定/重开、Float32 CPU/WGSL 树遍历、
有界体积积分和 Volume Main 属性保存重开。主线程/Offscreen 生产视口、高级 grid 材质、GPU
分页和发布 golden 尚未完成,因此 N-015 整体保持 `BLOCKED`
有界体积积分、主线程/Offscreen 生产视口和 Volume Main 属性保存重开。GPU demand paging、
高级 grid 材质、联合重开和发布 golden 尚未完成,因此 N-015 整体保持 `BLOCKED`
| 数据族 | Reader | Web 预览 | 当前门 |
| --- | --- | --- | --- |
@@ -25,7 +25,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` |
| Volume | path/grid metadata + VDB/NanoVDB 转换契约 | WebGPU core 可渲染真实 Float32 density生产视口接入 | `BLOCKED`paging/material/golden |
## 已实现任务
@@ -152,6 +152,11 @@ npm --prefix web run test:nonmesh-interaction
npm --prefix web run test:vdb
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-opfs
npm --prefix web run test:vdb-webgpu
npm --prefix web run test:vdb-viewport
npm --prefix web run test:vdb-faults
WEB_TEST_PORT=5349 npm --prefix web run test:e2e -- -g "real OPFS quota|reports quota exhaustion"
WEB_TEST_PORT=5201 npm --prefix web run test:e2e -- -g "N-015|non-mesh"
```

View File

@@ -23,7 +23,7 @@ Chromium 完整套件、离线包/OPFS、SPDX SBOM、1M geometry、simulation ca
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 paging、GLB/USD loss 和 desktop/Chromium 发布 golden 仍计为阻断。
生产视口已接入GPU demand paging、GLB/USD loss、联合重开和 desktop/Chromium 发布 golden 仍计为阻断。
6. 当前发布包已通过本地 third-party notices、Blender/Three license 文件、无远程运行时依赖、
非空 SHA-256 manifest、SPDX 2.3 lockfile/vendored SBOM、对应源码提供和离线二进制/源码包
确定性复建100k/1M decimate、5 类损坏 blend 和 archive 高压缩比拒绝有实际命令记录。

View File

@@ -15,8 +15,8 @@ move from `待验证` only after a task adds a build or browser regression test.
| Blender `draw/gpu` viewport | 关闭首期 | Three.js is the browser renderer | W-013, W-050 |
| Python runtime and automatic `.blend` scripts | 关闭首期 | security and package-size boundary | W-117 |
| Cycles, CUDA/OptiX, Embree | 关闭首期 | server-side or native rendering only | roadmap non-goal |
| OpenVDB | 浏览器关闭;桌面/服务端转换目标 planned | 读取 `.vdb` 并输出受校验 NanoVDB;不得链接进浏览器 WASM | N-015 VDB-010~014 |
| NanoVDB | 浏览器仅消费格式 | 分块 range + WebGPU sparse volume当前协议已落地renderer 阻断 | N-015 VDB-003~034 |
| OpenVDB | 浏览器关闭;桌面/服务端转换目标保留 | 真实 OpenVDB 13 -> NanoVDB 32 desktop/server 转换;不得链接进浏览器 WASM | N-015 VDB-010~014native/server hash 等价门 |
| NanoVDB | 浏览器仅消费格式 | HTTP/OPFS 分块 + Float32 WebGPU sparse volume双生产视口已接入demand paging/material/golden 阻断 | N-015 VDB-003~034 |
| USD, FFmpeg | 关闭首期 | server-side or later format modules | W-021 |
| React + TypeScript | 保留 | application UI and state | W-010 |
| Three.js (vendored) | 保留 | WebGL2 viewport and scene adapter; runtime has no CDN dependency | W-013, W-050 |

View File

@@ -0,0 +1,52 @@
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const read = (relativePath) => fs.readFileSync(path.join(root, relativePath), "utf8");
const ledgerBytes = fs.readFileSync(path.join(root, "docs/status/parity-ledger.json"));
const ledger = JSON.parse(ledgerBytes);
const report = JSON.parse(read("docs/status/release-evidence.json"));
const overview = read("docs/PROJECT_STATUS_AND_NEXT_WORK.md");
const parity = read("docs/BLENDER_5_2_WEB_FEATURE_PARITY.md");
const n015 = read("docs/status/N-015.md");
const n026 = read("docs/status/N-026.md");
const vdbPlan = read("docs/VDB_NANOVDB_WEBGPU_IMPLEMENTATION_PLAN.md");
const expectedFamilies = Array.from({ length: 12 }, (_, index) => `N-${String(index + 15).padStart(3, "0")}`);
assert.deepEqual(ledger.families.map((family) => family.id), expectedFamilies, "parity ledger family order or coverage drifted");
assert.deepEqual(report.families, ledger.families, "release evidence family snapshot is stale");
assert.equal(
report.sourceSha256,
crypto.createHash("sha256").update(ledgerBytes).digest("hex"),
"release evidence source hash is stale",
);
const blockedFamilies = ledger.families.filter((family) => family.status === "BLOCKED").map((family) => family.id);
const falseEvidence = [];
for (const [group, values] of Object.entries(report.evidence)) {
if (group === "records") continue;
for (const [key, value] of Object.entries(values)) if (value === false) falseEvidence.push(`${group}.${key}`);
}
const missingCount = blockedFamilies.length + falseEvidence.length;
assert.equal(blockedFamilies.length, 12, "this baseline expects N-015 through N-026 to remain explicitly blocked");
assert.deepEqual(falseEvidence.sort(), ["faults.oom", "performance.geometry10M", "performance.longMedia"]);
assert.equal(missingCount, 15);
for (const document of [overview, parity]) {
assert.match(document, /13 条(?:成功 )?(?:command\/output\/artifact-hash )?(?:有效)?记录|13 条有效记录/);
assert.match(document, /15 个缺失/);
assert.match(document, /N-015 至 N-02[56]/);
}
for (const document of [overview, n015, n026, vdbPlan]) {
assert.match(document, /desktop\/server converter|desktop\/server OpenVDB|desktop\/server converter|server job/);
assert.match(document, /双生产视口|主线程\/Offscreen 生产视口|主线程\/OffscreenCanvas/);
assert.match(document, /demand paging|demand-page/);
assert.match(document, /发布 golden|desktop\/Chromium.*golden/);
}
process.stdout.write(
`status-consistency-ok families=${ledger.families.length} blocked=${blockedFamilies.length} evidenceRecords=${report.evidence.records.length} missing=${missingCount}\n`,
);

View File

@@ -75,6 +75,7 @@
"release:sbom": "node ../tools/web/generate-sbom.mjs",
"release:evidence": "node ../tools/web/collect-release-evidence.mjs",
"test:release-evidence": "node ../tools/web/check-release-evidence.mjs",
"test:status-consistency": "node ../tools/web/check-status-consistency.mjs",
"release:offline": "npm run build && node ../tools/web/check-offline-reproducibility.mjs",
"diagnose:depsgraph": "node ../tools/web/diagnose-depsgraph.mjs"
},