From 7084f8d5ca87b8fdaf915746c267a981f01233d3 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Fri, 4 Sep 2026 09:16:52 +0800 Subject: [PATCH] chore(web): continuous handoff WBV2-P1252-001 --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P1252-001.md | 9 + docs/tasks/WBV2-P1252-001.md | 48 + .../wbv2-shader-f8e029f92dbfd33d.blend | Bin 0 -> 97451 bytes tests/golden/WBV2-P1252-000/manifest.json | 50 + .../WBV2-P1252-000/module-execution-plan.json | 25162 ++++++++++++++++ tests/golden/WBV2-P1252-001/manifest.json | 116 + .../golden/WBV2-P1252-001/module-receipt.json | 154 + tests/golden/WBV2-P1252-001/module-run.log | 49 + .../shader-main-reader-production.json | 127 + tests/golden/WBV2-P1252-001/task-context.json | 217 + tests/golden/WBV2/task-catalog.jsonl | 2 + tests/golden/WBV2/task-index.json | 2 +- 13 files changed, 25938 insertions(+), 4 deletions(-) create mode 100644 docs/status/WBV2-P1252-001.md create mode 100644 docs/tasks/WBV2-P1252-001.md create mode 100644 tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend create mode 100644 tests/golden/WBV2-P1252-000/manifest.json create mode 100644 tests/golden/WBV2-P1252-000/module-execution-plan.json create mode 100644 tests/golden/WBV2-P1252-001/manifest.json create mode 100644 tests/golden/WBV2-P1252-001/module-receipt.json create mode 100644 tests/golden/WBV2-P1252-001/module-run.log create mode 100644 tests/golden/WBV2-P1252-001/shader-main-reader-production.json create mode 100644 tests/golden/WBV2-P1252-001/task-context.json diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index 13b6a4566..ddf8d58e1 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -15,9 +15,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P1251-001` | -| parent manifest | `tests/golden/WBV2-P1251-000/manifest.json` | -| 任务卡 | [`tasks/WBV2-P1251-001.md`](tasks/WBV2-P1251-001.md) | +| 当前任务 | `WBV2-P1252-001` | +| parent manifest | `tests/golden/WBV2-P1252-000/manifest.json` | +| 任务卡 | [`tasks/WBV2-P1252-001.md`](tasks/WBV2-P1252-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-P1252-001.md b/docs/status/WBV2-P1252-001.md new file mode 100644 index 000000000..0d7e18015 --- /dev/null +++ b/docs/status/WBV2-P1252-001.md @@ -0,0 +1,9 @@ +# WBV2-P1252-001 status + +- task: `WBV2-P1252-001`; module: `AUTO_SHADER_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 `934`; unverified `2811`; planning estimate `5200` (non-binding); this-segment binding delta: `5` +- historical 6900-entry inventory remains read-only; full-family parity: `false` +- nextTask: `NONE` diff --git a/docs/tasks/WBV2-P1252-001.md b/docs/tasks/WBV2-P1252-001.md new file mode 100644 index 000000000..afaf3f418 --- /dev/null +++ b/docs/tasks/WBV2-P1252-001.md @@ -0,0 +1,48 @@ +# WBV2-P1252-001: verify auto-generated native shader node reader batch + +- task: WBV2-P1252-001 +- parent: WBV2-P1252-000 +- status: in_progress +- gap: capability:AUTO_SHADER_NATIVE_NODE_READER +- ownerFamily: NODES +- targetImplementationClass: LOCAL_EXACT +- batchId: WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d +- selectedRecordIds: ["node:ShaderNodeHairInfo","node:ShaderNodeHoldout","node:ShaderNodeHueSaturation","node:ShaderNodeInvert","node:ShaderNodeLayerWeight"] +- commandBudget: max=48; read/exploration max=16 +- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1252-001 --write` + +## 目标 + +以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 ShaderNodeHairInfo, ShaderNodeHoldout, ShaderNodeHueSaturation, ShaderNodeInvert, ShaderNodeLayerWeight 的真实 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-shader-f8e029f92dbfd33d.blend` +- Chromium test: `web/tests/e2e/shader-main-reader-production.spec.ts` +- Selected modifier units: `modifier-source:ShaderNodeHairInfo`, `modifier-source:ShaderNodeHoldout`, `modifier-source:ShaderNodeHueSaturation`, `modifier-source:ShaderNodeInvert`, `modifier-source:ShaderNodeLayerWeight` +- 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-P1252-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-P1252-001/module-receipt.json` +- Aggregate production evidence: `tests/golden/WBV2-P1252-001/modifier-reader-batch-production.json` +- Manifest: `tests/golden/WBV2-P1252-001/manifest.json` +- Status: `docs/status/WBV2-P1252-001.md` +- Rollback: restore WBV2-P1252-000 as queue parent without rewriting prior evidence. diff --git a/tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend b/tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend new file mode 100644 index 0000000000000000000000000000000000000000..0f8325ad0bb6849b93deb4a9ec0113a52a09a273 GIT binary patch literal 97451 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%0D$PRhmpD*I4XHr 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�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 literal 0 HcmV?d00001 diff --git a/tests/golden/WBV2-P1252-000/manifest.json b/tests/golden/WBV2-P1252-000/manifest.json new file mode 100644 index 000000000..ec5a2e350 --- /dev/null +++ b/tests/golden/WBV2-P1252-000/manifest.json @@ -0,0 +1,50 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1252-000", + "parentTask": "WBV2-P1251-001", + "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1251-001/manifest.json", + "sha256": "d8500dd587e3da10c1a2b3b11346016244a1d9913c7c76e8e52f981f177625ec" + }, + "plan": { + "path": "tests/golden/WBV2-P1252-000/module-execution-plan.json", + "sha256": "53a43465dd4654d3c970c99c8850bc38926a44c48468123b89c569c3c2aa7423" + }, + "report": { + "path": "tests/golden/WBV2-P1252-000/successor-authorization-report.json", + "sha256": "4ef65fa0403bb2b2c51d4e43475167824cbc1b68fe2a10d217e67fdabb970af6" + }, + "status": { + "path": "docs/status/WBV2-P1252-000.md", + "sha256": "c9aec7fb93ae8bd43e3e22cb3014618badf420d063e8f87c7a50d0f047992db5" + } + }, + "assertions": { + "sourceBackedSuccessor": true, + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchSize": 5, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 929, + "dynamicUnverifiedUnits": 2816, + "boundUnitDelta": 0, + "fullHistoricalReproduction": false + }, + "nextTask": "WBV2-P1252-001" +} diff --git a/tests/golden/WBV2-P1252-000/module-execution-plan.json b/tests/golden/WBV2-P1252-000/module-execution-plan.json new file mode 100644 index 000000000..cfb7c854a --- /dev/null +++ b/tests/golden/WBV2-P1252-000/module-execution-plan.json @@ -0,0 +1,25162 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_MODULE_EXECUTION_P1252", + "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 + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1172-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "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_normalize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_file_output.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_pixelate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_plane_track_deform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_posterize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_convert.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_render_layers.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-bf66c685c7c6fd95.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-P1173-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "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_relative_to_pixel.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rotate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scale.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scene_time.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_separate_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_strip_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_set_alpha.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_split.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-a1b966b1af421537.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-P1174-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "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_stabilize_2d.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_string_to_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch_view.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_time_curve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_tone_map.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_track_position.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_translate.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-8f71e517e24622f2.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-P1175-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "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_vector_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.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-4c3e128e97498ba4.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1176-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1177-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1178-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1179-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1180-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1181-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1182-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1183-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1184-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1185-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1186-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1187-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1188-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bone_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bounding_box.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_camera_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0f87459df8986017.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1189-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_connected.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_collection_children.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_edge.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-447074d84f4807db.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1190-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cube_grid_topology.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1191-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_curve_of_point.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_bezier_segment.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-71424076a2a8f339.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1192-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadratic_bezier.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_set_handle_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1193-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curves_to_grease_pencil.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1194-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8f6105d06959322c.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1195-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1196-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edges_to_face_groups.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1197-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_average.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1198-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_filter_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6581c99986be795f.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1199-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_geometry_to_instance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_attribute_names.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_bundle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-240d704df4420718.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1200-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_component.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_dial.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_linear.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_transform.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1201-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grease_pencil_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_advect.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_clip.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_curl.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_dilate_erode.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1202-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_divergence.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_gradient.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_mean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1203-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_median.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_prune.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_voxelize.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1204-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_csv.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_obj.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_ply.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_stl.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1205-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_text.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_vdb.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_of_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1206-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_collection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_edge_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_font.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-150a227b3433d301.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1207-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_id.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_bounds.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_reference.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1208-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_scale.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_angle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1209-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_area.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_neighbors.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e28f27c297406a24.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1210-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_island.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_vertex_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_layer_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1211-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_align_rotation_to_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axes_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_combine_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_euler_to_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1212-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_find_in_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_format_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_bool.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1213-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_menu.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_special_characters.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1214-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_match_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_determinant.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1215-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1216-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1216-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c598026385cc94dc", + "selectedRecordIds": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_axis_angle.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_euler.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_quaternion.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_separate_matrix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c598026385cc94dc.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1217-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1217-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dbc0fb8bb88f3d37", + "selectedRecordIds": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_set_string_case.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_slice_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_length.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_to_value.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_direction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-dbc0fb8bb88f3d37.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1218-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1218-001:AUTO_GEOMETRY_NATIVE_NODE_READER:34abb58eedf43c5f", + "selectedRecordIds": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_trim_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_value_to_string.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_object.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-34abb58eedf43c5f.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1219-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1219-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cccf2d7fb85d3b8", + "selectedRecordIds": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_face_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cccf2d7fb85d3b8.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1220-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1220-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d0f07a9289283d0", + "selectedRecordIds": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_resolution.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_voxel_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d0f07a9289283d0.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1221-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1221-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c30b3d2a341bc8b1", + "selectedRecordIds": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instances_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_get_item.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c30b3d2a341bc8b1.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1222-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1222-001:AUTO_GEOMETRY_NATIVE_NODE_READER:838d8958e4b989d1", + "selectedRecordIds": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-838d8958e4b989d1.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1223-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1223-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c3b7b0656afe6a91", + "selectedRecordIds": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_bevel.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_boolean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c3b7b0656afe6a91.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1224-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1224-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0dca701c57915fc7", + "selectedRecordIds": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0dca701c57915fc7.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1225-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1225-001:AUTO_GEOMETRY_NATIVE_NODE_READER:142ee68a2ed9492b", + "selectedRecordIds": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-142ee68a2ed9492b.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1226-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1226-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abb1c596d4ee21b2", + "selectedRecordIds": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_offset_point_in_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abb1c596d4ee21b2.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1227-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1227-001:AUTO_GEOMETRY_NATIVE_NODE_READER:81deda73b9188c10", + "selectedRecordIds": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-81deda73b9188c10.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1228-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1228-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6b022a1a8e99f7fd", + "selectedRecordIds": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_proximity.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_raycast.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rename_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6b022a1a8e99f7fd.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1229-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1229-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1323c437a10e245b", + "selectedRecordIds": [ + "node:GeometryNodeRepeatOutput" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1323c437a10e245b.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1230-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1230-001:AUTO_GEOMETRY_NATIVE_NODE_READER:bb5c9b89367c9d6d", + "selectedRecordIds": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_boolean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-bb5c9b89367c9d6d.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1231-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1231-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e423b626a07145e", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean_curvature.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_median.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e423b626a07145e.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1232-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1232-001:AUTO_GEOMETRY_NATIVE_NODE_READER:404eb303152ba922", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_offset.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-404eb303152ba922.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1233-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1233-001:AUTO_GEOMETRY_NATIVE_NODE_READER:529a042eb604c0e1", + "selectedRecordIds": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_sound_frequencies.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-529a042eb604c0e1.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1234-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1234-001:AUTO_GEOMETRY_NATIVE_NODE_READER:ad9e5b4bf235659f", + "selectedRecordIds": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_self_object.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_separate_components.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-ad9e5b4bf235659f.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1235-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1235-001:AUTO_GEOMETRY_NATIVE_NODE_READER:91beafd1d1c04670", + "selectedRecordIds": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_name.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_color.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-91beafd1d1c04670.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1236-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1236-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b7b77a5dec80a14d", + "selectedRecordIds": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_depth_mode.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_softness.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_id.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b7b77a5dec80a14d.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1237-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1237-001:AUTO_GEOMETRY_NATIVE_NODE_READER:95ccfa5892bb7a33", + "selectedRecordIds": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_mesh_normal.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_order.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-95ccfa5892bb7a33.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1238-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1238-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d3751cce437cb33", + "selectedRecordIds": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_weight.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d3751cce437cb33.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1239-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1239-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2de2c5e6ce0c4914", + "selectedRecordIds": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2de2c5e6ce0c4914.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1240-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1240-001:AUTO_GEOMETRY_NATIVE_NODE_READER:70077c253f8e9738", + "selectedRecordIds": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_join.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-70077c253f8e9738.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1241-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1241-001:AUTO_GEOMETRY_NATIVE_NODE_READER:518360e680870ecc", + "selectedRecordIds": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tag_filter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-518360e680870ecc.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1242-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1242-001:AUTO_GEOMETRY_NATIVE_NODE_READER:f355dda8099b8a6f", + "selectedRecordIds": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_active_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_face_set.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mouse_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-f355dda8099b8a6f.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1243-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1243-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6399364bfcbc157c", + "selectedRecordIds": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_transfer_attributes.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6399364bfcbc157c.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1244-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_vertex_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.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_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1245-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1245-001:AUTO_GEOMETRY_NATIVE_NODE_READER:06a9b0a82fc0bc5b", + "selectedRecordIds": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewport_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_warning.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_xpbd_solver.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-06a9b0a82fc0bc5b.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_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1246-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1246-001:AUTO_SHADER_NATIVE_NODE_READER:6084b65cc9b4dd13", + "selectedRecordIds": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_add_shader.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_attribute.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_background.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bevel.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-6084b65cc9b4dd13.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_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1247-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1247-001:AUTO_SHADER_NATIVE_NODE_READER:492bd603ac3e7b39", + "selectedRecordIds": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_blackbody.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_brightness.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-492bd603ac3e7b39.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_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1248-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1248-001:AUTO_SHADER_NATIVE_NODE_READER:5d3fdcd95f8dcb4a", + "selectedRecordIds": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_metallic.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_ray_portal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-5d3fdcd95f8dcb4a.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_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1249-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1249-001:AUTO_SHADER_NATIVE_NODE_READER:3dd8ce20c676372b", + "selectedRecordIds": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_toon.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bump.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-3dd8ce20c676372b.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_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1250-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1250-001:AUTO_SHADER_NATIVE_NODE_READER:4962cd49b587a2f9", + "selectedRecordIds": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_camera.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_clamp.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_xyz.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_displacement.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-4962cd49b587a2f9.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_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1251-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1251-001:AUTO_SHADER_NATIVE_NODE_READER:2367477c6dfff68d", + "selectedRecordIds": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_eevee_specular.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_emission.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_fresnel.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_gamma.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-2367477c6dfff68d.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_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1252-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.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 + } + } + }, + { + "id": "WBV2-P1172-000", + "phase": "1172", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1171-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1172", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1172-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-P1172-001", + "phase": "1172", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1172-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1172-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-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "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_normalize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_file_output.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_pixelate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_plane_track_deform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_posterize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_convert.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_render_layers.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-bf66c685c7c6fd95.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": [ + "CompositorNodeNormalize type is read from Blender Main", + "CompositorNodeOutputFile type is read from Blender Main", + "CompositorNodePixelate type is read from Blender Main", + "CompositorNodePlaneTrackDeform type is read from Blender Main", + "CompositorNodePosterize type is read from Blender Main", + "CompositorNodePremulKey type is read from Blender Main", + "CompositorNodeRGBToBW type is read from Blender Main", + "CompositorNodeRLayers 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-P1172-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1172-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-bf66c685c7c6fd95.blend WBV2_BATCH_TYPES='[\"CompositorNodeNormalize\",\"CompositorNodeOutputFile\",\"CompositorNodePixelate\",\"CompositorNodePlaneTrackDeform\",\"CompositorNodePosterize\",\"CompositorNodePremulKey\",\"CompositorNodeRGBToBW\",\"CompositorNodeRLayers\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeNormalize\",\"node:CompositorNodeOutputFile\",\"node:CompositorNodePixelate\",\"node:CompositorNodePlaneTrackDeform\",\"node:CompositorNodePosterize\",\"node:CompositorNodePremulKey\",\"node:CompositorNodeRGBToBW\",\"node:CompositorNodeRLayers\"]' 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-P1172-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1173-000", + "phase": "1173", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1172-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1173", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1173-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-P1173-001", + "phase": "1173", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1173-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1173-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-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "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_relative_to_pixel.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rotate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scale.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scene_time.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_separate_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_strip_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_set_alpha.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_split.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-a1b966b1af421537.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": [ + "CompositorNodeRelativeToPixel type is read from Blender Main", + "CompositorNodeRotate type is read from Blender Main", + "CompositorNodeScale type is read from Blender Main", + "CompositorNodeSceneTime type is read from Blender Main", + "CompositorNodeSeparateColor type is read from Blender Main", + "CompositorNodeSequencerStripInfo type is read from Blender Main", + "CompositorNodeSetAlpha type is read from Blender Main", + "CompositorNodeSplit 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-P1173-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1173-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-a1b966b1af421537.blend WBV2_BATCH_TYPES='[\"CompositorNodeRelativeToPixel\",\"CompositorNodeRotate\",\"CompositorNodeScale\",\"CompositorNodeSceneTime\",\"CompositorNodeSeparateColor\",\"CompositorNodeSequencerStripInfo\",\"CompositorNodeSetAlpha\",\"CompositorNodeSplit\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeRelativeToPixel\",\"node:CompositorNodeRotate\",\"node:CompositorNodeScale\",\"node:CompositorNodeSceneTime\",\"node:CompositorNodeSeparateColor\",\"node:CompositorNodeSequencerStripInfo\",\"node:CompositorNodeSetAlpha\",\"node:CompositorNodeSplit\"]' 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-P1173-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1174-000", + "phase": "1174", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1173-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1174", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1174-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-P1174-001", + "phase": "1174", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1174-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1174-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-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "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_stabilize_2d.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_string_to_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch_view.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_time_curve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_tone_map.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_track_position.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_translate.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-8f71e517e24622f2.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": [ + "CompositorNodeStabilize type is read from Blender Main", + "CompositorNodeStringToImage type is read from Blender Main", + "CompositorNodeSwitch type is read from Blender Main", + "CompositorNodeSwitchView type is read from Blender Main", + "CompositorNodeTime type is read from Blender Main", + "CompositorNodeTonemap type is read from Blender Main", + "CompositorNodeTrackPos type is read from Blender Main", + "CompositorNodeTranslate 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-P1174-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1174-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8f71e517e24622f2.blend WBV2_BATCH_TYPES='[\"CompositorNodeStabilize\",\"CompositorNodeStringToImage\",\"CompositorNodeSwitch\",\"CompositorNodeSwitchView\",\"CompositorNodeTime\",\"CompositorNodeTonemap\",\"CompositorNodeTrackPos\",\"CompositorNodeTranslate\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeStabilize\",\"node:CompositorNodeStringToImage\",\"node:CompositorNodeSwitch\",\"node:CompositorNodeSwitchView\",\"node:CompositorNodeTime\",\"node:CompositorNodeTonemap\",\"node:CompositorNodeTrackPos\",\"node:CompositorNodeTranslate\"]' 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-P1174-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1175-000", + "phase": "1175", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1174-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1175", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1175-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-P1175-001", + "phase": "1175", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1175-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1175-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-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "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_vector_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.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-4c3e128e97498ba4.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": [ + "CompositorNodeVecBlur type is read from Blender Main", + "CompositorNodeZcombine 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-P1175-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1175-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend WBV2_BATCH_TYPES='[\"CompositorNodeVecBlur\",\"CompositorNodeZcombine\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeVecBlur\",\"node:CompositorNodeZcombine\"]' 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-P1175-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1176-000", + "phase": "1176", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1175-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1176", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1176-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-P1176-001", + "phase": "1176", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1176-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1176-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1176-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1176-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1176-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1177-000", + "phase": "1177", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1176-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1177", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1177-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-P1177-001", + "phase": "1177", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1177-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1177-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1177-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1177-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1177-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1178-000", + "phase": "1178", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1177-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1178", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1178-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-P1178-001", + "phase": "1178", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1178-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1178-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1178-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1178-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1178-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1179-000", + "phase": "1179", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1178-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1179", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1179-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-P1179-001", + "phase": "1179", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1179-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1179-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1179-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1179-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1179-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1180-000", + "phase": "1180", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1179-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1180", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1180-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-P1180-001", + "phase": "1180", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1180-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1180-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1180-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1180-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1180-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1181-000", + "phase": "1181", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1180-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1181", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1181-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-P1181-001", + "phase": "1181", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1181-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1181-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1181-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1181-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1181-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1182-000", + "phase": "1182", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1181-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1182", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1182-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-P1182-001", + "phase": "1182", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1182-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1182-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1182-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1182-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1182-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1183-000", + "phase": "1183", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1182-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1183", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1183-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-P1183-001", + "phase": "1183", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1183-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1183-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1183-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1183-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1183-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1184-000", + "phase": "1184", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1183-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1184", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1184-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-P1184-001", + "phase": "1184", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1184-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1184-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1184-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1184-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1184-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1185-000", + "phase": "1185", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1184-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1185", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1185-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-P1185-001", + "phase": "1185", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1185-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1185-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1185-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1185-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1185-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1186-000", + "phase": "1186", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1185-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1186", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1186-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-P1186-001", + "phase": "1186", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1186-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1186-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1186-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1186-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1186-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1187-000", + "phase": "1187", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1186-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1187", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1187-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-P1187-001", + "phase": "1187", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1187-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1187-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.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": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute 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-P1187-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1187-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1187-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1188-000", + "phase": "1188", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1187-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1188", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1188-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-P1188-001", + "phase": "1188", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1188-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1188-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bone_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bounding_box.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_camera_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0f87459df8986017.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": [ + "GeometryNodeBoneInfo type is read from Blender Main", + "GeometryNodeBoundBox type is read from Blender Main", + "GeometryNodeCameraInfo type is read from Blender Main", + "GeometryNodeCaptureAttribute type is read from Blender Main", + "GeometryNodeClosureToList 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-P1188-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1188-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0f87459df8986017.blend WBV2_BATCH_TYPES='[\"GeometryNodeBoneInfo\",\"GeometryNodeBoundBox\",\"GeometryNodeCameraInfo\",\"GeometryNodeCaptureAttribute\",\"GeometryNodeClosureToList\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeBoneInfo\",\"node:GeometryNodeBoundBox\",\"node:GeometryNodeCameraInfo\",\"node:GeometryNodeCaptureAttribute\",\"node:GeometryNodeClosureToList\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1188-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1189-000", + "phase": "1189", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1188-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1189", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1189-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-P1189-001", + "phase": "1189", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1189-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1189-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_connected.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_collection_children.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_edge.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-447074d84f4807db.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": [ + "GeometryNodeClusterByConnected type is read from Blender Main", + "GeometryNodeClusterByDistance type is read from Blender Main", + "GeometryNodeCollectionChildren type is read from Blender Main", + "GeometryNodeConvexHull type is read from Blender Main", + "GeometryNodeCornersOfEdge 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-P1189-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1189-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-447074d84f4807db.blend WBV2_BATCH_TYPES='[\"GeometryNodeClusterByConnected\",\"GeometryNodeClusterByDistance\",\"GeometryNodeCollectionChildren\",\"GeometryNodeConvexHull\",\"GeometryNodeCornersOfEdge\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeClusterByConnected\",\"node:GeometryNodeClusterByDistance\",\"node:GeometryNodeCollectionChildren\",\"node:GeometryNodeConvexHull\",\"node:GeometryNodeCornersOfEdge\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1189-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1190-000", + "phase": "1190", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1189-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1190", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1190-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-P1190-001", + "phase": "1190", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1190-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1190-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cube_grid_topology.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.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": [ + "GeometryNodeCornersOfFace type is read from Blender Main", + "GeometryNodeCornersOfVertex type is read from Blender Main", + "GeometryNodeCubeGridTopology type is read from Blender Main", + "GeometryNodeCurveArc type is read from Blender Main", + "GeometryNodeCurveEndpointSelection 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-P1190-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1190-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.blend WBV2_BATCH_TYPES='[\"GeometryNodeCornersOfFace\",\"GeometryNodeCornersOfVertex\",\"GeometryNodeCubeGridTopology\",\"GeometryNodeCurveArc\",\"GeometryNodeCurveEndpointSelection\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCornersOfFace\",\"node:GeometryNodeCornersOfVertex\",\"node:GeometryNodeCubeGridTopology\",\"node:GeometryNodeCurveArc\",\"node:GeometryNodeCurveEndpointSelection\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1190-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1191-000", + "phase": "1191", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1190-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1191", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1191-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-P1191-001", + "phase": "1191", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1191-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1191-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_curve_of_point.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_bezier_segment.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-71424076a2a8f339.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": [ + "GeometryNodeCurveHandleTypeSelection type is read from Blender Main", + "GeometryNodeCurveLength type is read from Blender Main", + "GeometryNodeCurveOfPoint type is read from Blender Main", + "GeometryNodeCurvePrimitiveBezierSegment type is read from Blender Main", + "GeometryNodeCurvePrimitiveCircle 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-P1191-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1191-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-71424076a2a8f339.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurveHandleTypeSelection\",\"GeometryNodeCurveLength\",\"GeometryNodeCurveOfPoint\",\"GeometryNodeCurvePrimitiveBezierSegment\",\"GeometryNodeCurvePrimitiveCircle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurveHandleTypeSelection\",\"node:GeometryNodeCurveLength\",\"node:GeometryNodeCurveOfPoint\",\"node:GeometryNodeCurvePrimitiveBezierSegment\",\"node:GeometryNodeCurvePrimitiveCircle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1191-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1192-000", + "phase": "1192", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1191-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1192", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1192-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-P1192-001", + "phase": "1192", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1192-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1192-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadratic_bezier.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_set_handle_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.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": [ + "GeometryNodeCurvePrimitiveLine type is read from Blender Main", + "GeometryNodeCurvePrimitiveQuadrilateral type is read from Blender Main", + "GeometryNodeCurveQuadraticBezier type is read from Blender Main", + "GeometryNodeCurveSetHandles type is read from Blender Main", + "GeometryNodeCurveSpiral 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-P1192-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1192-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurvePrimitiveLine\",\"GeometryNodeCurvePrimitiveQuadrilateral\",\"GeometryNodeCurveQuadraticBezier\",\"GeometryNodeCurveSetHandles\",\"GeometryNodeCurveSpiral\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurvePrimitiveLine\",\"node:GeometryNodeCurvePrimitiveQuadrilateral\",\"node:GeometryNodeCurveQuadraticBezier\",\"node:GeometryNodeCurveSetHandles\",\"node:GeometryNodeCurveSpiral\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1192-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1193-000", + "phase": "1193", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1192-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1193", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1193-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-P1193-001", + "phase": "1193", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1193-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1193-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curves_to_grease_pencil.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.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": [ + "GeometryNodeCurveSplineType type is read from Blender Main", + "GeometryNodeCurveStar type is read from Blender Main", + "GeometryNodeCurveToMesh type is read from Blender Main", + "GeometryNodeCurveToPoints type is read from Blender Main", + "GeometryNodeCurvesToGreasePencil 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-P1193-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1193-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurveSplineType\",\"GeometryNodeCurveStar\",\"GeometryNodeCurveToMesh\",\"GeometryNodeCurveToPoints\",\"GeometryNodeCurvesToGreasePencil\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurveSplineType\",\"node:GeometryNodeCurveStar\",\"node:GeometryNodeCurveToMesh\",\"node:GeometryNodeCurveToPoints\",\"node:GeometryNodeCurvesToGreasePencil\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1193-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1194-000", + "phase": "1194", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1193-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1194", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1194-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-P1194-001", + "phase": "1194", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1194-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1194-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8f6105d06959322c.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": [ + "GeometryNodeDeformCurvesOnSurface type is read from Blender Main", + "GeometryNodeDeleteGeometry type is read from Blender Main", + "GeometryNodeDistributePointsInGrid type is read from Blender Main", + "GeometryNodeDistributePointsInVolume type is read from Blender Main", + "GeometryNodeDistributePointsOnFaces 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-P1194-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1194-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8f6105d06959322c.blend WBV2_BATCH_TYPES='[\"GeometryNodeDeformCurvesOnSurface\",\"GeometryNodeDeleteGeometry\",\"GeometryNodeDistributePointsInGrid\",\"GeometryNodeDistributePointsInVolume\",\"GeometryNodeDistributePointsOnFaces\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeDeformCurvesOnSurface\",\"node:GeometryNodeDeleteGeometry\",\"node:GeometryNodeDistributePointsInGrid\",\"node:GeometryNodeDistributePointsInVolume\",\"node:GeometryNodeDistributePointsOnFaces\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1194-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1195-000", + "phase": "1195", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1194-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1195", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1195-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-P1195-001", + "phase": "1195", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1195-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1195-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.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": [ + "GeometryNodeDualMesh type is read from Blender Main", + "GeometryNodeDuplicateElements type is read from Blender Main", + "GeometryNodeEdgePathsToCurves type is read from Blender Main", + "GeometryNodeEdgePathsToSelection type is read from Blender Main", + "GeometryNodeEdgesOfCorner 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-P1195-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1195-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.blend WBV2_BATCH_TYPES='[\"GeometryNodeDualMesh\",\"GeometryNodeDuplicateElements\",\"GeometryNodeEdgePathsToCurves\",\"GeometryNodeEdgePathsToSelection\",\"GeometryNodeEdgesOfCorner\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeDualMesh\",\"node:GeometryNodeDuplicateElements\",\"node:GeometryNodeEdgePathsToCurves\",\"node:GeometryNodeEdgePathsToSelection\",\"node:GeometryNodeEdgesOfCorner\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1195-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1196-000", + "phase": "1196", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1195-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1196", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1196-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-P1196-001", + "phase": "1196", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1196-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1196-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edges_to_face_groups.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.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": [ + "GeometryNodeEdgesOfVertex type is read from Blender Main", + "GeometryNodeEdgesToFaceGroups type is read from Blender Main", + "GeometryNodeExtrudeMesh type is read from Blender Main", + "GeometryNodeFaceOfCorner type is read from Blender Main", + "GeometryNodeFieldAtIndex 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-P1196-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1196-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.blend WBV2_BATCH_TYPES='[\"GeometryNodeEdgesOfVertex\",\"GeometryNodeEdgesToFaceGroups\",\"GeometryNodeExtrudeMesh\",\"GeometryNodeFaceOfCorner\",\"GeometryNodeFieldAtIndex\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeEdgesOfVertex\",\"node:GeometryNodeEdgesToFaceGroups\",\"node:GeometryNodeExtrudeMesh\",\"node:GeometryNodeFaceOfCorner\",\"node:GeometryNodeFieldAtIndex\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1196-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1197-000", + "phase": "1197", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1196-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1197", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1197-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-P1197-001", + "phase": "1197", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1197-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1197-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_average.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.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": [ + "GeometryNodeFieldAverage type is read from Blender Main", + "GeometryNodeFieldMinAndMax type is read from Blender Main", + "GeometryNodeFieldOnDomain type is read from Blender Main", + "GeometryNodeFieldToGrid type is read from Blender Main", + "GeometryNodeFieldToList 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-P1197-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1197-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.blend WBV2_BATCH_TYPES='[\"GeometryNodeFieldAverage\",\"GeometryNodeFieldMinAndMax\",\"GeometryNodeFieldOnDomain\",\"GeometryNodeFieldToGrid\",\"GeometryNodeFieldToList\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeFieldAverage\",\"node:GeometryNodeFieldMinAndMax\",\"node:GeometryNodeFieldOnDomain\",\"node:GeometryNodeFieldToGrid\",\"node:GeometryNodeFieldToList\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1197-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1198-000", + "phase": "1198", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1197-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1198", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1198-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-P1198-001", + "phase": "1198", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1198-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1198-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_filter_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6581c99986be795f.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": [ + "GeometryNodeFieldVariance type is read from Blender Main", + "GeometryNodeFillCurve type is read from Blender Main", + "GeometryNodeFilletCurve type is read from Blender Main", + "GeometryNodeFilterList type is read from Blender Main", + "GeometryNodeFlipFaces 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-P1198-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1198-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6581c99986be795f.blend WBV2_BATCH_TYPES='[\"GeometryNodeFieldVariance\",\"GeometryNodeFillCurve\",\"GeometryNodeFilletCurve\",\"GeometryNodeFilterList\",\"GeometryNodeFlipFaces\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeFieldVariance\",\"node:GeometryNodeFillCurve\",\"node:GeometryNodeFilletCurve\",\"node:GeometryNodeFilterList\",\"node:GeometryNodeFlipFaces\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1198-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1199-000", + "phase": "1199", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1198-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1199", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1199-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-P1199-001", + "phase": "1199", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1199-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1199-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_geometry_to_instance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_attribute_names.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_bundle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-240d704df4420718.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": [ + "GeometryNodeForeachGeometryElementInput type is read from Blender Main", + "GeometryNodeForeachGeometryElementOutput type is read from Blender Main", + "GeometryNodeGeometryToInstance type is read from Blender Main", + "GeometryNodeGetAttributeNames type is read from Blender Main", + "GeometryNodeGetGeometryBundle 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-P1199-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1199-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-240d704df4420718.blend WBV2_BATCH_TYPES='[\"GeometryNodeForeachGeometryElementInput\",\"GeometryNodeForeachGeometryElementOutput\",\"GeometryNodeGeometryToInstance\",\"GeometryNodeGetAttributeNames\",\"GeometryNodeGetGeometryBundle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeForeachGeometryElementInput\",\"node:GeometryNodeForeachGeometryElementOutput\",\"node:GeometryNodeGeometryToInstance\",\"node:GeometryNodeGetAttributeNames\",\"node:GeometryNodeGetGeometryBundle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1199-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1200-000", + "phase": "1200", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1199-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1200", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1200-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-P1200-001", + "phase": "1200", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1200-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1200-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_component.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_dial.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_linear.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_transform.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.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": [ + "GeometryNodeGetGeometryComponent type is read from Blender Main", + "GeometryNodeGetNamedGrid type is read from Blender Main", + "GeometryNodeGizmoDial type is read from Blender Main", + "GeometryNodeGizmoLinear type is read from Blender Main", + "GeometryNodeGizmoTransform 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-P1200-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1200-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.blend WBV2_BATCH_TYPES='[\"GeometryNodeGetGeometryComponent\",\"GeometryNodeGetNamedGrid\",\"GeometryNodeGizmoDial\",\"GeometryNodeGizmoLinear\",\"GeometryNodeGizmoTransform\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGetGeometryComponent\",\"node:GeometryNodeGetNamedGrid\",\"node:GeometryNodeGizmoDial\",\"node:GeometryNodeGizmoLinear\",\"node:GeometryNodeGizmoTransform\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1200-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1201-000", + "phase": "1201", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1200-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1201", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1201-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-P1201-001", + "phase": "1201", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1201-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1201-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grease_pencil_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_advect.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_clip.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_curl.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_dilate_erode.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.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": [ + "GeometryNodeGreasePencilToCurves type is read from Blender Main", + "GeometryNodeGridAdvect type is read from Blender Main", + "GeometryNodeGridClip type is read from Blender Main", + "GeometryNodeGridCurl type is read from Blender Main", + "GeometryNodeGridDilateAndErode 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-P1201-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1201-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.blend WBV2_BATCH_TYPES='[\"GeometryNodeGreasePencilToCurves\",\"GeometryNodeGridAdvect\",\"GeometryNodeGridClip\",\"GeometryNodeGridCurl\",\"GeometryNodeGridDilateAndErode\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGreasePencilToCurves\",\"node:GeometryNodeGridAdvect\",\"node:GeometryNodeGridClip\",\"node:GeometryNodeGridCurl\",\"node:GeometryNodeGridDilateAndErode\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1201-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1202-000", + "phase": "1202", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1201-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1202", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1202-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-P1202-001", + "phase": "1202", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1202-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1202-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_divergence.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_gradient.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_mean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.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": [ + "GeometryNodeGridDivergence type is read from Blender Main", + "GeometryNodeGridGradient type is read from Blender Main", + "GeometryNodeGridInfo type is read from Blender Main", + "GeometryNodeGridLaplacian type is read from Blender Main", + "GeometryNodeGridMean 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-P1202-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1202-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.blend WBV2_BATCH_TYPES='[\"GeometryNodeGridDivergence\",\"GeometryNodeGridGradient\",\"GeometryNodeGridInfo\",\"GeometryNodeGridLaplacian\",\"GeometryNodeGridMean\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGridDivergence\",\"node:GeometryNodeGridGradient\",\"node:GeometryNodeGridInfo\",\"node:GeometryNodeGridLaplacian\",\"node:GeometryNodeGridMean\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1202-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1203-000", + "phase": "1203", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1202-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1203", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1203-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-P1203-001", + "phase": "1203", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1203-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1203-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_median.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_prune.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_voxelize.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.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": [ + "GeometryNodeGridMedian type is read from Blender Main", + "GeometryNodeGridPrune type is read from Blender Main", + "GeometryNodeGridToMesh type is read from Blender Main", + "GeometryNodeGridToPoints type is read from Blender Main", + "GeometryNodeGridVoxelize 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-P1203-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1203-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.blend WBV2_BATCH_TYPES='[\"GeometryNodeGridMedian\",\"GeometryNodeGridPrune\",\"GeometryNodeGridToMesh\",\"GeometryNodeGridToPoints\",\"GeometryNodeGridVoxelize\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGridMedian\",\"node:GeometryNodeGridPrune\",\"node:GeometryNodeGridToMesh\",\"node:GeometryNodeGridToPoints\",\"node:GeometryNodeGridVoxelize\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1203-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1204-000", + "phase": "1204", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1203-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1204", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1204-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-P1204-001", + "phase": "1204", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1204-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1204-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_csv.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_obj.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_ply.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_stl.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.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": [ + "GeometryNodeImageTexture type is read from Blender Main", + "GeometryNodeImportCSV type is read from Blender Main", + "GeometryNodeImportOBJ type is read from Blender Main", + "GeometryNodeImportPLY type is read from Blender Main", + "GeometryNodeImportSTL 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-P1204-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1204-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.blend WBV2_BATCH_TYPES='[\"GeometryNodeImageTexture\",\"GeometryNodeImportCSV\",\"GeometryNodeImportOBJ\",\"GeometryNodeImportPLY\",\"GeometryNodeImportSTL\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeImageTexture\",\"node:GeometryNodeImportCSV\",\"node:GeometryNodeImportOBJ\",\"node:GeometryNodeImportPLY\",\"node:GeometryNodeImportSTL\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1204-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1205-000", + "phase": "1205", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1204-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1205", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1205-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-P1205-001", + "phase": "1205", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1205-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1205-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_text.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_vdb.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_of_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.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": [ + "GeometryNodeImportText type is read from Blender Main", + "GeometryNodeImportVDB type is read from Blender Main", + "GeometryNodeIndexOfNearest type is read from Blender Main", + "GeometryNodeIndexSwitch type is read from Blender Main", + "GeometryNodeInputActiveCamera 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-P1205-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1205-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.blend WBV2_BATCH_TYPES='[\"GeometryNodeImportText\",\"GeometryNodeImportVDB\",\"GeometryNodeIndexOfNearest\",\"GeometryNodeIndexSwitch\",\"GeometryNodeInputActiveCamera\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeImportText\",\"node:GeometryNodeImportVDB\",\"node:GeometryNodeIndexOfNearest\",\"node:GeometryNodeIndexSwitch\",\"node:GeometryNodeInputActiveCamera\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1205-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1206-000", + "phase": "1206", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1205-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1206", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1206-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-P1206-001", + "phase": "1206", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1206-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1206-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_collection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_edge_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_font.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-150a227b3433d301.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": [ + "GeometryNodeInputCollection type is read from Blender Main", + "GeometryNodeInputCurveHandlePositions type is read from Blender Main", + "GeometryNodeInputCurveTilt type is read from Blender Main", + "GeometryNodeInputEdgeSmooth type is read from Blender Main", + "GeometryNodeInputFont 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-P1206-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1206-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-150a227b3433d301.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputCollection\",\"GeometryNodeInputCurveHandlePositions\",\"GeometryNodeInputCurveTilt\",\"GeometryNodeInputEdgeSmooth\",\"GeometryNodeInputFont\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputCollection\",\"node:GeometryNodeInputCurveHandlePositions\",\"node:GeometryNodeInputCurveTilt\",\"node:GeometryNodeInputEdgeSmooth\",\"node:GeometryNodeInputFont\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1206-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1207-000", + "phase": "1207", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1206-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1207", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1207-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-P1207-001", + "phase": "1207", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1207-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1207-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_id.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_bounds.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_reference.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.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": [ + "GeometryNodeInputID type is read from Blender Main", + "GeometryNodeInputImage type is read from Blender Main", + "GeometryNodeInputIndex type is read from Blender Main", + "GeometryNodeInputInstanceBounds type is read from Blender Main", + "GeometryNodeInputInstanceReference 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-P1207-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1207-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputID\",\"GeometryNodeInputImage\",\"GeometryNodeInputIndex\",\"GeometryNodeInputInstanceBounds\",\"GeometryNodeInputInstanceReference\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputID\",\"node:GeometryNodeInputImage\",\"node:GeometryNodeInputIndex\",\"node:GeometryNodeInputInstanceBounds\",\"node:GeometryNodeInputInstanceReference\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1207-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1208-000", + "phase": "1208", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1207-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1208", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1208-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-P1208-001", + "phase": "1208", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1208-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1208-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_scale.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_angle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.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": [ + "GeometryNodeInputInstanceRotation type is read from Blender Main", + "GeometryNodeInputInstanceScale type is read from Blender Main", + "GeometryNodeInputMaterial type is read from Blender Main", + "GeometryNodeInputMaterialIndex type is read from Blender Main", + "GeometryNodeInputMeshEdgeAngle 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-P1208-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1208-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputInstanceRotation\",\"GeometryNodeInputInstanceScale\",\"GeometryNodeInputMaterial\",\"GeometryNodeInputMaterialIndex\",\"GeometryNodeInputMeshEdgeAngle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputInstanceRotation\",\"node:GeometryNodeInputInstanceScale\",\"node:GeometryNodeInputMaterial\",\"node:GeometryNodeInputMaterialIndex\",\"node:GeometryNodeInputMeshEdgeAngle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1208-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1209-000", + "phase": "1209", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1208-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1209", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1209-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-P1209-001", + "phase": "1209", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1209-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1209-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_area.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_neighbors.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e28f27c297406a24.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": [ + "GeometryNodeInputMeshEdgeNeighbors type is read from Blender Main", + "GeometryNodeInputMeshEdgeVertices type is read from Blender Main", + "GeometryNodeInputMeshFaceArea type is read from Blender Main", + "GeometryNodeInputMeshFaceIsPlanar type is read from Blender Main", + "GeometryNodeInputMeshFaceNeighbors 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-P1209-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1209-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e28f27c297406a24.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputMeshEdgeNeighbors\",\"GeometryNodeInputMeshEdgeVertices\",\"GeometryNodeInputMeshFaceArea\",\"GeometryNodeInputMeshFaceIsPlanar\",\"GeometryNodeInputMeshFaceNeighbors\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputMeshEdgeNeighbors\",\"node:GeometryNodeInputMeshEdgeVertices\",\"node:GeometryNodeInputMeshFaceArea\",\"node:GeometryNodeInputMeshFaceIsPlanar\",\"node:GeometryNodeInputMeshFaceNeighbors\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1209-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1210-000", + "phase": "1210", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1209-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1210", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1210-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-P1210-001", + "phase": "1210", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1210-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1210-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_island.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_vertex_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_layer_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.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": [ + "GeometryNodeInputMeshIsland type is read from Blender Main", + "GeometryNodeInputMeshVertexNeighbors type is read from Blender Main", + "GeometryNodeInputNamedAttribute type is read from Blender Main", + "GeometryNodeInputNamedLayerSelection type is read from Blender Main", + "GeometryNodeInputNormal 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-P1210-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1210-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputMeshIsland\",\"GeometryNodeInputMeshVertexNeighbors\",\"GeometryNodeInputNamedAttribute\",\"GeometryNodeInputNamedLayerSelection\",\"GeometryNodeInputNormal\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputMeshIsland\",\"node:GeometryNodeInputMeshVertexNeighbors\",\"node:GeometryNodeInputNamedAttribute\",\"node:GeometryNodeInputNamedLayerSelection\",\"node:GeometryNodeInputNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1210-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1211-000", + "phase": "1211", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1210-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1211", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1211-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-P1211-001", + "phase": "1211", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1211-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1211-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_align_rotation_to_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axes_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_combine_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_euler_to_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.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": [ + "FunctionNodeAlignRotationToVector type is read from Blender Main", + "FunctionNodeAxesToRotation type is read from Blender Main", + "FunctionNodeAxisAngleToRotation type is read from Blender Main", + "FunctionNodeCombineMatrix type is read from Blender Main", + "FunctionNodeEulerToRotation 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-P1211-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1211-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.blend WBV2_BATCH_TYPES='[\"FunctionNodeAlignRotationToVector\",\"FunctionNodeAxesToRotation\",\"FunctionNodeAxisAngleToRotation\",\"FunctionNodeCombineMatrix\",\"FunctionNodeEulerToRotation\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeAlignRotationToVector\",\"node:FunctionNodeAxesToRotation\",\"node:FunctionNodeAxisAngleToRotation\",\"node:FunctionNodeCombineMatrix\",\"node:FunctionNodeEulerToRotation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1211-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1212-000", + "phase": "1212", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1211-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1212", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1212-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-P1212-001", + "phase": "1212", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1212-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1212-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_find_in_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_format_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_bool.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.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": [ + "FunctionNodeFindInString type is read from Blender Main", + "FunctionNodeFormatString type is read from Blender Main", + "FunctionNodeInputBool type is read from Blender Main", + "FunctionNodeInputInt type is read from Blender Main", + "FunctionNodeInputIntVector 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-P1212-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1212-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.blend WBV2_BATCH_TYPES='[\"FunctionNodeFindInString\",\"FunctionNodeFormatString\",\"FunctionNodeInputBool\",\"FunctionNodeInputInt\",\"FunctionNodeInputIntVector\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeFindInString\",\"node:FunctionNodeFormatString\",\"node:FunctionNodeInputBool\",\"node:FunctionNodeInputInt\",\"node:FunctionNodeInputIntVector\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1212-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1213-000", + "phase": "1213", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1212-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1213", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1213-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-P1213-001", + "phase": "1213", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1213-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1213-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_menu.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_special_characters.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.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": [ + "FunctionNodeInputMenu type is read from Blender Main", + "FunctionNodeInputRotation type is read from Blender Main", + "FunctionNodeInputSpecialCharacters type is read from Blender Main", + "FunctionNodeInputString type is read from Blender Main", + "FunctionNodeInputVector 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-P1213-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1213-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.blend WBV2_BATCH_TYPES='[\"FunctionNodeInputMenu\",\"FunctionNodeInputRotation\",\"FunctionNodeInputSpecialCharacters\",\"FunctionNodeInputString\",\"FunctionNodeInputVector\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeInputMenu\",\"node:FunctionNodeInputRotation\",\"node:FunctionNodeInputSpecialCharacters\",\"node:FunctionNodeInputString\",\"node:FunctionNodeInputVector\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1213-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1214-000", + "phase": "1214", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1213-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1214", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1214-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-P1214-001", + "phase": "1214", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1214-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1214-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_match_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_determinant.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.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": [ + "FunctionNodeInvertMatrix type is read from Blender Main", + "FunctionNodeInvertRotation type is read from Blender Main", + "FunctionNodeMatchString type is read from Blender Main", + "FunctionNodeMatrixDeterminant type is read from Blender Main", + "FunctionNodeMatrixMultiply 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-P1214-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1214-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.blend WBV2_BATCH_TYPES='[\"FunctionNodeInvertMatrix\",\"FunctionNodeInvertRotation\",\"FunctionNodeMatchString\",\"FunctionNodeMatrixDeterminant\",\"FunctionNodeMatrixMultiply\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeInvertMatrix\",\"node:FunctionNodeInvertRotation\",\"node:FunctionNodeMatchString\",\"node:FunctionNodeMatrixDeterminant\",\"node:FunctionNodeMatrixMultiply\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1214-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1215-000", + "phase": "1215", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1214-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1215", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1215-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-P1215-001", + "phase": "1215", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1215-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1215-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.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": [ + "FunctionNodeProjectPoint type is read from Blender Main", + "FunctionNodeQuaternionToRotation type is read from Blender Main", + "FunctionNodeReplaceString type is read from Blender Main", + "FunctionNodeReverseString type is read from Blender Main", + "FunctionNodeRotateRotation 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-P1215-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1215-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend WBV2_BATCH_TYPES='[\"FunctionNodeProjectPoint\",\"FunctionNodeQuaternionToRotation\",\"FunctionNodeReplaceString\",\"FunctionNodeReverseString\",\"FunctionNodeRotateRotation\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeProjectPoint\",\"node:FunctionNodeQuaternionToRotation\",\"node:FunctionNodeReplaceString\",\"node:FunctionNodeReverseString\",\"node:FunctionNodeRotateRotation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1215-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1216-000", + "phase": "1216", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1215-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1216", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1216-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-P1216-001", + "phase": "1216", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1216-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1216-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1216-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c598026385cc94dc", + "selectedRecordIds": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1216-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c598026385cc94dc", + "selectedRecordIds": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_axis_angle.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_euler.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_quaternion.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_separate_matrix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c598026385cc94dc.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": [ + "FunctionNodeRotateVector type is read from Blender Main", + "FunctionNodeRotationToAxisAngle type is read from Blender Main", + "FunctionNodeRotationToEuler type is read from Blender Main", + "FunctionNodeRotationToQuaternion type is read from Blender Main", + "FunctionNodeSeparateMatrix 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-P1216-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1216-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c598026385cc94dc.blend WBV2_BATCH_TYPES='[\"FunctionNodeRotateVector\",\"FunctionNodeRotationToAxisAngle\",\"FunctionNodeRotationToEuler\",\"FunctionNodeRotationToQuaternion\",\"FunctionNodeSeparateMatrix\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeRotateVector\",\"node:FunctionNodeRotationToAxisAngle\",\"node:FunctionNodeRotationToEuler\",\"node:FunctionNodeRotationToQuaternion\",\"node:FunctionNodeSeparateMatrix\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1216-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1217-000", + "phase": "1217", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1216-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1217", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1217-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-P1217-001", + "phase": "1217", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1217-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1217-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1217-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dbc0fb8bb88f3d37", + "selectedRecordIds": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1217-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dbc0fb8bb88f3d37", + "selectedRecordIds": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_set_string_case.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_slice_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_length.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_to_value.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_direction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-dbc0fb8bb88f3d37.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": [ + "FunctionNodeSetStringCase type is read from Blender Main", + "FunctionNodeSliceString type is read from Blender Main", + "FunctionNodeStringLength type is read from Blender Main", + "FunctionNodeStringToValue type is read from Blender Main", + "FunctionNodeTransformDirection 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-P1217-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1217-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-dbc0fb8bb88f3d37.blend WBV2_BATCH_TYPES='[\"FunctionNodeSetStringCase\",\"FunctionNodeSliceString\",\"FunctionNodeStringLength\",\"FunctionNodeStringToValue\",\"FunctionNodeTransformDirection\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeSetStringCase\",\"node:FunctionNodeSliceString\",\"node:FunctionNodeStringLength\",\"node:FunctionNodeStringToValue\",\"node:FunctionNodeTransformDirection\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1217-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1218-000", + "phase": "1218", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1217-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1218", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1218-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-P1218-001", + "phase": "1218", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1218-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1218-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1218-001:AUTO_GEOMETRY_NATIVE_NODE_READER:34abb58eedf43c5f", + "selectedRecordIds": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1218-001:AUTO_GEOMETRY_NATIVE_NODE_READER:34abb58eedf43c5f", + "selectedRecordIds": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_trim_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_value_to_string.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_object.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-34abb58eedf43c5f.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": [ + "FunctionNodeTransformPoint type is read from Blender Main", + "FunctionNodeTransposeMatrix type is read from Blender Main", + "FunctionNodeTrimString type is read from Blender Main", + "FunctionNodeValueToString type is read from Blender Main", + "GeometryNodeInputObject 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-P1218-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1218-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-34abb58eedf43c5f.blend WBV2_BATCH_TYPES='[\"FunctionNodeTransformPoint\",\"FunctionNodeTransposeMatrix\",\"FunctionNodeTrimString\",\"FunctionNodeValueToString\",\"GeometryNodeInputObject\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeTransformPoint\",\"node:FunctionNodeTransposeMatrix\",\"node:FunctionNodeTrimString\",\"node:FunctionNodeValueToString\",\"node:GeometryNodeInputObject\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1218-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1219-000", + "phase": "1219", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1218-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1219", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1219-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-P1219-001", + "phase": "1219", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1219-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1219-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1219-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cccf2d7fb85d3b8", + "selectedRecordIds": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1219-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cccf2d7fb85d3b8", + "selectedRecordIds": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_face_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cccf2d7fb85d3b8.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": [ + "GeometryNodeInputPosition type is read from Blender Main", + "GeometryNodeInputRadius type is read from Blender Main", + "GeometryNodeInputSceneTime type is read from Blender Main", + "GeometryNodeInputShadeSmooth type is read from Blender Main", + "GeometryNodeInputShortestEdgePaths 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-P1219-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1219-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-3cccf2d7fb85d3b8.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputPosition\",\"GeometryNodeInputRadius\",\"GeometryNodeInputSceneTime\",\"GeometryNodeInputShadeSmooth\",\"GeometryNodeInputShortestEdgePaths\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputPosition\",\"node:GeometryNodeInputRadius\",\"node:GeometryNodeInputSceneTime\",\"node:GeometryNodeInputShadeSmooth\",\"node:GeometryNodeInputShortestEdgePaths\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1219-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1220-000", + "phase": "1220", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1219-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1220", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1220-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-P1220-001", + "phase": "1220", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1220-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1220-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1220-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d0f07a9289283d0", + "selectedRecordIds": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1220-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d0f07a9289283d0", + "selectedRecordIds": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_resolution.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_voxel_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d0f07a9289283d0.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": [ + "GeometryNodeInputSplineCyclic type is read from Blender Main", + "GeometryNodeInputSplineResolution type is read from Blender Main", + "GeometryNodeInputTangent type is read from Blender Main", + "GeometryNodeInputVoxelIndex type is read from Blender Main", + "GeometryNodeInstanceOnPoints 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-P1220-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1220-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8d0f07a9289283d0.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputSplineCyclic\",\"GeometryNodeInputSplineResolution\",\"GeometryNodeInputTangent\",\"GeometryNodeInputVoxelIndex\",\"GeometryNodeInstanceOnPoints\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputSplineCyclic\",\"node:GeometryNodeInputSplineResolution\",\"node:GeometryNodeInputTangent\",\"node:GeometryNodeInputVoxelIndex\",\"node:GeometryNodeInstanceOnPoints\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1220-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1221-000", + "phase": "1221", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1220-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1221", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1221-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-P1221-001", + "phase": "1221", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1221-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1221-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1221-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c30b3d2a341bc8b1", + "selectedRecordIds": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1221-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c30b3d2a341bc8b1", + "selectedRecordIds": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instances_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_get_item.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c30b3d2a341bc8b1.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": [ + "GeometryNodeInstanceTransform type is read from Blender Main", + "GeometryNodeInstancesToPoints type is read from Blender Main", + "GeometryNodeInterpolateCurves type is read from Blender Main", + "GeometryNodeIsViewport type is read from Blender Main", + "GeometryNodeListGetItem 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-P1221-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1221-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c30b3d2a341bc8b1.blend WBV2_BATCH_TYPES='[\"GeometryNodeInstanceTransform\",\"GeometryNodeInstancesToPoints\",\"GeometryNodeInterpolateCurves\",\"GeometryNodeIsViewport\",\"GeometryNodeListGetItem\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInstanceTransform\",\"node:GeometryNodeInstancesToPoints\",\"node:GeometryNodeInterpolateCurves\",\"node:GeometryNodeIsViewport\",\"node:GeometryNodeListGetItem\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1221-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1222-000", + "phase": "1222", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1221-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1222", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1222-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-P1222-001", + "phase": "1222", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1222-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1222-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1222-001:AUTO_GEOMETRY_NATIVE_NODE_READER:838d8958e4b989d1", + "selectedRecordIds": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1222-001:AUTO_GEOMETRY_NATIVE_NODE_READER:838d8958e4b989d1", + "selectedRecordIds": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-838d8958e4b989d1.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": [ + "GeometryNodeListLength type is read from Blender Main", + "GeometryNodeMaterialSelection type is read from Blender Main", + "GeometryNodeMenuSwitch type is read from Blender Main", + "GeometryNodeMergeByDistance type is read from Blender Main", + "GeometryNodeMergeLayers 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-P1222-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1222-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-838d8958e4b989d1.blend WBV2_BATCH_TYPES='[\"GeometryNodeListLength\",\"GeometryNodeMaterialSelection\",\"GeometryNodeMenuSwitch\",\"GeometryNodeMergeByDistance\",\"GeometryNodeMergeLayers\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeListLength\",\"node:GeometryNodeMaterialSelection\",\"node:GeometryNodeMenuSwitch\",\"node:GeometryNodeMergeByDistance\",\"node:GeometryNodeMergeLayers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1222-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1223-000", + "phase": "1223", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1222-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1223", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1223-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-P1223-001", + "phase": "1223", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1223-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1223-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1223-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c3b7b0656afe6a91", + "selectedRecordIds": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1223-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c3b7b0656afe6a91", + "selectedRecordIds": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_bevel.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_boolean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c3b7b0656afe6a91.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": [ + "GeometryNodeMergePoints type is read from Blender Main", + "GeometryNodeMeshBevel type is read from Blender Main", + "GeometryNodeMeshBoolean type is read from Blender Main", + "GeometryNodeMeshCircle type is read from Blender Main", + "GeometryNodeMeshCone 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-P1223-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1223-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c3b7b0656afe6a91.blend WBV2_BATCH_TYPES='[\"GeometryNodeMergePoints\",\"GeometryNodeMeshBevel\",\"GeometryNodeMeshBoolean\",\"GeometryNodeMeshCircle\",\"GeometryNodeMeshCone\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMergePoints\",\"node:GeometryNodeMeshBevel\",\"node:GeometryNodeMeshBoolean\",\"node:GeometryNodeMeshCircle\",\"node:GeometryNodeMeshCone\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1223-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1224-000", + "phase": "1224", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1223-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1224", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1224-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-P1224-001", + "phase": "1224", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1224-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1224-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1224-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0dca701c57915fc7", + "selectedRecordIds": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1224-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0dca701c57915fc7", + "selectedRecordIds": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0dca701c57915fc7.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": [ + "GeometryNodeMeshCube type is read from Blender Main", + "GeometryNodeMeshCylinder type is read from Blender Main", + "GeometryNodeMeshFaceSetBoundaries type is read from Blender Main", + "GeometryNodeMeshGrid type is read from Blender Main", + "GeometryNodeMeshIcoSphere 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-P1224-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1224-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0dca701c57915fc7.blend WBV2_BATCH_TYPES='[\"GeometryNodeMeshCube\",\"GeometryNodeMeshCylinder\",\"GeometryNodeMeshFaceSetBoundaries\",\"GeometryNodeMeshGrid\",\"GeometryNodeMeshIcoSphere\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMeshCube\",\"node:GeometryNodeMeshCylinder\",\"node:GeometryNodeMeshFaceSetBoundaries\",\"node:GeometryNodeMeshGrid\",\"node:GeometryNodeMeshIcoSphere\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1224-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1225-000", + "phase": "1225", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1224-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1225", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1225-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-P1225-001", + "phase": "1225", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1225-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1225-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1225-001:AUTO_GEOMETRY_NATIVE_NODE_READER:142ee68a2ed9492b", + "selectedRecordIds": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1225-001:AUTO_GEOMETRY_NATIVE_NODE_READER:142ee68a2ed9492b", + "selectedRecordIds": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-142ee68a2ed9492b.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": [ + "GeometryNodeMeshLine type is read from Blender Main", + "GeometryNodeMeshToCurve type is read from Blender Main", + "GeometryNodeMeshToDensityGrid type is read from Blender Main", + "GeometryNodeMeshToPoints type is read from Blender Main", + "GeometryNodeMeshToSDFGrid 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-P1225-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1225-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-142ee68a2ed9492b.blend WBV2_BATCH_TYPES='[\"GeometryNodeMeshLine\",\"GeometryNodeMeshToCurve\",\"GeometryNodeMeshToDensityGrid\",\"GeometryNodeMeshToPoints\",\"GeometryNodeMeshToSDFGrid\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMeshLine\",\"node:GeometryNodeMeshToCurve\",\"node:GeometryNodeMeshToDensityGrid\",\"node:GeometryNodeMeshToPoints\",\"node:GeometryNodeMeshToSDFGrid\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1225-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1226-000", + "phase": "1226", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1225-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1226", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1226-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-P1226-001", + "phase": "1226", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1226-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1226-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1226-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abb1c596d4ee21b2", + "selectedRecordIds": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1226-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abb1c596d4ee21b2", + "selectedRecordIds": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_offset_point_in_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abb1c596d4ee21b2.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": [ + "GeometryNodeMeshToVolume type is read from Blender Main", + "GeometryNodeMeshUVSphere type is read from Blender Main", + "GeometryNodeOffsetCornerInFace type is read from Blender Main", + "GeometryNodeOffsetPointInCurve type is read from Blender Main", + "GeometryNodePoints 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-P1226-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1226-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-abb1c596d4ee21b2.blend WBV2_BATCH_TYPES='[\"GeometryNodeMeshToVolume\",\"GeometryNodeMeshUVSphere\",\"GeometryNodeOffsetCornerInFace\",\"GeometryNodeOffsetPointInCurve\",\"GeometryNodePoints\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMeshToVolume\",\"node:GeometryNodeMeshUVSphere\",\"node:GeometryNodeOffsetCornerInFace\",\"node:GeometryNodeOffsetPointInCurve\",\"node:GeometryNodePoints\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1226-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1227-000", + "phase": "1227", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1226-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1227", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1227-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-P1227-001", + "phase": "1227", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1227-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1227-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1227-001:AUTO_GEOMETRY_NATIVE_NODE_READER:81deda73b9188c10", + "selectedRecordIds": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1227-001:AUTO_GEOMETRY_NATIVE_NODE_READER:81deda73b9188c10", + "selectedRecordIds": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-81deda73b9188c10.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": [ + "GeometryNodePointsOfCurve type is read from Blender Main", + "GeometryNodePointsToCurves type is read from Blender Main", + "GeometryNodePointsToSDFGrid type is read from Blender Main", + "GeometryNodePointsToVertices type is read from Blender Main", + "GeometryNodePointsToVolume 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-P1227-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1227-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-81deda73b9188c10.blend WBV2_BATCH_TYPES='[\"GeometryNodePointsOfCurve\",\"GeometryNodePointsToCurves\",\"GeometryNodePointsToSDFGrid\",\"GeometryNodePointsToVertices\",\"GeometryNodePointsToVolume\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodePointsOfCurve\",\"node:GeometryNodePointsToCurves\",\"node:GeometryNodePointsToSDFGrid\",\"node:GeometryNodePointsToVertices\",\"node:GeometryNodePointsToVolume\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1227-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1228-000", + "phase": "1228", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1227-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1228", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1228-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-P1228-001", + "phase": "1228", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1228-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1228-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1228-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6b022a1a8e99f7fd", + "selectedRecordIds": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1228-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6b022a1a8e99f7fd", + "selectedRecordIds": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_proximity.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_raycast.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rename_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6b022a1a8e99f7fd.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": [ + "GeometryNodeProximity type is read from Blender Main", + "GeometryNodeRaycast type is read from Blender Main", + "GeometryNodeRemoveAttribute type is read from Blender Main", + "GeometryNodeRenameAttribute type is read from Blender Main", + "GeometryNodeRepeatInput 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-P1228-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1228-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6b022a1a8e99f7fd.blend WBV2_BATCH_TYPES='[\"GeometryNodeProximity\",\"GeometryNodeRaycast\",\"GeometryNodeRemoveAttribute\",\"GeometryNodeRenameAttribute\",\"GeometryNodeRepeatInput\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeProximity\",\"node:GeometryNodeRaycast\",\"node:GeometryNodeRemoveAttribute\",\"node:GeometryNodeRenameAttribute\",\"node:GeometryNodeRepeatInput\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1228-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1229-000", + "phase": "1229", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1228-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1229", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1229-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-P1229-001", + "phase": "1229", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1229-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1229-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1229-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1323c437a10e245b", + "selectedRecordIds": [ + "node:GeometryNodeRepeatOutput" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1229-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1323c437a10e245b", + "selectedRecordIds": [ + "node:GeometryNodeRepeatOutput" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1323c437a10e245b.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": [ + "GeometryNodeRepeatOutput 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-P1229-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1229-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1323c437a10e245b.blend WBV2_BATCH_TYPES='[\"GeometryNodeRepeatOutput\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeRepeatOutput\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1229-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeRepeatOutput" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1230-000", + "phase": "1230", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1229-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1230", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1230-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-P1230-001", + "phase": "1230", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1230-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1230-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1230-001:AUTO_GEOMETRY_NATIVE_NODE_READER:bb5c9b89367c9d6d", + "selectedRecordIds": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1230-001:AUTO_GEOMETRY_NATIVE_NODE_READER:bb5c9b89367c9d6d", + "selectedRecordIds": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_boolean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-bb5c9b89367c9d6d.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": [ + "GeometryNodeReplaceMaterial type is read from Blender Main", + "GeometryNodeResampleCurve type is read from Blender Main", + "GeometryNodeReverseCurve type is read from Blender Main", + "GeometryNodeRotateInstances type is read from Blender Main", + "GeometryNodeSDFGridBoolean 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-P1230-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1230-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-bb5c9b89367c9d6d.blend WBV2_BATCH_TYPES='[\"GeometryNodeReplaceMaterial\",\"GeometryNodeResampleCurve\",\"GeometryNodeReverseCurve\",\"GeometryNodeRotateInstances\",\"GeometryNodeSDFGridBoolean\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeReplaceMaterial\",\"node:GeometryNodeResampleCurve\",\"node:GeometryNodeReverseCurve\",\"node:GeometryNodeRotateInstances\",\"node:GeometryNodeSDFGridBoolean\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1230-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1231-000", + "phase": "1231", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1230-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1231", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1231-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-P1231-001", + "phase": "1231", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1231-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1231-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1231-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e423b626a07145e", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1231-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e423b626a07145e", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean_curvature.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_median.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e423b626a07145e.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": [ + "GeometryNodeSDFGridFillet type is read from Blender Main", + "GeometryNodeSDFGridLaplacian type is read from Blender Main", + "GeometryNodeSDFGridMean type is read from Blender Main", + "GeometryNodeSDFGridMeanCurvature type is read from Blender Main", + "GeometryNodeSDFGridMedian 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-P1231-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1231-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-4e423b626a07145e.blend WBV2_BATCH_TYPES='[\"GeometryNodeSDFGridFillet\",\"GeometryNodeSDFGridLaplacian\",\"GeometryNodeSDFGridMean\",\"GeometryNodeSDFGridMeanCurvature\",\"GeometryNodeSDFGridMedian\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSDFGridFillet\",\"node:GeometryNodeSDFGridLaplacian\",\"node:GeometryNodeSDFGridMean\",\"node:GeometryNodeSDFGridMeanCurvature\",\"node:GeometryNodeSDFGridMedian\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1231-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1232-000", + "phase": "1232", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1231-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1232", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1232-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-P1232-001", + "phase": "1232", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1232-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1232-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1232-001:AUTO_GEOMETRY_NATIVE_NODE_READER:404eb303152ba922", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1232-001:AUTO_GEOMETRY_NATIVE_NODE_READER:404eb303152ba922", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_offset.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-404eb303152ba922.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": [ + "GeometryNodeSDFGridOffset type is read from Blender Main", + "GeometryNodeSampleCurve type is read from Blender Main", + "GeometryNodeSampleGrid type is read from Blender Main", + "GeometryNodeSampleGridIndex type is read from Blender Main", + "GeometryNodeSampleIndex 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-P1232-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1232-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-404eb303152ba922.blend WBV2_BATCH_TYPES='[\"GeometryNodeSDFGridOffset\",\"GeometryNodeSampleCurve\",\"GeometryNodeSampleGrid\",\"GeometryNodeSampleGridIndex\",\"GeometryNodeSampleIndex\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSDFGridOffset\",\"node:GeometryNodeSampleCurve\",\"node:GeometryNodeSampleGrid\",\"node:GeometryNodeSampleGridIndex\",\"node:GeometryNodeSampleIndex\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1232-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1233-000", + "phase": "1233", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1232-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1233", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1233-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-P1233-001", + "phase": "1233", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1233-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1233-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1233-001:AUTO_GEOMETRY_NATIVE_NODE_READER:529a042eb604c0e1", + "selectedRecordIds": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1233-001:AUTO_GEOMETRY_NATIVE_NODE_READER:529a042eb604c0e1", + "selectedRecordIds": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_sound_frequencies.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-529a042eb604c0e1.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": [ + "GeometryNodeSampleNearest type is read from Blender Main", + "GeometryNodeSampleNearestSurface type is read from Blender Main", + "GeometryNodeSampleSoundFrequencies type is read from Blender Main", + "GeometryNodeSampleUVSurface type is read from Blender Main", + "GeometryNodeScaleElements 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-P1233-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1233-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-529a042eb604c0e1.blend WBV2_BATCH_TYPES='[\"GeometryNodeSampleNearest\",\"GeometryNodeSampleNearestSurface\",\"GeometryNodeSampleSoundFrequencies\",\"GeometryNodeSampleUVSurface\",\"GeometryNodeScaleElements\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSampleNearest\",\"node:GeometryNodeSampleNearestSurface\",\"node:GeometryNodeSampleSoundFrequencies\",\"node:GeometryNodeSampleUVSurface\",\"node:GeometryNodeScaleElements\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1233-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1234-000", + "phase": "1234", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1233-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1234", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1234-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-P1234-001", + "phase": "1234", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1234-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1234-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1234-001:AUTO_GEOMETRY_NATIVE_NODE_READER:ad9e5b4bf235659f", + "selectedRecordIds": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1234-001:AUTO_GEOMETRY_NATIVE_NODE_READER:ad9e5b4bf235659f", + "selectedRecordIds": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_self_object.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_separate_components.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-ad9e5b4bf235659f.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": [ + "GeometryNodeScaleInstances type is read from Blender Main", + "GeometryNodeSelfObject type is read from Blender Main", + "GeometryNodeSeparateComponents type is read from Blender Main", + "GeometryNodeSetCurveHandlePositions type is read from Blender Main", + "GeometryNodeSetCurveNormal 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-P1234-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1234-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-ad9e5b4bf235659f.blend WBV2_BATCH_TYPES='[\"GeometryNodeScaleInstances\",\"GeometryNodeSelfObject\",\"GeometryNodeSeparateComponents\",\"GeometryNodeSetCurveHandlePositions\",\"GeometryNodeSetCurveNormal\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeScaleInstances\",\"node:GeometryNodeSelfObject\",\"node:GeometryNodeSeparateComponents\",\"node:GeometryNodeSetCurveHandlePositions\",\"node:GeometryNodeSetCurveNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1234-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1235-000", + "phase": "1235", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1234-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1235", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1235-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-P1235-001", + "phase": "1235", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1235-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1235-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1235-001:AUTO_GEOMETRY_NATIVE_NODE_READER:91beafd1d1c04670", + "selectedRecordIds": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1235-001:AUTO_GEOMETRY_NATIVE_NODE_READER:91beafd1d1c04670", + "selectedRecordIds": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_name.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_color.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-91beafd1d1c04670.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": [ + "GeometryNodeSetCurveRadius type is read from Blender Main", + "GeometryNodeSetCurveTilt type is read from Blender Main", + "GeometryNodeSetGeometryBundle type is read from Blender Main", + "GeometryNodeSetGeometryName type is read from Blender Main", + "GeometryNodeSetGreasePencilColor 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-P1235-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1235-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-91beafd1d1c04670.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetCurveRadius\",\"GeometryNodeSetCurveTilt\",\"GeometryNodeSetGeometryBundle\",\"GeometryNodeSetGeometryName\",\"GeometryNodeSetGreasePencilColor\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetCurveRadius\",\"node:GeometryNodeSetCurveTilt\",\"node:GeometryNodeSetGeometryBundle\",\"node:GeometryNodeSetGeometryName\",\"node:GeometryNodeSetGreasePencilColor\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1235-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1236-000", + "phase": "1236", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1235-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1236", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1236-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-P1236-001", + "phase": "1236", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1236-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1236-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1236-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b7b77a5dec80a14d", + "selectedRecordIds": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1236-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b7b77a5dec80a14d", + "selectedRecordIds": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_depth_mode.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_softness.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_id.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b7b77a5dec80a14d.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": [ + "GeometryNodeSetGreasePencilDepth type is read from Blender Main", + "GeometryNodeSetGreasePencilSoftness type is read from Blender Main", + "GeometryNodeSetGridBackground type is read from Blender Main", + "GeometryNodeSetGridTransform type is read from Blender Main", + "GeometryNodeSetID 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-P1236-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1236-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b7b77a5dec80a14d.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetGreasePencilDepth\",\"GeometryNodeSetGreasePencilSoftness\",\"GeometryNodeSetGridBackground\",\"GeometryNodeSetGridTransform\",\"GeometryNodeSetID\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetGreasePencilDepth\",\"node:GeometryNodeSetGreasePencilSoftness\",\"node:GeometryNodeSetGridBackground\",\"node:GeometryNodeSetGridTransform\",\"node:GeometryNodeSetID\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1236-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1237-000", + "phase": "1237", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1236-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1237", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1237-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-P1237-001", + "phase": "1237", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1237-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1237-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1237-001:AUTO_GEOMETRY_NATIVE_NODE_READER:95ccfa5892bb7a33", + "selectedRecordIds": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1237-001:AUTO_GEOMETRY_NATIVE_NODE_READER:95ccfa5892bb7a33", + "selectedRecordIds": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_mesh_normal.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_order.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-95ccfa5892bb7a33.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": [ + "GeometryNodeSetInstanceTransform type is read from Blender Main", + "GeometryNodeSetMaterial type is read from Blender Main", + "GeometryNodeSetMaterialIndex type is read from Blender Main", + "GeometryNodeSetMeshNormal type is read from Blender Main", + "GeometryNodeSetNURBSOrder 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-P1237-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1237-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-95ccfa5892bb7a33.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetInstanceTransform\",\"GeometryNodeSetMaterial\",\"GeometryNodeSetMaterialIndex\",\"GeometryNodeSetMeshNormal\",\"GeometryNodeSetNURBSOrder\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetInstanceTransform\",\"node:GeometryNodeSetMaterial\",\"node:GeometryNodeSetMaterialIndex\",\"node:GeometryNodeSetMeshNormal\",\"node:GeometryNodeSetNURBSOrder\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1237-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1238-000", + "phase": "1238", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1237-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1238", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1238-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-P1238-001", + "phase": "1238", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1238-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1238-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1238-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d3751cce437cb33", + "selectedRecordIds": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1238-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d3751cce437cb33", + "selectedRecordIds": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_weight.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d3751cce437cb33.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": [ + "GeometryNodeSetNURBSWeight type is read from Blender Main", + "GeometryNodeSetPointRadius type is read from Blender Main", + "GeometryNodeSetShadeSmooth type is read from Blender Main", + "GeometryNodeSetSplineCyclic type is read from Blender Main", + "GeometryNodeSetSplineResolution 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-P1238-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1238-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8d3751cce437cb33.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetNURBSWeight\",\"GeometryNodeSetPointRadius\",\"GeometryNodeSetShadeSmooth\",\"GeometryNodeSetSplineCyclic\",\"GeometryNodeSetSplineResolution\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetNURBSWeight\",\"node:GeometryNodeSetPointRadius\",\"node:GeometryNodeSetShadeSmooth\",\"node:GeometryNodeSetSplineCyclic\",\"node:GeometryNodeSetSplineResolution\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1238-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1239-000", + "phase": "1239", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1238-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1239", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1239-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-P1239-001", + "phase": "1239", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1239-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1239-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1239-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2de2c5e6ce0c4914", + "selectedRecordIds": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1239-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2de2c5e6ce0c4914", + "selectedRecordIds": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2de2c5e6ce0c4914.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": [ + "GeometryNodeSortElements type is read from Blender Main", + "GeometryNodeSortList type is read from Blender Main", + "GeometryNodeSplineLength type is read from Blender Main", + "GeometryNodeSplineParameter type is read from Blender Main", + "GeometryNodeSplitEdges 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-P1239-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1239-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2de2c5e6ce0c4914.blend WBV2_BATCH_TYPES='[\"GeometryNodeSortElements\",\"GeometryNodeSortList\",\"GeometryNodeSplineLength\",\"GeometryNodeSplineParameter\",\"GeometryNodeSplitEdges\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSortElements\",\"node:GeometryNodeSortList\",\"node:GeometryNodeSplineLength\",\"node:GeometryNodeSplineParameter\",\"node:GeometryNodeSplitEdges\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1239-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1240-000", + "phase": "1240", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1239-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1240", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1240-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-P1240-001", + "phase": "1240", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1240-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1240-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1240-001:AUTO_GEOMETRY_NATIVE_NODE_READER:70077c253f8e9738", + "selectedRecordIds": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1240-001:AUTO_GEOMETRY_NATIVE_NODE_READER:70077c253f8e9738", + "selectedRecordIds": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_join.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-70077c253f8e9738.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": [ + "GeometryNodeSplitToInstances type is read from Blender Main", + "GeometryNodeStoreNamedGrid type is read from Blender Main", + "GeometryNodeStringJoin type is read from Blender Main", + "GeometryNodeStringToCurves type is read from Blender Main", + "GeometryNodeSubdivideCurve 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-P1240-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1240-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-70077c253f8e9738.blend WBV2_BATCH_TYPES='[\"GeometryNodeSplitToInstances\",\"GeometryNodeStoreNamedGrid\",\"GeometryNodeStringJoin\",\"GeometryNodeStringToCurves\",\"GeometryNodeSubdivideCurve\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSplitToInstances\",\"node:GeometryNodeStoreNamedGrid\",\"node:GeometryNodeStringJoin\",\"node:GeometryNodeStringToCurves\",\"node:GeometryNodeSubdivideCurve\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1240-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1241-000", + "phase": "1241", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1240-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1241", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1241-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-P1241-001", + "phase": "1241", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1241-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1241-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1241-001:AUTO_GEOMETRY_NATIVE_NODE_READER:518360e680870ecc", + "selectedRecordIds": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1241-001:AUTO_GEOMETRY_NATIVE_NODE_READER:518360e680870ecc", + "selectedRecordIds": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tag_filter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-518360e680870ecc.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": [ + "GeometryNodeSubdivideMesh type is read from Blender Main", + "GeometryNodeSubdivisionSurface type is read from Blender Main", + "GeometryNodeSwitch type is read from Blender Main", + "GeometryNodeTagFilter type is read from Blender Main", + "GeometryNodeTool3DCursor 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-P1241-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1241-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-518360e680870ecc.blend WBV2_BATCH_TYPES='[\"GeometryNodeSubdivideMesh\",\"GeometryNodeSubdivisionSurface\",\"GeometryNodeSwitch\",\"GeometryNodeTagFilter\",\"GeometryNodeTool3DCursor\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSubdivideMesh\",\"node:GeometryNodeSubdivisionSurface\",\"node:GeometryNodeSwitch\",\"node:GeometryNodeTagFilter\",\"node:GeometryNodeTool3DCursor\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1241-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1242-000", + "phase": "1242", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1241-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1242", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1242-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-P1242-001", + "phase": "1242", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1242-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1242-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1242-001:AUTO_GEOMETRY_NATIVE_NODE_READER:f355dda8099b8a6f", + "selectedRecordIds": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1242-001:AUTO_GEOMETRY_NATIVE_NODE_READER:f355dda8099b8a6f", + "selectedRecordIds": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_active_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_face_set.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mouse_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-f355dda8099b8a6f.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": [ + "GeometryNodeToolActiveElement type is read from Blender Main", + "GeometryNodeToolFaceSet type is read from Blender Main", + "GeometryNodeToolMousePosition type is read from Blender Main", + "GeometryNodeToolSelection type is read from Blender Main", + "GeometryNodeToolSetFaceSet 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-P1242-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1242-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-f355dda8099b8a6f.blend WBV2_BATCH_TYPES='[\"GeometryNodeToolActiveElement\",\"GeometryNodeToolFaceSet\",\"GeometryNodeToolMousePosition\",\"GeometryNodeToolSelection\",\"GeometryNodeToolSetFaceSet\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeToolActiveElement\",\"node:GeometryNodeToolFaceSet\",\"node:GeometryNodeToolMousePosition\",\"node:GeometryNodeToolSelection\",\"node:GeometryNodeToolSetFaceSet\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1242-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1243-000", + "phase": "1243", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1242-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1243", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1243-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-P1243-001", + "phase": "1243", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1243-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1243-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1243-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6399364bfcbc157c", + "selectedRecordIds": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1243-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6399364bfcbc157c", + "selectedRecordIds": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_transfer_attributes.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6399364bfcbc157c.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": [ + "GeometryNodeToolSetSelection type is read from Blender Main", + "GeometryNodeTransferAttributes type is read from Blender Main", + "GeometryNodeTranslateInstances type is read from Blender Main", + "GeometryNodeTriangulate type is read from Blender Main", + "GeometryNodeTrimCurve 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-P1243-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1243-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6399364bfcbc157c.blend WBV2_BATCH_TYPES='[\"GeometryNodeToolSetSelection\",\"GeometryNodeTransferAttributes\",\"GeometryNodeTranslateInstances\",\"GeometryNodeTriangulate\",\"GeometryNodeTrimCurve\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeToolSetSelection\",\"node:GeometryNodeTransferAttributes\",\"node:GeometryNodeTranslateInstances\",\"node:GeometryNodeTriangulate\",\"node:GeometryNodeTrimCurve\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1243-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1244-000", + "phase": "1244", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1243-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1244", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1244-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-P1244-001", + "phase": "1244", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1244-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1244-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_vertex_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.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": [ + "GeometryNodeUVPackIslands type is read from Blender Main", + "GeometryNodeUVTangent type is read from Blender Main", + "GeometryNodeUVUnwrap type is read from Blender Main", + "GeometryNodeVertexOfCorner type is read from Blender Main", + "GeometryNodeViewer 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-P1244-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1244-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend WBV2_BATCH_TYPES='[\"GeometryNodeUVPackIslands\",\"GeometryNodeUVTangent\",\"GeometryNodeUVUnwrap\",\"GeometryNodeVertexOfCorner\",\"GeometryNodeViewer\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeUVPackIslands\",\"node:GeometryNodeUVTangent\",\"node:GeometryNodeUVUnwrap\",\"node:GeometryNodeVertexOfCorner\",\"node:GeometryNodeViewer\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1244-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1245-000", + "phase": "1245", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1244-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1245", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1245-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-P1245-001", + "phase": "1245", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1245-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1245-001.md", + "behavior": "Verify the AUTO_GEOMETRY_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-P1245-001:AUTO_GEOMETRY_NATIVE_NODE_READER:06a9b0a82fc0bc5b", + "selectedRecordIds": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1245-001:AUTO_GEOMETRY_NATIVE_NODE_READER:06a9b0a82fc0bc5b", + "selectedRecordIds": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewport_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_warning.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_xpbd_solver.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-06a9b0a82fc0bc5b.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": [ + "GeometryNodeViewportTransform type is read from Blender Main", + "GeometryNodeVolumeCube type is read from Blender Main", + "GeometryNodeVolumeToMesh type is read from Blender Main", + "GeometryNodeWarning type is read from Blender Main", + "GeometryNodeXPBDSolver 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-P1245-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1245-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-06a9b0a82fc0bc5b.blend WBV2_BATCH_TYPES='[\"GeometryNodeViewportTransform\",\"GeometryNodeVolumeCube\",\"GeometryNodeVolumeToMesh\",\"GeometryNodeWarning\",\"GeometryNodeXPBDSolver\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeViewportTransform\",\"node:GeometryNodeVolumeCube\",\"node:GeometryNodeVolumeToMesh\",\"node:GeometryNodeWarning\",\"node:GeometryNodeXPBDSolver\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1245-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1246-000", + "phase": "1246", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1245-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1246", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1246-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-P1246-001", + "phase": "1246", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1246-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1246-001.md", + "behavior": "Verify the AUTO_SHADER_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-P1246-001:AUTO_SHADER_NATIVE_NODE_READER:6084b65cc9b4dd13", + "selectedRecordIds": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1246-001:AUTO_SHADER_NATIVE_NODE_READER:6084b65cc9b4dd13", + "selectedRecordIds": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_add_shader.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_attribute.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_background.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bevel.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-6084b65cc9b4dd13.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": [ + "ShaderNodeAddShader type is read from Blender Main", + "ShaderNodeAmbientOcclusion type is read from Blender Main", + "ShaderNodeAttribute type is read from Blender Main", + "ShaderNodeBackground type is read from Blender Main", + "ShaderNodeBevel 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-P1246-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1246-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-6084b65cc9b4dd13.blend WBV2_BATCH_TYPES='[\"ShaderNodeAddShader\",\"ShaderNodeAmbientOcclusion\",\"ShaderNodeAttribute\",\"ShaderNodeBackground\",\"ShaderNodeBevel\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeAddShader\",\"node:ShaderNodeAmbientOcclusion\",\"node:ShaderNodeAttribute\",\"node:ShaderNodeBackground\",\"node:ShaderNodeBevel\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 web/tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1246-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1247-000", + "phase": "1247", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1246-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1247", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1247-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-P1247-001", + "phase": "1247", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1247-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1247-001.md", + "behavior": "Verify the AUTO_SHADER_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-P1247-001:AUTO_SHADER_NATIVE_NODE_READER:492bd603ac3e7b39", + "selectedRecordIds": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1247-001:AUTO_SHADER_NATIVE_NODE_READER:492bd603ac3e7b39", + "selectedRecordIds": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_blackbody.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_brightness.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-492bd603ac3e7b39.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": [ + "ShaderNodeBlackbody type is read from Blender Main", + "ShaderNodeBrightContrast type is read from Blender Main", + "ShaderNodeBsdfAnisotropic type is read from Blender Main", + "ShaderNodeBsdfDiffuse type is read from Blender Main", + "ShaderNodeBsdfGlass 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-P1247-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1247-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-492bd603ac3e7b39.blend WBV2_BATCH_TYPES='[\"ShaderNodeBlackbody\",\"ShaderNodeBrightContrast\",\"ShaderNodeBsdfAnisotropic\",\"ShaderNodeBsdfDiffuse\",\"ShaderNodeBsdfGlass\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeBlackbody\",\"node:ShaderNodeBrightContrast\",\"node:ShaderNodeBsdfAnisotropic\",\"node:ShaderNodeBsdfDiffuse\",\"node:ShaderNodeBsdfGlass\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1247-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1248-000", + "phase": "1248", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1247-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1248", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1248-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-P1248-001", + "phase": "1248", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1248-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1248-001.md", + "behavior": "Verify the AUTO_SHADER_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-P1248-001:AUTO_SHADER_NATIVE_NODE_READER:5d3fdcd95f8dcb4a", + "selectedRecordIds": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1248-001:AUTO_SHADER_NATIVE_NODE_READER:5d3fdcd95f8dcb4a", + "selectedRecordIds": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_metallic.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_ray_portal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-5d3fdcd95f8dcb4a.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": [ + "ShaderNodeBsdfHair type is read from Blender Main", + "ShaderNodeBsdfHairPrincipled type is read from Blender Main", + "ShaderNodeBsdfMetallic type is read from Blender Main", + "ShaderNodeBsdfRayPortal type is read from Blender Main", + "ShaderNodeBsdfRefraction 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-P1248-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1248-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-5d3fdcd95f8dcb4a.blend WBV2_BATCH_TYPES='[\"ShaderNodeBsdfHair\",\"ShaderNodeBsdfHairPrincipled\",\"ShaderNodeBsdfMetallic\",\"ShaderNodeBsdfRayPortal\",\"ShaderNodeBsdfRefraction\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeBsdfHair\",\"node:ShaderNodeBsdfHairPrincipled\",\"node:ShaderNodeBsdfMetallic\",\"node:ShaderNodeBsdfRayPortal\",\"node:ShaderNodeBsdfRefraction\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1248-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1249-000", + "phase": "1249", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1248-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1249", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1249-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-P1249-001", + "phase": "1249", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1249-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1249-001.md", + "behavior": "Verify the AUTO_SHADER_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-P1249-001:AUTO_SHADER_NATIVE_NODE_READER:3dd8ce20c676372b", + "selectedRecordIds": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1249-001:AUTO_SHADER_NATIVE_NODE_READER:3dd8ce20c676372b", + "selectedRecordIds": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_toon.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bump.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-3dd8ce20c676372b.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": [ + "ShaderNodeBsdfSheen type is read from Blender Main", + "ShaderNodeBsdfToon type is read from Blender Main", + "ShaderNodeBsdfTranslucent type is read from Blender Main", + "ShaderNodeBsdfTransparent type is read from Blender Main", + "ShaderNodeBump 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-P1249-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1249-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-3dd8ce20c676372b.blend WBV2_BATCH_TYPES='[\"ShaderNodeBsdfSheen\",\"ShaderNodeBsdfToon\",\"ShaderNodeBsdfTranslucent\",\"ShaderNodeBsdfTransparent\",\"ShaderNodeBump\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeBsdfSheen\",\"node:ShaderNodeBsdfToon\",\"node:ShaderNodeBsdfTranslucent\",\"node:ShaderNodeBsdfTransparent\",\"node:ShaderNodeBump\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1249-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1250-000", + "phase": "1250", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1249-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1250", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1250-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-P1250-001", + "phase": "1250", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1250-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1250-001.md", + "behavior": "Verify the AUTO_SHADER_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-P1250-001:AUTO_SHADER_NATIVE_NODE_READER:4962cd49b587a2f9", + "selectedRecordIds": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1250-001:AUTO_SHADER_NATIVE_NODE_READER:4962cd49b587a2f9", + "selectedRecordIds": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_camera.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_clamp.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_xyz.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_displacement.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-4962cd49b587a2f9.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": [ + "ShaderNodeCameraData type is read from Blender Main", + "ShaderNodeClamp type is read from Blender Main", + "ShaderNodeCombineColor type is read from Blender Main", + "ShaderNodeCombineXYZ type is read from Blender Main", + "ShaderNodeDisplacement 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-P1250-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1250-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-4962cd49b587a2f9.blend WBV2_BATCH_TYPES='[\"ShaderNodeCameraData\",\"ShaderNodeClamp\",\"ShaderNodeCombineColor\",\"ShaderNodeCombineXYZ\",\"ShaderNodeDisplacement\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeCameraData\",\"node:ShaderNodeClamp\",\"node:ShaderNodeCombineColor\",\"node:ShaderNodeCombineXYZ\",\"node:ShaderNodeDisplacement\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1250-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1251-000", + "phase": "1251", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1250-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1251", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1251-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-P1251-001", + "phase": "1251", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1251-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1251-001.md", + "behavior": "Verify the AUTO_SHADER_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-P1251-001:AUTO_SHADER_NATIVE_NODE_READER:2367477c6dfff68d", + "selectedRecordIds": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1251-001:AUTO_SHADER_NATIVE_NODE_READER:2367477c6dfff68d", + "selectedRecordIds": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_eevee_specular.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_emission.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_fresnel.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_gamma.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-2367477c6dfff68d.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": [ + "ShaderNodeEeveeSpecular type is read from Blender Main", + "ShaderNodeEmission type is read from Blender Main", + "ShaderNodeFloatCurve type is read from Blender Main", + "ShaderNodeFresnel type is read from Blender Main", + "ShaderNodeGamma 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-P1251-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1251-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-2367477c6dfff68d.blend WBV2_BATCH_TYPES='[\"ShaderNodeEeveeSpecular\",\"ShaderNodeEmission\",\"ShaderNodeFloatCurve\",\"ShaderNodeFresnel\",\"ShaderNodeGamma\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeEeveeSpecular\",\"node:ShaderNodeEmission\",\"node:ShaderNodeFloatCurve\",\"node:ShaderNodeFresnel\",\"node:ShaderNodeGamma\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1251-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1252-000", + "phase": "1252", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1251-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1252", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1252-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-P1252-001", + "phase": "1252", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1252-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1252-001.md", + "behavior": "Verify the AUTO_SHADER_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-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.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": [ + "ShaderNodeHairInfo type is read from Blender Main", + "ShaderNodeHoldout type is read from Blender Main", + "ShaderNodeHueSaturation type is read from Blender Main", + "ShaderNodeInvert type is read from Blender Main", + "ShaderNodeLayerWeight 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-P1252-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1252-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend WBV2_BATCH_TYPES='[\"ShaderNodeHairInfo\",\"ShaderNodeHoldout\",\"ShaderNodeHueSaturation\",\"ShaderNodeInvert\",\"ShaderNodeLayerWeight\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeHairInfo\",\"node:ShaderNodeHoldout\",\"node:ShaderNodeHueSaturation\",\"node:ShaderNodeInvert\",\"node:ShaderNodeLayerWeight\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1252-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + } + ] +} diff --git a/tests/golden/WBV2-P1252-001/manifest.json b/tests/golden/WBV2-P1252-001/manifest.json new file mode 100644 index 000000000..28c54d632 --- /dev/null +++ b/tests/golden/WBV2-P1252-001/manifest.json @@ -0,0 +1,116 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1252-001", + "parentTask": "WBV2-P1252-000", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "taskClass": "MODULE", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "BLENDER_WEB_FUNCTION_MODULE", + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1252-000/manifest.json", + "sha256": "f7ff266fc4f9be32babb29522b8a888573befc9bf46846b18db096bd1ebdde9b" + }, + "source1": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc", + "sha256": "6440ec700c309f4712238361194f9f9a46fb3c6d929948ec5a943256f5dbea80" + }, + "source2": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc", + "sha256": "7d0dfde2399ab344c2606326e4258537ca1c3625f0389f6a073a9d1d99795e08" + }, + "source3": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc", + "sha256": "2e9fced89488ddd8fc076ea0e7b97ffe3e3e379cc4c8d407ea4319037d3c054e" + }, + "source4": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc", + "sha256": "230da636f216206ed30ea19b1e261ec18734b6605137b2b178bd2c79b38ad51b" + }, + "source5": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc", + "sha256": "fc78a9dc0a14d60bde01fe9a1fdfb530770e9aff8905d9a5838ab575644aada3" + }, + "source6": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "sha256": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "source7": { + "path": "web/tests/e2e/shader-main-reader-production.spec.ts", + "sha256": "1e43659a14084afd46821fb8bbdc1e564d6213ee87193271d172bc2b0452ea6d" + }, + "source8": { + "path": "tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend", + "sha256": "39bf36bc9a35fc08b8edc4e81f2edab2fd91a68b29566b0dd3f396471a6cb950" + }, + "source9": { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "sha256": "66fc59cba55a8c17d398b74d12ea4a9f09746c0f30c40f579c44aa34956e3072" + }, + "evidence1": { + "path": "tests/golden/WBV2-P1252-001/shader-main-reader-production.json", + "sha256": "d95951fc14f0f2d5acf0d59d10c295aa0b22ac0cdbed41184affbf0aca8ddc93" + }, + "moduleReceipt": { + "path": "tests/golden/WBV2-P1252-001/module-receipt.json", + "sha256": "543a13f7949e4cc6c05ff577ab08bbf73d08469dba3f670df43d24467b9ebdf6" + }, + "status": { + "path": "docs/status/WBV2-P1252-001.md", + "sha256": "570483334569a4a46484021392c9d003af6d27fa8096a586b378e24d41675906" + }, + "log": { + "path": "tests/golden/WBV2-P1252-001/module-run.log", + "sha256": "0ed040e848bf5456bf36a8581fe4c484512fd8016880eab07c9991feff8d6d2b" + }, + "plan": { + "path": "tests/golden/WBV2-P1252-000/module-execution-plan.json", + "sha256": "0e9e81c32aee4949c8163a3bd9f39a5b398f8387dda556bea2f24907b301cb17" + }, + "taskContext": { + "path": "tests/golden/WBV2-P1252-001/task-context.json", + "sha256": "346fefa560666deab9d59d34f8fe037a154358dd9dfb217f820dbfb9d9484298" + } + }, + "assertions": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "sourceBacked": true, + "positiveCases": 7, + "negativeCases": 3, + "recoveryCases": 3, + "commandCount": 4, + "reusedReceiptCount": 1, + "sourceUnchanged": true, + "fullFamilyParity": false, + "dynamicInventoryPath": "tests/golden/WBV2/dynamic-inventory.json", + "dynamicSourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 934, + "dynamicUnverifiedUnits": 2811, + "planningEstimate": 5200, + "historicalInventoryTotal": 6900, + "historicalEffectiveCompleted": 290, + "historicalEffectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1252-001/module-receipt.json b/tests/golden/WBV2-P1252-001/module-receipt.json new file mode 100644 index 000000000..c0025829c --- /dev/null +++ b/tests/golden/WBV2-P1252-001/module-receipt.json @@ -0,0 +1,154 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1252-001", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16, + "commandCount": 4, + "readCommandCount": 0, + "withinBudget": true + }, + "status": "PASS", + "source": { + "paths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "auditedPaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp" + ], + "before": { + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc": "6440ec700c309f4712238361194f9f9a46fb3c6d929948ec5a943256f5dbea80", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc": "7d0dfde2399ab344c2606326e4258537ca1c3625f0389f6a073a9d1d99795e08", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc": "2e9fced89488ddd8fc076ea0e7b97ffe3e3e379cc4c8d407ea4319037d3c054e", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc": "230da636f216206ed30ea19b1e261ec18734b6605137b2b178bd2c79b38ad51b", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc": "fc78a9dc0a14d60bde01fe9a1fdfb530770e9aff8905d9a5838ab575644aada3", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "after": { + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc": "6440ec700c309f4712238361194f9f9a46fb3c6d929948ec5a943256f5dbea80", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc": "7d0dfde2399ab344c2606326e4258537ca1c3625f0389f6a073a9d1d99795e08", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc": "2e9fced89488ddd8fc076ea0e7b97ffe3e3e379cc4c8d407ea4319037d3c054e", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc": "230da636f216206ed30ea19b1e261ec18734b6605137b2b178bd2c79b38ad51b", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc": "fc78a9dc0a14d60bde01fe9a1fdfb530770e9aff8905d9a5838ab575644aada3", + "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": [ + "ShaderNodeHairInfo type is read from Blender Main", + "ShaderNodeHoldout type is read from Blender Main", + "ShaderNodeHueSaturation type is read from Blender Main", + "ShaderNodeInvert type is read from Blender Main", + "ShaderNodeLayerWeight 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": 145 + }, + { + "command": "npm --prefix web run typecheck", + "exitCode": 0, + "durationMs": 3363 + }, + { + "command": "npm --prefix web run build", + "exitCode": 0, + "durationMs": 3946 + }, + { + "command": "WBV2_BATCH_TASK=WBV2-P1252-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1252-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend WBV2_BATCH_TYPES='[\"ShaderNodeHairInfo\",\"ShaderNodeHoldout\",\"ShaderNodeHueSaturation\",\"ShaderNodeInvert\",\"ShaderNodeLayerWeight\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeHairInfo\",\"node:ShaderNodeHoldout\",\"node:ShaderNodeHueSaturation\",\"node:ShaderNodeInvert\",\"node:ShaderNodeLayerWeight\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts", + "exitCode": 0, + "durationMs": 2837 + } + ], + "verification": { + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "chromiumOnly": true, + "fullFamilyParity": false + }, + "efficiency": { + "existingEvidenceReused": false, + "skippedCommands": 0, + "totalDurationMs": 10291, + "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": "440019b1000bc74b2669146108a44954a935b527905ae3a6fffcbf795d93ba0e", + "sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "unitCount": 3745, + "planningEstimate": 5200, + "hardTarget": false, + "verifiedUnits": 934, + "unverifiedUnits": 2811 + } + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1252-001/module-run.log b/tests/golden/WBV2-P1252-001/module-run.log new file mode 100644 index 000000000..3ae183aee --- /dev/null +++ b/tests/golden/WBV2-P1252-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 469ms +[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-P1252-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1252-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend WBV2_BATCH_TYPES='["ShaderNodeHairInfo","ShaderNodeHoldout","ShaderNodeHueSaturation","ShaderNodeInvert","ShaderNodeLayerWeight"]' WBV2_BATCH_UNITS='["node:ShaderNodeHairInfo","node:ShaderNodeHoldout","node:ShaderNodeHueSaturation","node:ShaderNodeInvert","node:ShaderNodeLayerWeight"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-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/shader-main-reader-production.spec.ts + + +Running 1 test using 1 worker + + ✓ 1 tests/e2e/shader-main-reader-production.spec.ts:15:1 › WBV2-P1113-000 reads Shader nodes from Blender Main without JS simulation (1.7s) + + 1 passed (2.5s) +[WebServer] (node:1325906) 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:1325960) 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-P1252-001/shader-main-reader-production.json b/tests/golden/WBV2-P1252-001/shader-main-reader-production.json new file mode 100644 index 000000000..2019f0212 --- /dev/null +++ b/tests/golden/WBV2-P1252-001/shader-main-reader-production.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1252-001", + "operation": "SHADER_MAIN_READER_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": "tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend", + "fixtureSha256": "39bf36bc9a35fc08b8edc4e81f2edab2fd91a68b29566b0dd3f396471a6cb950", + "sourceUnits": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "expectedTypes": [ + "ShaderNodeHairInfo", + "ShaderNodeHoldout", + "ShaderNodeHueSaturation", + "ShaderNodeInvert", + "ShaderNodeLayerWeight" + ], + "sourceNodes": { + "node:ShaderNodeBsdfPrincipled": "material.nodes[type=PRINCIPLED]", + "node:ShaderNodeOutputMaterial": "material.nodes[type=OUTPUT]" + }, + "materials": [ + { + "id": "material:Material", + "nodes": [ + { + "type": "OUTPUT", + "name": "Material Output" + }, + { + "type": "PRINCIPLED", + "name": "Principled BSDF" + } + ], + "links": [ + { + "fromNodeId": "node:132449552:Principled BSDF", + "fromSocket": "BSDF", + "toNodeId": "node:156502014:Material Output", + "toSocket": "Surface" + } + ] + }, + { + "id": "material:WBV2 Shader Batch", + "nodes": [ + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeHairInfo" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeHoldout" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeHueSaturation" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeInvert" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeLayerWeight" + } + ], + "links": [] + } + ], + "reopenedMaterials": [ + { + "id": "material:Material", + "nodes": [ + { + "type": "OUTPUT", + "name": "Material Output" + }, + { + "type": "PRINCIPLED", + "name": "Principled BSDF" + } + ], + "links": [ + { + "fromNodeId": "node:132449552:Principled BSDF", + "fromSocket": "BSDF", + "toNodeId": "node:156502014:Material Output", + "toSocket": "Surface" + } + ] + }, + { + "id": "material:WBV2 Shader Batch", + "nodes": [ + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeHairInfo" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeHoldout" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeHueSaturation" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeInvert" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeLayerWeight" + } + ], + "links": [] + } + ], + "openedRevision": 1, + "reopenedRevision": 1 +} diff --git a/tests/golden/WBV2-P1252-001/task-context.json b/tests/golden/WBV2-P1252-001/task-context.json new file mode 100644 index 000000000..e0e16dc7a --- /dev/null +++ b/tests/golden/WBV2-P1252-001/task-context.json @@ -0,0 +1,217 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1252-001", + "parentTask": "WBV2-P1252-000", + "status": "in_progress", + "goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 ShaderNodeHairInfo, ShaderNodeHoldout, ShaderNodeHueSaturation, ShaderNodeInvert, ShaderNodeLayerWeight 的真实 modifier/RNA 元数据。", + "scope": { + "gap": "capability:AUTO_SHADER_NATIVE_NODE_READER", + "ownerFamily": "NODES", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P1252-001 --write" + ], + "inputPaths": [], + "inputMetadata": { + "docs/EXECUTION_QUEUE.md": { + "path": "docs/EXECUTION_QUEUE.md", + "exists": true, + "bytes": 4030, + "mtime_ns": "1788484612057575826", + "sha256": "a9d567c388bd53253db89f5e23622ae39d667efd833d9a2575b31b513a9174e5" + }, + "docs/tasks/WBV2-P1252-001.md": { + "path": "docs/tasks/WBV2-P1252-001.md", + "exists": true, + "bytes": 2606, + "mtime_ns": "1788484601282901874", + "sha256": "c9bc7e4262387c02349debf9383124ee701f39537343feb568a8dff4fb215c47" + }, + "tests/golden/WBV2-P1252-000/manifest.json": { + "path": "tests/golden/WBV2-P1252-000/manifest.json", + "exists": true, + "bytes": 1653, + "mtime_ns": "1788484601283720528", + "sha256": "f7ff266fc4f9be32babb29522b8a888573befc9bf46846b18db096bd1ebdde9b" + }, + "docs/status/WBV2-P1252-000.md": { + "path": "docs/status/WBV2-P1252-000.md", + "exists": true, + "bytes": 362, + "mtime_ns": "1788484601283049400", + "sha256": "c9aec7fb93ae8bd43e3e22cb3014618badf420d063e8f87c7a50d0f047992db5" + } + }, + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 1253, + "contextRemainingTokens": 311 + }, + "source": { + "bytes": 8651, + "tokens": 2165 + }, + "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-shader-f8e029f92dbfd33d.blend", + "bytes": 97451, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/shader-main-reader-production.spec.ts", + "bytes": 3665, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1252-001/module-receipt.json", + "bytes": 7261, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1252-001/modifier-reader-batch-production.json", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P1252-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P1252-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-P1252-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P1252-000/manifest.json", + "parentStatus": "docs/status/WBV2-P1252-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P1252-001.md", + "tests/golden/WBV2-P1252-000/manifest.json", + "docs/status/WBV2-P1252-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-P1252-000", + "parentTask": "WBV2-P1251-001", + "status": "done", + "nextTask": "WBV2-P1252-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P1252-000 status", + "- task: `WBV2-P1252-000`; parent: `WBV2-P1251-001`; status: `done`", + "- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed", + "- source-backed batch authorized: `AUTO_SHADER_NATIVE_NODE_READER` (5 units)", + "- dynamic inventory: `3745` units; verified `929`; unverified `2816`; bound delta `0`", + "- nextTask: `WBV2-P1252-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 2606, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 49, + "taskTokens": 652 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 4030, + "lines": 58, + "tokens": 1008 + }, + { + "path": "docs/tasks/WBV2-P1252-001.md", + "bytes": 2606, + "lines": 49, + "tokens": 652 + }, + { + "path": "tests/golden/WBV2-P1252-000/manifest.json", + "bytes": 1653, + "lines": 51, + "tokens": 414 + }, + { + "path": "docs/status/WBV2-P1252-000.md", + "bytes": 362, + "lines": 8, + "tokens": 91 + } + ], + "sourceTokens": 2165, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 2165, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3189, + "serializedContextTokens": 674, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index bea4b7109..8d55bf697 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -281,3 +281,5 @@ {"id":"WBV2-P1250-001","gapId":"AUTO_SHADER_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1250","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-P1251-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1251","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} {"id":"WBV2-P1251-001","gapId":"AUTO_SHADER_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1251","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-P1252-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1252","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} +{"id":"WBV2-P1252-001","gapId":"AUTO_SHADER_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1252","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 f4b64508c..7c003010a 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-P1251-000/module-execution-plan.json","sha256":"a74ad17b70b37fa1ed87d470d5b7e8c89097e30bb3b33e36372056572b7c6340"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"fb62023b5d34f34d7ac396a4f87a96379814f6ad4a9983718bde3601bcc77903"},"taskCount":283,"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":"WBV2-P1172-000"},"WBV2-P1172-000":{"line":123,"offset":44048,"length":303,"previous":"WBV2-P1171-001","next":"WBV2-P1172-001"},"WBV2-P1172-001":{"line":124,"offset":44351,"length":366,"previous":"WBV2-P1172-000","next":"WBV2-P1173-000"},"WBV2-P1173-000":{"line":125,"offset":44717,"length":303,"previous":"WBV2-P1172-001","next":"WBV2-P1173-001"},"WBV2-P1173-001":{"line":126,"offset":45020,"length":366,"previous":"WBV2-P1173-000","next":"WBV2-P1174-000"},"WBV2-P1174-000":{"line":127,"offset":45386,"length":303,"previous":"WBV2-P1173-001","next":"WBV2-P1174-001"},"WBV2-P1174-001":{"line":128,"offset":45689,"length":366,"previous":"WBV2-P1174-000","next":"WBV2-P1175-000"},"WBV2-P1175-000":{"line":129,"offset":46055,"length":303,"previous":"WBV2-P1174-001","next":"WBV2-P1175-001"},"WBV2-P1175-001":{"line":130,"offset":46358,"length":366,"previous":"WBV2-P1175-000","next":"WBV2-P1176-000"},"WBV2-P1176-000":{"line":131,"offset":46724,"length":303,"previous":"WBV2-P1175-001","next":"WBV2-P1176-001"},"WBV2-P1176-001":{"line":132,"offset":47027,"length":364,"previous":"WBV2-P1176-000","next":"WBV2-P1177-000"},"WBV2-P1177-000":{"line":133,"offset":47391,"length":303,"previous":"WBV2-P1176-001","next":"WBV2-P1177-001"},"WBV2-P1177-001":{"line":134,"offset":47694,"length":364,"previous":"WBV2-P1177-000","next":"WBV2-P1178-000"},"WBV2-P1178-000":{"line":135,"offset":48058,"length":303,"previous":"WBV2-P1177-001","next":"WBV2-P1178-001"},"WBV2-P1178-001":{"line":136,"offset":48361,"length":364,"previous":"WBV2-P1178-000","next":"WBV2-P1179-000"},"WBV2-P1179-000":{"line":137,"offset":48725,"length":303,"previous":"WBV2-P1178-001","next":"WBV2-P1179-001"},"WBV2-P1179-001":{"line":138,"offset":49028,"length":364,"previous":"WBV2-P1179-000","next":"WBV2-P1180-000"},"WBV2-P1180-000":{"line":139,"offset":49392,"length":303,"previous":"WBV2-P1179-001","next":"WBV2-P1180-001"},"WBV2-P1180-001":{"line":140,"offset":49695,"length":364,"previous":"WBV2-P1180-000","next":"WBV2-P1181-000"},"WBV2-P1181-000":{"line":141,"offset":50059,"length":303,"previous":"WBV2-P1180-001","next":"WBV2-P1181-001"},"WBV2-P1181-001":{"line":142,"offset":50362,"length":364,"previous":"WBV2-P1181-000","next":"WBV2-P1182-000"},"WBV2-P1182-000":{"line":143,"offset":50726,"length":303,"previous":"WBV2-P1181-001","next":"WBV2-P1182-001"},"WBV2-P1182-001":{"line":144,"offset":51029,"length":364,"previous":"WBV2-P1182-000","next":"WBV2-P1183-000"},"WBV2-P1183-000":{"line":145,"offset":51393,"length":303,"previous":"WBV2-P1182-001","next":"WBV2-P1183-001"},"WBV2-P1183-001":{"line":146,"offset":51696,"length":364,"previous":"WBV2-P1183-000","next":"WBV2-P1184-000"},"WBV2-P1184-000":{"line":147,"offset":52060,"length":303,"previous":"WBV2-P1183-001","next":"WBV2-P1184-001"},"WBV2-P1184-001":{"line":148,"offset":52363,"length":364,"previous":"WBV2-P1184-000","next":"WBV2-P1185-000"},"WBV2-P1185-000":{"line":149,"offset":52727,"length":303,"previous":"WBV2-P1184-001","next":"WBV2-P1185-001"},"WBV2-P1185-001":{"line":150,"offset":53030,"length":364,"previous":"WBV2-P1185-000","next":"WBV2-P1186-000"},"WBV2-P1186-000":{"line":151,"offset":53394,"length":303,"previous":"WBV2-P1185-001","next":"WBV2-P1186-001"},"WBV2-P1186-001":{"line":152,"offset":53697,"length":364,"previous":"WBV2-P1186-000","next":"WBV2-P1187-000"},"WBV2-P1187-000":{"line":153,"offset":54061,"length":303,"previous":"WBV2-P1186-001","next":"WBV2-P1187-001"},"WBV2-P1187-001":{"line":154,"offset":54364,"length":364,"previous":"WBV2-P1187-000","next":"WBV2-P1188-000"},"WBV2-P1188-000":{"line":155,"offset":54728,"length":303,"previous":"WBV2-P1187-001","next":"WBV2-P1188-001"},"WBV2-P1188-001":{"line":156,"offset":55031,"length":364,"previous":"WBV2-P1188-000","next":"WBV2-P1189-000"},"WBV2-P1189-000":{"line":157,"offset":55395,"length":303,"previous":"WBV2-P1188-001","next":"WBV2-P1189-001"},"WBV2-P1189-001":{"line":158,"offset":55698,"length":364,"previous":"WBV2-P1189-000","next":"WBV2-P1190-000"},"WBV2-P1190-000":{"line":159,"offset":56062,"length":303,"previous":"WBV2-P1189-001","next":"WBV2-P1190-001"},"WBV2-P1190-001":{"line":160,"offset":56365,"length":364,"previous":"WBV2-P1190-000","next":"WBV2-P1191-000"},"WBV2-P1191-000":{"line":161,"offset":56729,"length":303,"previous":"WBV2-P1190-001","next":"WBV2-P1191-001"},"WBV2-P1191-001":{"line":162,"offset":57032,"length":364,"previous":"WBV2-P1191-000","next":"WBV2-P1192-000"},"WBV2-P1192-000":{"line":163,"offset":57396,"length":303,"previous":"WBV2-P1191-001","next":"WBV2-P1192-001"},"WBV2-P1192-001":{"line":164,"offset":57699,"length":364,"previous":"WBV2-P1192-000","next":"WBV2-P1193-000"},"WBV2-P1193-000":{"line":165,"offset":58063,"length":303,"previous":"WBV2-P1192-001","next":"WBV2-P1193-001"},"WBV2-P1193-001":{"line":166,"offset":58366,"length":364,"previous":"WBV2-P1193-000","next":"WBV2-P1194-000"},"WBV2-P1194-000":{"line":167,"offset":58730,"length":303,"previous":"WBV2-P1193-001","next":"WBV2-P1194-001"},"WBV2-P1194-001":{"line":168,"offset":59033,"length":364,"previous":"WBV2-P1194-000","next":"WBV2-P1195-000"},"WBV2-P1195-000":{"line":169,"offset":59397,"length":303,"previous":"WBV2-P1194-001","next":"WBV2-P1195-001"},"WBV2-P1195-001":{"line":170,"offset":59700,"length":364,"previous":"WBV2-P1195-000","next":"WBV2-P1196-000"},"WBV2-P1196-000":{"line":171,"offset":60064,"length":303,"previous":"WBV2-P1195-001","next":"WBV2-P1196-001"},"WBV2-P1196-001":{"line":172,"offset":60367,"length":364,"previous":"WBV2-P1196-000","next":"WBV2-P1197-000"},"WBV2-P1197-000":{"line":173,"offset":60731,"length":303,"previous":"WBV2-P1196-001","next":"WBV2-P1197-001"},"WBV2-P1197-001":{"line":174,"offset":61034,"length":364,"previous":"WBV2-P1197-000","next":"WBV2-P1198-000"},"WBV2-P1198-000":{"line":175,"offset":61398,"length":303,"previous":"WBV2-P1197-001","next":"WBV2-P1198-001"},"WBV2-P1198-001":{"line":176,"offset":61701,"length":364,"previous":"WBV2-P1198-000","next":"WBV2-P1199-000"},"WBV2-P1199-000":{"line":177,"offset":62065,"length":303,"previous":"WBV2-P1198-001","next":"WBV2-P1199-001"},"WBV2-P1199-001":{"line":178,"offset":62368,"length":364,"previous":"WBV2-P1199-000","next":"WBV2-P1200-000"},"WBV2-P1200-000":{"line":179,"offset":62732,"length":303,"previous":"WBV2-P1199-001","next":"WBV2-P1200-001"},"WBV2-P1200-001":{"line":180,"offset":63035,"length":364,"previous":"WBV2-P1200-000","next":"WBV2-P1201-000"},"WBV2-P1201-000":{"line":181,"offset":63399,"length":303,"previous":"WBV2-P1200-001","next":"WBV2-P1201-001"},"WBV2-P1201-001":{"line":182,"offset":63702,"length":364,"previous":"WBV2-P1201-000","next":"WBV2-P1202-000"},"WBV2-P1202-000":{"line":183,"offset":64066,"length":303,"previous":"WBV2-P1201-001","next":"WBV2-P1202-001"},"WBV2-P1202-001":{"line":184,"offset":64369,"length":364,"previous":"WBV2-P1202-000","next":"WBV2-P1203-000"},"WBV2-P1203-000":{"line":185,"offset":64733,"length":303,"previous":"WBV2-P1202-001","next":"WBV2-P1203-001"},"WBV2-P1203-001":{"line":186,"offset":65036,"length":364,"previous":"WBV2-P1203-000","next":"WBV2-P1204-000"},"WBV2-P1204-000":{"line":187,"offset":65400,"length":303,"previous":"WBV2-P1203-001","next":"WBV2-P1204-001"},"WBV2-P1204-001":{"line":188,"offset":65703,"length":364,"previous":"WBV2-P1204-000","next":"WBV2-P1205-000"},"WBV2-P1205-000":{"line":189,"offset":66067,"length":303,"previous":"WBV2-P1204-001","next":"WBV2-P1205-001"},"WBV2-P1205-001":{"line":190,"offset":66370,"length":364,"previous":"WBV2-P1205-000","next":"WBV2-P1206-000"},"WBV2-P1206-000":{"line":191,"offset":66734,"length":303,"previous":"WBV2-P1205-001","next":"WBV2-P1206-001"},"WBV2-P1206-001":{"line":192,"offset":67037,"length":364,"previous":"WBV2-P1206-000","next":"WBV2-P1207-000"},"WBV2-P1207-000":{"line":193,"offset":67401,"length":303,"previous":"WBV2-P1206-001","next":"WBV2-P1207-001"},"WBV2-P1207-001":{"line":194,"offset":67704,"length":364,"previous":"WBV2-P1207-000","next":"WBV2-P1208-000"},"WBV2-P1208-000":{"line":195,"offset":68068,"length":303,"previous":"WBV2-P1207-001","next":"WBV2-P1208-001"},"WBV2-P1208-001":{"line":196,"offset":68371,"length":364,"previous":"WBV2-P1208-000","next":"WBV2-P1209-000"},"WBV2-P1209-000":{"line":197,"offset":68735,"length":303,"previous":"WBV2-P1208-001","next":"WBV2-P1209-001"},"WBV2-P1209-001":{"line":198,"offset":69038,"length":364,"previous":"WBV2-P1209-000","next":"WBV2-P1210-000"},"WBV2-P1210-000":{"line":199,"offset":69402,"length":303,"previous":"WBV2-P1209-001","next":"WBV2-P1210-001"},"WBV2-P1210-001":{"line":200,"offset":69705,"length":364,"previous":"WBV2-P1210-000","next":"WBV2-P1211-000"},"WBV2-P1211-000":{"line":201,"offset":70069,"length":303,"previous":"WBV2-P1210-001","next":"WBV2-P1211-001"},"WBV2-P1211-001":{"line":202,"offset":70372,"length":364,"previous":"WBV2-P1211-000","next":"WBV2-P1212-000"},"WBV2-P1212-000":{"line":203,"offset":70736,"length":303,"previous":"WBV2-P1211-001","next":"WBV2-P1212-001"},"WBV2-P1212-001":{"line":204,"offset":71039,"length":364,"previous":"WBV2-P1212-000","next":"WBV2-P1213-000"},"WBV2-P1213-000":{"line":205,"offset":71403,"length":303,"previous":"WBV2-P1212-001","next":"WBV2-P1213-001"},"WBV2-P1213-001":{"line":206,"offset":71706,"length":364,"previous":"WBV2-P1213-000","next":"WBV2-P1214-000"},"WBV2-P1214-000":{"line":207,"offset":72070,"length":303,"previous":"WBV2-P1213-001","next":"WBV2-P1214-001"},"WBV2-P1214-001":{"line":208,"offset":72373,"length":364,"previous":"WBV2-P1214-000","next":"WBV2-P1215-000"},"WBV2-P1215-000":{"line":209,"offset":72737,"length":303,"previous":"WBV2-P1214-001","next":"WBV2-P1215-001"},"WBV2-P1215-001":{"line":210,"offset":73040,"length":364,"previous":"WBV2-P1215-000","next":"WBV2-P1216-000"},"WBV2-P1216-000":{"line":211,"offset":73404,"length":303,"previous":"WBV2-P1215-001","next":"WBV2-P1216-001"},"WBV2-P1216-001":{"line":212,"offset":73707,"length":364,"previous":"WBV2-P1216-000","next":"WBV2-P1217-000"},"WBV2-P1217-000":{"line":213,"offset":74071,"length":303,"previous":"WBV2-P1216-001","next":"WBV2-P1217-001"},"WBV2-P1217-001":{"line":214,"offset":74374,"length":364,"previous":"WBV2-P1217-000","next":"WBV2-P1218-000"},"WBV2-P1218-000":{"line":215,"offset":74738,"length":303,"previous":"WBV2-P1217-001","next":"WBV2-P1218-001"},"WBV2-P1218-001":{"line":216,"offset":75041,"length":364,"previous":"WBV2-P1218-000","next":"WBV2-P1219-000"},"WBV2-P1219-000":{"line":217,"offset":75405,"length":303,"previous":"WBV2-P1218-001","next":"WBV2-P1219-001"},"WBV2-P1219-001":{"line":218,"offset":75708,"length":364,"previous":"WBV2-P1219-000","next":"WBV2-P1220-000"},"WBV2-P1220-000":{"line":219,"offset":76072,"length":303,"previous":"WBV2-P1219-001","next":"WBV2-P1220-001"},"WBV2-P1220-001":{"line":220,"offset":76375,"length":364,"previous":"WBV2-P1220-000","next":"WBV2-P1221-000"},"WBV2-P1221-000":{"line":221,"offset":76739,"length":303,"previous":"WBV2-P1220-001","next":"WBV2-P1221-001"},"WBV2-P1221-001":{"line":222,"offset":77042,"length":364,"previous":"WBV2-P1221-000","next":"WBV2-P1222-000"},"WBV2-P1222-000":{"line":223,"offset":77406,"length":303,"previous":"WBV2-P1221-001","next":"WBV2-P1222-001"},"WBV2-P1222-001":{"line":224,"offset":77709,"length":364,"previous":"WBV2-P1222-000","next":"WBV2-P1223-000"},"WBV2-P1223-000":{"line":225,"offset":78073,"length":303,"previous":"WBV2-P1222-001","next":"WBV2-P1223-001"},"WBV2-P1223-001":{"line":226,"offset":78376,"length":364,"previous":"WBV2-P1223-000","next":"WBV2-P1224-000"},"WBV2-P1224-000":{"line":227,"offset":78740,"length":303,"previous":"WBV2-P1223-001","next":"WBV2-P1224-001"},"WBV2-P1224-001":{"line":228,"offset":79043,"length":364,"previous":"WBV2-P1224-000","next":"WBV2-P1225-000"},"WBV2-P1225-000":{"line":229,"offset":79407,"length":303,"previous":"WBV2-P1224-001","next":"WBV2-P1225-001"},"WBV2-P1225-001":{"line":230,"offset":79710,"length":364,"previous":"WBV2-P1225-000","next":"WBV2-P1226-000"},"WBV2-P1226-000":{"line":231,"offset":80074,"length":303,"previous":"WBV2-P1225-001","next":"WBV2-P1226-001"},"WBV2-P1226-001":{"line":232,"offset":80377,"length":364,"previous":"WBV2-P1226-000","next":"WBV2-P1227-000"},"WBV2-P1227-000":{"line":233,"offset":80741,"length":303,"previous":"WBV2-P1226-001","next":"WBV2-P1227-001"},"WBV2-P1227-001":{"line":234,"offset":81044,"length":364,"previous":"WBV2-P1227-000","next":"WBV2-P1228-000"},"WBV2-P1228-000":{"line":235,"offset":81408,"length":303,"previous":"WBV2-P1227-001","next":"WBV2-P1228-001"},"WBV2-P1228-001":{"line":236,"offset":81711,"length":364,"previous":"WBV2-P1228-000","next":"WBV2-P1229-000"},"WBV2-P1229-000":{"line":237,"offset":82075,"length":303,"previous":"WBV2-P1228-001","next":"WBV2-P1229-001"},"WBV2-P1229-001":{"line":238,"offset":82378,"length":364,"previous":"WBV2-P1229-000","next":"WBV2-P1230-000"},"WBV2-P1230-000":{"line":239,"offset":82742,"length":303,"previous":"WBV2-P1229-001","next":"WBV2-P1230-001"},"WBV2-P1230-001":{"line":240,"offset":83045,"length":364,"previous":"WBV2-P1230-000","next":"WBV2-P1231-000"},"WBV2-P1231-000":{"line":241,"offset":83409,"length":303,"previous":"WBV2-P1230-001","next":"WBV2-P1231-001"},"WBV2-P1231-001":{"line":242,"offset":83712,"length":364,"previous":"WBV2-P1231-000","next":"WBV2-P1232-000"},"WBV2-P1232-000":{"line":243,"offset":84076,"length":303,"previous":"WBV2-P1231-001","next":"WBV2-P1232-001"},"WBV2-P1232-001":{"line":244,"offset":84379,"length":364,"previous":"WBV2-P1232-000","next":"WBV2-P1233-000"},"WBV2-P1233-000":{"line":245,"offset":84743,"length":303,"previous":"WBV2-P1232-001","next":"WBV2-P1233-001"},"WBV2-P1233-001":{"line":246,"offset":85046,"length":364,"previous":"WBV2-P1233-000","next":"WBV2-P1234-000"},"WBV2-P1234-000":{"line":247,"offset":85410,"length":303,"previous":"WBV2-P1233-001","next":"WBV2-P1234-001"},"WBV2-P1234-001":{"line":248,"offset":85713,"length":364,"previous":"WBV2-P1234-000","next":"WBV2-P1235-000"},"WBV2-P1235-000":{"line":249,"offset":86077,"length":303,"previous":"WBV2-P1234-001","next":"WBV2-P1235-001"},"WBV2-P1235-001":{"line":250,"offset":86380,"length":364,"previous":"WBV2-P1235-000","next":"WBV2-P1236-000"},"WBV2-P1236-000":{"line":251,"offset":86744,"length":303,"previous":"WBV2-P1235-001","next":"WBV2-P1236-001"},"WBV2-P1236-001":{"line":252,"offset":87047,"length":364,"previous":"WBV2-P1236-000","next":"WBV2-P1237-000"},"WBV2-P1237-000":{"line":253,"offset":87411,"length":303,"previous":"WBV2-P1236-001","next":"WBV2-P1237-001"},"WBV2-P1237-001":{"line":254,"offset":87714,"length":364,"previous":"WBV2-P1237-000","next":"WBV2-P1238-000"},"WBV2-P1238-000":{"line":255,"offset":88078,"length":303,"previous":"WBV2-P1237-001","next":"WBV2-P1238-001"},"WBV2-P1238-001":{"line":256,"offset":88381,"length":364,"previous":"WBV2-P1238-000","next":"WBV2-P1239-000"},"WBV2-P1239-000":{"line":257,"offset":88745,"length":303,"previous":"WBV2-P1238-001","next":"WBV2-P1239-001"},"WBV2-P1239-001":{"line":258,"offset":89048,"length":364,"previous":"WBV2-P1239-000","next":"WBV2-P1240-000"},"WBV2-P1240-000":{"line":259,"offset":89412,"length":303,"previous":"WBV2-P1239-001","next":"WBV2-P1240-001"},"WBV2-P1240-001":{"line":260,"offset":89715,"length":364,"previous":"WBV2-P1240-000","next":"WBV2-P1241-000"},"WBV2-P1241-000":{"line":261,"offset":90079,"length":303,"previous":"WBV2-P1240-001","next":"WBV2-P1241-001"},"WBV2-P1241-001":{"line":262,"offset":90382,"length":364,"previous":"WBV2-P1241-000","next":"WBV2-P1242-000"},"WBV2-P1242-000":{"line":263,"offset":90746,"length":303,"previous":"WBV2-P1241-001","next":"WBV2-P1242-001"},"WBV2-P1242-001":{"line":264,"offset":91049,"length":364,"previous":"WBV2-P1242-000","next":"WBV2-P1243-000"},"WBV2-P1243-000":{"line":265,"offset":91413,"length":303,"previous":"WBV2-P1242-001","next":"WBV2-P1243-001"},"WBV2-P1243-001":{"line":266,"offset":91716,"length":364,"previous":"WBV2-P1243-000","next":"WBV2-P1244-000"},"WBV2-P1244-000":{"line":267,"offset":92080,"length":303,"previous":"WBV2-P1243-001","next":"WBV2-P1244-001"},"WBV2-P1244-001":{"line":268,"offset":92383,"length":364,"previous":"WBV2-P1244-000","next":"WBV2-P1245-000"},"WBV2-P1245-000":{"line":269,"offset":92747,"length":303,"previous":"WBV2-P1244-001","next":"WBV2-P1245-001"},"WBV2-P1245-001":{"line":270,"offset":93050,"length":364,"previous":"WBV2-P1245-000","next":"WBV2-P1246-000"},"WBV2-P1246-000":{"line":271,"offset":93414,"length":303,"previous":"WBV2-P1245-001","next":"WBV2-P1246-001"},"WBV2-P1246-001":{"line":272,"offset":93717,"length":362,"previous":"WBV2-P1246-000","next":"WBV2-P1247-000"},"WBV2-P1247-000":{"line":273,"offset":94079,"length":303,"previous":"WBV2-P1246-001","next":"WBV2-P1247-001"},"WBV2-P1247-001":{"line":274,"offset":94382,"length":362,"previous":"WBV2-P1247-000","next":"WBV2-P1248-000"},"WBV2-P1248-000":{"line":275,"offset":94744,"length":303,"previous":"WBV2-P1247-001","next":"WBV2-P1248-001"},"WBV2-P1248-001":{"line":276,"offset":95047,"length":362,"previous":"WBV2-P1248-000","next":"WBV2-P1249-000"},"WBV2-P1249-000":{"line":277,"offset":95409,"length":303,"previous":"WBV2-P1248-001","next":"WBV2-P1249-001"},"WBV2-P1249-001":{"line":278,"offset":95712,"length":362,"previous":"WBV2-P1249-000","next":"WBV2-P1250-000"},"WBV2-P1250-000":{"line":279,"offset":96074,"length":303,"previous":"WBV2-P1249-001","next":"WBV2-P1250-001"},"WBV2-P1250-001":{"line":280,"offset":96377,"length":362,"previous":"WBV2-P1250-000","next":"WBV2-P1251-000"},"WBV2-P1251-000":{"line":281,"offset":96739,"length":303,"previous":"WBV2-P1250-001","next":"WBV2-P1251-001"},"WBV2-P1251-001":{"line":282,"offset":97042,"length":362,"previous":"WBV2-P1251-000","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1252-000/module-execution-plan.json","sha256":"0e9e81c32aee4949c8163a3bd9f39a5b398f8387dda556bea2f24907b301cb17"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"70c638034d92a815c89e64591805f599ec21ad4e937ded8efdbb7821cede0adc"},"taskCount":285,"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":"WBV2-P1172-000"},"WBV2-P1172-000":{"line":123,"offset":44048,"length":303,"previous":"WBV2-P1171-001","next":"WBV2-P1172-001"},"WBV2-P1172-001":{"line":124,"offset":44351,"length":366,"previous":"WBV2-P1172-000","next":"WBV2-P1173-000"},"WBV2-P1173-000":{"line":125,"offset":44717,"length":303,"previous":"WBV2-P1172-001","next":"WBV2-P1173-001"},"WBV2-P1173-001":{"line":126,"offset":45020,"length":366,"previous":"WBV2-P1173-000","next":"WBV2-P1174-000"},"WBV2-P1174-000":{"line":127,"offset":45386,"length":303,"previous":"WBV2-P1173-001","next":"WBV2-P1174-001"},"WBV2-P1174-001":{"line":128,"offset":45689,"length":366,"previous":"WBV2-P1174-000","next":"WBV2-P1175-000"},"WBV2-P1175-000":{"line":129,"offset":46055,"length":303,"previous":"WBV2-P1174-001","next":"WBV2-P1175-001"},"WBV2-P1175-001":{"line":130,"offset":46358,"length":366,"previous":"WBV2-P1175-000","next":"WBV2-P1176-000"},"WBV2-P1176-000":{"line":131,"offset":46724,"length":303,"previous":"WBV2-P1175-001","next":"WBV2-P1176-001"},"WBV2-P1176-001":{"line":132,"offset":47027,"length":364,"previous":"WBV2-P1176-000","next":"WBV2-P1177-000"},"WBV2-P1177-000":{"line":133,"offset":47391,"length":303,"previous":"WBV2-P1176-001","next":"WBV2-P1177-001"},"WBV2-P1177-001":{"line":134,"offset":47694,"length":364,"previous":"WBV2-P1177-000","next":"WBV2-P1178-000"},"WBV2-P1178-000":{"line":135,"offset":48058,"length":303,"previous":"WBV2-P1177-001","next":"WBV2-P1178-001"},"WBV2-P1178-001":{"line":136,"offset":48361,"length":364,"previous":"WBV2-P1178-000","next":"WBV2-P1179-000"},"WBV2-P1179-000":{"line":137,"offset":48725,"length":303,"previous":"WBV2-P1178-001","next":"WBV2-P1179-001"},"WBV2-P1179-001":{"line":138,"offset":49028,"length":364,"previous":"WBV2-P1179-000","next":"WBV2-P1180-000"},"WBV2-P1180-000":{"line":139,"offset":49392,"length":303,"previous":"WBV2-P1179-001","next":"WBV2-P1180-001"},"WBV2-P1180-001":{"line":140,"offset":49695,"length":364,"previous":"WBV2-P1180-000","next":"WBV2-P1181-000"},"WBV2-P1181-000":{"line":141,"offset":50059,"length":303,"previous":"WBV2-P1180-001","next":"WBV2-P1181-001"},"WBV2-P1181-001":{"line":142,"offset":50362,"length":364,"previous":"WBV2-P1181-000","next":"WBV2-P1182-000"},"WBV2-P1182-000":{"line":143,"offset":50726,"length":303,"previous":"WBV2-P1181-001","next":"WBV2-P1182-001"},"WBV2-P1182-001":{"line":144,"offset":51029,"length":364,"previous":"WBV2-P1182-000","next":"WBV2-P1183-000"},"WBV2-P1183-000":{"line":145,"offset":51393,"length":303,"previous":"WBV2-P1182-001","next":"WBV2-P1183-001"},"WBV2-P1183-001":{"line":146,"offset":51696,"length":364,"previous":"WBV2-P1183-000","next":"WBV2-P1184-000"},"WBV2-P1184-000":{"line":147,"offset":52060,"length":303,"previous":"WBV2-P1183-001","next":"WBV2-P1184-001"},"WBV2-P1184-001":{"line":148,"offset":52363,"length":364,"previous":"WBV2-P1184-000","next":"WBV2-P1185-000"},"WBV2-P1185-000":{"line":149,"offset":52727,"length":303,"previous":"WBV2-P1184-001","next":"WBV2-P1185-001"},"WBV2-P1185-001":{"line":150,"offset":53030,"length":364,"previous":"WBV2-P1185-000","next":"WBV2-P1186-000"},"WBV2-P1186-000":{"line":151,"offset":53394,"length":303,"previous":"WBV2-P1185-001","next":"WBV2-P1186-001"},"WBV2-P1186-001":{"line":152,"offset":53697,"length":364,"previous":"WBV2-P1186-000","next":"WBV2-P1187-000"},"WBV2-P1187-000":{"line":153,"offset":54061,"length":303,"previous":"WBV2-P1186-001","next":"WBV2-P1187-001"},"WBV2-P1187-001":{"line":154,"offset":54364,"length":364,"previous":"WBV2-P1187-000","next":"WBV2-P1188-000"},"WBV2-P1188-000":{"line":155,"offset":54728,"length":303,"previous":"WBV2-P1187-001","next":"WBV2-P1188-001"},"WBV2-P1188-001":{"line":156,"offset":55031,"length":364,"previous":"WBV2-P1188-000","next":"WBV2-P1189-000"},"WBV2-P1189-000":{"line":157,"offset":55395,"length":303,"previous":"WBV2-P1188-001","next":"WBV2-P1189-001"},"WBV2-P1189-001":{"line":158,"offset":55698,"length":364,"previous":"WBV2-P1189-000","next":"WBV2-P1190-000"},"WBV2-P1190-000":{"line":159,"offset":56062,"length":303,"previous":"WBV2-P1189-001","next":"WBV2-P1190-001"},"WBV2-P1190-001":{"line":160,"offset":56365,"length":364,"previous":"WBV2-P1190-000","next":"WBV2-P1191-000"},"WBV2-P1191-000":{"line":161,"offset":56729,"length":303,"previous":"WBV2-P1190-001","next":"WBV2-P1191-001"},"WBV2-P1191-001":{"line":162,"offset":57032,"length":364,"previous":"WBV2-P1191-000","next":"WBV2-P1192-000"},"WBV2-P1192-000":{"line":163,"offset":57396,"length":303,"previous":"WBV2-P1191-001","next":"WBV2-P1192-001"},"WBV2-P1192-001":{"line":164,"offset":57699,"length":364,"previous":"WBV2-P1192-000","next":"WBV2-P1193-000"},"WBV2-P1193-000":{"line":165,"offset":58063,"length":303,"previous":"WBV2-P1192-001","next":"WBV2-P1193-001"},"WBV2-P1193-001":{"line":166,"offset":58366,"length":364,"previous":"WBV2-P1193-000","next":"WBV2-P1194-000"},"WBV2-P1194-000":{"line":167,"offset":58730,"length":303,"previous":"WBV2-P1193-001","next":"WBV2-P1194-001"},"WBV2-P1194-001":{"line":168,"offset":59033,"length":364,"previous":"WBV2-P1194-000","next":"WBV2-P1195-000"},"WBV2-P1195-000":{"line":169,"offset":59397,"length":303,"previous":"WBV2-P1194-001","next":"WBV2-P1195-001"},"WBV2-P1195-001":{"line":170,"offset":59700,"length":364,"previous":"WBV2-P1195-000","next":"WBV2-P1196-000"},"WBV2-P1196-000":{"line":171,"offset":60064,"length":303,"previous":"WBV2-P1195-001","next":"WBV2-P1196-001"},"WBV2-P1196-001":{"line":172,"offset":60367,"length":364,"previous":"WBV2-P1196-000","next":"WBV2-P1197-000"},"WBV2-P1197-000":{"line":173,"offset":60731,"length":303,"previous":"WBV2-P1196-001","next":"WBV2-P1197-001"},"WBV2-P1197-001":{"line":174,"offset":61034,"length":364,"previous":"WBV2-P1197-000","next":"WBV2-P1198-000"},"WBV2-P1198-000":{"line":175,"offset":61398,"length":303,"previous":"WBV2-P1197-001","next":"WBV2-P1198-001"},"WBV2-P1198-001":{"line":176,"offset":61701,"length":364,"previous":"WBV2-P1198-000","next":"WBV2-P1199-000"},"WBV2-P1199-000":{"line":177,"offset":62065,"length":303,"previous":"WBV2-P1198-001","next":"WBV2-P1199-001"},"WBV2-P1199-001":{"line":178,"offset":62368,"length":364,"previous":"WBV2-P1199-000","next":"WBV2-P1200-000"},"WBV2-P1200-000":{"line":179,"offset":62732,"length":303,"previous":"WBV2-P1199-001","next":"WBV2-P1200-001"},"WBV2-P1200-001":{"line":180,"offset":63035,"length":364,"previous":"WBV2-P1200-000","next":"WBV2-P1201-000"},"WBV2-P1201-000":{"line":181,"offset":63399,"length":303,"previous":"WBV2-P1200-001","next":"WBV2-P1201-001"},"WBV2-P1201-001":{"line":182,"offset":63702,"length":364,"previous":"WBV2-P1201-000","next":"WBV2-P1202-000"},"WBV2-P1202-000":{"line":183,"offset":64066,"length":303,"previous":"WBV2-P1201-001","next":"WBV2-P1202-001"},"WBV2-P1202-001":{"line":184,"offset":64369,"length":364,"previous":"WBV2-P1202-000","next":"WBV2-P1203-000"},"WBV2-P1203-000":{"line":185,"offset":64733,"length":303,"previous":"WBV2-P1202-001","next":"WBV2-P1203-001"},"WBV2-P1203-001":{"line":186,"offset":65036,"length":364,"previous":"WBV2-P1203-000","next":"WBV2-P1204-000"},"WBV2-P1204-000":{"line":187,"offset":65400,"length":303,"previous":"WBV2-P1203-001","next":"WBV2-P1204-001"},"WBV2-P1204-001":{"line":188,"offset":65703,"length":364,"previous":"WBV2-P1204-000","next":"WBV2-P1205-000"},"WBV2-P1205-000":{"line":189,"offset":66067,"length":303,"previous":"WBV2-P1204-001","next":"WBV2-P1205-001"},"WBV2-P1205-001":{"line":190,"offset":66370,"length":364,"previous":"WBV2-P1205-000","next":"WBV2-P1206-000"},"WBV2-P1206-000":{"line":191,"offset":66734,"length":303,"previous":"WBV2-P1205-001","next":"WBV2-P1206-001"},"WBV2-P1206-001":{"line":192,"offset":67037,"length":364,"previous":"WBV2-P1206-000","next":"WBV2-P1207-000"},"WBV2-P1207-000":{"line":193,"offset":67401,"length":303,"previous":"WBV2-P1206-001","next":"WBV2-P1207-001"},"WBV2-P1207-001":{"line":194,"offset":67704,"length":364,"previous":"WBV2-P1207-000","next":"WBV2-P1208-000"},"WBV2-P1208-000":{"line":195,"offset":68068,"length":303,"previous":"WBV2-P1207-001","next":"WBV2-P1208-001"},"WBV2-P1208-001":{"line":196,"offset":68371,"length":364,"previous":"WBV2-P1208-000","next":"WBV2-P1209-000"},"WBV2-P1209-000":{"line":197,"offset":68735,"length":303,"previous":"WBV2-P1208-001","next":"WBV2-P1209-001"},"WBV2-P1209-001":{"line":198,"offset":69038,"length":364,"previous":"WBV2-P1209-000","next":"WBV2-P1210-000"},"WBV2-P1210-000":{"line":199,"offset":69402,"length":303,"previous":"WBV2-P1209-001","next":"WBV2-P1210-001"},"WBV2-P1210-001":{"line":200,"offset":69705,"length":364,"previous":"WBV2-P1210-000","next":"WBV2-P1211-000"},"WBV2-P1211-000":{"line":201,"offset":70069,"length":303,"previous":"WBV2-P1210-001","next":"WBV2-P1211-001"},"WBV2-P1211-001":{"line":202,"offset":70372,"length":364,"previous":"WBV2-P1211-000","next":"WBV2-P1212-000"},"WBV2-P1212-000":{"line":203,"offset":70736,"length":303,"previous":"WBV2-P1211-001","next":"WBV2-P1212-001"},"WBV2-P1212-001":{"line":204,"offset":71039,"length":364,"previous":"WBV2-P1212-000","next":"WBV2-P1213-000"},"WBV2-P1213-000":{"line":205,"offset":71403,"length":303,"previous":"WBV2-P1212-001","next":"WBV2-P1213-001"},"WBV2-P1213-001":{"line":206,"offset":71706,"length":364,"previous":"WBV2-P1213-000","next":"WBV2-P1214-000"},"WBV2-P1214-000":{"line":207,"offset":72070,"length":303,"previous":"WBV2-P1213-001","next":"WBV2-P1214-001"},"WBV2-P1214-001":{"line":208,"offset":72373,"length":364,"previous":"WBV2-P1214-000","next":"WBV2-P1215-000"},"WBV2-P1215-000":{"line":209,"offset":72737,"length":303,"previous":"WBV2-P1214-001","next":"WBV2-P1215-001"},"WBV2-P1215-001":{"line":210,"offset":73040,"length":364,"previous":"WBV2-P1215-000","next":"WBV2-P1216-000"},"WBV2-P1216-000":{"line":211,"offset":73404,"length":303,"previous":"WBV2-P1215-001","next":"WBV2-P1216-001"},"WBV2-P1216-001":{"line":212,"offset":73707,"length":364,"previous":"WBV2-P1216-000","next":"WBV2-P1217-000"},"WBV2-P1217-000":{"line":213,"offset":74071,"length":303,"previous":"WBV2-P1216-001","next":"WBV2-P1217-001"},"WBV2-P1217-001":{"line":214,"offset":74374,"length":364,"previous":"WBV2-P1217-000","next":"WBV2-P1218-000"},"WBV2-P1218-000":{"line":215,"offset":74738,"length":303,"previous":"WBV2-P1217-001","next":"WBV2-P1218-001"},"WBV2-P1218-001":{"line":216,"offset":75041,"length":364,"previous":"WBV2-P1218-000","next":"WBV2-P1219-000"},"WBV2-P1219-000":{"line":217,"offset":75405,"length":303,"previous":"WBV2-P1218-001","next":"WBV2-P1219-001"},"WBV2-P1219-001":{"line":218,"offset":75708,"length":364,"previous":"WBV2-P1219-000","next":"WBV2-P1220-000"},"WBV2-P1220-000":{"line":219,"offset":76072,"length":303,"previous":"WBV2-P1219-001","next":"WBV2-P1220-001"},"WBV2-P1220-001":{"line":220,"offset":76375,"length":364,"previous":"WBV2-P1220-000","next":"WBV2-P1221-000"},"WBV2-P1221-000":{"line":221,"offset":76739,"length":303,"previous":"WBV2-P1220-001","next":"WBV2-P1221-001"},"WBV2-P1221-001":{"line":222,"offset":77042,"length":364,"previous":"WBV2-P1221-000","next":"WBV2-P1222-000"},"WBV2-P1222-000":{"line":223,"offset":77406,"length":303,"previous":"WBV2-P1221-001","next":"WBV2-P1222-001"},"WBV2-P1222-001":{"line":224,"offset":77709,"length":364,"previous":"WBV2-P1222-000","next":"WBV2-P1223-000"},"WBV2-P1223-000":{"line":225,"offset":78073,"length":303,"previous":"WBV2-P1222-001","next":"WBV2-P1223-001"},"WBV2-P1223-001":{"line":226,"offset":78376,"length":364,"previous":"WBV2-P1223-000","next":"WBV2-P1224-000"},"WBV2-P1224-000":{"line":227,"offset":78740,"length":303,"previous":"WBV2-P1223-001","next":"WBV2-P1224-001"},"WBV2-P1224-001":{"line":228,"offset":79043,"length":364,"previous":"WBV2-P1224-000","next":"WBV2-P1225-000"},"WBV2-P1225-000":{"line":229,"offset":79407,"length":303,"previous":"WBV2-P1224-001","next":"WBV2-P1225-001"},"WBV2-P1225-001":{"line":230,"offset":79710,"length":364,"previous":"WBV2-P1225-000","next":"WBV2-P1226-000"},"WBV2-P1226-000":{"line":231,"offset":80074,"length":303,"previous":"WBV2-P1225-001","next":"WBV2-P1226-001"},"WBV2-P1226-001":{"line":232,"offset":80377,"length":364,"previous":"WBV2-P1226-000","next":"WBV2-P1227-000"},"WBV2-P1227-000":{"line":233,"offset":80741,"length":303,"previous":"WBV2-P1226-001","next":"WBV2-P1227-001"},"WBV2-P1227-001":{"line":234,"offset":81044,"length":364,"previous":"WBV2-P1227-000","next":"WBV2-P1228-000"},"WBV2-P1228-000":{"line":235,"offset":81408,"length":303,"previous":"WBV2-P1227-001","next":"WBV2-P1228-001"},"WBV2-P1228-001":{"line":236,"offset":81711,"length":364,"previous":"WBV2-P1228-000","next":"WBV2-P1229-000"},"WBV2-P1229-000":{"line":237,"offset":82075,"length":303,"previous":"WBV2-P1228-001","next":"WBV2-P1229-001"},"WBV2-P1229-001":{"line":238,"offset":82378,"length":364,"previous":"WBV2-P1229-000","next":"WBV2-P1230-000"},"WBV2-P1230-000":{"line":239,"offset":82742,"length":303,"previous":"WBV2-P1229-001","next":"WBV2-P1230-001"},"WBV2-P1230-001":{"line":240,"offset":83045,"length":364,"previous":"WBV2-P1230-000","next":"WBV2-P1231-000"},"WBV2-P1231-000":{"line":241,"offset":83409,"length":303,"previous":"WBV2-P1230-001","next":"WBV2-P1231-001"},"WBV2-P1231-001":{"line":242,"offset":83712,"length":364,"previous":"WBV2-P1231-000","next":"WBV2-P1232-000"},"WBV2-P1232-000":{"line":243,"offset":84076,"length":303,"previous":"WBV2-P1231-001","next":"WBV2-P1232-001"},"WBV2-P1232-001":{"line":244,"offset":84379,"length":364,"previous":"WBV2-P1232-000","next":"WBV2-P1233-000"},"WBV2-P1233-000":{"line":245,"offset":84743,"length":303,"previous":"WBV2-P1232-001","next":"WBV2-P1233-001"},"WBV2-P1233-001":{"line":246,"offset":85046,"length":364,"previous":"WBV2-P1233-000","next":"WBV2-P1234-000"},"WBV2-P1234-000":{"line":247,"offset":85410,"length":303,"previous":"WBV2-P1233-001","next":"WBV2-P1234-001"},"WBV2-P1234-001":{"line":248,"offset":85713,"length":364,"previous":"WBV2-P1234-000","next":"WBV2-P1235-000"},"WBV2-P1235-000":{"line":249,"offset":86077,"length":303,"previous":"WBV2-P1234-001","next":"WBV2-P1235-001"},"WBV2-P1235-001":{"line":250,"offset":86380,"length":364,"previous":"WBV2-P1235-000","next":"WBV2-P1236-000"},"WBV2-P1236-000":{"line":251,"offset":86744,"length":303,"previous":"WBV2-P1235-001","next":"WBV2-P1236-001"},"WBV2-P1236-001":{"line":252,"offset":87047,"length":364,"previous":"WBV2-P1236-000","next":"WBV2-P1237-000"},"WBV2-P1237-000":{"line":253,"offset":87411,"length":303,"previous":"WBV2-P1236-001","next":"WBV2-P1237-001"},"WBV2-P1237-001":{"line":254,"offset":87714,"length":364,"previous":"WBV2-P1237-000","next":"WBV2-P1238-000"},"WBV2-P1238-000":{"line":255,"offset":88078,"length":303,"previous":"WBV2-P1237-001","next":"WBV2-P1238-001"},"WBV2-P1238-001":{"line":256,"offset":88381,"length":364,"previous":"WBV2-P1238-000","next":"WBV2-P1239-000"},"WBV2-P1239-000":{"line":257,"offset":88745,"length":303,"previous":"WBV2-P1238-001","next":"WBV2-P1239-001"},"WBV2-P1239-001":{"line":258,"offset":89048,"length":364,"previous":"WBV2-P1239-000","next":"WBV2-P1240-000"},"WBV2-P1240-000":{"line":259,"offset":89412,"length":303,"previous":"WBV2-P1239-001","next":"WBV2-P1240-001"},"WBV2-P1240-001":{"line":260,"offset":89715,"length":364,"previous":"WBV2-P1240-000","next":"WBV2-P1241-000"},"WBV2-P1241-000":{"line":261,"offset":90079,"length":303,"previous":"WBV2-P1240-001","next":"WBV2-P1241-001"},"WBV2-P1241-001":{"line":262,"offset":90382,"length":364,"previous":"WBV2-P1241-000","next":"WBV2-P1242-000"},"WBV2-P1242-000":{"line":263,"offset":90746,"length":303,"previous":"WBV2-P1241-001","next":"WBV2-P1242-001"},"WBV2-P1242-001":{"line":264,"offset":91049,"length":364,"previous":"WBV2-P1242-000","next":"WBV2-P1243-000"},"WBV2-P1243-000":{"line":265,"offset":91413,"length":303,"previous":"WBV2-P1242-001","next":"WBV2-P1243-001"},"WBV2-P1243-001":{"line":266,"offset":91716,"length":364,"previous":"WBV2-P1243-000","next":"WBV2-P1244-000"},"WBV2-P1244-000":{"line":267,"offset":92080,"length":303,"previous":"WBV2-P1243-001","next":"WBV2-P1244-001"},"WBV2-P1244-001":{"line":268,"offset":92383,"length":364,"previous":"WBV2-P1244-000","next":"WBV2-P1245-000"},"WBV2-P1245-000":{"line":269,"offset":92747,"length":303,"previous":"WBV2-P1244-001","next":"WBV2-P1245-001"},"WBV2-P1245-001":{"line":270,"offset":93050,"length":364,"previous":"WBV2-P1245-000","next":"WBV2-P1246-000"},"WBV2-P1246-000":{"line":271,"offset":93414,"length":303,"previous":"WBV2-P1245-001","next":"WBV2-P1246-001"},"WBV2-P1246-001":{"line":272,"offset":93717,"length":362,"previous":"WBV2-P1246-000","next":"WBV2-P1247-000"},"WBV2-P1247-000":{"line":273,"offset":94079,"length":303,"previous":"WBV2-P1246-001","next":"WBV2-P1247-001"},"WBV2-P1247-001":{"line":274,"offset":94382,"length":362,"previous":"WBV2-P1247-000","next":"WBV2-P1248-000"},"WBV2-P1248-000":{"line":275,"offset":94744,"length":303,"previous":"WBV2-P1247-001","next":"WBV2-P1248-001"},"WBV2-P1248-001":{"line":276,"offset":95047,"length":362,"previous":"WBV2-P1248-000","next":"WBV2-P1249-000"},"WBV2-P1249-000":{"line":277,"offset":95409,"length":303,"previous":"WBV2-P1248-001","next":"WBV2-P1249-001"},"WBV2-P1249-001":{"line":278,"offset":95712,"length":362,"previous":"WBV2-P1249-000","next":"WBV2-P1250-000"},"WBV2-P1250-000":{"line":279,"offset":96074,"length":303,"previous":"WBV2-P1249-001","next":"WBV2-P1250-001"},"WBV2-P1250-001":{"line":280,"offset":96377,"length":362,"previous":"WBV2-P1250-000","next":"WBV2-P1251-000"},"WBV2-P1251-000":{"line":281,"offset":96739,"length":303,"previous":"WBV2-P1250-001","next":"WBV2-P1251-001"},"WBV2-P1251-001":{"line":282,"offset":97042,"length":362,"previous":"WBV2-P1251-000","next":"WBV2-P1252-000"},"WBV2-P1252-000":{"line":283,"offset":97404,"length":303,"previous":"WBV2-P1251-001","next":"WBV2-P1252-001"},"WBV2-P1252-001":{"line":284,"offset":97707,"length":362,"previous":"WBV2-P1252-000","next":null}}}