23 KiB
Blender/Web 移植后续执行安排
更新时间:2026-08-26(America/New_York)
1. 目标与当前结论
目标是让 Web 版本在 Chromium 中形成可持续的 Blender 工作流:打开 .blend、读取 SceneIR、执行受约束的 Main mutation、保存/重开、恢复和导出,并且每项声明都绑定可复现证据。
当前基线已经可以正常工作,但还不能宣称“与 Blender 全量 parity”:
- quick CI 已修复 Node 堆内存问题:7/7 lane READY,128 个 unit 文件隔离执行。
- Blender 5.2 inventory 有 6,900 条记录,聚合为 15 个 capability family;当前记录仍是
L0 / METADATA_ONLY。 - P7-002 已生成 45 个原子任务,即 15 个 family 乘以
desktopPositive、wasmMutation、saveReopenExact。 - P7-003 的恢复链为 READY,但
parityClosure和releaseDecision为 BLOCKED;当前 9/45 atomic 行为已有可审计 Chromium receipt。 - M12 有 82 条、42 个路径的 SHA 漂移;Git-history snapshot 已恢复 22 条,剩余 60 条保持
BLOCKED_SOURCE_LOST,历史 manifest 不得重写。
因此后续安排分为两条并行轨道:
- 新证据驱动的 Blender/Web 正向移植。
- M12 原始来源快照恢复与 provenance 重建。
当前机器整合入口为 node tools/web/generate-wbv2-integration-readiness.mjs,输出 tests/golden/WBV2-P7-003/integration-readiness-report.json;该报告是继续开发的 checkpoint,不是 parity 成功声明。
2. 不可违反的规则
- 只使用 Chromium 作为浏览器证据;Firefox/WebKit 不进入本计划的验收范围。
- 旧 manifest 的原始 SHA、时间线和状态不可改写。新发现只能追加 corrective evidence。
- 一个执行任务只负责一个主要行为。共享代码可以复用,但每个行为必须有独立 fixture、报告和 manifest。
FEATURE_PARITY只有在以下条件同时满足时才能出现:- Blender desktop 正向结果;
- WASM/Main 正向 mutation;
- save/reopen 精确保持;
- Chromium 生产路径通过;
- malformed、unsupported、cancel、duplicate、over-budget 和 hash-drift 负例均 fail-closed。
- 任何失败都保持
in_progress或blocked,不能手工推进nextTask。 - 所有产物必须由 generator/checker 生成,并由 SHA-256 manifest 绑定。
3. 阶段安排
阶段 A:构建与证据基础设施(第 1-2 天)
目标:让桌面 binary、WASM binary、测试 runner 在同一工作区可重复运行。
工作项:
- 重新配置
build_blender_5.2.0的 CMake cache,使 RUNPATH 指向当前工作区的依赖目录;禁止依赖/home/mes123456/working的隐式路径。 - 记录 Blender、Emscripten、Node、Chrome、依赖库版本和 SHA;生成一份可复现环境 receipt。
- 保持
tools/web/run-unit-tests.mjs的隔离策略,quick lane 每次提交都运行。 - 为 generated-gap checker 抽出通用的
open -> snapshot -> mutate -> save -> reopen -> negativerunner,减少各任务重复代码。 - 统一 comparator:对象 ID、Main revision、delta、资源 hash、save/reopen hash 必须使用 canonical JSON 比较。
完成条件:
cmake --build build_blender_5.2.0 -j2成功;桌面 binary 在不依赖旧工作区路径的情况下启动。- quick CI、typecheck、lint、context governance 全部通过。
- 同一 fixture 连续生成两次字节一致。
阶段 B:三条现有正向链路固化(第 3-5 天)
目标:把已有 C5 pilot 的 Mesh、Modifier、Asset 能力转成标准 Web evidence 模板。
复用模块:
web/protocol/corrective-main-transaction.tsweb/protocol/corrective-mesh-command.tsweb/protocol/corrective-modifier-command.tsweb/protocol/corrective-asset-catalog-command.ts- 现有 C5 Chromium family reports 和 save/reopen checker
每个 family 必须补齐:
- desktop positive fixture;
- WASM/Main mutation 和 revision 变化;
- undo/redo 与 save/reopen;
- Chromium production interaction;
- malformed payload、stale revision、missing target、budget overflow 负例。
完成条件:
- 三个 family 的 evidence 从
CANDIDATE变为可审计的正向结果。 - 旧 C5/M12 证据只读消费,不改变历史 SHA。
- 共享 runner 能在单条命令中重复三族验证。
阶段 C:按风险批量移植高价值 family(第 2-3 周)
采用“一个共享能力实现 + 三个原子证据任务”的节奏。实现一次,证据拆成三个独立任务,不为 6,900 条 legacy 记录重复造轮子。
优先级如下:
| 顺序 | family | 规模 | 先解决的问题 | 主要复用方向 |
|---|---|---|---|---|
| 1 | UI_EDITOR |
3,930 | editor/context/keymap 与 Chromium 输入一致性 | editor workflow、keyboard/pointer/input-modal |
| 2 | MEDIA_IO |
585 | import/export、媒体资源、外部依赖与 loss report | GLB/OBJ/PLY/STL、asset sandbox、media recovery |
| 3 | NODES_GRAPH |
543 | Geometry Nodes/shader allowlist、预算和 compile rollback | geometry-nodes、shader-compiler、render budget |
| 4 | MESH_EDITING |
431 | 选择、拓扑 mutation、binary delta | mesh command、mesh geometry delta、topology comparator |
| 5 | OBJECT_OPERATIONS |
316 | transform、parent、collection、undo/redo | Main transaction、scene delta、selection history |
| 6 | RIG_ANIMATION |
375 | Action、TRS、pose、constraint、skin | animation、NLA、armature、skin protocol |
| 7 | MATERIAL_RENDER |
125 | PBR/UV/texture 与渲染路由 | shader graph、render routing、packed assets |
| 8 | SIMULATION |
155 | cache identity、cancel、quota、restart | simulation cache、worker fault、storage journal |
| 9 | SCULPT_PAINT |
117 | PBVH 限制、笔刷/笔画和非 mesh slice | sculpt、paint、non-mesh binary |
| 10 | CORE_SCENE_GRAPH |
66 | Scene/Collection/Object/Depsgraph canonical state | SceneIR、stable IDs、world matrices |
| 11 | CORE_DNA_RNA |
38 | RNA metadata read and unsupported retention | reader metadata、unknown-field preservation |
| 12 | CORE_MESH |
31 | Mesh datablock schema and attributes | binary mesh、attribute domains |
| 13 | OTHER_OPERATOR |
103 | 无法归入高阶 family 的小范围 operator | explicit unsupported/EXCLUDED routing |
| 14 | CORE_OBJECT |
2 | Object identity/read compatibility | scene graph reader |
MODIFIER_SYSTEM(83)虽然 legacy 记录相对完整,也必须经过同样的 WASM mutation 和 persistence 证明,不能仅凭旧 completed 状态提升 parity。
每个 family 的固定工作包:
- 选 1 个最小可观察行为,建立 Blender fixture 和 canonical expected state。
- 在
web/protocol建立或复用 bounded command,统一走 Main transaction。 - 接入
web_engine_blend_reader.cpp,只读取声明的数据,不执行任意 Blender operator 或脚本。 - 添加桌面 checker、WASM checker、Chromium e2e、unit negatives。
- 生成该 family 的三个原子 manifest,只有三项证据均通过时才提升 capability 状态。
- 通过 handoff 后再由 generator 激活下一个任务。
阶段 D:完整 45 项原子队列关闭(第 3-4 周)
目标:逐项清空 P7-002 队列,但不把同类 legacy 记录重复实现。
每项任务的最小证据包:
- fixture 和 generator;
- desktop report;
- WASM/Main report;
- Chromium report(涉及生产交互时必须有);
- persistence/hash report;
- negative matrix;
- status、manifest、task-context;
- parent manifest SHA 和当前 source/build SHA。
队列推进规则:
- 始终只有一个
active + ready; - 当前任务完成后由 manifest 的
nextTask决定下一项; - 任何 hash drift、环境缺失或测试失败都停在当前任务;
- 每完成一个 family,重新计算 6,900 条 legacy 覆盖映射,已证明的记录保留 regression coverage。
阶段 E:M12 provenance 恢复(与阶段 C/D 并行)
这条轨道不依赖 Web 功能实现,责任人必须提供以下任一权威来源:
- 原始 immutable repository snapshot;
- 带签名的 M12 artifact archive;
- CI artifact store 中可验证的原始文件和时间戳。
恢复步骤:
- 只读导入来源,计算原始 SHA,不覆盖当前文件。
- 将原始文件与当前观察值做逐项三方比较:
original manifest、source snapshot、current worktree。 - 对能复原的条目生成
PROVENANCE_RESTOREDcorrective evidence。 - 对仍无法复原的条目保留
BLOCKED_SOURCE_LOST。 - 只有 provenance checker 和 protected hash checker 同时通过,才允许影响 release gate。
在来源恢复前,禁止以下行为:
- 用当前文件反推旧文件;
- 用新 manifest 覆盖旧 manifest;
- 删除 drift entry;
- 把
BLOCKED_SOURCE_LOST改成READY或FEATURE_PARITY。
阶段 F:Release closure(第 5 周)
只有阶段 D 和 E 都完成后执行:
- 重新生成完整 capability parity map;
- 统计
FEATURE_PARITY、READ_COMPATIBILITY、NEGATIVE_BOUNDARY、EXCLUDED、BLOCKED; - 运行 quick、Chromium、release、offline、SBOM、rollback 全套 lane;
- 检查所有声明都绑定 manifest 和 immutable source/build SHA;
- 生成 known limitations 和最终 release decision。
release decision 的允许状态:
READY:所有目标 capability 达到声明级别,历史 provenance 完整;BLOCKED:存在任何未闭合 parity、来源丢失、hash drift、负例不安全或 release lane 失败;- 不允许使用“近似完成”或隐式降级状态替代上述两种状态。
4. 每周产出与效率指标
每周必须产出:
- 完成的 capability family 数;
- 新增正向 desktop/WASM/Chromium evidence 数;
- 从 L0 提升的 legacy 覆盖条目数;
- 仍为 BLOCKED 的条目数及原因分布;
- quick CI 平均耗时与峰值 Node heap;
- fixture 重生成字节一致率;
- M12 provenance 恢复条目数。
建议效率目标:
- 每个 family 至少关闭 3 个原子行为证据,覆盖同族 legacy 记录;
- 每周完成 3-5 个 family,而不是逐条处理 6,900 个 legacy operator;
- 每个 family 的重复 checker 代码不超过一个模板文件的 20%;
- quick lane 保持单次提交可运行,Chromium lane 在 family 合并前运行;
- 失败任务平均恢复时间小于一个工作日,且不通过改历史证据解决。
5. 当前立即执行顺序
- 修复
build_blender_5.2.0的 workspace RUNPATH,并生成环境 receipt。 - 用现有 C5 Mesh/Modifier/Asset 证据跑通统一 family runner。
- 激活 P7-002 队列中第一个高风险 family 的
desktopPositive任务。 - 依次完成该 family 的
wasmMutation和saveReopenExact,再推进下一个 family。 - 每个 family 完成后更新 parity map 和风险报告,但不修改 M12 历史 manifest。
- 并行向 provenance 责任人索取 M12 immutable snapshot;在收到前保持 release gate BLOCKED。
- 只有 45 项原子任务和 M12 provenance 都闭合,才重新运行 P7-003 release gate。
6. 回滚与停止条件
出现以下任一情况时立即停在当前任务:
- desktop 与 WASM/Main 状态不一致;
- save/reopen 改变 Main revision、资源 hash 或稳定 ID;
- malformed/unsupported/cancel/over-budget 输入改变 Main;
- source/build/fixture/manifest hash 漂移;
- CMake、Node heap、Chromium 或 Blender 环境不可复现;
- M12 来源仍不可验证。
回滚只删除当前新任务的 fixture、报告、manifest、status 和 context,恢复 parent 的 queue tail;不得触碰已完成任务的历史 evidence,也不得把失败任务标成完成。
7. 完成定义
本计划只有在以下条件同时满足时才算完成:
- Web 生产路径可在 Chromium 中完成 open/edit/undo/redo/save/restart/reopen/export;
- 15 个 capability family 的目标 parity level 有逐项证据;
- 45 个原子行为任务全部完成或明确
EXCLUDED/BLOCKED并有原因; - 负向边界、资源预算、取消、重启、OOM、quota、device loss 均 fail-closed;
- M12 historical SHA 的可复原部分有权威 source snapshot,剩余部分明确保留 blocked;
- quick/Chromium/release/offline/SBOM/rollback 和 protected hashes 全部通过;
- 最终 release gate 不依赖人工解释或手工重写历史文件。
8. 项目完成情况总表(整合视图)
这里的“完成”严格指对应任务的机器验收和 manifest handoff 已完成,不把它扩大解释为 Blender 全产品 parity。
| 区域 | 机器状态 | 已有成果 | 仍需整合的内容 |
|---|---|---|---|
| P0 事实与合同 | 3/3 done | scope、6,900 条 Blender 5.2 inventory、capability/error/budget contract | 将 inventory 条目映射到最终 FEATURE_PARITY、READ_COMPATIBILITY 或 EXCLUDED |
| P1 Runtime/Main | 5/5 done | single/pthread receipt、SceneIR stable ID、Main transaction/history、Worker lifecycle、OPFS/IndexedDB recovery | 将所有后续 family runner 统一接入同一 revision/generation/store |
| P2 核心建模闭环 | 5/5 done | open/context、transform/hierarchy、mesh edit、双 viewport、open-edit-undo-redo-save-reopen | 将已有 P2 证据作为 family regression,不重复实现基础 writer |
| P3 Authoring/IO | 5/5 done | material/UV、animation、rig/skin、GLB round-trip、library append/link/override | 补齐各 family 的统一 WASM mutation receipt 和 Chromium 生产证据 |
| P4 高级本地切片 | 4/4 done | modifier、Geometry Nodes/shader、sculpt/non-mesh/paint、simulation cache | 将能力边界、预算和 recovery 结果汇入 capability ledger |
| P5 Render/Server | 3/3 done | render routing、media recovery、server job binding | 保持 local/server/excluded 分类,不把 server 结果当作本地 parity |
| P6 安全/发布 | 3/3 done | default-deny scripting、故障矩阵、offline/CI/SBOM/rollback | 修复构建环境 receipt 的可复现路径,避免旧工作区依赖 |
| P7 差距程序 | P7-001/P7-002 done,P7-003 blocked | 15 family、45 原子行为任务、release gate;9/45 Chromium receipt 已绑定 | 剩余 36 项 WASM mutation/persistence/Chromium 证据和 M12 provenance |
| Quick CI | READY | 7/7 lane,128 个 unit 文件隔离执行 | 每次 capability 合并继续作为必需回归,不重引入单进程 OOM |
| M12 历史证据 | BLOCKED_SOURCE_LOST | 82 条、42 路径 drift ledger;Git-history snapshot 恢复 22 条,历史文件保持不变 | 取得剩余 immutable snapshot 或签名 artifact 后只读重建 provenance |
9. 不重复开发的模块所有权
所有后续工作先按以下所有权表复用;除非现有接口无法表达新行为,否则不创建第二套协议、store、runner 或 comparator。
| 能力 | 唯一生产入口 | 复用的现有证据/测试 | 允许新增的最小内容 |
|---|---|---|---|
| 文件读取和 SceneIR | web_engine_blend_reader.cpp、web/protocol/scene-ir.ts |
P1/P2/P7 reader receipts | 新字段的 typed parser、fallback、schema negative |
| Main mutation/history | web/protocol/corrective-main-transaction.ts 与现有 Main state |
P1-003、P2-002、P2-005 | 一个 bounded command 和对应 transaction case |
| Mesh | corrective-mesh-command.ts、mesh delta comparator |
C5 Mesh、P2-003 | 新拓扑/attribute case,不复制 transaction |
| Modifier | corrective-modifier-command.ts |
C5 Modifier、P4-001 | 一个声明参数或 apply slice |
| Asset/library | corrective-asset-catalog-command.ts 与 library protocols |
C5 Asset、P3-005、M12 library receipts | 新 ownership/reload case,不重写 catalog schema |
| 渲染与节点 | render routing、shader/geometry-node protocols | P4-002、P5-001、M12 format receipts | 只添加 allowlist/预算条目 |
| Worker/存储/recovery | runtime lifecycle、OPFS/IndexedDB journal | P1-004/P1-005、P4-004、P6-002 | 新 fault injection 或资源计数,不新建 recovery store |
| CI/release | run-ci-lane.mjs、release checkers、manifest |
P6-003、quick report | 新 lane 仅在现有 lane 无法表达时增加 |
禁止事项:为同一行为同时新增一个 Web protocol 和一个 corrective protocol;为同一 family 同时维护手工 expected JSON 和 generator 产物;用 UI 像素相似度替代 Main/SceneIR 语义比较。
10. 统一整合数据流
所有能力证据按同一条数据流进入 ledger,任何环节缺失都不能提升 parity level:
Blender fixture/generator
|
+--> desktop checker --> canonical semantic report
|
+--> WASM reader --> SceneIR snapshot --> Main bounded mutation
|
+--> save/reopen + stable-ID/hash report
|
+--> Chromium production interaction
|
+--> negative/recovery report
|
+--> manifest/status/ledger
整合时只比较 canonical semantic state:stable ID、Main revision、delta、拓扑/属性、资源 hash、错误码和 save/reopen state。.blend 原始字节只用于来源完整性和 fixture 保护,不把 Blender 进程指针字节误当成业务差异。
生成器规则:首次 fixture 生成可以写入目标;验证重跑必须保留已存在目标。P7-003 已实现这一规则,后续 generator 统一采用同一约定,避免重复触发二进制 hash drift。
11. 队列整合策略
当前 P7-003 是 release gate,不是新的功能 family。它在 nextTask=null 时必须停留在 blocked;不得从历史文档猜测 successor,也不得把 P7-003 改成一个批量实现任务。
队列重新打开的唯一条件:
- P7-003 依赖的 release receipt、fixture、generator、reports、status、task-context 的 SHA 全部通过 handoff。
- 由新的机器 manifest 明确给出 successor;手工修改
nextTask无效。 - successor 只领取一个 family 的一个行为,先完成
desktopPositive,再完成wasmMutation,最后完成saveReopenExact。 - 同一 family 的 Chromium、negative 和 recovery 证据作为该行为的必需门,不另起重复功能实现任务。
- family 完成后只更新 parity map 和 regression coverage,不修改已完成任务的历史 manifest。
如果现有 45 项原子队列的实现类别与 capability matrix 不一致,先新增一个“分类修正”证据任务,由 generator 重新输出 READ_COMPATIBILITY/EXCLUDED/SERVER_EXACT;不能直接把 metadata-only 或 negative-only 记录标成 feature parity。
12. 分阶段整合安排
I. 基础环境和证据入口
- 重新配置或封装 Blender desktop 运行环境,消除
/home/mes123456/working的隐式 RUNPATH;记录 Blender source/build、Emscripten、Node、Chromium 和依赖库 receipt。 - 抽出一个 family runner 外壳,参数只包含 fixture、行为 catalog、desktop checker、WASM command、Chromium case 和负例集合。
- comparator 统一输出 canonical JSON 和 SHA;命令输出写入任务 evidence 目录,manifest 只绑定最终构件。
II. 复用现有 C5 正向链路
- 先整合 Mesh、Modifier、Asset 三个已有 pilot,不改它们的协议语义。
- 对每个 pilot 补齐同一个证据形状:desktop state、WASM/Main revision、undo/redo、save/reopen、Chromium result、malformed/stale/missing/budget negatives。
- 三个 pilot 只能在证据字段齐全后提升为 capability ledger 的正向候选;旧 C5/M12 SHA 只读消费。
III. 按收益和风险推进 family
- 首批:
MESH_EDITING、OBJECT_OPERATIONS、MEDIA_IO,因为已有 P2/P3/C5 可复用且能覆盖大量 legacy regression。 - 第二批:
MODIFIER_SYSTEM、NODES_GRAPH、RIG_ANIMATION、MATERIAL_RENDER。 - 第三批:
SIMULATION、SCULPT_PAINT、CORE_SCENE_GRAPH、CORE_MESH。 - 最后处理
UI_EDITOR、CORE_DNA_RNA、OTHER_OPERATOR、CORE_OBJECT:优先做 read-compatibility 或 explicit excluded 分类,只有存在真实 Main writer 时才创建 mutation task。
每个 family 只选择一个最小可观察行为作为实现入口,已覆盖的 P2/P3/P4/P5 行为直接引用 regression receipt,不重复造 fixture 或 command。
IV. M12 provenance 并行轨道
- 接收 immutable repository snapshot、签名 artifact archive 或 CI artifact store 原件后,先只读计算原始 SHA。
- 可先从本仓库 Git 历史提取精确匹配项:
node tools/web/build-m12-git-snapshot.mjs,再执行 intake;该过程不读取或重写当前工作树。 - 统一入口:
node tools/web/intake-m12-immutable-snapshot.mjs --write;收到快照时追加--snapshot <目录或 snapshot-manifest.json>,工具只读校验并输出tests/golden/corrective/rehydration/M12-provenance-intake.json。 - 运行三方比较:original manifest、source snapshot、current worktree。
- 可复原项生成
PROVENANCE_RESTOREDcorrective evidence,无法复原项继续保留BLOCKED_SOURCE_LOST。 - provenance 修复不得修改 M12 历史 manifest,不得删除 drift entry,也不得覆盖当前工作树文件。
V. Release closure
- 45 项行为证据和 M12 provenance 都满足后,重新生成 parity map、known limitations 和 release decision。
- 依次运行 quick、Chromium、release、offline、SBOM、rollback 及 protected-hash gates。
- 只有
FEATURE_PARITY、READ_COMPATIBILITY、SERVER_EXACT、EXCLUDED、BLOCKED的数量和原因都可从机器证据重算时,才允许 releaseREADY。
13. 每个整合任务的交付模板
<family>/<behavior>/
fixture.blend or source fixture reference
generator.py or generator.mjs
desktop-report.json
wasm-main-report.json
chromium-report.json (when production interaction is involved)
persistence-report.json
negative-report.json
manifest.json
status.md
task-context.json
交付前固定运行:focused command、determinism check、desktop/WASM comparator、save/reopen、negative matrix、manifest hash、context governance、typecheck/lint 和 quick CI。任何一个命令失败都保留 in_progress/blocked,不创建 successor。
14. 项目级完成判定
项目整合完成需要同时满足:
- P0-P6 的已有生产实现全部由同一 SceneIR/Main/Worker/storage/CI 入口消费;没有重复协议或第二套状态源。
- 已实现能力、只读兼容能力、server/excluded 能力和真正未完成能力可以从 ledger 自动区分。
- P7 inventory 的 6,900 条记录均有稳定 family/implementation class/证据映射;不要求每条记录都拥有独立 writer。
- 45 项原子行为已完成,或明确标记为
READ_COMPATIBILITY、SERVER_EXACT、EXCLUDED、BLOCKED并绑定原因。 - Chromium 是唯一浏览器验收入口,quick CI 保持稳定,不再出现 Node exit 134。
- M12 可复原 SHA 有权威来源;不可复原项继续显式 blocked。
- release gate 可以只从 manifest、status、ledger 和 immutable source/build hash 重新计算,无需人工解释或历史重写。