Add full Blender desktop parity validation workflow
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-09-08 05:18:12 +08:00
parent 39b188c574
commit a69e41457a
8 changed files with 564 additions and 23 deletions

View File

@@ -0,0 +1,205 @@
# 桌面版 Blender → Web Blender 全功能与界面对标验证流程
版本:`2026-09-08`
基准:官方 Blender `5.2.0 LTS`(`USD=True`)
浏览器范围:Chromium;禁止用 Firefox/WebKit 结果替代本流程。
执行原则:以功能模块为单位增量执行;已通过的模块只复用证据,不重复启动完整验证。
## 1. 目标与完成定义
本流程用于判断 Web Blender 是否在“功能行为、工作区结构、交互语义和失败边界”上对标桌面版 Blender。完成不是“页面能打开”或“控件名称相同”,而是每个模块都有桌面基准、Web 接线和可追溯证据。
一个模块只有同时满足以下条件才标记 `READY`:
1. 桌面 Blender 5.2 正例已生成可复用 fixture、字段快照或像素/结构基准。
2. Web 路径调用编译后的 Blender WebEngine/WASM Main;不得用 JS 重实现 Blender 业务逻辑。
3. 正例至少包含一次真实 mutation 或精确 Main reader/context 读取。
4. 负例在提交前失败,且 revision、对象数、资源数等状态保持不变。
5. 需要持久化的模块完成 undo/redo、save/reopen;需要 Worker 的模块完成重启/释放证据。
6. Chromium focused gate、manifest、源码 unit 绑定和 SHA-256 均已落盘。
`PARTIAL` 表示界面或协议已接线,但仍有桌面行为、字段或资源未闭环;`BLOCKED` 只用于桌面能力明确不可在浏览器执行、依赖外部资源或安全策略拒绝的路径。禁止用“隐藏按钮”“跳过验证”或伪造结果提升状态。
## 2. 固定基准与证据
### 2.1 桌面基准
固定使用本机官方二进制:
```bash
/tmp/blender-5.2.0-linux-x64/blender --version
/tmp/blender-5.2.0-linux-x64/blender -b --factory-startup --python-expr \
'import bpy,json; print(json.dumps({w.name:[a.type for s in w.screens for a in s.areas] for w in bpy.data.workspaces}, sort_keys=True))'
```
记录二进制和归档 SHA-256。默认 Layout 以及每个工作区的 Area 集合必须保留原始输出;截图只用于人工视觉复核,结构判断以 API 输出为准。
### 2.2 Web 基准
每个批次记录:
- `gitCommit`、`releaseId`、源码 `sourceTreeSha256`;
- WASM 构件 SHA-256、入口 HTML/CSS/JS SHA-256;
- Chromium 版本、viewport、`crossOriginIsolated`、请求失败列表;
- 任务 manifest、focused gate 退出码、正/负例结果和恢复结果。
生产入口必须先通过:
```bash
node tools/web/print-task-context.mjs
node tools/web/check-task-context.mjs
node tools/web/check-context-governance.mjs
```
源码检索强制使用批次入口,禁止全量源码扫描:
```bash
node tools/web/search-wbv2-batch-source.mjs --task <task-id> --pattern '<pattern>' \
--runtime web/app/src/app/App.tsx \
--runtime web/protocol/scene-ir.ts
```
`--runtime` 只能使用该工具中的 allowlist;完整 inventory 仅在最终审计命令显式执行。
## 3. 桌面工作区结构基准
下表是 Blender 5.2 `bpy.data.workspaces` 的 Area 类型集合。Web 必须保留这些区域的语义和相对布局;移动端可折叠非主区域,但不得改变桌面工作区定义。
| 工作区 | 桌面 Area 集合 | Web 对应表面 | 默认模式 |
| --- | --- | --- | --- |
| Layout | 3D View、Outliner、Properties、Dope Sheet/Timeline | 3D Viewport、Outliner、Properties、Timeline | Object |
| Modeling | 3D View、Outliner、Properties | 3D Viewport、Outliner、Properties | Edit |
| Sculpting | 3D View、Outliner、Properties | 3D Viewport、Outliner、Properties | Sculpt |
| UV Editing | Image Editor、3D View、Outliner、Properties | Image Editor、3D Viewport、Outliner、Properties | Edit |
| Texture Paint | Image Editor、3D View、Outliner、Properties | Image Editor、3D Viewport、Outliner、Properties | Texture Paint |
| Shading | File Browser、Image Editor、Node Editor、3D View、Outliner、Properties | File Browser、Image Editor、Shader Editor、3D Viewport、Outliner、Properties | Object |
| Animation | 2×3D View、Dope Sheet、Outliner、Properties | Camera View、3D Viewport、Dope Sheet、Outliner、Properties | Object |
| Rendering | Image Editor、Properties、Dope Sheet/Timeline | Render Result、Properties、Timeline | Object |
| Compositing | Image Editor、Node Editor、Properties、Dope Sheet/Timeline | Image Editor、Compositor、Properties、Timeline | Object |
| Geometry Nodes | Geometry Node Editor、Spreadsheet、3D View、Outliner、Properties、Timeline | Geometry Nodes、Spreadsheet、3D Viewport、Outliner、Properties、Timeline | Object |
| Scripting | Info、Console、Text Editor、3D View、2×Outliner、Properties | Info、Python Console、Text Editor、3D Viewport、2×Outliner、Properties | Object |
结构门禁必须检查:
- 工作区切换后 `data-workspace`、模式和编辑器集合一致;
- 区域可见矩形不重叠,右侧 Properties/Outliner 位置符合基准;
- 1440×900、1280×720、360×640、320×568 均无根横向溢出;
- 新增编辑器表面具备标题、菜单、键盘焦点和严重级别 WCAG 通过证据;
- 诊断信息不遮挡主编辑区域,工程状态只在 Status Bar 或明确的诊断区域显示。
## 4. 功能模块验证顺序
按依赖从底到顶执行,每个模块只执行一次 focused gate;同一模块的多个命令共享一个 fixture、一个 WASM adapter、一个 dispatcher 和一个 evidence JSON。
### A. 文件、场景和对象
- `.blend` 打开、分段读取、取消、恢复、最近项目、保存、另存为、关闭;
- 对象创建、复制/链接复制、删除、重命名、可见性、父子关系、Collection;
- Scene/Main reader、对象变换、原点、数据块和资源清单。
优先复用:`v1-user-loop`、`file-import-progress`、`dirty-state`、`recent-projects-recovery`、`main-datablocks-reader-production`、`wbv2-object-*-production`。
### B. Mesh、UV、非 Mesh 与编辑域
- Vertex/Edge/Face 选择、Merge/Dissolve/Extrude/Inset/Bevel/Loop Cut/Subdivide;
- UV unwrap、Curve/Surface/Metaball、Point Cloud、Volume/NanoVDB;
- Grease Pencil 选择、框选、图层/帧/笔画;
- Sculpt stroke、Vertex Paint/Weight Paint、PBVH 可见性。
每个 mutation 必须检查 revision 单调递增、非法索引 no-mutation、undo/redo 和 save/reopen。
### C. 材质、Shader、Geometry Nodes 与资源
- Material slot、Principled、Shader graph、图片/字体/声音/纹理/粒子;
- Geometry Node graph、allowlist、field budget、Spreadsheet;
- Asset catalog、library link/override/append、OPFS 资源 hash、LOD cache。
Shader、Geometry Nodes、Asset/Library 只允许调用对应 protocol/Worker/Main reader;UI 节点卡片是编辑表面,不能代替实际 WASM graph mutation。
### D. 动画、Sequencer、灯光、渲染与合成
- Action/FCurve/Driver/Keying Set/NLA/Marker;
- Sequencer strip、媒体 codec probe、音频恢复和最终导出;
- Camera、Light subtype/field、Render routing、Render reference、Compositor CPU/WebGPU;
- 渲染像素、资源预算、设备丢失、OOM、网络中断和重启恢复。
像素类 gate 必须复用已有 golden;浏览器仅执行 focused render,不在每个普通 API 回合重复启动浏览器。
### E. Scripting、安全和发布
- Text Editor、Python Console 的只读/受策略控制入口;
- manifest canonical、签名、权限、sandbox scope/budget、host call、取消、dispose、recovery;
- CSP、COOP/COEP/CORP、Range、缓存、离线归档、回滚和发布 metadata。
脚本策略拒绝必须是显式 `BLOCKED`,不能通过前端按钮绕过。
## 5. 单模块验收契约
每个模块的 manifest 使用以下最小结构:
```json
{
"task": "WBV2-…",
"desktop": { "binarySha256": "…", "fixture": "…", "receipt": "…" },
"web": { "wasmSha256": "…", "browser": "chromium", "gate": "…" },
"cases": {
"positive": { "status": "READY", "before": "…", "after": "…" },
"negative": { "status": "REJECTED", "revisionUnchanged": true },
"undoRedo": { "status": "EXACT" },
"saveReopen": { "status": "EXACT" },
"recovery": { "status": "READY" }
},
"sourceCoverage": { "unitCount": 0, "verifiedUnits": 0, "unverifiedUnits": 0, "sourceTreeSha256": "…" },
"nextTask": "…"
}
```
失败时保持 `in_progress` 或 `blocked`,不得写入 `status=done`,不得人工修改 `nextTask`。
## 6. 高效率执行规则
1. 回合启动只读取一次失败账本和当前批次 manifest;命令事件更新内存对象,回合结束集中写入。
2. 上下文 manifest 先比较 `bytes`/`mtime_ns`,未变化直接输出 `CONTEXT_PACKET_REUSED`。
3. 卡片按需读取;只有最终审计才解析完整任务树。
4. 实现回合只运行当前源码/依赖接线、最小 fixture、focused gate 和 `validate_incremental_context.py`。
5. 默认每回合最多 48 个工具命令、读取/探索不超过 16 个;达到预算先写 checkpoint。
6. 代理回合只返回结果和 `phase=CONTINUE`,rotate/sync/prepare-next 由外层 scheduler 统一执行。
7. 最近 3 次周期按 `(module,tier,family)` 自适应批次大小;超时或超过 900 秒减半,低于 300 秒且无 focused gate 失败增加 4。
8. 已通过的模块只复用 manifest、receipt、构件 hash 和截图;除非输入指纹变化,不重跑相同 gate。
## 7. 本次执行入口与交付
实现工作区改造后,按以下顺序验证:
```bash
npm --prefix web run typecheck
npm --prefix web run lint
node --test web/tests/unit/ui-schema.test.mjs
CHROME_PATH=/usr/bin/google-chrome WEB_TEST_PORT=4173 \
npx playwright test --config playwright.config.ts --workers=1 \
tests/e2e/responsive-layout.spec.ts \
tests/e2e/ui-context.spec.ts \
tests/e2e/keyboard-accessibility.spec.ts
npm --prefix web run build
CHROME_PATH=/usr/bin/google-chrome-stable WEB_ORIGIN=https://49.232.250.35:58014 \
node tools/web/check-deployed-web-blender.mjs
```
发布前确认:
- 当前 release metadata 的 commit、入口、CSS/JS、WASM hash 相互绑定;
- 线上 `/`、`/wasm-module-manifest.json`、WASM Range 和隔离头通过;
- Chromium 真实打开 `basic_scene.blend`,对象 mutation 正常;
- 线上截图覆盖 Layout、UV/Texture Paint、Shading、Animation、Rendering、Compositing、Geometry Nodes、Scripting;
- 回滚目标仍保留,任何失败不切换 `current`。
## 8. 当前实现状态记录方式
本流程本身不是“全部功能已完成”的声明。每次执行后必须同步:
- `docs/status/<task>.md`:本次模块、通过/失败/阻断和下一任务;
- `tests/golden/<task>/manifest.json`:构件、测试、hash、source coverage;
- `tests/golden/<task>/task-context.json`:上下文指纹和交接;
- 最终审计报告:按工作区、功能族、内部子模块分别统计 `READY/PARTIAL/BLOCKED`。
只有最终审计报告中所有声明为 `READY` 的功能都有桌面 receipt、Web 行为 gate 和界面 gate,才能对外宣称“桌面版 Blender 功能与界面完整对标”。

View File

@@ -0,0 +1,44 @@
# Blender 桌面版 → Web Blender 全面对标验证状态
日期:`2026-09-08`
状态:`IN_PROGRESS`
流程文档:[BLENDER_DESKTOP_WEB_FULL_PARITY_VALIDATION.md](../BLENDER_DESKTOP_WEB_FULL_PARITY_VALIDATION.md)
## 本轮完成
- 使用本机官方 Blender 5.2.0 LTS API 导出 11 个工作区 Area 基准。
- Web 协议增加每个工作区的编辑器集合、相对区域和默认模式。
- Web UI 增加并接线 Image Editor、Render Result、Shader Editor、Compositor、Geometry Nodes、File Browser、Spreadsheet、Text Editor、Python Console、Info、双 3D View 工作区表面。
- Modeling/Sculpting/UV Editing/Texture Paint/Shading/Animation/Rendering/Compositing/Geometry Nodes/Scripting 均可切换,且保留现有 Layout 主功能入口。
- 新增工作区表面仅作为编辑器 UI 和上下文入口;业务 mutation 仍必须通过已存在的 WASM Main/protocol/Worker 路径,不能用表面占位冒充功能完成。
## 增量验证结果
| 验证 | 结果 |
| --- | --- |
| `npm --prefix web run typecheck` | PASS |
| `npm --prefix web run lint` | PASS |
| `node --test web/tests/unit/ui-schema.test.mjs` | PASS,2/2 |
| `responsive-layout.spec.ts` | PASS,6/6 |
| `ui-context.spec.ts` | PASS |
| `keyboard-accessibility.spec.ts` | PASS |
| 11 工作区编辑器集合 | PASS |
| 工作区区域交叠检查 | PASS,0 overlap |
| 1440/1280/360/320 根宽度 | PASS,无横向溢出 |
| 新增编辑器表面 WCAG serious/critical | PASS |
## 当前边界
本轮完成的是桌面版工作区和编辑器界面对标,以及现有功能模块入口的正确分区。以下内容仍必须按流程文档逐模块执行 focused gate 后才能声明 `READY`:
- Shader/Compositor/Geometry Nodes 编辑器中的真实 graph mutation;
- Spreadsheet 与 Main reader 的字段一致性;
- Rendering/Compositor 的像素 golden、资源预算和设备故障;
- Scripting 的真实权限、签名、sandbox、取消和 dispose;
- 每个功能族的负例 no-mutation、undo/redo、save/reopen、恢复证据。
这些路径已有测试入口和协议实现时优先复用已有证据;只有输入指纹或模块 manifest 变化时才重跑。
## 交付门禁
本轮未推进 `nextTask`,未宣称全部功能完成。完成全量对标时必须继续写入模块 manifest、桌面 receipt、Chromium gate、源码 coverage 和 release metadata,并执行流程文档第 7 节的发布检查。