From 3fba5dedd4f8190d1edc114cccd229e9cfab2d01 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Fri, 4 Sep 2026 08:16:18 +0800 Subject: [PATCH] chore(web): continuous handoff WBV2-P1244-001 --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P1244-001.md | 9 + docs/tasks/WBV2-P1244-001.md | 48 + .../wbv2-geometry-b2e40edae0bea18d.blend | Bin 0 -> 98150 bytes tests/golden/WBV2-P1244-000/manifest.json | 50 + .../WBV2-P1244-000/module-execution-plan.json | 23690 ++++++++++++++++ .../geometry-node-reader-production.json | 43 + tests/golden/WBV2-P1244-001/manifest.json | 116 + .../golden/WBV2-P1244-001/module-receipt.json | 154 + tests/golden/WBV2-P1244-001/module-run.log | 49 + tests/golden/WBV2-P1244-001/task-context.json | 217 + tests/golden/WBV2/task-catalog.jsonl | 2 + tests/golden/WBV2/task-index.json | 2 +- 13 files changed, 24382 insertions(+), 4 deletions(-) create mode 100644 docs/status/WBV2-P1244-001.md create mode 100644 docs/tasks/WBV2-P1244-001.md create mode 100644 tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend create mode 100644 tests/golden/WBV2-P1244-000/manifest.json create mode 100644 tests/golden/WBV2-P1244-000/module-execution-plan.json create mode 100644 tests/golden/WBV2-P1244-001/geometry-node-reader-production.json create mode 100644 tests/golden/WBV2-P1244-001/manifest.json create mode 100644 tests/golden/WBV2-P1244-001/module-receipt.json create mode 100644 tests/golden/WBV2-P1244-001/module-run.log create mode 100644 tests/golden/WBV2-P1244-001/task-context.json diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index 8b7852901..1690f5451 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -15,9 +15,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P1243-001` | -| parent manifest | `tests/golden/WBV2-P1243-000/manifest.json` | -| 任务卡 | [`tasks/WBV2-P1243-001.md`](tasks/WBV2-P1243-001.md) | +| 当前任务 | `WBV2-P1244-001` | +| parent manifest | `tests/golden/WBV2-P1244-000/manifest.json` | +| 任务卡 | [`tasks/WBV2-P1244-001.md`](tasks/WBV2-P1244-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-P1244-001.md b/docs/status/WBV2-P1244-001.md new file mode 100644 index 000000000..c95cc351e --- /dev/null +++ b/docs/status/WBV2-P1244-001.md @@ -0,0 +1,9 @@ +# WBV2-P1244-001 status + +- task: `WBV2-P1244-001`; module: `AUTO_GEOMETRY_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 `894`; unverified `2851`; 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-P1244-001.md b/docs/tasks/WBV2-P1244-001.md new file mode 100644 index 000000000..b8d64ea06 --- /dev/null +++ b/docs/tasks/WBV2-P1244-001.md @@ -0,0 +1,48 @@ +# WBV2-P1244-001: verify auto-generated native geometry node reader batch + +- task: WBV2-P1244-001 +- parent: WBV2-P1244-000 +- status: in_progress +- gap: capability:AUTO_GEOMETRY_NATIVE_NODE_READER +- ownerFamily: NODES +- targetImplementationClass: LOCAL_EXACT +- batchId: WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d +- selectedRecordIds: ["node:GeometryNodeUVPackIslands","node:GeometryNodeUVTangent","node:GeometryNodeUVUnwrap","node:GeometryNodeVertexOfCorner","node:GeometryNodeViewer"] +- commandBudget: max=48; read/exploration max=16 +- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1244-001 --write` + +## 目标 + +以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 GeometryNodeUVPackIslands, GeometryNodeUVTangent, GeometryNodeUVUnwrap, GeometryNodeVertexOfCorner, GeometryNodeViewer 的真实 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-geometry-b2e40edae0bea18d.blend` +- Chromium test: `web/tests/e2e/geometry-node-main-reader.spec.ts` +- Selected modifier units: `modifier-source:GeometryNodeUVPackIslands`, `modifier-source:GeometryNodeUVTangent`, `modifier-source:GeometryNodeUVUnwrap`, `modifier-source:GeometryNodeVertexOfCorner`, `modifier-source:GeometryNodeViewer` +- 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-P1244-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-P1244-001/module-receipt.json` +- Aggregate production evidence: `tests/golden/WBV2-P1244-001/modifier-reader-batch-production.json` +- Manifest: `tests/golden/WBV2-P1244-001/manifest.json` +- Status: `docs/status/WBV2-P1244-001.md` +- Rollback: restore WBV2-P1244-000 as queue parent without rewriting prior evidence. diff --git a/tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend b/tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend new file mode 100644 index 0000000000000000000000000000000000000000..8a2cd9de06802181dcadd5585aef92f64eac88cb GIT binary patch literal 98150 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�?y@SV1P>r>iLw+K4ta^^xyF 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 literal 0 HcmV?d00001 diff --git a/tests/golden/WBV2-P1244-000/manifest.json b/tests/golden/WBV2-P1244-000/manifest.json new file mode 100644 index 000000000..a02a013df --- /dev/null +++ b/tests/golden/WBV2-P1244-000/manifest.json @@ -0,0 +1,50 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1244-000", + "parentTask": "WBV2-P1243-001", + "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1243-001/manifest.json", + "sha256": "d6672f5eb3ceeff0fd34bd79d8f3255b450a0873b3a4e56399514c4b78f792c6" + }, + "plan": { + "path": "tests/golden/WBV2-P1244-000/module-execution-plan.json", + "sha256": "cbac5d525955cb44411a070390845bd40da3bc60787eb114852acef69bee3feb" + }, + "report": { + "path": "tests/golden/WBV2-P1244-000/successor-authorization-report.json", + "sha256": "fabb372418b501f542542bffd3acdf7b86dc675c045b22bfd59594c53bcb2c95" + }, + "status": { + "path": "docs/status/WBV2-P1244-000.md", + "sha256": "26b8997e37084bfeed0ac2d60b075e24a11f1b941a56df311ec61a8574eae5ea" + } + }, + "assertions": { + "sourceBackedSuccessor": true, + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchSize": 5, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 889, + "dynamicUnverifiedUnits": 2856, + "boundUnitDelta": 0, + "fullHistoricalReproduction": false + }, + "nextTask": "WBV2-P1244-001" +} diff --git a/tests/golden/WBV2-P1244-000/module-execution-plan.json b/tests/golden/WBV2-P1244-000/module-execution-plan.json new file mode 100644 index 000000000..e21038448 --- /dev/null +++ b/tests/golden/WBV2-P1244-000/module-execution-plan.json @@ -0,0 +1,23690 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_MODULE_EXECUTION_P1244", + "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 + } + ], + "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 + } + } + } + ] +} diff --git a/tests/golden/WBV2-P1244-001/geometry-node-reader-production.json b/tests/golden/WBV2-P1244-001/geometry-node-reader-production.json new file mode 100644 index 000000000..2e67c0fb9 --- /dev/null +++ b/tests/golden/WBV2-P1244-001/geometry-node-reader-production.json @@ -0,0 +1,43 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1244-001", + "operation": "GEOMETRY_NODE_MAIN_READER_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": "tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend", + "fixtureSha256": "d65c38eefb677f86602c4ace3f13bd94b4599442b4df2a61f9b80bbe9edada75", + "sourceUnits": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "expectedTypes": [ + "GeometryNodeUVPackIslands", + "GeometryNodeUVTangent", + "GeometryNodeUVUnwrap", + "GeometryNodeVertexOfCorner", + "GeometryNodeViewer" + ], + "graphNames": [ + "WBV2 Geometry Batch" + ], + "nodeTypes": [ + "GeometryNodeUVTangent", + "NodeGroupInput", + "GeometryNodeViewer", + "GeometryNodeUVPackIslands", + "GeometryNodeUVUnwrap", + "GeometryNodeVertexOfCorner", + "NodeGroupOutput" + ], + "nodeCount": 7, + "linkCount": 0, + "defaultCount": 21, + "unsupportedPreserved": false, + "stable": true, + "hashes": [ + "4fa573ef95493e399d1292e23c86c1ffa1572f481197bb60bff1c665f4b2ff70" + ] +} diff --git a/tests/golden/WBV2-P1244-001/manifest.json b/tests/golden/WBV2-P1244-001/manifest.json new file mode 100644 index 000000000..647605547 --- /dev/null +++ b/tests/golden/WBV2-P1244-001/manifest.json @@ -0,0 +1,116 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1244-001", + "parentTask": "WBV2-P1244-000", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "taskClass": "MODULE", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "BLENDER_WEB_FUNCTION_MODULE", + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1244-000/manifest.json", + "sha256": "c6cf0f906f599976eaf863c1f014238678d0d840072d01e26f28d44308a714f0" + }, + "source1": { + "path": "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc", + "sha256": "da5e17d8a556d8e837d60e3a8db62b7b644a104ff28769a55e7c14a805c4bf32" + }, + "source2": { + "path": "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_tangent.cc", + "sha256": "73a9c93d16976a44fca066b2900b6d9a0c71fa40d68206b8bc035606ae7946a6" + }, + "source3": { + "path": "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc", + "sha256": "d5f302315a30428c00d7a29c107b35fda8ae33929397d16fffdc93ab27ed6bdf" + }, + "source4": { + "path": "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_vertex_of_corner.cc", + "sha256": "dfaaa543ccbe0d00634d2282a19aa80592df2993e1cb39fc65483720f0681142" + }, + "source5": { + "path": "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewer.cc", + "sha256": "c1b80b3fc42508e5337c8c6b0849a4abd4504dd2edd2e88f927afa68f461e0d5" + }, + "source6": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "sha256": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "source7": { + "path": "web/tests/e2e/geometry-node-main-reader.spec.ts", + "sha256": "066e205d7a329fe96b4a344f052034790563447edd8d9eb25afd730618a26f84" + }, + "source8": { + "path": "tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend", + "sha256": "d65c38eefb677f86602c4ace3f13bd94b4599442b4df2a61f9b80bbe9edada75" + }, + "source9": { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "sha256": "66fc59cba55a8c17d398b74d12ea4a9f09746c0f30c40f579c44aa34956e3072" + }, + "evidence1": { + "path": "tests/golden/WBV2-P1244-001/geometry-node-reader-production.json", + "sha256": "b1bfad26fa73e574e242d91916910b18ff510eeb50b1116f9c602be218364768" + }, + "moduleReceipt": { + "path": "tests/golden/WBV2-P1244-001/module-receipt.json", + "sha256": "090fb8079f470d6bf863c28141d157720134aa661f1c35cd6fa71338606c288a" + }, + "status": { + "path": "docs/status/WBV2-P1244-001.md", + "sha256": "dd9ca5304db766db0af451f6e46fafc3d84090ad4cd7d5496ec985d7f6760540" + }, + "log": { + "path": "tests/golden/WBV2-P1244-001/module-run.log", + "sha256": "ccc607699c33a0aa6d531a6d1b1d2995e7a6d064d2138ff310cf002856cebe7a" + }, + "plan": { + "path": "tests/golden/WBV2-P1244-000/module-execution-plan.json", + "sha256": "54198a06a7d4363c4635eae4d18a71388fc2a84493a9b272e65fdfe753c93cc5" + }, + "taskContext": { + "path": "tests/golden/WBV2-P1244-001/task-context.json", + "sha256": "176e2c92c18fa3efec96337a2aadf78a3551fdc32149404a6a85b1cfd6d4cf64" + } + }, + "assertions": { + "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, + "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": 894, + "dynamicUnverifiedUnits": 2851, + "planningEstimate": 5200, + "historicalInventoryTotal": 6900, + "historicalEffectiveCompleted": 290, + "historicalEffectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1244-001/module-receipt.json b/tests/golden/WBV2-P1244-001/module-receipt.json new file mode 100644 index 000000000..d291f0a36 --- /dev/null +++ b/tests/golden/WBV2-P1244-001/module-receipt.json @@ -0,0 +1,154 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1244-001", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "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" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16, + "commandCount": 4, + "readCommandCount": 0, + "withinBudget": true + }, + "status": "PASS", + "source": { + "paths": [ + "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" + ], + "auditedPaths": [ + "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" + ], + "before": { + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc": "da5e17d8a556d8e837d60e3a8db62b7b644a104ff28769a55e7c14a805c4bf32", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_tangent.cc": "73a9c93d16976a44fca066b2900b6d9a0c71fa40d68206b8bc035606ae7946a6", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc": "d5f302315a30428c00d7a29c107b35fda8ae33929397d16fffdc93ab27ed6bdf", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_vertex_of_corner.cc": "dfaaa543ccbe0d00634d2282a19aa80592df2993e1cb39fc65483720f0681142", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewer.cc": "c1b80b3fc42508e5337c8c6b0849a4abd4504dd2edd2e88f927afa68f461e0d5", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "after": { + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc": "da5e17d8a556d8e837d60e3a8db62b7b644a104ff28769a55e7c14a805c4bf32", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_tangent.cc": "73a9c93d16976a44fca066b2900b6d9a0c71fa40d68206b8bc035606ae7946a6", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc": "d5f302315a30428c00d7a29c107b35fda8ae33929397d16fffdc93ab27ed6bdf", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_vertex_of_corner.cc": "dfaaa543ccbe0d00634d2282a19aa80592df2993e1cb39fc65483720f0681142", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewer.cc": "c1b80b3fc42508e5337c8c6b0849a4abd4504dd2edd2e88f927afa68f461e0d5", + "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": [ + "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": [ + { + "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": 3377 + }, + { + "command": "npm --prefix web run build", + "exitCode": 0, + "durationMs": 3950 + }, + { + "command": "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", + "exitCode": 0, + "durationMs": 2622 + } + ], + "verification": { + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "chromiumOnly": true, + "fullFamilyParity": false + }, + "efficiency": { + "existingEvidenceReused": false, + "skippedCommands": 0, + "totalDurationMs": 10094, + "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": "76502b4f06f3dd70104d9ee3750ceab8480464d05497d403b24ef6969e784c4a", + "sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "unitCount": 3745, + "planningEstimate": 5200, + "hardTarget": false, + "verifiedUnits": 894, + "unverifiedUnits": 2851 + } + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1244-001/module-run.log b/tests/golden/WBV2-P1244-001/module-run.log new file mode 100644 index 000000000..232941b12 --- /dev/null +++ b/tests/golden/WBV2-P1244-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 484ms +[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-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 + +> blender-web-editor@0.1.0-rc.1 test:e2e +> playwright test --config playwright.config.ts --workers=1 tests/e2e/geometry-node-main-reader.spec.ts + + +Running 1 test using 1 worker + + ✓ 1 tests/e2e/geometry-node-main-reader.spec.ts:14:1 › M10-01 production Worker preserves Main Geometry Node topology across save and reopen (1.5s) + + 1 passed (2.3s) +[WebServer] (node:1316947) 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:1317001) 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-P1244-001/task-context.json b/tests/golden/WBV2-P1244-001/task-context.json new file mode 100644 index 000000000..08620a1e5 --- /dev/null +++ b/tests/golden/WBV2-P1244-001/task-context.json @@ -0,0 +1,217 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1244-001", + "parentTask": "WBV2-P1244-000", + "status": "in_progress", + "goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 GeometryNodeUVPackIslands, GeometryNodeUVTangent, GeometryNodeUVUnwrap, GeometryNodeVertexOfCorner, GeometryNodeViewer 的真实 modifier/RNA 元数据。", + "scope": { + "gap": "capability:AUTO_GEOMETRY_NATIVE_NODE_READER", + "ownerFamily": "NODES", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P1244-001 --write" + ], + "inputPaths": [], + "inputMetadata": { + "docs/EXECUTION_QUEUE.md": { + "path": "docs/EXECUTION_QUEUE.md", + "exists": true, + "bytes": 4030, + "mtime_ns": "1788480977765944946", + "sha256": "4a4ab16d478f02ee169b789745a2c8dc7a26f370ef72783b1ffaf729717dc90c" + }, + "docs/tasks/WBV2-P1244-001.md": { + "path": "docs/tasks/WBV2-P1244-001.md", + "exists": true, + "bytes": 2655, + "mtime_ns": "1788480967175773797", + "sha256": "6c1a3df6b43bf13deaad31f84c9177bd71814db6f1c6e84672e0c7c2f5c5fb49" + }, + "tests/golden/WBV2-P1244-000/manifest.json": { + "path": "tests/golden/WBV2-P1244-000/manifest.json", + "exists": true, + "bytes": 1672, + "mtime_ns": "1788480967176714895", + "sha256": "c6cf0f906f599976eaf863c1f014238678d0d840072d01e26f28d44308a714f0" + }, + "docs/status/WBV2-P1244-000.md": { + "path": "docs/status/WBV2-P1244-000.md", + "exists": true, + "bytes": 364, + "mtime_ns": "1788480967175944192", + "sha256": "26b8997e37084bfeed0ac2d60b075e24a11f1b941a56df311ec61a8574eae5ea" + } + }, + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 1183, + "contextRemainingTokens": 295 + }, + "source": { + "bytes": 8721, + "tokens": 2181 + }, + "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-geometry-b2e40edae0bea18d.blend", + "bytes": 98150, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/geometry-node-main-reader.spec.ts", + "bytes": 3789, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1244-001/module-receipt.json", + "bytes": 7411, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1244-001/modifier-reader-batch-production.json", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P1244-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P1244-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-P1244-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P1244-000/manifest.json", + "parentStatus": "docs/status/WBV2-P1244-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P1244-001.md", + "tests/golden/WBV2-P1244-000/manifest.json", + "docs/status/WBV2-P1244-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-P1244-000", + "parentTask": "WBV2-P1243-001", + "status": "done", + "nextTask": "WBV2-P1244-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P1244-000 status", + "- task: `WBV2-P1244-000`; parent: `WBV2-P1243-001`; status: `done`", + "- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed", + "- source-backed batch authorized: `AUTO_GEOMETRY_NATIVE_NODE_READER` (5 units)", + "- dynamic inventory: `3745` units; verified `889`; unverified `2856`; bound delta `0`", + "- nextTask: `WBV2-P1244-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 2655, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 49, + "taskTokens": 664 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 4030, + "lines": 58, + "tokens": 1008 + }, + { + "path": "docs/tasks/WBV2-P1244-001.md", + "bytes": 2655, + "lines": 49, + "tokens": 664 + }, + { + "path": "tests/golden/WBV2-P1244-000/manifest.json", + "bytes": 1672, + "lines": 51, + "tokens": 418 + }, + { + "path": "docs/status/WBV2-P1244-000.md", + "bytes": 364, + "lines": 8, + "tokens": 91 + } + ], + "sourceTokens": 2181, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 2181, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3205, + "serializedContextTokens": 679, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index b5a08716e..438b42499 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -265,3 +265,5 @@ {"id":"WBV2-P1242-001","gapId":"AUTO_GEOMETRY_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1242","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-P1243-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1243","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} {"id":"WBV2-P1243-001","gapId":"AUTO_GEOMETRY_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1243","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-P1244-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1244","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} +{"id":"WBV2-P1244-001","gapId":"AUTO_GEOMETRY_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1244","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 1313437e8..771747ba7 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-P1243-000/module-execution-plan.json","sha256":"ab5199a0ce10ef9e738c29ac4de624dda6304637ae822f22a6fc68d98c9971a2"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"5b570ebb3ef564971b5345be3895074d71401c900215ef0b42c8b8e78e4c1c0e"},"taskCount":267,"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":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1244-000/module-execution-plan.json","sha256":"54198a06a7d4363c4635eae4d18a71388fc2a84493a9b272e65fdfe753c93cc5"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"e870707bf1b956fea680e1ec7e8b89132b5cf8363c155edb6c52c1db0000dd38"},"taskCount":269,"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":null}}}