From c8b8e9b00a72e29beffe77e344e4f2ef75a9281f Mon Sep 17 00:00:00 2001 From: mes123456 Date: Fri, 4 Sep 2026 07:40:56 +0800 Subject: [PATCH] chore(web): continuous handoff WBV2-P1171-001 --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P1171-001.md | 9 + docs/tasks/WBV2-P1171-001.md | 48 + .../wbv2-compositor-c7c1993f19c6c688.blend | Bin 0 -> 99846 bytes tests/golden/WBV2-P1171-000/manifest.json | 53 + .../WBV2-P1171-000/module-execution-plan.json | 10244 ++++++++++++++++ .../compositor-main-reader-production.json | 89 + tests/golden/WBV2-P1171-001/manifest.json | 134 + .../golden/WBV2-P1171-001/module-receipt.json | 172 + tests/golden/WBV2-P1171-001/module-run.log | 49 + tests/golden/WBV2-P1171-001/task-context.json | 217 + tests/golden/WBV2/task-catalog.jsonl | 2 + tests/golden/WBV2/task-index.json | 2 +- 13 files changed, 11021 insertions(+), 4 deletions(-) create mode 100644 docs/status/WBV2-P1171-001.md create mode 100644 docs/tasks/WBV2-P1171-001.md create mode 100644 tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend create mode 100644 tests/golden/WBV2-P1171-000/manifest.json create mode 100644 tests/golden/WBV2-P1171-000/module-execution-plan.json create mode 100644 tests/golden/WBV2-P1171-001/compositor-main-reader-production.json create mode 100644 tests/golden/WBV2-P1171-001/manifest.json create mode 100644 tests/golden/WBV2-P1171-001/module-receipt.json create mode 100644 tests/golden/WBV2-P1171-001/module-run.log create mode 100644 tests/golden/WBV2-P1171-001/task-context.json diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index 47620ce8d..4bdfa66a5 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -15,9 +15,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P1170-001` | -| parent manifest | `tests/golden/WBV2-P1170-000/manifest.json` | -| 任务卡 | [`tasks/WBV2-P1170-001.md`](tasks/WBV2-P1170-001.md) | +| 当前任务 | `WBV2-P1171-001` | +| parent manifest | `tests/golden/WBV2-P1171-000/manifest.json` | +| 任务卡 | [`tasks/WBV2-P1171-001.md`](tasks/WBV2-P1171-001.md) | | 专项验收 | `node tools/web/check-execution-control-plane.mjs` | | legacy coverage checkpoint | `M16-GAP-00282` | | legacy coverage parent | `tests/golden/M16-GAP-00281/manifest.json` | diff --git a/docs/status/WBV2-P1171-001.md b/docs/status/WBV2-P1171-001.md new file mode 100644 index 000000000..40e8ba037 --- /dev/null +++ b/docs/status/WBV2-P1171-001.md @@ -0,0 +1,9 @@ +# WBV2-P1171-001 status + +- task: `WBV2-P1171-001`; module: `AUTO_COMPOSITOR_NATIVE_NODE_READER`; status: `done` +- source hashes stable: `true`; commands passed: `4` +- existing production evidence reused: `false`; skipped commands: `0` +- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt +- dynamic source inventory: `3745` units; verified `582`; unverified `3163`; planning estimate `5200` (non-binding); this-segment binding delta: `8` +- historical 6900-entry inventory remains read-only; full-family parity: `false` +- nextTask: `NONE` diff --git a/docs/tasks/WBV2-P1171-001.md b/docs/tasks/WBV2-P1171-001.md new file mode 100644 index 000000000..921f9810a --- /dev/null +++ b/docs/tasks/WBV2-P1171-001.md @@ -0,0 +1,48 @@ +# WBV2-P1171-001: verify auto-generated native compositor reader batch + +- task: WBV2-P1171-001 +- parent: WBV2-P1171-000 +- status: in_progress +- gap: capability:AUTO_COMPOSITOR_NATIVE_NODE_READER +- ownerFamily: NODES +- targetImplementationClass: LOCAL_EXACT +- batchId: WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688 +- selectedRecordIds: ["node:CompositorNodeLevels","node:CompositorNodeLumaMatte","node:CompositorNodeMapUV","node:CompositorNodeMask","node:CompositorNodeMaskToSDF","node:CompositorNodeMovieClip","node:CompositorNodeMovieDistortion","node:CompositorNodeNormal"] +- commandBudget: max=48; read/exploration max=16 +- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1171-001 --write` + +## 目标 + +以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 CompositorNodeLevels, CompositorNodeLumaMatte, CompositorNodeMapUV, CompositorNodeMask, CompositorNodeMaskToSDF, CompositorNodeMovieClip, CompositorNodeMovieDistortion, CompositorNodeNormal 的真实 modifier/RNA 元数据。 + +## 输入与范围 + +- Blender modifier sources: `blender-5.2.0/source/blender/modifiers/intern/` +- RNA source: `blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc` +- Native reader: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Fixtures: `tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend` +- Chromium test: `web/tests/e2e/compositor-main-reader-production.spec.ts` +- Selected modifier units: `modifier-source:CompositorNodeLevels`, `modifier-source:CompositorNodeLumaMatte`, `modifier-source:CompositorNodeMapUV`, `modifier-source:CompositorNodeMask`, `modifier-source:CompositorNodeMaskToSDF`, `modifier-source:CompositorNodeMovieClip`, `modifier-source:CompositorNodeMovieDistortion`, `modifier-source:CompositorNodeNormal` +- Selected RNA units: none (source-only dependency batch) + +## 验收 + +- one shared Main/WASM/Worker/Chromium chain observes every selected type +- malformed input is rejected without Main mutation +- save/reopen and deterministic second read are exact +- only Chromium is used; JS simulation and per-API duplicate workers are forbidden +- each selected source unit receives an explicit hash-bound coverage binding +- `node tools/web/check-task-context.mjs --task WBV2-P1171-001 --write` + +## 失败边界 + +- any missing source, unsupported type, hash drift, malformed data or non-exact recovery keeps the batch `in_progress`/`blocked` +- partial batch success never claims the omitted family; historical inventory remains read-only + +## 交付与回滚 + +- Receipt: `tests/golden/WBV2-P1171-001/module-receipt.json` +- Aggregate production evidence: `tests/golden/WBV2-P1171-001/modifier-reader-batch-production.json` +- Manifest: `tests/golden/WBV2-P1171-001/manifest.json` +- Status: `docs/status/WBV2-P1171-001.md` +- Rollback: restore WBV2-P1171-000 as queue parent without rewriting prior evidence. diff --git a/tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend b/tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend new file mode 100644 index 0000000000000000000000000000000000000000..4ec9e2f06b9cdb73073e0e2c5c5c81003fc3f12b GIT binary patch literal 99846 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%0D$PRhmpD*I4XHr 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%0DFDN$K-!?QlcdaHrbYlk zlm@CCbf~h%2N^w_=K=+Q=~!UEhpQHW0X21$#2hBb2%Xf3;O!BR!VvCR5wjhZ77R?v z`jpWC3IO+{A_F#CyrrdjF%Nkz4-tA%(`>~=we*sB6PKPOF5TETvm|kkA})zm*7!f_ z;$;Qnke$`8H?ECCjB9TJlzSZbPx905LuRg61Ld zwoR_onl3oO6%@h-1iGLdq;Rb8fEzYYY{4ll7znO08P8mw08WIb#)Kq7G^r4JOf-

;6dlv2Y`tOuGA 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 P4gvrJ00000vFehKNOoOa literal 0 HcmV?d00001 diff --git a/tests/golden/WBV2-P1171-000/manifest.json b/tests/golden/WBV2-P1171-000/manifest.json new file mode 100644 index 000000000..dea7419bc --- /dev/null +++ b/tests/golden/WBV2-P1171-000/manifest.json @@ -0,0 +1,53 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1171-000", + "parentTask": "WBV2-P1170-001", + "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1170-001/manifest.json", + "sha256": "fadbdc8e186772ab2dce0bbd3b59edf6fe39bb684eebd82fc4624de6372344eb" + }, + "plan": { + "path": "tests/golden/WBV2-P1171-000/module-execution-plan.json", + "sha256": "ec52d75904b9a0a2ebe1ee5278796d3ac8a2e7ef3455a3af144e8f2b1dbdd5e5" + }, + "report": { + "path": "tests/golden/WBV2-P1171-000/successor-authorization-report.json", + "sha256": "b4fcb5253dbf16d7604b1cb40f57c737617184fd2a60655ad717daffb07dcc9c" + }, + "status": { + "path": "docs/status/WBV2-P1171-000.md", + "sha256": "2f51932bf9db711dfb51e4f76a305f5b52eeac8f7ae5ce48aaf2d82bc02ac5b7" + } + }, + "assertions": { + "sourceBackedSuccessor": true, + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchSize": 8, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 574, + "dynamicUnverifiedUnits": 3171, + "boundUnitDelta": 0, + "fullHistoricalReproduction": false + }, + "nextTask": "WBV2-P1171-001" +} diff --git a/tests/golden/WBV2-P1171-000/module-execution-plan.json b/tests/golden/WBV2-P1171-000/module-execution-plan.json new file mode 100644 index 000000000..76b643370 --- /dev/null +++ b/tests/golden/WBV2-P1171-000/module-execution-plan.json @@ -0,0 +1,10244 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_MODULE_EXECUTION_P1171", + "operation": "FUNCTION_MODULE_MIGRATION_PLAN", + "status": "COMPLETED_MODULE_EXECUTION", + "authority": "blender_main_source_and_existing_hash_bound_receipts", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "inventory": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "mutation": "forbidden_by_module_execution" + }, + "reusePolicy": { + "completedReceipts": "reuse_without_rerun", + "continuationEvidence": "excluded", + "duplicateValidation": "forbidden", + "fullFamilyParity": "never_inferred" + }, + "verificationPolicy": { + "browser": "chromium_only", + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "failure": "keep_module_in_progress_and_do_not_advance" + }, + "modules": [ + { + "id": "RENDER_LIGHT_CAMERA", + "task": "WBV2-P1100-001", + "owner": "RENDER", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCENE_OBJECT_MESH", + "task": "WBV2-P1100-002", + "owner": "SCENE_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MATERIAL_ANIMATION", + "task": "WBV2-P1100-003", + "owner": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NONMESH_GEOMETRY", + "task": "WBV2-P1101-000", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NODES_SIMULATION", + "task": "WBV2-P1101-001", + "owner": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ASSET_IO", + "task": "WBV2-P1101-002", + "owner": "ASSET", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCULPT_PAINT", + "task": "WBV2-P1101-003", + "owner": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR", + "task": "WBV2-P1102-000", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "INVENTORY_GATE", + "task": "WBV2-P1102-001", + "owner": "RELEASE", + "sourceBacked": true, + "capabilities": [], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "OBJECT_OPERATIONS", + "task": "WBV2-P1103-000", + "owner": "OBJECT", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_SEQUENCER", + "task": "WBV2-P1104-000", + "owner": "MEDIA", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUDIO_PARTICLE", + "task": "WBV2-P1105-000", + "owner": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "RIG_ANIMATION", + "task": "WBV2-P1106-000", + "owner": "RIG", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORE_SCENE_GRAPH_SETTINGS", + "task": "WBV2-P1129-001", + "owner": "CORE_SCENE", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR_VIEW2D_STATE", + "task": "WBV2-P1130-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "CURVE_TOPOLOGY_EDITOR", + "task": "WBV2-P1131-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/M9-05/manifest.json", + "report": "tests/golden/M9-05/curve-toggle-cyclic.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_HANDLE_GIZMO", + "task": "WBV2-P1132-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_SPLINES_TRANSACTION", + "task": "WBV2-P1133-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SURFACE_TOPOLOGY_TRANSACTION", + "task": "WBV2-P1134-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_BODY_TRANSACTION", + "task": "WBV2-P1135-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_PROPERTIES_TRANSACTION", + "task": "WBV2-P1136-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "METABALL_ELEMENTS_TRANSACTION", + "task": "WBV2-P1137-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXT_SOURCE_TRANSACTION", + "task": "WBV2-P1138-001", + "owner": "SCRIPTING", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXTURE_PROPERTIES_TRANSACTION", + "task": "WBV2-P1139-001", + "owner": "TEXTURE", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_GROUP_READER", + "task": "WBV2-P1140-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_POSE_MARKERS_READER", + "task": "WBV2-P1141-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_SAMPLE_READER", + "task": "WBV2-P1142-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_READER", + "task": "WBV2-P1143-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "DRIVER_READER", + "task": "WBV2-P1144-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORRECTIVE_SMOOTH_READER", + "task": "WBV2-P1145-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH", + "task": "WBV2-P1146-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_TWO", + "task": "WBV2-P1147-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_THREE", + "task": "WBV2-P1148-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FOUR", + "task": "WBV2-P1149-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FIVE", + "task": "WBV2-P1150-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "task": "WBV2-P1151-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_SIX", + "task": "WBV2-P1152-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "task": "WBV2-P1153-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOLIDIFY_DEPENDENCY_REUSE", + "task": "WBV2-P1154-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_RNA_READER_BATCH", + "task": "WBV2-P1155-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_VOLUME_DISPLACE_BATCH", + "task": "WBV2-P1156-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SHAPE_KEY_POINT_READER_BATCH", + "task": "WBV2-P1157-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_READER_BATCH", + "task": "WBV2-P1158-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_COLLECTION_READER_BATCH", + "task": "WBV2-P1159-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_SUBTYPE_READER_BATCH", + "task": "WBV2-P1160-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "task": "WBV2-P1161-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SHAPEKEY_READER_BATCH", + "task": "WBV2-P1162-001", + "owner": "MODIFIER", + "sourceBacked": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NODE_READER_BATCH", + "task": "WBV2-P1163-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NATIVE_NODE_BATCH", + "task": "WBV2-P1164-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1165-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_anti_aliasing.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bilateral_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blank_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_box_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_brightness_contrast.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_channel_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1166-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_chroma_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_balance.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_correction.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_spill.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_combine_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_to_display.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1167-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convolve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_corner_pin.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_crop.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_curves.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_directional_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_defocus.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1168-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_denoise.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_despeckle.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_difference_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_dilate_erode.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_displace.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_distance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_ellipse_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1169-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:21d6a496860ad568", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask", + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_filter.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_flip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_correct.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_saturation_value.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_id_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-21d6a496860ad568.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1170-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1171-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + } + ], + "tasks": [ + { + "id": "WBV2-P1096-000", + "phase": "1096", + "title": "supersede_generic_continuation_queue", + "kind": "bridge", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1095-003" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "bridge", + "gate": "QUEUE", + "card": "docs/tasks/WBV2-P1096-000.md", + "behavior": "Replace the generic continuation queue with a finite module execution plan without claiming capability parity.", + "outputs": [ + "bridge manifest", + "status" + ], + "acceptance": [ + "no parity claim", + "inventory preserved", + "module plan hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-000", + "phase": "1100", + "title": "reorganize_module_execution_plan", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1096-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-000.md", + "behavior": "Reuse completed source-backed work and activate finite module-level implementation and verification.", + "outputs": [ + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "completed receipts reused", + "generic continuation excluded", + "one module active", + "inventory preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-001", + "phase": "1100", + "title": "verify_render_light_camera_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1100-000" + ], + "parityId": "RENDER_LIGHT_CAMERA", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-render_light_camera", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-001.md", + "behavior": "Complete the RENDER_LIGHT_CAMERA module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_LIGHT_CAMERA", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "positive": [ + "setLightProperties", + "setWorldProperties", + "setCameraProperties", + "camera panorama", + "world environment", + "light shadow/cascade" + ], + "negative": [ + "invalid enum", + "invalid numeric bounds", + "near/far conflict", + "unknown target", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:lighting-field-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-lighting-fields-production.spec.ts tests/e2e/lighting-field-roundtrip.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-002", + "phase": "1100", + "title": "verify_scene_object_mesh_module", + "kind": "module", + "owner": "SCENE_MESH", + "dependsOn": [ + "WBV2-P1100-001" + ], + "parityId": "SCENE_OBJECT_MESH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-scene_object_mesh", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-002.md", + "behavior": "Complete the SCENE_OBJECT_MESH module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCENE_OBJECT_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "positive": [ + "mesh topology", + "visibility", + "transform", + "collection membership" + ], + "negative": [ + "invalid selection", + "stale revision", + "linked data" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts tests/e2e/wbv2-scene-object-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-003", + "phase": "1100", + "title": "verify_material_animation_module", + "kind": "module", + "owner": "MATERIAL_ANIMATION", + "dependsOn": [ + "WBV2-P1100-002" + ], + "parityId": "MATERIAL_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-material_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-003.md", + "behavior": "Complete the MATERIAL_ANIMATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "positive": [ + "principled material", + "image node", + "keyframe", + "FCurve" + ], + "negative": [ + "unsupported graph", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-animation-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-000", + "phase": "1101", + "title": "verify_nonmesh_geometry_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1100-003" + ], + "parityId": "NONMESH_GEOMETRY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nonmesh_geometry", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-000.md", + "behavior": "Complete the NONMESH_GEOMETRY module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NONMESH_GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "curve", + "surface", + "font", + "volume", + "metaball", + "grease pencil" + ], + "negative": [ + "unsupported data", + "resource missing", + "malformed geometry" + ], + "recovery": [ + "save/reopen", + "resource disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-viewport-nonmesh-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-001", + "phase": "1101", + "title": "verify_nodes_simulation_module", + "kind": "module", + "owner": "NODES_SIMULATION", + "dependsOn": [ + "WBV2-P1101-000" + ], + "parityId": "NODES_SIMULATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_simulation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-001.md", + "behavior": "Complete the NODES_SIMULATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted node graph", + "physics manifest", + "stable hash" + ], + "negative": [ + "unsupported node", + "budget exceeded", + "stale revision" + ], + "recovery": [ + "save/reopen", + "cache disposal" + ], + "commands": [ + "npm --prefix web run test:geometry-node-main-reader", + "npm --prefix web run test:physics-main-reader" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-002", + "phase": "1101", + "title": "verify_asset_io_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1101-001" + ], + "parityId": "ASSET_IO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-asset_io", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-002.md", + "behavior": "Complete the ASSET_IO module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ASSET_IO", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "positive": [ + "append", + "link", + "override", + "reload", + "asset catalog v2" + ], + "negative": [ + "missing source", + "ownership violation", + "hash drift", + "collision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "IndexedDB restart" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-v2", + "npm --prefix web run test:asset-catalog-migration", + "npm --prefix web run test:asset-catalog-negatives", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-link-override-production.spec.ts tests/e2e/wbv2-asset-catalog-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-003", + "phase": "1101", + "title": "verify_sculpt_paint_module", + "kind": "module", + "owner": "SCULPT_PAINT", + "dependsOn": [ + "WBV2-P1101-002" + ], + "parityId": "SCULPT_PAINT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-sculpt_paint", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-003.md", + "behavior": "Complete the SCULPT_PAINT module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "positive": [ + "vertex colors", + "vertex weights", + "bounded sculpt stroke" + ], + "negative": [ + "mirror unverified", + "invalid patch", + "unsupported brush" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:paint-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-paint-attributes-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-000", + "phase": "1102", + "title": "implement_ui_editor_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1101-003" + ], + "parityId": "UI_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-000.md", + "behavior": "Complete the UI_EDITOR module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "sourcePaths": [ + "web/protocol/editor-workflow.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "editor context", + "workspace", + "area/region" + ], + "negative": [ + "unsupported editor", + "invalid context" + ], + "recovery": [ + "worker restart", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:editor-main-reader", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-workflow-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-001", + "phase": "1102", + "title": "close_module_execution_gate", + "kind": "module", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P1102-000" + ], + "parityId": "INVENTORY_GATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-inventory_gate", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-001.md", + "behavior": "Complete the INVENTORY_GATE module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "INVENTORY_GATE", + "sourceBacked": true, + "capabilities": [], + "sourcePaths": [ + "tests/golden/WBV2-P0-002/parity-map.json", + "tests/golden/WBV2-P1100-000/module-execution-plan.json" + ], + "reuseReceipts": [], + "positive": [ + "aggregate module receipts", + "catalog hash" + ], + "negative": [ + "missing receipt", + "hash drift", + "false completion" + ], + "recovery": [ + "re-run affected module only" + ], + "commands": [ + "node tools/web/check-wbv2-module-execution.mjs", + "npm --prefix web run build" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1103-000", + "phase": "1103", + "title": "aggregate_object_operations_module", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1102-001" + ], + "parityId": "OBJECT_OPERATIONS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_operations", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1103-000.md", + "behavior": "Aggregate the existing source-backed Object Main operations into one module and revalidate the Chromium operator matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "OBJECT_OPERATIONS", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "positive": [ + "duplicate", + "create", + "parent", + "collection", + "rename", + "delete", + "transform apply" + ], + "negative": [ + "unknown object", + "invalid parent cycle", + "malformed transform" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts tests/e2e/wbv2-object-create-production.spec.ts tests/e2e/wbv2-object-parent-production.spec.ts tests/e2e/wbv2-collection-create-production.spec.ts tests/e2e/wbv2-object-rename-production.spec.ts tests/e2e/wbv2-object-delete-production.spec.ts tests/e2e/wbv2-object-transform-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1104-000", + "phase": "1104", + "title": "verify_compositor_sequencer_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1103-000" + ], + "parityId": "COMPOSITOR_SEQUENCER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_sequencer", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1104-000.md", + "behavior": "Verify the source-backed compositor and sequencer module through golden, unsupported-gate and media recovery cases.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main or compositor mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "COMPOSITOR_SEQUENCER", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/compositor.ts", + "web/protocol/sequencer.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "compositor node graph", + "sequencer still-image timeline", + "media cache contract" + ], + "negative": [ + "unsupported compositor node", + "invalid sequencer strip", + "stale media revision" + ], + "recovery": [ + "worker restart", + "save/reopen", + "media cache replay", + "movie codec blocked without READY receipt" + ], + "commands": [ + "npm --prefix web run test:compositor-node-golden", + "npm --prefix web run test:compositor-unsupported-gate", + "npm --prefix web run test:sequencer-main-reader", + "node --test web/tests/unit/sequencer-media-cache.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-021 sequencer|real Blender 5.2 sequencer\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1105-000", + "phase": "1105", + "title": "verify_audio_particle_module", + "kind": "module", + "owner": "AUDIO_PARTICLE", + "dependsOn": [ + "WBV2-P1104-000" + ], + "parityId": "AUDIO_PARTICLE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-audio_particle", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1105-000.md", + "behavior": "Verify Sound, Speaker and ParticleSettings mutations against authoritative Blender Main with explicit build capability gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven or a typed build capability blocker is recorded", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/protocol/io-media-commands.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "positive": [ + "Sound properties", + "Speaker properties", + "ParticleSettings properties" + ], + "negative": [ + "missing Main datablock", + "unsupported build feature", + "out-of-range property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker restart" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-audio-particle-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1106-000", + "phase": "1106", + "title": "verify_rig_animation_module", + "kind": "module", + "owner": "RIG", + "dependsOn": [ + "WBV2-P1105-000" + ], + "parityId": "RIG_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-rig_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1106-000.md", + "behavior": "Verify armature pose, constraints and NLA animation through the existing Blender Main primitives.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RIG_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "armature pose", + "constraint edit", + "NLA stack" + ], + "negative": [ + "missing bone", + "invalid constraint influence", + "stale NLA revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-rig-pose-production.spec.ts", + "npm --prefix web run test:nla-operator", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1107-000", + "phase": "1107", + "title": "verify_modifier_system_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1106-000" + ], + "parityId": "MODIFIER_SYSTEM", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_system", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1107-000.md", + "behavior": "Verify modifier stack visibility and bounded parameter mutation through authoritative Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SYSTEM", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER-STATE-MUTATION", + "CAP-MODIFIER-PARAMETER-EDIT", + "CAP-MODIFIER-STACK-READER" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/modifier-graph.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P9-002/manifest.json", + "report": "tests/golden/WBV2-P9-002/modifier-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P11-002/manifest.json", + "report": "tests/golden/WBV2-P11-002/modifier-parameter-receipt-report.json" + } + ], + "positive": [ + "modifier visibility toggle", + "bounded DECIMATE parameter mutation", + "modifier stack evaluation reader" + ], + "negative": [ + "unknown modifier UUID", + "stale mesh revision", + "out-of-range parameter" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts tests/e2e/wbv2-modifier-parameter-production.spec.ts", + "npm --prefix web run test:modifier-goldens", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1108-000", + "phase": "1108", + "title": "verify_nodes_graph_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1107-000" + ], + "parityId": "NODES_GRAPH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_graph", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1108-000.md", + "behavior": "Verify Geometry Nodes graph identity, allowlisted evaluation, field budgets and unsupported graph retention.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive graph reader/evaluation evidence is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_GRAPH", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-GRAPH", + "CAP-GEOMETRY-NODES-ALLOWLIST", + "CAP-GEOMETRY-NODES-FIELD-BUDGET" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted graph identity", + "Blender depsgraph geometry evaluation", + "field materialization with exact domain cardinality" + ], + "negative": [ + "unsupported node graph", + "field budget overflow", + "stale or invalid graph command" + ], + "recovery": [ + "save/reopen", + "worker restart", + "graph retention after rejected command", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:geometry-node-evaluator-golden", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1109-000", + "phase": "1109", + "title": "verify_io_format_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1108-000" + ], + "parityId": "IO_FORMAT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-io_format", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1109-000.md", + "behavior": "Verify format capability routing, runtime receipts, recovery and fail-closed file UI gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive format routing/readiness evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "IO_FORMAT", + "sourceBacked": true, + "capabilities": [ + "CAP-IO-FORMAT-CAPABILITY-MATRIX", + "CAP-IO-FORMAT-RUNTIME-RECEIPTS", + "CAP-IO-FORMAT-RECOVERY", + "CAP-IO-FORMAT-UI-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/asset-library-io.ts", + "web/protocol/io-format-capability-matrix.ts", + "web/protocol/io-format-receipt-binding.ts", + "web/protocol/io-format-runtime-receipt.ts", + "web/protocol/io-format-recovery.ts", + "web/protocol/io-format-ui-gate.ts", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "GLB export readiness", + "format runtime receipt inventory", + "declared .blend import route" + ], + "negative": [ + "unverified format route", + "cancelled or OOM operation", + "unsupported file extension" + ], + "recovery": [ + "worker restart", + "small operation recovery", + "deterministic receipt replay", + "fail-closed UI route" + ], + "commands": [ + "node tools/web/check-io-format-receipt-bindings.mjs", + "node tools/web/check-io-format-runtime-receipts.mjs", + "node tools/web/check-io-format-recovery.mjs", + "node tools/web/check-io-format-ui-gate.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/io-format-recovery.spec.ts tests/e2e/io-format-ui-gate.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1110-000", + "phase": "1110", + "title": "verify_render_pipeline_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1109-000" + ], + "parityId": "RENDER_PIPELINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-render_pipeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1110-000.md", + "behavior": "Verify render backend routing, explicit resource budgets and Blender reference comparison in Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive render/reference evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic render receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_PIPELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-BACKEND-ROUTING", + "CAP-RENDER-RESOURCE-BUDGET", + "CAP-RENDER-REFERENCE-COMPARISON" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/render-routing.ts", + "web/protocol/render-budget.ts", + "web/protocol/render-capabilities.ts", + "web/protocol/render-image-comparison.ts", + "web/protocol/server-render-job.ts", + "web/app/src/three-adapter/render-routing.ts", + "web/app/src/three-adapter/render-image-comparison.ts", + "web/app/src/workers/viewport-render.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "bounded local backend routing", + "reference render metrics", + "resource budget acceptance" + ], + "negative": [ + "unknown or unavailable backend", + "aggregate texture/light budget overflow", + "wrong composition reference" + ], + "recovery": [ + "retain previous texture set", + "offscreen renderer parity", + "worker restart", + "deterministic second render" + ], + "commands": [ + "npm --prefix web run test:render-resource-budget", + "npm --prefix web run test:render-routing", + "npm --prefix web run test:render-reference", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1111-000", + "phase": "1111", + "title": "verify_scripting_security_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1110-000" + ], + "parityId": "SCRIPTING_SECURITY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-scripting_security", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1111-000.md", + "behavior": "Verify script source Main reader, deny-by-default permission policy and sandbox isolation/recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader and policy evidence is proven", + "negative and recovery cases are proven", + "Chromium sandbox receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCRIPTING_SECURITY", + "sourceBacked": true, + "capabilities": [ + "CAP-SCRIPT-MAIN-READER", + "CAP-SCRIPT-PERMISSION-POLICY", + "CAP-SCRIPT-SANDBOX-ISOLATION", + "CAP-SCRIPT-SANDBOX-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/scripting-platform.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/script-permission-policy-test.worker.ts", + "web/app/src/workers/script-sandbox-isolation-test.worker.ts", + "web/app/src/workers/script-sandbox-recovery-test.worker.ts", + "web/app/src/testing/script-sandbox-recovery.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "script source inventory reader", + "explicit READ_MAIN permission", + "new-generation recovery audit" + ], + "negative": [ + "autorun denied by default", + "undeclared permission", + "sandbox crash/timeout/late result" + ], + "recovery": [ + "worker restart", + "sandbox generation rollover", + "continuous audit chain", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:script-main-reader", + "npm --prefix web run test:scripting-isolation", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/script-permission-policy.spec.ts tests/e2e/script-sandbox-isolation.spec.ts tests/e2e/script-sandbox-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1112-000", + "phase": "1112", + "title": "verify_animation_timeline_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1111-000" + ], + "parityId": "ANIMATION_TIMELINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-animation_timeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1112-000.md", + "behavior": "Verify frame evaluation and NLA time mapping through the production Worker and Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive frame/NLA evaluation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic evaluation receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ANIMATION_TIMELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-FRAME-EVALUATION", + "CAP-NLA-TIME-MAPPING", + "CAP-ANIMATION-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/protocol/depsgraph.ts", + "web/protocol/scene-ir.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "frame 1/5/10 evaluation", + "NLA track and strip mapping", + "Blender depsgraph animation result" + ], + "negative": [ + "stale NLA revision", + "invalid strip topology", + "unsupported animation domain" + ], + "recovery": [ + "save/reopen", + "worker restart", + "deterministic repeated evaluation", + "preserve rejected stack" + ], + "commands": [ + "npm --prefix web run test:frame-evaluation", + "node tools/web/check-nla-evaluation-golden.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/nla-evaluation-golden.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1113-000", + "phase": "1113", + "title": "verify_shader_material_module", + "kind": "module", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P1112-000" + ], + "parityId": "SHADER_MATERIAL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shader_material", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1113-000.md", + "behavior": "Verify bounded Shader graph compilation, stable compile keys and fail-closed pipeline recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Shader Main compilation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic compile receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHADER_MATERIAL", + "sourceBacked": true, + "capabilities": [ + "CAP-SHADER-GRAPH-COMPILER", + "CAP-SHADER-COMPILE-KEY", + "CAP-SHADER-FAIL-CLOSED-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/shader-graph.ts", + "web/protocol/shader-graph-commands.ts", + "web/protocol/shader-compiler.ts", + "web/protocol/render-capabilities.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "Principled/Image/Normal/Math graph compile", + "stable compile key", + "real Main shader material path" + ], + "negative": [ + "unknown shader node", + "graph cycle or duplicate link", + "unsupported renderer backend" + ], + "recovery": [ + "retain previous material after compile failure", + "worker restart", + "deterministic repeated compile", + "save/reopen material graph" + ], + "commands": [ + "npm --prefix web run test:shader-compile", + "npm --prefix web run test:shader-pipeline", + "npm --prefix web run test:shader-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1114-000", + "phase": "1114", + "title": "verify_grease_pencil_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1113-000" + ], + "parityId": "GREASE_PENCIL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1114-000.md", + "behavior": "Verify Grease Pencil layer/frame Main mutations, stable identity validation and roundtrip recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Grease Pencil Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-LAYER-FRAME", + "CAP-GREASE-PENCIL-STROKE-READER", + "CAP-GREASE-PENCIL-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/grease-pencil.ts", + "web/protocol/grease-pencil-reorder.ts", + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "create and reorder layer", + "insert and move frame", + "stable Grease Pencil drawing reader" + ], + "negative": [ + "forged drawing identity", + "occupied frame target", + "stale layer/frame revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic layer/frame replay" + ], + "commands": [ + "npm --prefix web run test:grease-pencil-reorder", + "npm --prefix web run test:grease-pencil", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1115-000", + "phase": "1115", + "title": "verify_curve_surface_editing_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1114-000" + ], + "parityId": "CURVE_SURFACE_EDITING", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_surface_editing", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1115-000.md", + "behavior": "Verify Curve topology/handle edits, Surface topology and non-mesh/font roundtrip through Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive non-mesh Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SURFACE_EDITING", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-HANDLES", + "CAP-SURFACE-TOPOLOGY", + "CAP-NONMESH-FONT-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nonmesh-geometry-commands.ts", + "web/protocol/curve-topology-editor.ts", + "web/protocol/non-mesh.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + } + ], + "positive": [ + "Curve control point and handle edit", + "Curve cyclic/topology operator", + "Surface and Font property mutation" + ], + "negative": [ + "invalid curve selection/domain", + "occupied or stale frame/topology target", + "malformed non-mesh property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic multispline replay" + ], + "commands": [ + "npm --prefix web run test:curve-topology-operator", + "npm --prefix web run test:nonmesh-roundtrip", + "npm --prefix web run test:nonmesh-desktop-golden", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1116-000", + "phase": "1116", + "title": "verify_storage_recovery_module", + "kind": "module", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1115-000" + ], + "parityId": "STORAGE_RECOVERY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-storage_recovery", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1116-000.md", + "behavior": "Verify IndexedDB catalog migration/restart and OPFS asset preview deduplication, quarantine and reference GC.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive storage commit/recovery evidence is proven", + "negative and quarantine cases are proven", + "Chromium restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "STORAGE_RECOVERY", + "sourceBacked": true, + "capabilities": [ + "CAP-INDEXEDDB-CATALOG-MIGRATION", + "CAP-OPFS-PREVIEW-COMMIT", + "CAP-OPFS-QUARANTINE-GC" + ], + "sourcePaths": [ + "web/protocol/storage.ts", + "web/protocol/storage-budget.ts", + "web/protocol/save-transaction.ts", + "web/protocol/recent-projects.ts", + "web/protocol/asset-preview.ts", + "web/protocol/asset-preview-decode.ts", + "web/app/src/storage/asset-catalog-indexeddb.ts", + "web/app/src/storage/asset-preview-opfs-commit.ts", + "web/app/src/storage/asset-preview-quarantine.ts", + "web/app/src/storage/asset-preview-reference-gc.ts", + "web/app/src/storage/opfs-files.ts", + "web/app/src/storage/migrations.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "v1 to v2 catalog migration", + "page/Worker restart identity", + "content-addressed preview deduplication" + ], + "negative": [ + "partial catalog migration", + "corrupt preview quarantine", + "cross-project or non-final reference GC" + ], + "recovery": [ + "IndexedDB restart", + "OPFS commit replay", + "quarantine cleanup", + "deterministic reference reclamation" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-restart", + "npm --prefix web run test:asset-preview-dedup", + "npm --prefix web run test:asset-preview-quarantine", + "npm --prefix web run test:asset-preview-reference-gc", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1117-000", + "phase": "1117", + "title": "verify_simulation_cache_module", + "kind": "module", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1116-000" + ], + "parityId": "SIMULATION_CACHE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-simulation_cache", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1117-000.md", + "behavior": "Verify simulation cache identity, physics-family payload integrity, lifecycle recovery and deterministic LRU pruning.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive cache identity/lifecycle evidence is proven", + "negative integrity and budget cases are proven", + "Chromium restart and quarantine receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SIMULATION_CACHE", + "sourceBacked": true, + "capabilities": [ + "CAP-SIMULATION-CACHE-IDENTITY", + "CAP-PHYSICS-CACHE-INTEGRITY", + "CAP-SIMULATION-CACHE-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/simulation-cache.ts", + "web/protocol/physics-simulation.ts", + "web/protocol/physics-cache-playback.ts", + "web/protocol/storage.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "graph/source/revision cache identity", + "all physics-family frame hashes", + "verified playback lifecycle" + ], + "negative": [ + "source or payload hash drift", + "revision/range mismatch", + "cache byte/frame budget overflow" + ], + "recovery": [ + "cancel and cleanup", + "LRU prune with protected playback", + "corruption quarantine", + "worker restart" + ], + "commands": [ + "npm --prefix web run test:simulation-cache-identity", + "npm --prefix web run test:simulation-cache-lifecycle", + "npm --prefix web run test:physics-cache-family", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1118-000", + "phase": "1118", + "title": "verify_ui_input_interaction_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1117-000" + ], + "parityId": "UI_INPUT_INTERACTION", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-ui_input_interaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1118-000.md", + "behavior": "Verify keyboard-only user actions, input mutex, IME/pointer state and responsive editor interaction under deployment CSP.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive keyboard Main mutation and save are proven", + "negative mutex/input cases are proven", + "Chromium accessibility and responsive receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_INPUT_INTERACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-KEYBOARD-USER-ACTIONS", + "CAP-INPUT-MODAL-STATE", + "CAP-IME-SHORTCUT-GUARD", + "CAP-RESPONSIVE-CSP-UI" + ], + "sourcePaths": [ + "web/app/index.html", + "web/app/src/app/App.tsx", + "web/app/src/app/app-shell.css", + "web/app/src/workers/web-engine.worker.ts", + "web/protocol/user-action-state.ts", + "web/protocol/project-action-mutex.ts", + "web/protocol/ime-composition.ts", + "web/protocol/input-modal.ts", + "web/protocol/pointer-contract.ts", + "web/protocol/worker-fault.ts", + "web/tests/unit/user-action-state.test.mjs", + "web/tests/unit/project-action-mutex.test.mjs", + "web/tests/unit/ime-composition.test.mjs", + "web/tests/unit/input-modal.test.mjs", + "web/tests/unit/pointer-contract.test.mjs" + ], + "reuseReceipts": [], + "positive": [ + "keyboard-only Add Cube Main mutation", + "keyboard save/reopen and GLB export", + "responsive controls at desktop/mobile viewports" + ], + "negative": [ + "concurrent project action mutex", + "IME shortcut suppression", + "pointer cancel/touch modal cleanup" + ], + "recovery": [ + "worker restart", + "save interruption recovery", + "responsive layout preservation", + "deterministic repeated keyboard loop" + ], + "commands": [ + "node --test web/tests/unit/user-action-state.test.mjs web/tests/unit/project-action-mutex.test.mjs web/tests/unit/ime-composition.test.mjs web/tests/unit/input-modal.test.mjs web/tests/unit/pointer-contract.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/user-action-state.spec.ts tests/e2e/project-action-mutex.spec.ts tests/e2e/keyboard-accessibility.spec.ts tests/e2e/responsive-layout.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1119-000", + "phase": "1119", + "title": "verify_library_workflow_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1118-000" + ], + "parityId": "LIBRARY_WORKFLOW", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-library_workflow", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1119-000.md", + "behavior": "Verify append, link, override and reload library flows through authoritative Main with path and dependency safety gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive library Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LIBRARY_WORKFLOW", + "sourceBacked": true, + "capabilities": [ + "CAP-LIBRARY-APPEND", + "CAP-LIBRARY-LINK", + "CAP-LIBRARY-OVERRIDE", + "CAP-LIBRARY-RELOAD-SAFETY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/library-main-append.ts", + "web/protocol/library-linked-mutation.ts", + "web/protocol/library-linked-reload.ts", + "web/protocol/library-linked-missing.ts", + "web/protocol/library-override-writer.ts", + "web/protocol/library-override-freshness.ts", + "web/protocol/library-negative-cases.ts", + "web/protocol/library-operation-identity.ts", + "web/protocol/library-source-origin.ts", + "web/protocol/asset-path.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P9-003/manifest.json", + "report": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json" + } + ], + "positive": [ + "append object into Main", + "linked read-only object", + "local override and reload identity" + ], + "negative": [ + "missing library source", + "dependency/cross-library cycle", + "unsafe path or ownership mutation" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic library replay" + ], + "commands": [ + "npm --prefix web run test:library-main-append", + "npm --prefix web run test:library-link-chromium", + "npm --prefix web run test:library-override-chromium", + "npm --prefix web run test:library-negative-cases", + "npm --prefix web run test:library-path-security", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1120-000", + "phase": "1120", + "title": "verify_volume_nanovdb_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1119-000" + ], + "parityId": "VOLUME_NANOVDB", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-volume_nanovdb", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1120-000.md", + "behavior": "Verify NanoVDB manifest, paged feedback, OPFS commit/restart and production viewport volume roundtrip.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive volume resource and viewport evidence is proven", + "negative and recovery cases are proven", + "Chromium OPFS/restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "VOLUME_NANOVDB", + "sourceBacked": true, + "capabilities": [ + "CAP-NANOVDB-MANIFEST", + "CAP-NANOVDB-PAGED-FEEDBACK", + "CAP-NANOVDB-OPFS-RESTART", + "CAP-NANOVDB-VIEWPORT-ROUNDTRIP" + ], + "sourcePaths": [ + "web/protocol/volume-vdb.ts", + "web/protocol/nanovdb-page-feedback.ts", + "web/protocol/nanovdb-device-recovery.ts", + "web/protocol/storage.ts", + "web/app/src/volume/nanovdb-opfs.ts", + "web/app/src/volume/nanovdb-stream.ts", + "web/app/src/volume/nanovdb-viewport.ts", + "web/app/src/volume/nanovdb-float32.ts", + "web/app/src/render/nanovdb-volume-renderer.ts", + "web/app/src/workers/vdb-opfs-test.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "validated NanoVDB bundle manifest", + "content-addressed OPFS commit", + "main/offscreen production viewport volume" + ], + "negative": [ + "manifest/chunk hash mismatch", + "stale source binding", + "WebGPU/resource availability block" + ], + "recovery": [ + "OPFS Worker restart", + "paged feedback resume", + "quota/device loss cleanup", + "deterministic volume save/reopen" + ], + "commands": [ + "npm --prefix web run test:vdb-availability", + "npm --prefix web run test:vdb-native", + "npm --prefix web run test:nanovdb-page-feedback", + "npm --prefix web run test:nanovdb-opfs-restart", + "npm --prefix web run test:nanovdb-volume-roundtrip", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1121-000", + "phase": "1121", + "title": "verify_paint_stroke_module", + "kind": "module", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P1120-000" + ], + "parityId": "PAINT_STROKE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-paint_stroke", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1121-000.md", + "behavior": "Verify paint pointer sessions, depth visibility and PBVH capability gates through the production Worker.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive paint Main transaction is proven", + "negative and recovery cases are proven", + "Chromium pointer/GPU receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "PAINT_STROKE", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-POINTER-SESSION", + "CAP-PAINT-DEPTH-VISIBILITY", + "CAP-PAINT-PBVH-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/sculpt.ts", + "web/protocol/paint.ts", + "web/protocol/paint-stroke-session.ts", + "web/protocol/paint-depth-visibility.ts", + "web/protocol/paint-pbvh-capability.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/three-adapter/paint-depth-visibility.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "ordered paint pointer chunks", + "main/offscreen depth visibility", + "PBVH inventory capability query" + ], + "negative": [ + "stale/discontinuous pointer chunks", + "forged or over-budget depth samples", + "missing PBVH WASM entrypoint" + ], + "recovery": [ + "pointer cancel without Main mutation", + "undo step after paint commit", + "worker restart", + "deterministic capability replay" + ], + "commands": [ + "npm --prefix web run test:paint-stroke-session", + "npm --prefix web run test:paint-depth-visibility", + "npm --prefix web run test:paint-pbvh-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1122-000", + "phase": "1122", + "title": "verify_engine_runtime_module", + "kind": "module", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1121-000" + ], + "parityId": "ENGINE_RUNTIME", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-engine_runtime", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1122-000.md", + "behavior": "Verify WebEngine variant manifest/selection, compiled WASM Main ABI and Worker crash recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive compiled WASM Main lifecycle is proven", + "negative variant/hash cases are proven", + "Chromium Worker restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ENGINE_RUNTIME", + "sourceBacked": true, + "capabilities": [ + "CAP-ENGINE-VARIANT-MANIFEST", + "CAP-ENGINE-WASM-MAIN-ABI", + "CAP-WORKER-CRASH-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.h", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/CMakeLists.txt", + "web/protocol/engine-variant.ts", + "web/protocol/worker-fault.ts", + "web/protocol/save-transaction.ts", + "web/app/src/engine-client/engine-variant-bootstrap.ts", + "web/app/src/engine-client/browser-engine-variant-session.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "single/pthread manifest binding", + "compiled WASM Main open/save lifecycle", + "engine and storage Worker recovery" + ], + "negative": [ + "malformed variant/resource declaration", + "mixed-version/hash mismatch", + "pthread unavailable fallback" + ], + "recovery": [ + "single-thread fallback", + "Worker crash restart", + "operation-log restore", + "deterministic repeated startup" + ], + "commands": [ + "npm --prefix web run test:engine-manifest-v2", + "npm --prefix web run test:engine-variant-selection", + "npm --prefix web run test:engine-variant-fallback", + "npm --prefix web run test:engine-variant-install", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-native-engine-production.spec.ts tests/e2e/worker-crash-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1123-000", + "phase": "1123", + "title": "repair_glb_roundtrip_dependency_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1122-000" + ], + "parityId": "GLB_ROUNDTRIP_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-glb_roundtrip_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1123-000.md", + "behavior": "Repair the standalone GLB checker dependency chain and verify mesh/non-mesh Blender roundtrip plus Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive GLB and non-mesh roundtrip are proven", + "negative and recovery cases are proven", + "Chromium save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GLB_ROUNDTRIP_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GLB-MESH-ROUNDTRIP", + "CAP-GLB-NONMESH-ROUNDTRIP", + "CAP-GLB-CHROMIUM-RECOVERY" + ], + "sourcePaths": [ + "tools/web/check-glb-blender-roundtrip.mjs", + "tools/web/check-nonmesh-glb-blender-roundtrip.mjs", + "tools/web/blender-check-glb-roundtrip.py", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/protocol/nonmesh-binary.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "mesh/material/skin/animation GLB roundtrip", + "Curve/Surface/Font/Metaball non-mesh mapping", + "desktop GLB Main persistence in Chromium" + ], + "negative": [ + "sparse or oversized GLB", + "external URI/extension rejection", + "non-mesh export loss gate" + ], + "recovery": [ + "cancel without publishing output", + "Worker restart", + "OPFS quota retains old asset", + "deterministic Blender roundtrip" + ], + "commands": [ + "npm --prefix web run test:glb-blender-roundtrip", + "npm --prefix web run test:nonmesh-glb-blender-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/glb-negative-cases.spec.ts tests/e2e/glb-recovery.spec.ts tests/e2e/glb-main-persistence.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1124-000", + "phase": "1124", + "title": "record_historical_hash_drift_module", + "kind": "module", + "owner": "PROVENANCE", + "dependsOn": [ + "WBV2-P1123-000" + ], + "parityId": "HISTORICAL_HASH_DRIFT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-historical_hash_drift", + "gate": "EVIDENCE", + "card": "docs/tasks/WBV2-P1124-000.md", + "behavior": "Record legacy M12 artifact hash drift without re-signing historical manifests or changing the immutable inventory.", + "outputs": [ + "drift report", + "module receipt", + "manifest", + "status" + ], + "acceptance": [ + "original and observed hashes are recorded", + "provenance remains BLOCKED_SOURCE_LOST where bytes cannot be restored", + "historical manifests and inventory remain unchanged", + "deterministic drift evidence is reproducible", + "no full-family parity claim" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "HISTORICAL_HASH_DRIFT", + "sourceBacked": true, + "capabilities": [ + "CAP-HISTORICAL-HASH-AUDIT", + "CAP-PROVENANCE-SOURCE-LOST-GATE" + ], + "sourcePaths": [ + "tools/web/check-m12-manifest-drift.mjs", + "tests/golden/corrective/rehydration/M12-manifest-sha-drift.json", + "tests/golden/WBV2-P0-002/parity-map.json" + ], + "reuseReceipts": [], + "positive": [ + "84 drift entries captured", + "43 affected artifact paths indexed", + "immutable inventory binding preserved" + ], + "negative": [ + "missing original bytes", + "attempted historical re-signing", + "inventory mutation" + ], + "recovery": [ + "deterministic report rerun", + "source cache can restore original bytes later", + "new capability manifests reference drift evidence only" + ], + "commands": [ + "node tools/web/check-m12-manifest-drift.mjs --write", + "node tools/web/check-m12-manifest-drift.mjs", + "node tools/web/check-wbv2-module-execution.mjs" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1125-000", + "phase": "1125", + "title": "repair_geometry_nodes_allowlist_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1124-000" + ], + "parityId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-geometry_nodes_allowlist_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1125-000.md", + "behavior": "Persist Geometry Nodes graph overrides in Web-safe Main storage and align allowlist assertions with real materialization behavior.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "supported graph Main materialization is proven", + "unsupported graph remains rejected without mutation", + "save/reopen graph retention is exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-MAIN-PERSISTENCE", + "CAP-GEOMETRY-NODES-ALLOWLIST-CONSISTENCY", + "CAP-GEOMETRY-NODES-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/web-engine.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/geometry-node-allowlist.spec.ts", + "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "allowlisted graph materializes into Main", + "Scene IDProperty graph override persists", + "save/reopen retains graph identity/hash" + ], + "negative": [ + "unsupported simulation node", + "invalid graph schema", + "missing node/link endpoint" + ], + "recovery": [ + "rejected graph leaves baseline unchanged", + "undo/redo graph override", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:geometry-node-allowlist", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1126-000", + "phase": "1126", + "title": "verify_grease_pencil_viewport_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1125-000" + ], + "parityId": "GREASE_PENCIL_VIEWPORT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-grease_pencil_viewport", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1126-000.md", + "behavior": "Verify Grease Pencil 2D/3D selection and marquee integration on both viewport backends using an isolated Chromium port.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "2D and 3D selection revisions converge", + "main-thread and Offscreen marquee are exact", + "stale/foreign selection cases remain fail-closed", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_VIEWPORT", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-SELECTION-REVISION", + "CAP-GREASE-PENCIL-MARQUEE-MAIN", + "CAP-GREASE-PENCIL-MARQUEE-OFFSCREEN" + ], + "sourcePaths": [ + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/workers/viewport-render.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "2D canvas selection revision", + "main-thread 3D marquee selection", + "OffscreenCanvas 3D marquee selection" + ], + "negative": [ + "stale selection revision", + "foreign drawing identity", + "duplicate or forged point candidate" + ], + "recovery": [ + "selection convergence across backends", + "worker viewport restart", + "deterministic repeated marquee", + "preserve Main revision" + ], + "commands": [ + "WEB_TEST_PORT=5331 npm --prefix web run test:e2e -- --workers=1 tests/e2e/grease-pencil-selection.spec.ts tests/e2e/grease-pencil-marquee.spec.ts", + "node --test web/tests/unit/grease-pencil-selection.test.mjs web/tests/unit/grease-pencil-marquee.test.mjs", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1127-000", + "phase": "1127", + "title": "verify_tracking_mask_module", + "kind": "module", + "owner": "TRACKING", + "dependsOn": [ + "WBV2-P1126-000" + ], + "parityId": "TRACKING_MASK", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-tracking_mask", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1127-000.md", + "behavior": "Verify Mask reader, editable point raycast/marquee and tracking capability gates through Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Mask reader and interaction evidence is proven", + "negative solve/resource cases are proven", + "Chromium stable IDs and recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TRACKING_MASK", + "sourceBacked": true, + "capabilities": [ + "CAP-MASK-MAIN-READER", + "CAP-MASK-POINT-RAYCAST", + "CAP-TRACKING-SOLVE-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/tracking-mask.ts", + "web/protocol/scene-ir.ts", + "web/app/src/tracking/MaskSelection.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/smoke.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Mask layers and splines reader", + "editable Mask point raycast", + "N-022 tracking marker/mask gate" + ], + "negative": [ + "foreign mask point identity", + "missing resource binding", + "camera solve unavailable" + ], + "recovery": [ + "main/offscreen marquee parity", + "worker restart", + "deterministic stable IDs", + "preserve source Main on blocked solve" + ], + "commands": [ + "npm --prefix web run test:mask-main-reader", + "WEB_TEST_PORT=5340 npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-022 tracking|real Blender 5.2 Mask\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1128-000", + "phase": "1128", + "title": "verify_ffmpeg_movie_codec_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1127-000" + ], + "parityId": "SEQUENCER_MOVIE_CODEC", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-sequencer_movie_codec", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1128-000.md", + "behavior": "Use a local ffmpeg.wasm Worker fallback for movie probing and proxy-frame extraction when Chromium HTML media decoding is unavailable.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and core-resource hashes are bound", + "positive MP4 probe and RGBA frame are proven", + "corrupt and source-identity cases are rejected", + "AbortSignal cancellation leaves no live Worker", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SEQUENCER_MOVIE_CODEC", + "sourceBacked": true, + "capabilities": [ + "CAP-FFMPEG-WASM-MOVIE-PROBE", + "CAP-FFMPEG-WASM-PROXY-FRAME", + "CAP-MOVIE-CODEC-RECOVERY" + ], + "sourcePaths": [ + "web/package.json", + "web/package-lock.json", + "web/protocol/sequencer.ts", + "web/app/src/sequencer/SequencerCodecProbe.ts", + "web/app/src/sequencer/FFmpegMovieProbe.ts", + "web/app/src/sequencer/ffmpeg-movie-probe.worker.ts", + "web/app/src/sequencer/SequencerMediaProxyCache.ts", + "web/app/src/vendor/ffmpeg/ffmpeg-core.js", + "web/app/src/vendor/ffmpeg/ffmpeg-core.wasm", + "web/app/public/vendor/ffmpeg/ffmpeg-core.js", + "web/app/public/vendor/ffmpeg/ffmpeg-core.wasm", + "third_party/ffmpeg.wasm/package.json", + "third_party/ffmpeg.wasm/README.md", + "web/tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "browser decode fallback to ffmpeg.wasm", + "16x16 MP4 metadata probe", + "8x8 RGBA proxy frame extraction" + ], + "negative": [ + "corrupt movie payload", + "source SHA mismatch", + "ffmpeg runtime unavailable" + ], + "recovery": [ + "AbortSignal cancellation", + "Worker termination after response", + "cache manifest identity binding", + "deterministic repeated probe" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5342 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1129-000", + "phase": "1129", + "title": "authorize_scene_settings_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1128-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1129", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-000.md", + "behavior": "Authorize one source-backed Core Scene Graph settings module after the terminal P1128 module epoch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1128 evidence remains hash-bound", + "existing receipts are reused", + "inventory remains immutable", + "one source-backed module is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ] + }, + { + "id": "WBV2-P1129-001", + "phase": "1129", + "title": "verify_scene_settings_module", + "kind": "module", + "owner": "CORE_SCENE", + "dependsOn": [ + "WBV2-P1129-000" + ], + "parityId": "CORE_SCENE_GRAPH_SETTINGS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-core_scene_graph_settings", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-001.md", + "behavior": "Verify the existing Blender Main scene compositor, performance and sampling setting transactions as one aggregate module.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutations are proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORE_SCENE_GRAPH_SETTINGS", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "positive": [ + "compositor device/precision mutation", + "performance thread/persistence mutation", + "sampling filter/dither mutation" + ], + "negative": [ + "invalid sampling range", + "unknown scene target", + "malformed property set" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic scene settings snapshot" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5344 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1130-000", + "phase": "1130", + "title": "authorize_editor_view2d_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1129-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1130", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-000.md", + "behavior": "Authorize one source-backed UI editor View2D reader/protocol module after the P1129 scene settings module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1129 evidence remains hash-bound", + "P1102 editor workflow source remains unchanged", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1130-001", + "phase": "1130", + "title": "verify_editor_view2d_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1130-000" + ], + "parityId": "UI_EDITOR_VIEW2D_STATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor_view2d_state", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-001.md", + "behavior": "Preserve Blender Graph/Dope Sheet View2D cur and mask state through the Web editor protocol without changing the existing editor workflow parser.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader state is proven", + "negative no-publish and recovery are proven", + "Chromium and save/reopen compatibility are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR_VIEW2D_STATE", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/editor-view2d.ts", + "web/app/src/workers/editor-view2d-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Graph main-region View2D cur retention", + "Graph main-region pixel mask retention", + "reader/protocol exact state" + ], + "negative": [ + "inverted View2D bounds", + "malformed mask range", + "missing View2D payload" + ], + "recovery": [ + "immutable base editor workflow", + "worker termination", + "deterministic repeated parse", + "save/reopen reader compatibility" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5346 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1131-000", + "phase": "1131", + "title": "authorize_curve_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1130-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1131", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-000.md", + "behavior": "Authorize one source-backed Curve topology editor module after the P1130 View2D module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1130 evidence remains hash-bound", + "Curve topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1131-001", + "phase": "1131", + "title": "verify_curve_topology_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1131-000" + ], + "parityId": "CURVE_TOPOLOGY_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_topology_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-001.md", + "behavior": "Verify the Blender Curve TOGGLE_CYCLIC topology transaction through the existing Main, protocol, Worker and frontend path.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_TOPOLOGY_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/curve-topology-editor.ts", + "web/app/src/workers/curve-topology-contract-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/curve-topology-contract.spec.ts", + "web/tests/e2e/curve-topology-operator.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "TOGGLE_CYCLIC Main mutation", + "operator gate exposes only verified capability", + "save/reopen preserves cyclic spline state" + ], + "negative": [ + "unknown curve operator", + "stale revision claim", + "selection and payload budget overflow" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic contract parse" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5347 npm --prefix web run test:e2e -- --workers=1 tests/e2e/curve-topology-contract.spec.ts tests/e2e/curve-topology-operator.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1132-000", + "phase": "1132", + "title": "authorize_curve_handle_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1131-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1132", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-000.md", + "behavior": "Authorize one source-backed Curve handle gizmo module after the P1131 topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1131 evidence remains hash-bound", + "Curve handle source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1132-001", + "phase": "1132", + "title": "verify_curve_handle_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1132-000" + ], + "parityId": "CURVE_HANDLE_GIZMO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_handle_gizmo", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-001.md", + "behavior": "Verify Curve handle position edits through Blender Main, protocol, Worker, renderer preview and frontend gizmo.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_HANDLE_GIZMO", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/nonmesh-interaction.ts", + "web/app/src/workers/nonmesh-interaction-test.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/nonmesh.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Curve handle position Main mutation", + "local handle gizmo preview", + "save/reopen preserves handle state" + ], + "negative": [ + "invalid handle identity", + "stale base revision", + "malformed handle position" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic preview" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5348 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1133-000", + "phase": "1133", + "title": "authorize_curve_splines_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1132-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1133", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-000.md", + "behavior": "Authorize one source-backed Curve spline transaction module after the P1132 handle module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1132 evidence remains hash-bound", + "Curve spline source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1133-001", + "phase": "1133", + "title": "verify_curve_splines_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1133-000" + ], + "parityId": "CURVE_SPLINES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_splines_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-001.md", + "behavior": "Verify complete Curve spline replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SPLINES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "complete Curve spline Main transaction", + "POLY/BEZIER descriptor retention", + "save/reopen preserves spline state" + ], + "negative": [ + "invalid spline offsets", + "stale base revision", + "mismatched handle payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic binary-geometry transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5349 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1134-000", + "phase": "1134", + "title": "authorize_surface_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1133-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1134", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-000.md", + "behavior": "Authorize one source-backed Surface topology transaction module after the P1133 Curve spline module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1133 evidence remains hash-bound", + "Surface topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1134-001", + "phase": "1134", + "title": "verify_surface_topology_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1134-000" + ], + "parityId": "SURFACE_TOPOLOGY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-surface_topology_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-001.md", + "behavior": "Verify Surface NURBS topology replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SURFACE_TOPOLOGY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Surface topology Main transaction", + "NURBS dimensions and weights retention", + "save/reopen preserves surface state" + ], + "negative": [ + "invalid surface dimensions", + "stale base revision", + "control grid budget mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic surface transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5350 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1135-000", + "phase": "1135", + "title": "authorize_font_body_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1134-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1135", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-000.md", + "behavior": "Authorize one source-backed Font body transaction module after the P1134 Surface topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1134 evidence remains hash-bound", + "Font body source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1135-001", + "phase": "1135", + "title": "verify_font_body_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1135-000" + ], + "parityId": "FONT_BODY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_body_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-001.md", + "behavior": "Verify Font body replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_BODY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-body-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font body Main mutation", + "UTF-8 text retention", + "save/reopen preserves text" + ], + "negative": [ + "unknown Font data ID", + "body byte budget overflow", + "malformed body payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic text state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5351 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-body-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1136-000", + "phase": "1136", + "title": "authorize_font_properties_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1135-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1136", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-000.md", + "behavior": "Authorize one source-backed Font properties transaction module after the P1135 Font body module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1135 evidence remains hash-bound", + "Font property source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1136-001", + "phase": "1136", + "title": "verify_font_properties_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1136-000" + ], + "parityId": "FONT_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-001.md", + "behavior": "Verify Font property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font property Main mutation", + "bounded alignment/extrude fields", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Font data ID", + "invalid alignment enum", + "out-of-range numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5352 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1137-000", + "phase": "1137", + "title": "authorize_metaball_elements_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1136-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1137", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-000.md", + "behavior": "Authorize one source-backed Metaball element transaction module after the P1136 Font properties module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1136 evidence remains hash-bound", + "Metaball element source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1137-001", + "phase": "1137", + "title": "verify_metaball_elements_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1137-000" + ], + "parityId": "METABALL_ELEMENTS_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-metaball_elements_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-001.md", + "behavior": "Verify Metaball element replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "METABALL_ELEMENTS_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Metaball element Main mutation", + "bounded position/radius/scale retention", + "save/reopen preserves elements" + ], + "negative": [ + "unknown Metaball data ID", + "invalid radius", + "element count topology mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic element state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1138-000", + "phase": "1138", + "title": "authorize_text_source_module", + "kind": "enabling", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1137-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1138", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-000.md", + "behavior": "Authorize a source-backed Text datablock mutation after the P1137 Metaball module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1137 evidence remains hash-bound", + "ID_TXT is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1138-001", + "phase": "1138", + "title": "verify_text_source_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1138-000" + ], + "parityId": "TEXT_SOURCE_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-text_source_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-001.md", + "behavior": "Verify Text source replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXT_SOURCE_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-text-source-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "positive": [ + "Text source Main mutation", + "ID_TXT registration in WITH_WEB", + "save/reopen preserves source" + ], + "negative": [ + "unknown Text data ID", + "source over 1 MiB", + "linked/read-only Text" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic source state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-text-source-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1139-000", + "phase": "1139", + "title": "authorize_texture_properties_module", + "kind": "enabling", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1138-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1139", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-000.md", + "behavior": "Authorize a source-backed Texture property mutation module after P1138 Text.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1138 evidence remains hash-bound", + "ID_TE is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1139-001", + "phase": "1139", + "title": "verify_texture_properties_module", + "kind": "module", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1139-000" + ], + "parityId": "TEXTURE_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-texture_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-001.md", + "behavior": "Verify Texture property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXTURE_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-texture-properties-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "positive": [ + "Texture property Main mutation", + "ID_TE registration in WITH_WEB", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Texture data ID", + "noise depth outside Blender bounds", + "non-finite numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-texture-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1140-000", + "phase": "1140", + "title": "authorize_action_group_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1139-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1140", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-000.md", + "behavior": "Authorize a source-backed ActionGroup reader and recovery module after P1139 Texture.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1139 evidence remains hash-bound", + "ActionGroup has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1140-001", + "phase": "1140", + "title": "verify_action_group_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-000" + ], + "parityId": "ACTION_GROUP_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_group_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-001.md", + "behavior": "Verify ActionGroup metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_GROUP_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-group-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "positive": [ + "ActionGroup Main reader exposes group and expanded metadata", + "three grouped location F-Curves remain grouped", + "save/reopen preserves group metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "unsupported group payload is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic group state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5356 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-group-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1141-000", + "phase": "1141", + "title": "authorize_action_pose_markers_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1141", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-000.md", + "behavior": "Authorize a source-backed ActionPoseMarkers reader and recovery module after P1140.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1140 evidence remains hash-bound", + "ActionPoseMarkers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1141-001", + "phase": "1141", + "title": "verify_action_pose_markers_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-000" + ], + "parityId": "ACTION_POSE_MARKERS_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_pose_markers_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-001.md", + "behavior": "Verify ActionPoseMarkers metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_POSE_MARKERS_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-pose-markers-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "positive": [ + "ActionPoseMarkers Main reader exposes marker names and frames", + "three Blender pose markers remain ordered", + "save/reopen preserves marker metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "non-finite marker frame is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic marker state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5359 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-pose-markers-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1142-000", + "phase": "1142", + "title": "authorize_fcurve_sample_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1142", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-000.md", + "behavior": "Authorize a source-backed FCurveSample reader and recovery module after P1141.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1141 evidence remains hash-bound", + "FCurveSample has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1142-001", + "phase": "1142", + "title": "verify_fcurve_sample_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-000" + ], + "parityId": "FCURVE_SAMPLE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_sample_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-001.md", + "behavior": "Verify FCurveSample data through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_SAMPLE_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-sample-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "positive": [ + "FCurveSample Main reader exposes sampled source and values", + "four native FPoint samples remain ordered", + "save/reopen preserves sampled data" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing sampled payload is fail-closed", + "non-finite sampled value is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic sampled state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5365 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-sample-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1143-000", + "phase": "1143", + "title": "authorize_fcurve_modifier_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1143", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-000.md", + "behavior": "Authorize a source-backed FCurve modifier reader and recovery module after P1142.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1142 evidence remains hash-bound", + "FCurveModifiers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1143-001", + "phase": "1143", + "title": "verify_fcurve_modifier_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-000" + ], + "parityId": "FCURVE_MODIFIER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-001.md", + "behavior": "Verify FCurve modifier metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "positive": [ + "FCurveModifiers Main reader exposes native modifier stack", + "FModifierCycles preserves type/name/flags/influence", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing modifier payload is fail-closed", + "unsupported modifier type is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic modifier state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5368 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1144-000", + "phase": "1144", + "title": "authorize_driver_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1144", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-000.md", + "behavior": "Authorize a source-backed Driver reader and recovery module after P1143.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1143 evidence remains hash-bound", + "Driver has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1144-001", + "phase": "1144", + "title": "verify_driver_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1144-000" + ], + "parityId": "DRIVER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-driver_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-001.md", + "behavior": "Verify Driver metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "DRIVER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-driver-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "positive": [ + "AnimData driver list is read from Blender Main", + "Driver preserves scripted expression and variables", + "save/reopen preserves driver metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing driver target is fail-closed", + "non-finite driver influence is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic driver state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-driver-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1145-000", + "phase": "1145", + "title": "authorize_corrective_smooth_reader_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1144-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1145", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-000.md", + "behavior": "Authorize a source-backed Corrective Smooth reader/recovery module after the Driver reader.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "Corrective Smooth has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1145-001", + "phase": "1145", + "title": "verify_corrective_smooth_reader_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1145-000" + ], + "parityId": "CORRECTIVE_SMOOTH_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-corrective_smooth_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-001.md", + "behavior": "Verify Corrective Smooth modifier type and RNA metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORRECTIVE_SMOOTH_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "Corrective Smooth type is read from Blender Main", + "RNA metadata is preserved", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported modifier data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1146-000", + "phase": "1146", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1145-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1146", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1146-001", + "phase": "1146", + "title": "verify modifier reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1146-000" + ], + "parityId": "MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_datatransfer type is read from Blender Main", + "MOD_dynamicpaint type is read from Blender Main", + "MOD_explode type is read from Blender Main", + "MOD_fluid type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_datatransfer", + "modifier-source:MOD_dynamicpaint", + "modifier-source:MOD_explode", + "modifier-source:MOD_fluid", + "rna-struct:DataTransferModifier", + "rna-struct:DynamicPaintModifier", + "rna-struct:ExplodeModifier", + "rna-struct:FluidModifier", + "rna-struct:FluidDomainSettings" + ] + } + }, + { + "id": "WBV2-P1147-000", + "phase": "1147", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1146-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1147", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1147-001", + "phase": "1147", + "title": "verify modifier reader batch two", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1147-000" + ], + "parityId": "MODIFIER_READER_BATCH_TWO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_two", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_TWO batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_TWO", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_laplaciandeform type is read from Blender Main", + "MOD_laplaciansmooth type is read from Blender Main", + "MOD_mask type is read from Blender Main", + "MOD_mesh_to_volume type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_laplaciandeform", + "modifier-source:MOD_laplaciansmooth", + "modifier-source:MOD_mask", + "modifier-source:MOD_shrinkwrap", + "rna-struct:LaplacianDeformModifier", + "rna-struct:LaplacianSmoothModifier", + "rna-struct:MaskModifier", + "rna-struct:ShrinkwrapModifier" + ] + } + }, + { + "id": "WBV2-P1148-000", + "phase": "1148", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1147-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1148", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1148-001", + "phase": "1148", + "title": "verify modifier reader batch three", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1148-000" + ], + "parityId": "MODIFIER_READER_BATCH_THREE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_three", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_THREE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_THREE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_remesh type is read from Blender Main", + "MOD_skin type is read from Blender Main", + "MOD_weighted_normal type is read from Blender Main", + "MOD_warp type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1148-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_three_scene.blend WBV2_BATCH_TYPES='[\"REMESH\",\"SKIN\",\"WEIGHTED_NORMAL\",\"WARP\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_remesh\",\"modifier-source:MOD_skin\",\"modifier-source:MOD_weighted_normal\",\"modifier-source:MOD_warp\",\"rna-struct:RemeshModifier\",\"rna-struct:SkinModifier\",\"rna-struct:WeightedNormalModifier\",\"rna-struct:WarpModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_remesh", + "modifier-source:MOD_skin", + "modifier-source:MOD_weighted_normal", + "modifier-source:MOD_warp", + "rna-struct:RemeshModifier", + "rna-struct:SkinModifier", + "rna-struct:WeightedNormalModifier", + "rna-struct:WarpModifier" + ] + } + }, + { + "id": "WBV2-P1149-000", + "phase": "1149", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1148-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1149", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1149-001", + "phase": "1149", + "title": "verify modifier reader batch four", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1149-000" + ], + "parityId": "MODIFIER_READER_BATCH_FOUR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_four", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FOUR batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FOUR", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_uvproject type is read from Blender Main", + "MOD_uvwarp type is read from Blender Main", + "MOD_volume_displace type is read from Blender Main", + "MOD_volume_to_mesh type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1149-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_four_scene.blend WBV2_BATCH_TYPES='[\"UV_PROJECT\",\"UV_WARP\",\"NORMAL_EDIT\",\"VOLUME_TO_MESH\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_uvproject\",\"modifier-source:MOD_uvwarp\",\"modifier-source:MOD_normal_edit\",\"modifier-source:MOD_volume_to_mesh\",\"rna-struct:UVProjectModifier\",\"rna-struct:UVWarpModifier\",\"rna-struct:NormalEditModifier\",\"rna-struct:VolumeToMeshModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1149-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_uvproject", + "modifier-source:MOD_uvwarp", + "modifier-source:MOD_normal_edit", + "modifier-source:MOD_volume_to_mesh", + "rna-struct:UVProjectModifier", + "rna-struct:UVWarpModifier", + "rna-struct:NormalEditModifier", + "rna-struct:VolumeToMeshModifier" + ] + } + }, + { + "id": "WBV2-P1150-000", + "phase": "1150", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1149-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1150", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1150-001", + "phase": "1150", + "title": "verify modifier reader batch five", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1150-000" + ], + "parityId": "MODIFIER_READER_BATCH_FIVE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_five", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FIVE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FIVE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_meshcache type is read from Blender Main", + "MOD_meshsequencecache type is read from Blender Main", + "MOD_multires type is read from Blender Main", + "MOD_ocean type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1150-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_five_scene.blend WBV2_BATCH_TYPES='[\"MESH_CACHE\",\"MESH_SEQUENCE_CACHE\",\"MULTIRES\",\"OCEAN\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_meshcache\",\"modifier-source:MOD_meshsequencecache\",\"modifier-source:MOD_multires\",\"modifier-source:MOD_ocean\",\"rna-struct:MeshCacheModifier\",\"rna-struct:MeshSequenceCacheModifier\",\"rna-struct:MultiresModifier\",\"rna-struct:OceanModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_meshcache", + "modifier-source:MOD_meshsequencecache", + "modifier-source:MOD_multires", + "modifier-source:MOD_ocean", + "rna-struct:MeshCacheModifier", + "rna-struct:MeshSequenceCacheModifier", + "rna-struct:MultiresModifier", + "rna-struct:OceanModifier" + ] + } + }, + { + "id": "WBV2-P1151-000", + "phase": "1151", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1150-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1151", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1151-001", + "phase": "1151", + "title": "verify Grease Pencil modifier reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1151-000" + ], + "parityId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil_modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-001.md", + "behavior": "Verify the GREASE_PENCIL_MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_grease_pencil_armature type is read from Blender Main", + "MOD_grease_pencil_array type is read from Blender Main", + "MOD_grease_pencil_build type is read from Blender Main", + "MOD_grease_pencil_color type is read from Blender Main", + "MOD_grease_pencil_dash type is read from Blender Main", + "MOD_grease_pencil_envelope type is read from Blender Main", + "MOD_grease_pencil_hook type is read from Blender Main", + "MOD_grease_pencil_lattice type is read from Blender Main", + "MOD_grease_pencil_length type is read from Blender Main", + "MOD_grease_pencil_mirror type is read from Blender Main", + "MOD_grease_pencil_multiply type is read from Blender Main", + "MOD_grease_pencil_noise type is read from Blender Main", + "MOD_grease_pencil_offset type is read from Blender Main", + "MOD_grease_pencil_opacity type is read from Blender Main", + "MOD_grease_pencil_outline type is read from Blender Main", + "MOD_grease_pencil_shrinkwrap type is read from Blender Main", + "MOD_grease_pencil_simplify type is read from Blender Main", + "MOD_grease_pencil_smooth type is read from Blender Main", + "MOD_grease_pencil_subdiv type is read from Blender Main", + "MOD_grease_pencil_texture type is read from Blender Main", + "MOD_grease_pencil_thickness type is read from Blender Main", + "MOD_grease_pencil_time type is read from Blender Main", + "MOD_grease_pencil_tint type is read from Blender Main", + "MOD_grease_pencil_weight_angle type is read from Blender Main", + "MOD_grease_pencil_weight_proximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1151-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_grease_pencil_scene.blend WBV2_BATCH_TYPES='[\"GREASE_PENCIL_ARMATURE\",\"GREASE_PENCIL_ARRAY\",\"GREASE_PENCIL_BUILD\",\"GREASE_PENCIL_COLOR\",\"GREASE_PENCIL_DASH\",\"GREASE_PENCIL_ENVELOPE\",\"GREASE_PENCIL_HOOK\",\"GREASE_PENCIL_LATTICE\",\"GREASE_PENCIL_LENGTH\",\"GREASE_PENCIL_MIRROR\",\"GREASE_PENCIL_MULTIPLY\",\"GREASE_PENCIL_NOISE\",\"GREASE_PENCIL_OFFSET\",\"GREASE_PENCIL_OPACITY\",\"GREASE_PENCIL_OUTLINE\",\"GREASE_PENCIL_SHRINKWRAP\",\"GREASE_PENCIL_SIMPLIFY\",\"GREASE_PENCIL_SMOOTH\",\"GREASE_PENCIL_SUBDIV\",\"GREASE_PENCIL_TEXTURE\",\"GREASE_PENCIL_THICKNESS\",\"GREASE_PENCIL_TIME\",\"GREASE_PENCIL_TINT\",\"GREASE_PENCIL_VERTEX_WEIGHT_ANGLE\",\"GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_grease_pencil_armature\",\"modifier-source:MOD_grease_pencil_array\",\"modifier-source:MOD_grease_pencil_build\",\"modifier-source:MOD_grease_pencil_color\",\"modifier-source:MOD_grease_pencil_dash\",\"modifier-source:MOD_grease_pencil_envelope\",\"modifier-source:MOD_grease_pencil_hook\",\"modifier-source:MOD_grease_pencil_lattice\",\"modifier-source:MOD_grease_pencil_length\",\"modifier-source:MOD_grease_pencil_mirror\",\"modifier-source:MOD_grease_pencil_multiply\",\"modifier-source:MOD_grease_pencil_noise\",\"modifier-source:MOD_grease_pencil_offset\",\"modifier-source:MOD_grease_pencil_opacity\",\"modifier-source:MOD_grease_pencil_outline\",\"modifier-source:MOD_grease_pencil_shrinkwrap\",\"modifier-source:MOD_grease_pencil_simplify\",\"modifier-source:MOD_grease_pencil_smooth\",\"modifier-source:MOD_grease_pencil_subdiv\",\"modifier-source:MOD_grease_pencil_texture\",\"modifier-source:MOD_grease_pencil_thickness\",\"modifier-source:MOD_grease_pencil_time\",\"modifier-source:MOD_grease_pencil_tint\",\"modifier-source:MOD_grease_pencil_weight_angle\",\"modifier-source:MOD_grease_pencil_weight_proximity\",\"rna-struct:GreasePencilArmatureModifier\",\"rna-struct:GreasePencilArrayModifier\",\"rna-struct:GreasePencilBuildModifier\",\"rna-struct:GreasePencilColorModifier\",\"rna-struct:GreasePencilEnvelopeModifier\",\"rna-struct:GreasePencilHookModifier\",\"rna-struct:GreasePencilLatticeModifier\",\"rna-struct:GreasePencilLengthModifier\",\"rna-struct:GreasePencilMirrorModifier\",\"rna-struct:GreasePencilMultiplyModifier\",\"rna-struct:GreasePencilNoiseModifier\",\"rna-struct:GreasePencilOffsetModifier\",\"rna-struct:GreasePencilOpacityModifier\",\"rna-struct:GreasePencilOutlineModifier\",\"rna-struct:GreasePencilShrinkwrapModifier\",\"rna-struct:GreasePencilSimplifyModifier\",\"rna-struct:GreasePencilSmoothModifier\",\"rna-struct:GreasePencilSubdivModifier\",\"rna-struct:GreasePencilTextureModifier\",\"rna-struct:GreasePencilTimeModifier\",\"rna-struct:GreasePencilTintModifier\",\"rna-struct:GreasePencilWeightAngleModifier\",\"rna-struct:GreasePencilWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_armature", + "modifier-source:MOD_grease_pencil_array", + "modifier-source:MOD_grease_pencil_build", + "modifier-source:MOD_grease_pencil_color", + "modifier-source:MOD_grease_pencil_dash", + "modifier-source:MOD_grease_pencil_envelope", + "modifier-source:MOD_grease_pencil_hook", + "modifier-source:MOD_grease_pencil_lattice", + "modifier-source:MOD_grease_pencil_length", + "modifier-source:MOD_grease_pencil_mirror", + "modifier-source:MOD_grease_pencil_multiply", + "modifier-source:MOD_grease_pencil_noise", + "modifier-source:MOD_grease_pencil_offset", + "modifier-source:MOD_grease_pencil_opacity", + "modifier-source:MOD_grease_pencil_outline", + "modifier-source:MOD_grease_pencil_shrinkwrap", + "modifier-source:MOD_grease_pencil_simplify", + "modifier-source:MOD_grease_pencil_smooth", + "modifier-source:MOD_grease_pencil_subdiv", + "modifier-source:MOD_grease_pencil_texture", + "modifier-source:MOD_grease_pencil_thickness", + "modifier-source:MOD_grease_pencil_time", + "modifier-source:MOD_grease_pencil_tint", + "modifier-source:MOD_grease_pencil_weight_angle", + "modifier-source:MOD_grease_pencil_weight_proximity", + "rna-struct:GreasePencilArmatureModifier", + "rna-struct:GreasePencilArrayModifier", + "rna-struct:GreasePencilBuildModifier", + "rna-struct:GreasePencilColorModifier", + "rna-struct:GreasePencilEnvelopeModifier", + "rna-struct:GreasePencilHookModifier", + "rna-struct:GreasePencilLatticeModifier", + "rna-struct:GreasePencilLengthModifier", + "rna-struct:GreasePencilMirrorModifier", + "rna-struct:GreasePencilMultiplyModifier", + "rna-struct:GreasePencilNoiseModifier", + "rna-struct:GreasePencilOffsetModifier", + "rna-struct:GreasePencilOpacityModifier", + "rna-struct:GreasePencilOutlineModifier", + "rna-struct:GreasePencilShrinkwrapModifier", + "rna-struct:GreasePencilSimplifyModifier", + "rna-struct:GreasePencilSmoothModifier", + "rna-struct:GreasePencilSubdivModifier", + "rna-struct:GreasePencilTextureModifier", + "rna-struct:GreasePencilTimeModifier", + "rna-struct:GreasePencilTintModifier", + "rna-struct:GreasePencilWeightAngleModifier", + "rna-struct:GreasePencilWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1152-000", + "phase": "1152", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1151-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1152", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1152-001", + "phase": "1152", + "title": "verify modifier reader batch six", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1152-000" + ], + "parityId": "MODIFIER_READER_BATCH_SIX", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_six", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_SIX batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_SIX", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_mesh_to_volume type is read from Blender Main", + "MOD_particleinstance type is read from Blender Main", + "MOD_surface type is read from Blender Main", + "MOD_weightvgedit type is read from Blender Main", + "MOD_weightvgmix type is read from Blender Main", + "MOD_weightvgproximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1152-001 WBV2_BATCH_FIXTURES='[\"tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend\",\"tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend\",\"tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend\",\"tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend\",\"tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend\",\"tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend\"]' WBV2_BATCH_TYPES='[\"MESH_TO_VOLUME\",\"PARTICLE_INSTANCE\",\"SURFACE\",\"VERTEX_WEIGHT_EDIT\",\"VERTEX_WEIGHT_MIX\",\"VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_mesh_to_volume\",\"modifier-source:MOD_particleinstance\",\"modifier-source:MOD_surface\",\"modifier-source:MOD_weightvgedit\",\"modifier-source:MOD_weightvgmix\",\"modifier-source:MOD_weightvgproximity\",\"rna-struct:MeshToVolumeModifier\",\"rna-struct:ParticleInstanceModifier\",\"rna-struct:SurfaceModifier\",\"rna-struct:VertexWeightEditModifier\",\"rna-struct:VertexWeightMixModifier\",\"rna-struct:VertexWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_mesh_to_volume", + "modifier-source:MOD_particleinstance", + "modifier-source:MOD_surface", + "modifier-source:MOD_weightvgedit", + "modifier-source:MOD_weightvgmix", + "modifier-source:MOD_weightvgproximity", + "rna-struct:MeshToVolumeModifier", + "rna-struct:ParticleInstanceModifier", + "rna-struct:SurfaceModifier", + "rna-struct:VertexWeightEditModifier", + "rna-struct:VertexWeightMixModifier", + "rna-struct:VertexWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1153-000", + "phase": "1153", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1152-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1153", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1153-001", + "phase": "1153", + "title": "reuse verified modifier receipts for shared source utilities", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1153-000" + ], + "parityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_source_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-001.md", + "behavior": "Verify the MODIFIER_SOURCE_DEPENDENCY_REUSE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "dependencyReuse": [ + { + "unitId": "modifier-source:MOD_grease_pencil_util", + "representativeUnitId": "modifier-source:MOD_grease_pencil_array", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "marker": "MOD_grease_pencil_util.hh", + "productionEvidence": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_mdd", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_mdd_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_pc2", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_pc2_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_util", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_util.hh", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_weightvg_util", + "representativeUnitId": "modifier-source:MOD_weightvgedit", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "marker": "MOD_weightvg_util.hh", + "productionEvidence": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + } + ], + "positive": [ + "MOD_grease_pencil_util type is read from Blender Main", + "MOD_meshcache_mdd type is read from Blender Main", + "MOD_meshcache_pc2 type is read from Blender Main", + "MOD_meshcache_util type is read from Blender Main", + "MOD_weightvg_util type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "node tools/web/reuse-wbv2-source-dependencies.mjs --task WBV2-P1153-001 --write" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_util", + "modifier-source:MOD_meshcache_mdd", + "modifier-source:MOD_meshcache_pc2", + "modifier-source:MOD_meshcache_util", + "modifier-source:MOD_weightvg_util" + ] + } + }, + { + "id": "WBV2-P1154-000", + "phase": "1154", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1153-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1154", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1154-001", + "phase": "1154", + "title": "verify solidify split helper sources", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1154-000" + ], + "parityId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_solidify_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-001.md", + "behavior": "Verify the MODIFIER_SOLIDIFY_HELPER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-READER", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_generate_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "positive": [ + "MOD_solidify_extrude type is read from Blender Main", + "MOD_solidify_nonmanifold type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1154-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/modifier_generate_scene.blend WBV2_BATCH_TYPES='[\"SOLIDIFY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_solidify_extrude\",\"modifier-source:MOD_solidify_nonmanifold\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_solidify_extrude", + "modifier-source:MOD_solidify_nonmanifold" + ] + } + }, + { + "id": "WBV2-P1155-000", + "phase": "1155", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1154-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1155", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1155-001", + "phase": "1155", + "title": "verify modifier RNA reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1155-000" + ], + "parityId": "MODIFIER_RNA_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_rna_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-001.md", + "behavior": "Verify the MODIFIER_RNA_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_RNA_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_lineart type is read from Blender Main", + "MOD_particlesystem type is read from Blender Main", + "MOD_decimate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1155-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURES='[\"tests/files/web/modifier_grease_pencil_scene.blend\",\"tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend\",\"tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend\"]' WBV2_BATCH_TYPES='[\"LINEART\",\"PARTICLE_SYSTEM\",\"DECIMATE\"]' WBV2_BATCH_UNITS='[\"rna-struct:GreasePencilLineartModifier\",\"rna-struct:ParticleSystemModifier\",\"rna-struct:DecimateModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "rna-struct:GreasePencilLineartModifier", + "rna-struct:ParticleSystemModifier", + "rna-struct:DecimateModifier" + ] + } + }, + { + "id": "WBV2-P1156-000", + "phase": "1156", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1155-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1156", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1156-001", + "phase": "1156", + "title": "verify volume displace modifier reader", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1156-000" + ], + "parityId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_volume_displace_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-001.md", + "behavior": "Verify the MODIFIER_VOLUME_DISPLACE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_volume_displace type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1156-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend WBV2_BATCH_TYPES='[\"VOLUME_DISPLACE\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_volume_displace\",\"rna-struct:VolumeDisplaceModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_volume_displace", + "rna-struct:VolumeDisplaceModifier" + ] + } + }, + { + "id": "WBV2-P1157-000", + "phase": "1157", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1156-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1157", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1157-001", + "phase": "1157", + "title": "verify shape key point reader", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1157-000" + ], + "parityId": "SHAPE_KEY_POINT_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shape_key_point_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-001.md", + "behavior": "Verify the SHAPE_KEY_POINT_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHAPE_KEY_POINT_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1157-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1157-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:ShapeKeyPoint\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1157-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:ShapeKeyPoint" + ] + } + }, + { + "id": "WBV2-P1158-000", + "phase": "1158", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1157-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1158", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1158-001", + "phase": "1158", + "title": "verify line style reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1158-000" + ], + "parityId": "LINE_STYLE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-001.md", + "behavior": "Verify the LINE_STYLE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1158-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1158-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FreestyleLineStyle\",\"rna-struct:LineStyleModifier\",\"rna-struct:LineStyleAlphaModifier\",\"rna-struct:LineStyleColorModifier\",\"rna-struct:LineStyleGeometryModifier\",\"rna-struct:LineStyleThicknessModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1158-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:FreestyleLineStyle", + "rna-struct:LineStyleModifier", + "rna-struct:LineStyleAlphaModifier", + "rna-struct:LineStyleColorModifier", + "rna-struct:LineStyleGeometryModifier", + "rna-struct:LineStyleThicknessModifier" + ] + } + }, + { + "id": "WBV2-P1159-000", + "phase": "1159", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1158-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1159", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1159-001", + "phase": "1159", + "title": "verify line style collection reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1159-000" + ], + "parityId": "LINE_STYLE_COLLECTION_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_collection_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-001.md", + "behavior": "Verify the LINE_STYLE_COLLECTION_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_COLLECTION_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1159-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1159-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_modifier_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:BlendDataLineStyles\",\"rna-struct:LineStyleColorModifiers\",\"rna-struct:LineStyleAlphaModifiers\",\"rna-struct:LineStyleThicknessModifiers\",\"rna-struct:LineStyleGeometryModifiers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1159-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:BlendDataLineStyles", + "rna-struct:LineStyleColorModifiers", + "rna-struct:LineStyleAlphaModifiers", + "rna-struct:LineStyleThicknessModifiers", + "rna-struct:LineStyleGeometryModifiers" + ] + } + }, + { + "id": "WBV2-P1160-000", + "phase": "1160", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1159-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1160", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1160-001", + "phase": "1160", + "title": "verify line style modifier subtype reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1160-000" + ], + "parityId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-001.md", + "behavior": "Verify the LINE_STYLE_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1160-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1160-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:LineStyleAlphaModifier_AlongStroke\",\"rna-struct:LineStyleAlphaModifier_CreaseAngle\",\"rna-struct:LineStyleAlphaModifier_Curvature_3D\",\"rna-struct:LineStyleAlphaModifier_DistanceFromCamera\",\"rna-struct:LineStyleAlphaModifier_DistanceFromObject\",\"rna-struct:LineStyleAlphaModifier_Material\",\"rna-struct:LineStyleAlphaModifier_Noise\",\"rna-struct:LineStyleAlphaModifier_Tangent\",\"rna-struct:LineStyleColorModifier_AlongStroke\",\"rna-struct:LineStyleColorModifier_CreaseAngle\",\"rna-struct:LineStyleColorModifier_Curvature_3D\",\"rna-struct:LineStyleColorModifier_DistanceFromCamera\",\"rna-struct:LineStyleColorModifier_DistanceFromObject\",\"rna-struct:LineStyleColorModifier_Material\",\"rna-struct:LineStyleColorModifier_Noise\",\"rna-struct:LineStyleColorModifier_Tangent\",\"rna-struct:LineStyleGeometryModifier_2DOffset\",\"rna-struct:LineStyleGeometryModifier_2DTransform\",\"rna-struct:LineStyleGeometryModifier_BackboneStretcher\",\"rna-struct:LineStyleGeometryModifier_BezierCurve\",\"rna-struct:LineStyleGeometryModifier_Blueprint\",\"rna-struct:LineStyleGeometryModifier_GuidingLines\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise1D\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise2D\",\"rna-struct:LineStyleGeometryModifier_Polygonalization\",\"rna-struct:LineStyleGeometryModifier_Sampling\",\"rna-struct:LineStyleGeometryModifier_Simplification\",\"rna-struct:LineStyleGeometryModifier_SinusDisplacement\",\"rna-struct:LineStyleGeometryModifier_SpatialNoise\",\"rna-struct:LineStyleGeometryModifier_TipRemover\",\"rna-struct:LineStyleThicknessModifier_AlongStroke\",\"rna-struct:LineStyleThicknessModifier_Calligraphy\",\"rna-struct:LineStyleThicknessModifier_CreaseAngle\",\"rna-struct:LineStyleThicknessModifier_Curvature_3D\",\"rna-struct:LineStyleThicknessModifier_DistanceFromCamera\",\"rna-struct:LineStyleThicknessModifier_DistanceFromObject\",\"rna-struct:LineStyleThicknessModifier_Material\",\"rna-struct:LineStyleThicknessModifier_Noise\",\"rna-struct:LineStyleThicknessModifier_Tangent\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1160-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:LineStyleAlphaModifier_AlongStroke", + "rna-struct:LineStyleAlphaModifier_CreaseAngle", + "rna-struct:LineStyleAlphaModifier_Curvature_3D", + "rna-struct:LineStyleAlphaModifier_DistanceFromCamera", + "rna-struct:LineStyleAlphaModifier_DistanceFromObject", + "rna-struct:LineStyleAlphaModifier_Material", + "rna-struct:LineStyleAlphaModifier_Noise", + "rna-struct:LineStyleAlphaModifier_Tangent", + "rna-struct:LineStyleColorModifier_AlongStroke", + "rna-struct:LineStyleColorModifier_CreaseAngle", + "rna-struct:LineStyleColorModifier_Curvature_3D", + "rna-struct:LineStyleColorModifier_DistanceFromCamera", + "rna-struct:LineStyleColorModifier_DistanceFromObject", + "rna-struct:LineStyleColorModifier_Material", + "rna-struct:LineStyleColorModifier_Noise", + "rna-struct:LineStyleColorModifier_Tangent", + "rna-struct:LineStyleGeometryModifier_2DOffset", + "rna-struct:LineStyleGeometryModifier_2DTransform", + "rna-struct:LineStyleGeometryModifier_BackboneStretcher", + "rna-struct:LineStyleGeometryModifier_BezierCurve", + "rna-struct:LineStyleGeometryModifier_Blueprint", + "rna-struct:LineStyleGeometryModifier_GuidingLines", + "rna-struct:LineStyleGeometryModifier_PerlinNoise1D", + "rna-struct:LineStyleGeometryModifier_PerlinNoise2D", + "rna-struct:LineStyleGeometryModifier_Polygonalization", + "rna-struct:LineStyleGeometryModifier_Sampling", + "rna-struct:LineStyleGeometryModifier_Simplification", + "rna-struct:LineStyleGeometryModifier_SinusDisplacement", + "rna-struct:LineStyleGeometryModifier_SpatialNoise", + "rna-struct:LineStyleGeometryModifier_TipRemover", + "rna-struct:LineStyleThicknessModifier_AlongStroke", + "rna-struct:LineStyleThicknessModifier_Calligraphy", + "rna-struct:LineStyleThicknessModifier_CreaseAngle", + "rna-struct:LineStyleThicknessModifier_Curvature_3D", + "rna-struct:LineStyleThicknessModifier_DistanceFromCamera", + "rna-struct:LineStyleThicknessModifier_DistanceFromObject", + "rna-struct:LineStyleThicknessModifier_Material", + "rna-struct:LineStyleThicknessModifier_Noise", + "rna-struct:LineStyleThicknessModifier_Tangent" + ] + } + }, + { + "id": "WBV2-P1161-000", + "phase": "1161", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1160-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1161", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1161-001", + "phase": "1161", + "title": "verify FCurve modifier subtype reader batch", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1161-000" + ], + "parityId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-001.md", + "behavior": "Verify the FCURVE_MODIFIER_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1161-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1161-001/fcurve-modifier-production.json WBV2_BATCH_FIXTURE=tests/files/web/fcurve_modifier_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FModifierEnvelope\",\"rna-struct:FModifierGenerator\",\"rna-struct:FModifierLimits\",\"rna-struct:FModifierNoise\",\"rna-struct:FModifierSmooth\",\"rna-struct:FModifierStepped\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1161-001/fcurve-modifier-production.json" + ], + "coverageBindings": [ + "rna-struct:FModifierEnvelope", + "rna-struct:FModifierGenerator", + "rna-struct:FModifierLimits", + "rna-struct:FModifierNoise", + "rna-struct:FModifierSmooth", + "rna-struct:FModifierStepped" + ] + } + }, + { + "id": "WBV2-P1162-000", + "phase": "1162", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1161-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1162", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1162-001", + "phase": "1162", + "title": "verify shape key modifier reader dependency", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1162-000" + ], + "parityId": "MODIFIER_SHAPEKEY_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_shapekey_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-001.md", + "behavior": "Verify the MODIFIER_SHAPEKEY_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "module": { + "moduleId": "MODIFIER_SHAPEKEY_READER_BATCH", + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_shapekey type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1162-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1162-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_shapekey\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1162-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_shapekey" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1163-000", + "phase": "1163", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1162-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1163", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1163-001", + "phase": "1163", + "title": "verify compositor node reader batch", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1163-000" + ], + "parityId": "COMPOSITOR_NODE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_node_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-001.md", + "behavior": "Verify the COMPOSITOR_NODE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "module": { + "moduleId": "COMPOSITOR_NODE_READER_BATCH", + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1163-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1163-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeGlare\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeGlare\",\"node:CompositorNodeViewer\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1163-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1164-000", + "phase": "1164", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1163-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1164", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1164-001", + "phase": "1164", + "title": "verify native compositor transform blur alpha reader", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1164-000" + ], + "parityId": "COMPOSITOR_NATIVE_NODE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_native_node_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-001.md", + "behavior": "Verify the COMPOSITOR_NATIVE_NODE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "module": { + "moduleId": "COMPOSITOR_NATIVE_NODE_BATCH", + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeTransform type is read from Blender Main", + "CompositorNodeBlur type is read from Blender Main", + "CompositorNodeAlphaOver type is read from Blender Main", + "CompositorNodeViewer type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1164-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1164-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_node_batch_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeTransform\",\"CompositorNodeBlur\",\"CompositorNodeAlphaOver\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeTransform\",\"node:CompositorNodeBlur\",\"node:CompositorNodeAlphaOver\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1164-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1165-000", + "phase": "1165", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1164-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1165", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1165-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1165-001", + "phase": "1165", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1165-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1165-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_anti_aliasing.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bilateral_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blank_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_box_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_brightness_contrast.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_channel_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeAntiAliasing type is read from Blender Main", + "CompositorNodeBilateralblur type is read from Blender Main", + "CompositorNodeBlankImage type is read from Blender Main", + "CompositorNodeBokehBlur type is read from Blender Main", + "CompositorNodeBokehImage type is read from Blender Main", + "CompositorNodeBoxMask type is read from Blender Main", + "CompositorNodeBrightContrast type is read from Blender Main", + "CompositorNodeChannelMatte type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1165-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1165-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend WBV2_BATCH_TYPES='[\"CompositorNodeAntiAliasing\",\"CompositorNodeBilateralblur\",\"CompositorNodeBlankImage\",\"CompositorNodeBokehBlur\",\"CompositorNodeBokehImage\",\"CompositorNodeBoxMask\",\"CompositorNodeBrightContrast\",\"CompositorNodeChannelMatte\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeAntiAliasing\",\"node:CompositorNodeBilateralblur\",\"node:CompositorNodeBlankImage\",\"node:CompositorNodeBokehBlur\",\"node:CompositorNodeBokehImage\",\"node:CompositorNodeBoxMask\",\"node:CompositorNodeBrightContrast\",\"node:CompositorNodeChannelMatte\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1165-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1166-000", + "phase": "1166", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1165-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1166", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1166-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1166-001", + "phase": "1166", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1166-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1166-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_chroma_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_balance.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_correction.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_spill.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_combine_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_to_display.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeChromaMatte type is read from Blender Main", + "CompositorNodeColorBalance type is read from Blender Main", + "CompositorNodeColorCorrection type is read from Blender Main", + "CompositorNodeColorMatte type is read from Blender Main", + "CompositorNodeColorSpill type is read from Blender Main", + "CompositorNodeCombineColor type is read from Blender Main", + "CompositorNodeConvertColorSpace type is read from Blender Main", + "CompositorNodeConvertToDisplay type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1166-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1166-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend WBV2_BATCH_TYPES='[\"CompositorNodeChromaMatte\",\"CompositorNodeColorBalance\",\"CompositorNodeColorCorrection\",\"CompositorNodeColorMatte\",\"CompositorNodeColorSpill\",\"CompositorNodeCombineColor\",\"CompositorNodeConvertColorSpace\",\"CompositorNodeConvertToDisplay\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeChromaMatte\",\"node:CompositorNodeColorBalance\",\"node:CompositorNodeColorCorrection\",\"node:CompositorNodeColorMatte\",\"node:CompositorNodeColorSpill\",\"node:CompositorNodeCombineColor\",\"node:CompositorNodeConvertColorSpace\",\"node:CompositorNodeConvertToDisplay\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1166-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1167-000", + "phase": "1167", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1166-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1167", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1167-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1167-001", + "phase": "1167", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1167-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1167-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convolve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_corner_pin.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_crop.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_curves.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_directional_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_defocus.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeConvolve type is read from Blender Main", + "CompositorNodeCornerPin type is read from Blender Main", + "CompositorNodeCrop type is read from Blender Main", + "CompositorNodeCryptomatte type is read from Blender Main", + "CompositorNodeCryptomatteV2 type is read from Blender Main", + "CompositorNodeCurveRGB type is read from Blender Main", + "CompositorNodeDBlur type is read from Blender Main", + "CompositorNodeDefocus type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1167-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1167-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend WBV2_BATCH_TYPES='[\"CompositorNodeConvolve\",\"CompositorNodeCornerPin\",\"CompositorNodeCrop\",\"CompositorNodeCryptomatte\",\"CompositorNodeCryptomatteV2\",\"CompositorNodeCurveRGB\",\"CompositorNodeDBlur\",\"CompositorNodeDefocus\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeConvolve\",\"node:CompositorNodeCornerPin\",\"node:CompositorNodeCrop\",\"node:CompositorNodeCryptomatte\",\"node:CompositorNodeCryptomatteV2\",\"node:CompositorNodeCurveRGB\",\"node:CompositorNodeDBlur\",\"node:CompositorNodeDefocus\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1167-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1168-000", + "phase": "1168", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1167-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1168", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1168-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1168-001", + "phase": "1168", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1168-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1168-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_denoise.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_despeckle.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_difference_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_dilate_erode.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_displace.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_distance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_ellipse_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeDenoise type is read from Blender Main", + "CompositorNodeDespeckle type is read from Blender Main", + "CompositorNodeDiffMatte type is read from Blender Main", + "CompositorNodeDilateErode type is read from Blender Main", + "CompositorNodeDisplace type is read from Blender Main", + "CompositorNodeDistanceMatte type is read from Blender Main", + "CompositorNodeDoubleEdgeMask type is read from Blender Main", + "CompositorNodeEllipseMask type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1168-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1168-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend WBV2_BATCH_TYPES='[\"CompositorNodeDenoise\",\"CompositorNodeDespeckle\",\"CompositorNodeDiffMatte\",\"CompositorNodeDilateErode\",\"CompositorNodeDisplace\",\"CompositorNodeDistanceMatte\",\"CompositorNodeDoubleEdgeMask\",\"CompositorNodeEllipseMask\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeDenoise\",\"node:CompositorNodeDespeckle\",\"node:CompositorNodeDiffMatte\",\"node:CompositorNodeDilateErode\",\"node:CompositorNodeDisplace\",\"node:CompositorNodeDistanceMatte\",\"node:CompositorNodeDoubleEdgeMask\",\"node:CompositorNodeEllipseMask\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1168-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1169-000", + "phase": "1169", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1168-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1169", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1169-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1169-001", + "phase": "1169", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1169-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1169-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:cd9ae59d0f9640d1", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:cd9ae59d0f9640d1", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_filter.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_flip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_correct.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_saturation_value.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_id_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-cd9ae59d0f9640d1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeFilter type is read from Blender Main", + "CompositorNodeFlip type is read from Blender Main", + "CompositorNodeHueCorrect type is read from Blender Main", + "CompositorNodeHueSat type is read from Blender Main", + "CompositorNodeIDMask type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1169-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1169-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-cd9ae59d0f9640d1.blend WBV2_BATCH_TYPES='[\"CompositorNodeFilter\",\"CompositorNodeFlip\",\"CompositorNodeHueCorrect\",\"CompositorNodeHueSat\",\"CompositorNodeIDMask\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeFilter\",\"node:CompositorNodeFlip\",\"node:CompositorNodeHueCorrect\",\"node:CompositorNodeHueSat\",\"node:CompositorNodeIDMask\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1169-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1170-000", + "phase": "1170", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1169-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1170", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1170-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1170-001", + "phase": "1170", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1170-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1170-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeImage type is read from Blender Main", + "CompositorNodeImageCoordinates type is read from Blender Main", + "CompositorNodeImageInfo type is read from Blender Main", + "CompositorNodeInpaint type is read from Blender Main", + "CompositorNodeKeying type is read from Blender Main", + "CompositorNodeKeyingScreen type is read from Blender Main", + "CompositorNodeKuwahara type is read from Blender Main", + "CompositorNodeLensdist type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1170-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1170-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend WBV2_BATCH_TYPES='[\"CompositorNodeImage\",\"CompositorNodeImageCoordinates\",\"CompositorNodeImageInfo\",\"CompositorNodeInpaint\",\"CompositorNodeKeying\",\"CompositorNodeKeyingScreen\",\"CompositorNodeKuwahara\",\"CompositorNodeLensdist\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeImage\",\"node:CompositorNodeImageCoordinates\",\"node:CompositorNodeImageInfo\",\"node:CompositorNodeInpaint\",\"node:CompositorNodeKeying\",\"node:CompositorNodeKeyingScreen\",\"node:CompositorNodeKuwahara\",\"node:CompositorNodeLensdist\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1170-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1171-000", + "phase": "1171", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1170-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1171", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1171-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1171-001", + "phase": "1171", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1171-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1171-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeLevels type is read from Blender Main", + "CompositorNodeLumaMatte type is read from Blender Main", + "CompositorNodeMapUV type is read from Blender Main", + "CompositorNodeMask type is read from Blender Main", + "CompositorNodeMaskToSDF type is read from Blender Main", + "CompositorNodeMovieClip type is read from Blender Main", + "CompositorNodeMovieDistortion type is read from Blender Main", + "CompositorNodeNormal type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1171-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1171-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend WBV2_BATCH_TYPES='[\"CompositorNodeLevels\",\"CompositorNodeLumaMatte\",\"CompositorNodeMapUV\",\"CompositorNodeMask\",\"CompositorNodeMaskToSDF\",\"CompositorNodeMovieClip\",\"CompositorNodeMovieDistortion\",\"CompositorNodeNormal\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeLevels\",\"node:CompositorNodeLumaMatte\",\"node:CompositorNodeMapUV\",\"node:CompositorNodeMask\",\"node:CompositorNodeMaskToSDF\",\"node:CompositorNodeMovieClip\",\"node:CompositorNodeMovieDistortion\",\"node:CompositorNodeNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1171-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + } + ] +} diff --git a/tests/golden/WBV2-P1171-001/compositor-main-reader-production.json b/tests/golden/WBV2-P1171-001/compositor-main-reader-production.json new file mode 100644 index 000000000..5ccc44bb5 --- /dev/null +++ b/tests/golden/WBV2-P1171-001/compositor-main-reader-production.json @@ -0,0 +1,89 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1171-001", + "operation": "COMPOSITOR_MAIN_READER_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "sourceUnits": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "expectedTypes": [ + "CompositorNodeLevels", + "CompositorNodeLumaMatte", + "CompositorNodeMapUV", + "CompositorNodeMask", + "CompositorNodeMaskToSDF", + "CompositorNodeMovieClip", + "CompositorNodeMovieDistortion", + "CompositorNodeNormal" + ], + "sourceRnaStructs": { + "rna-struct:CompositorNodeTree": "scene.compositorGraph", + "rna-struct:NodeTree": "scene.compositorGraph", + "rna-struct:NodeLinks": "scene.compositorGraph.links", + "rna-struct:NodeLink": "scene.compositorGraph.links[]" + }, + "fixtureSha256": "4ce74eee4ae6cf91abdf42b971fc1b67f710a1376693c18feb481e622288034b", + "graphs": [ + { + "id": "compositor:scene:Scene", + "name": "Scene Compositor", + "nodeTypes": [ + "COMPOSITE", + "CONSTANT_COLOR", + "CompositorNodeLevels", + "CompositorNodeLumaMatte", + "CompositorNodeMapUV", + "CompositorNodeMask", + "CompositorNodeMaskToSDF", + "CompositorNodeMovieClip", + "CompositorNodeMovieDistortion", + "CompositorNodeNormal" + ], + "links": [ + { + "fromNodeId": "compositor-node:2071841918", + "fromSocket": "Color", + "toNodeId": "compositor-node:205038794", + "toSocket": "Image" + } + ] + } + ], + "reopenedGraphs": [ + { + "id": "compositor:scene:Scene", + "name": "Scene Compositor", + "nodeTypes": [ + "COMPOSITE", + "CONSTANT_COLOR", + "CompositorNodeLevels", + "CompositorNodeLumaMatte", + "CompositorNodeMapUV", + "CompositorNodeMask", + "CompositorNodeMaskToSDF", + "CompositorNodeMovieClip", + "CompositorNodeMovieDistortion", + "CompositorNodeNormal" + ], + "links": [ + { + "fromNodeId": "compositor-node:2071841918", + "fromSocket": "Color", + "toNodeId": "compositor-node:205038794", + "toSocket": "Image" + } + ] + } + ], + "openedRevision": 1, + "reopenedRevision": 1 +} diff --git a/tests/golden/WBV2-P1171-001/manifest.json b/tests/golden/WBV2-P1171-001/manifest.json new file mode 100644 index 000000000..7c85d1930 --- /dev/null +++ b/tests/golden/WBV2-P1171-001/manifest.json @@ -0,0 +1,134 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1171-001", + "parentTask": "WBV2-P1171-000", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "taskClass": "MODULE", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "BLENDER_WEB_FUNCTION_MODULE", + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1171-000/manifest.json", + "sha256": "88c4843cf23166881495e2e16ac829254da973b4177b6dfc81171dbf3365a056" + }, + "source1": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc", + "sha256": "3e088928034e1214b9b21a63cf69e1cd3f21fd745c8f9d9b9d53faefe2b0ae26" + }, + "source2": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "sha256": "b5f8e9d7ebfb56e14ec26570a1f6be5185b49e11f25607df2d38f531138160e0" + }, + "source3": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "sha256": "1ed6618a7649bcff6adf6704be93273f55b552e239f3b2e24688f07f00298376" + }, + "source4": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "sha256": "a72534271d5f3b998041aa19626b86049861cba3fce17fb544e30fde0af11400" + }, + "source5": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "sha256": "a604f5ef888221f86f3da881b498335506c66b148bcb683d133cb592120b4274" + }, + "source6": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "sha256": "7724fd7d874a75a7b35326a25425a8a17c8f164df849e565ba19a9fb347ca8fe" + }, + "source7": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "sha256": "c8981cd71d26870b53d4caf82bf16019161aecf69a190b209a8eafc5caa28db2" + }, + "source8": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc", + "sha256": "3d7f09fdcfd819d9a46335e73d784ad109ee0ecad25677cd6d69572b8899c7c8" + }, + "source9": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "sha256": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "source10": { + "path": "web/tests/e2e/compositor-main-reader-production.spec.ts", + "sha256": "b573ac61d289a63389631bc80dd4195acf10c7383c4db3f2adde0e09aa01c9d7" + }, + "source11": { + "path": "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "sha256": "4ce74eee4ae6cf91abdf42b971fc1b67f710a1376693c18feb481e622288034b" + }, + "source12": { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "sha256": "66fc59cba55a8c17d398b74d12ea4a9f09746c0f30c40f579c44aa34956e3072" + }, + "evidence1": { + "path": "tests/golden/WBV2-P1171-001/compositor-main-reader-production.json", + "sha256": "c47fdbee47b51888e3bdff5b2eef8a71e62962893718cc6495a8345b5a6a3e72" + }, + "moduleReceipt": { + "path": "tests/golden/WBV2-P1171-001/module-receipt.json", + "sha256": "9efbf87b5cc412a169117fd947f4dbba801ac2b14a85dd2a3869cc1f00a480c2" + }, + "status": { + "path": "docs/status/WBV2-P1171-001.md", + "sha256": "f52a7ac0d11d1e71b6c928b45b703c4b4f1d716fdf5d340db0537278931bba19" + }, + "log": { + "path": "tests/golden/WBV2-P1171-001/module-run.log", + "sha256": "bb313d7816423d6e74a715df3912167283da13d8991aa37c84b7d39fb6014734" + }, + "plan": { + "path": "tests/golden/WBV2-P1171-000/module-execution-plan.json", + "sha256": "c2c126f3c2a0b7293b18ee2afa6587712415094c20f1e82ce02283b3006fdf24" + }, + "taskContext": { + "path": "tests/golden/WBV2-P1171-001/task-context.json", + "sha256": "a1abeae6cd471c41abaf01977ca25e2e01a500b0fe216e157f59b30d5acb731e" + } + }, + "assertions": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "sourceBacked": true, + "positiveCases": 10, + "negativeCases": 3, + "recoveryCases": 3, + "commandCount": 4, + "reusedReceiptCount": 1, + "sourceUnchanged": true, + "fullFamilyParity": false, + "dynamicInventoryPath": "tests/golden/WBV2/dynamic-inventory.json", + "dynamicSourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 582, + "dynamicUnverifiedUnits": 3163, + "planningEstimate": 5200, + "historicalInventoryTotal": 6900, + "historicalEffectiveCompleted": 290, + "historicalEffectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1171-001/module-receipt.json b/tests/golden/WBV2-P1171-001/module-receipt.json new file mode 100644 index 000000000..d7e441d2a --- /dev/null +++ b/tests/golden/WBV2-P1171-001/module-receipt.json @@ -0,0 +1,172 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1171-001", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16, + "commandCount": 4, + "readCommandCount": 0, + "withinBudget": true + }, + "status": "PASS", + "source": { + "paths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "auditedPaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp" + ], + "before": { + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc": "3e088928034e1214b9b21a63cf69e1cd3f21fd745c8f9d9b9d53faefe2b0ae26", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc": "b5f8e9d7ebfb56e14ec26570a1f6be5185b49e11f25607df2d38f531138160e0", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc": "1ed6618a7649bcff6adf6704be93273f55b552e239f3b2e24688f07f00298376", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc": "a72534271d5f3b998041aa19626b86049861cba3fce17fb544e30fde0af11400", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc": "a604f5ef888221f86f3da881b498335506c66b148bcb683d133cb592120b4274", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc": "7724fd7d874a75a7b35326a25425a8a17c8f164df849e565ba19a9fb347ca8fe", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc": "c8981cd71d26870b53d4caf82bf16019161aecf69a190b209a8eafc5caa28db2", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc": "3d7f09fdcfd819d9a46335e73d784ad109ee0ecad25677cd6d69572b8899c7c8", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "after": { + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc": "3e088928034e1214b9b21a63cf69e1cd3f21fd745c8f9d9b9d53faefe2b0ae26", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc": "b5f8e9d7ebfb56e14ec26570a1f6be5185b49e11f25607df2d38f531138160e0", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc": "1ed6618a7649bcff6adf6704be93273f55b552e239f3b2e24688f07f00298376", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc": "a72534271d5f3b998041aa19626b86049861cba3fce17fb544e30fde0af11400", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc": "a604f5ef888221f86f3da881b498335506c66b148bcb683d133cb592120b4274", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc": "7724fd7d874a75a7b35326a25425a8a17c8f164df849e565ba19a9fb347ca8fe", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc": "c8981cd71d26870b53d4caf82bf16019161aecf69a190b209a8eafc5caa28db2", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc": "3d7f09fdcfd819d9a46335e73d784ad109ee0ecad25677cd6d69572b8899c7c8", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "unchanged": true + }, + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json", + "manifestSha256": "a53ebdc52db5dcf27d44e938e5551f1ee2adae8e46c3fe8661604ee6b1000f8c", + "reportSha256": "6dd419799e1a4b9251328d9496f2459d148cd89118740a06b0ee6ffb78e0b1d2" + } + ], + "cases": { + "positive": [ + "CompositorNodeLevels type is read from Blender Main", + "CompositorNodeLumaMatte type is read from Blender Main", + "CompositorNodeMapUV type is read from Blender Main", + "CompositorNodeMask type is read from Blender Main", + "CompositorNodeMaskToSDF type is read from Blender Main", + "CompositorNodeMovieClip type is read from Blender Main", + "CompositorNodeMovieDistortion type is read from Blender Main", + "CompositorNodeNormal type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ] + }, + "commands": [ + { + "command": "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "exitCode": 0, + "durationMs": 146 + }, + { + "command": "npm --prefix web run typecheck", + "exitCode": 0, + "durationMs": 3382 + }, + { + "command": "npm --prefix web run build", + "exitCode": 0, + "durationMs": 3930 + }, + { + "command": "WBV2_BATCH_TASK=WBV2-P1171-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1171-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend WBV2_BATCH_TYPES='[\"CompositorNodeLevels\",\"CompositorNodeLumaMatte\",\"CompositorNodeMapUV\",\"CompositorNodeMask\",\"CompositorNodeMaskToSDF\",\"CompositorNodeMovieClip\",\"CompositorNodeMovieDistortion\",\"CompositorNodeNormal\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeLevels\",\"node:CompositorNodeLumaMatte\",\"node:CompositorNodeMapUV\",\"node:CompositorNodeMask\",\"node:CompositorNodeMaskToSDF\",\"node:CompositorNodeMovieClip\",\"node:CompositorNodeMovieDistortion\",\"node:CompositorNodeNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts", + "exitCode": 0, + "durationMs": 2813 + } + ], + "verification": { + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "chromiumOnly": true, + "fullFamilyParity": false + }, + "efficiency": { + "existingEvidenceReused": false, + "skippedCommands": 0, + "totalDurationMs": 10271, + "reusePolicy": "hash_bound_receipt" + }, + "inventory": { + "historical": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "mutation": "forbidden_by_module_execution" + }, + "dynamic": { + "path": "tests/golden/WBV2/dynamic-inventory.json", + "sha256": "b21cfb58365fc66e1ac96485bd128f4aa94eb597a4d00330ca5c468148e8ebe5", + "sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "unitCount": 3745, + "planningEstimate": 5200, + "hardTarget": false, + "verifiedUnits": 582, + "unverifiedUnits": 3163 + } + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1171-001/module-run.log b/tests/golden/WBV2-P1171-001/module-run.log new file mode 100644 index 000000000..e219bc3ab --- /dev/null +++ b/tests/golden/WBV2-P1171-001/module-run.log @@ -0,0 +1,49 @@ +> source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm +ninja: no work to do. + +> npm --prefix web run typecheck + +> blender-web-editor@0.1.0-rc.1 typecheck +> tsc -p tsconfig.json --noEmit + + +> npm --prefix web run build + +> blender-web-editor@0.1.0-rc.1 build +> tsc -p tsconfig.json && vite build --config app/vite.config.ts + +vite v8.2.0 building client environment for production... + transforming...✓ 102 modules transformed. +rendering chunks... +computing gzip size... +dist/index.html 0.46 kB │ gzip: 0.29 kB +dist/assets/storage.worker-D9TqXsGS.js 66.59 kB +dist/assets/web-engine.worker-ynL11m10.js 362.11 kB +dist/assets/viewport-render.worker-BKnJyAEz.js 634.08 kB +dist/assets/web_engine-C04Dp4ba.wasm 16,243.50 kB │ gzip: 3,858.52 kB +dist/assets/index-BgTbQCE2.css 15.35 kB │ gzip: 3.91 kB +dist/assets/index-B1m0FaKy.js 1,190.30 kB │ gzip: 316.69 kB + +✓ built in 465ms +[plugin rolldown:vite-resolve] Module "module" has been externalized for browser compatibility, imported by "/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details. +[plugin builtin:vite-reporter] +(!) Some chunks are larger than 500 kB after minification. Consider: +- Using dynamic import() to code-split the application +- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting +- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. + +> WBV2_BATCH_TASK=WBV2-P1171-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1171-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend WBV2_BATCH_TYPES='["CompositorNodeLevels","CompositorNodeLumaMatte","CompositorNodeMapUV","CompositorNodeMask","CompositorNodeMaskToSDF","CompositorNodeMovieClip","CompositorNodeMovieDistortion","CompositorNodeNormal"]' WBV2_BATCH_UNITS='["node:CompositorNodeLevels","node:CompositorNodeLumaMatte","node:CompositorNodeMapUV","node:CompositorNodeMask","node:CompositorNodeMaskToSDF","node:CompositorNodeMovieClip","node:CompositorNodeMovieDistortion","node:CompositorNodeNormal"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts + +> blender-web-editor@0.1.0-rc.1 test:e2e +> playwright test --config playwright.config.ts --workers=1 tests/e2e/compositor-main-reader-production.spec.ts + + +Running 1 test using 1 worker + + ✓ 1 tests/e2e/compositor-main-reader-production.spec.ts:15:1 › WBV2-P1104-000 reads compositor NodeTree and links from Blender Main without JS execution (1.7s) + + 1 passed (2.5s) +[WebServer] (node:1257704) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +[WebServer] (Use `node --trace-warnings ...` to show where the warning was created) +(node:1257758) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +(Use `node --trace-warnings ...` to show where the warning was created) diff --git a/tests/golden/WBV2-P1171-001/task-context.json b/tests/golden/WBV2-P1171-001/task-context.json new file mode 100644 index 000000000..f5b3a8ea5 --- /dev/null +++ b/tests/golden/WBV2-P1171-001/task-context.json @@ -0,0 +1,217 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1171-001", + "parentTask": "WBV2-P1171-000", + "status": "in_progress", + "goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 CompositorNodeLevels, CompositorNodeLumaMatte, CompositorNodeMapUV, CompositorNodeMask, CompositorNodeMaskToSDF, CompositorNodeMovieClip, CompositorNodeMovieDistortion, CompositorNodeNormal 的真实 modifier/RNA 元数据。", + "scope": { + "gap": "capability:AUTO_COMPOSITOR_NATIVE_NODE_READER", + "ownerFamily": "NODES", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P1171-001 --write" + ], + "inputPaths": [], + "inputMetadata": { + "docs/EXECUTION_QUEUE.md": { + "path": "docs/EXECUTION_QUEUE.md", + "exists": true, + "bytes": 4030, + "mtime_ns": "1788478856143437072", + "sha256": "de43ba6cf187e1b7b2528e75b60058f989087a21df2b677fc23efec5586ea627" + }, + "docs/tasks/WBV2-P1171-001.md": { + "path": "docs/tasks/WBV2-P1171-001.md", + "exists": true, + "bytes": 2951, + "mtime_ns": "1788478845416154983", + "sha256": "de27252317577b7514529b5724ef34601f20118650886004c86e4311969c0407" + }, + "tests/golden/WBV2-P1171-000/manifest.json": { + "path": "tests/golden/WBV2-P1171-000/manifest.json", + "exists": true, + "bytes": 1780, + "mtime_ns": "1788478845416697052", + "sha256": "88c4843cf23166881495e2e16ac829254da973b4177b6dfc81171dbf3365a056" + }, + "docs/status/WBV2-P1171-000.md": { + "path": "docs/status/WBV2-P1171-000.md", + "exists": true, + "bytes": 366, + "mtime_ns": "1788478845416331234", + "sha256": "2f51932bf9db711dfb51e4f76a305f5b52eeac8f7ae5ce48aaf2d82bc02ac5b7" + } + }, + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 777, + "contextRemainingTokens": 193 + }, + "source": { + "bytes": 9127, + "tokens": 2283 + }, + "selected": [], + "excluded": [ + { + "path": "blender-5.2.0/source/blender/modifiers/intern/", + "bytes": 10155, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "bytes": 521651, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "bytes": 314614, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "bytes": 99846, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/compositor-main-reader-production.spec.ts", + "bytes": 3876, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1171-001/module-receipt.json", + "bytes": 9408, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P1171-001/modifier-reader-batch-production.json", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P1171-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P1171-001.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 0, + "bytes": 0, + "tokens": 0 + } + }, + "exitCriteria": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "nextTask": null, + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P1171-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P1171-000/manifest.json", + "parentStatus": "docs/status/WBV2-P1171-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P1171-001.md", + "tests/golden/WBV2-P1171-000/manifest.json", + "docs/status/WBV2-P1171-000.md" + ], + "machineOnly": [ + "tests/golden/WBV2/task-index.json", + "tests/golden/M15-03A/task-catalog.jsonl" + ], + "optionalByNeed": [ + "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "任务卡列出的精确协议/生产路径", + "任务卡明确命名的长期计划小节" + ], + "forbiddenByDefault": [ + "完整 CURRENT_EXECUTION_PLAN.md", + "完整 PROJECT_STATUS_AND_NEXT_WORK.md", + "全部 docs/status/*.md", + "完整 parity/WBS 计划", + "README 历史和 test-results/" + ] + }, + "parent": { + "manifest": { + "schemaVersion": 1, + "task": "WBV2-P1171-000", + "parentTask": "WBV2-P1170-001", + "status": "done", + "nextTask": "WBV2-P1171-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P1171-000 status", + "- task: `WBV2-P1171-000`; parent: `WBV2-P1170-001`; status: `done`", + "- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed", + "- source-backed batch authorized: `AUTO_COMPOSITOR_NATIVE_NODE_READER` (8 units)", + "- dynamic inventory: `3745` units; verified `574`; unverified `3171`; bound delta `0`", + "- nextTask: `WBV2-P1171-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 2951, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 49, + "taskTokens": 738 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 4030, + "lines": 58, + "tokens": 1008 + }, + { + "path": "docs/tasks/WBV2-P1171-001.md", + "bytes": 2951, + "lines": 49, + "tokens": 738 + }, + { + "path": "tests/golden/WBV2-P1171-000/manifest.json", + "bytes": 1780, + "lines": 54, + "tokens": 445 + }, + { + "path": "docs/status/WBV2-P1171-000.md", + "bytes": 366, + "lines": 8, + "tokens": 92 + } + ], + "sourceTokens": 2283, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 2283, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3307, + "serializedContextTokens": 697, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index 3e8efb859..c2f488779 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -119,3 +119,5 @@ {"id":"WBV2-P1169-001","gapId":"AUTO_COMPOSITOR_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1169","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} {"id":"WBV2-P1170-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1170","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} {"id":"WBV2-P1170-001","gapId":"AUTO_COMPOSITOR_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1170","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} +{"id":"WBV2-P1171-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1171","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} +{"id":"WBV2-P1171-001","gapId":"AUTO_COMPOSITOR_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1171","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} diff --git a/tests/golden/WBV2/task-index.json b/tests/golden/WBV2/task-index.json index 435cab165..adc3cf58a 100644 --- a/tests/golden/WBV2/task-index.json +++ b/tests/golden/WBV2/task-index.json @@ -1 +1 @@ -{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1170-000/module-execution-plan.json","sha256":"c0ad17f6f2a7c37c5c46421fe9d99d5a6d4ec77ce01565ec6efdf75c9fb16027"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"3c415c42e222f9ea15a9701d77f6c169dcab8d78181d35473286bfd9b0259cdd"},"taskCount":121,"activeTask":null,"entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":"WBV2-P1164-000"},"WBV2-P1164-000":{"line":107,"offset":38702,"length":303,"previous":"WBV2-P1163-001","next":"WBV2-P1164-001"},"WBV2-P1164-001":{"line":108,"offset":39005,"length":360,"previous":"WBV2-P1164-000","next":"WBV2-P1165-000"},"WBV2-P1165-000":{"line":109,"offset":39365,"length":303,"previous":"WBV2-P1164-001","next":"WBV2-P1165-001"},"WBV2-P1165-001":{"line":110,"offset":39668,"length":366,"previous":"WBV2-P1165-000","next":"WBV2-P1166-000"},"WBV2-P1166-000":{"line":111,"offset":40034,"length":303,"previous":"WBV2-P1165-001","next":"WBV2-P1166-001"},"WBV2-P1166-001":{"line":112,"offset":40337,"length":366,"previous":"WBV2-P1166-000","next":"WBV2-P1167-000"},"WBV2-P1167-000":{"line":113,"offset":40703,"length":303,"previous":"WBV2-P1166-001","next":"WBV2-P1167-001"},"WBV2-P1167-001":{"line":114,"offset":41006,"length":366,"previous":"WBV2-P1167-000","next":"WBV2-P1168-000"},"WBV2-P1168-000":{"line":115,"offset":41372,"length":303,"previous":"WBV2-P1167-001","next":"WBV2-P1168-001"},"WBV2-P1168-001":{"line":116,"offset":41675,"length":366,"previous":"WBV2-P1168-000","next":"WBV2-P1169-000"},"WBV2-P1169-000":{"line":117,"offset":42041,"length":303,"previous":"WBV2-P1168-001","next":"WBV2-P1169-001"},"WBV2-P1169-001":{"line":118,"offset":42344,"length":366,"previous":"WBV2-P1169-000","next":"WBV2-P1170-000"},"WBV2-P1170-000":{"line":119,"offset":42710,"length":303,"previous":"WBV2-P1169-001","next":"WBV2-P1170-001"},"WBV2-P1170-001":{"line":120,"offset":43013,"length":366,"previous":"WBV2-P1170-000","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1171-000/module-execution-plan.json","sha256":"c2c126f3c2a0b7293b18ee2afa6587712415094c20f1e82ce02283b3006fdf24"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"6c9abb8fcf92ed15b77a2f5d3867d6f9b78e33f9c6c99cedeaaf940002ee8cbb"},"taskCount":123,"activeTask":null,"entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":"WBV2-P1164-000"},"WBV2-P1164-000":{"line":107,"offset":38702,"length":303,"previous":"WBV2-P1163-001","next":"WBV2-P1164-001"},"WBV2-P1164-001":{"line":108,"offset":39005,"length":360,"previous":"WBV2-P1164-000","next":"WBV2-P1165-000"},"WBV2-P1165-000":{"line":109,"offset":39365,"length":303,"previous":"WBV2-P1164-001","next":"WBV2-P1165-001"},"WBV2-P1165-001":{"line":110,"offset":39668,"length":366,"previous":"WBV2-P1165-000","next":"WBV2-P1166-000"},"WBV2-P1166-000":{"line":111,"offset":40034,"length":303,"previous":"WBV2-P1165-001","next":"WBV2-P1166-001"},"WBV2-P1166-001":{"line":112,"offset":40337,"length":366,"previous":"WBV2-P1166-000","next":"WBV2-P1167-000"},"WBV2-P1167-000":{"line":113,"offset":40703,"length":303,"previous":"WBV2-P1166-001","next":"WBV2-P1167-001"},"WBV2-P1167-001":{"line":114,"offset":41006,"length":366,"previous":"WBV2-P1167-000","next":"WBV2-P1168-000"},"WBV2-P1168-000":{"line":115,"offset":41372,"length":303,"previous":"WBV2-P1167-001","next":"WBV2-P1168-001"},"WBV2-P1168-001":{"line":116,"offset":41675,"length":366,"previous":"WBV2-P1168-000","next":"WBV2-P1169-000"},"WBV2-P1169-000":{"line":117,"offset":42041,"length":303,"previous":"WBV2-P1168-001","next":"WBV2-P1169-001"},"WBV2-P1169-001":{"line":118,"offset":42344,"length":366,"previous":"WBV2-P1169-000","next":"WBV2-P1170-000"},"WBV2-P1170-000":{"line":119,"offset":42710,"length":303,"previous":"WBV2-P1169-001","next":"WBV2-P1170-001"},"WBV2-P1170-001":{"line":120,"offset":43013,"length":366,"previous":"WBV2-P1170-000","next":"WBV2-P1171-000"},"WBV2-P1171-000":{"line":121,"offset":43379,"length":303,"previous":"WBV2-P1170-001","next":"WBV2-P1171-001"},"WBV2-P1171-001":{"line":122,"offset":43682,"length":366,"previous":"WBV2-P1171-000","next":null}}}