From bdf2ef9658a8f233605d8d79c9fbdd2190cf9d43 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Fri, 4 Sep 2026 09:17:08 +0800 Subject: [PATCH] chore(web): continuous handoff WBV2-P1253-001 --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P1253-001.md | 9 + docs/tasks/WBV2-P1253-001.md | 48 + .../wbv2-shader-c56bc2ebdfa34be7.blend | Bin 0 -> 98611 bytes tests/golden/WBV2-P1253-000/manifest.json | 50 + .../WBV2-P1253-000/module-execution-plan.json | 25346 ++++++++++++++++ tests/golden/WBV2-P1253-001/manifest.json | 116 + .../golden/WBV2-P1253-001/module-receipt.json | 154 + tests/golden/WBV2-P1253-001/module-run.log | 49 + .../shader-main-reader-production.json | 127 + tests/golden/WBV2-P1253-001/task-context.json | 217 + tests/golden/WBV2/task-catalog.jsonl | 2 + tests/golden/WBV2/task-index.json | 2 +- 13 files changed, 26122 insertions(+), 4 deletions(-) create mode 100644 docs/status/WBV2-P1253-001.md create mode 100644 docs/tasks/WBV2-P1253-001.md create mode 100644 tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend create mode 100644 tests/golden/WBV2-P1253-000/manifest.json create mode 100644 tests/golden/WBV2-P1253-000/module-execution-plan.json create mode 100644 tests/golden/WBV2-P1253-001/manifest.json create mode 100644 tests/golden/WBV2-P1253-001/module-receipt.json create mode 100644 tests/golden/WBV2-P1253-001/module-run.log create mode 100644 tests/golden/WBV2-P1253-001/shader-main-reader-production.json create mode 100644 tests/golden/WBV2-P1253-001/task-context.json diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index ddf8d58e1..f8571c0e8 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -15,9 +15,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P1252-001` | -| parent manifest | `tests/golden/WBV2-P1252-000/manifest.json` | -| 任务卡 | [`tasks/WBV2-P1252-001.md`](tasks/WBV2-P1252-001.md) | +| 当前任务 | `WBV2-P1253-001` | +| parent manifest | `tests/golden/WBV2-P1253-000/manifest.json` | +| 任务卡 | [`tasks/WBV2-P1253-001.md`](tasks/WBV2-P1253-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-P1253-001.md b/docs/status/WBV2-P1253-001.md new file mode 100644 index 000000000..533e91bc9 --- /dev/null +++ b/docs/status/WBV2-P1253-001.md @@ -0,0 +1,9 @@ +# WBV2-P1253-001 status + +- task: `WBV2-P1253-001`; module: `AUTO_SHADER_NATIVE_NODE_READER`; status: `done` +- source hashes stable: `true`; commands passed: `4` +- existing production evidence reused: `false`; skipped commands: `0` +- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt +- dynamic source inventory: `3745` units; verified `939`; unverified `2806`; 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-P1253-001.md b/docs/tasks/WBV2-P1253-001.md new file mode 100644 index 000000000..26633f4ee --- /dev/null +++ b/docs/tasks/WBV2-P1253-001.md @@ -0,0 +1,48 @@ +# WBV2-P1253-001: verify auto-generated native shader node reader batch + +- task: WBV2-P1253-001 +- parent: WBV2-P1253-000 +- status: in_progress +- gap: capability:AUTO_SHADER_NATIVE_NODE_READER +- ownerFamily: NODES +- targetImplementationClass: LOCAL_EXACT +- batchId: WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7 +- selectedRecordIds: ["node:ShaderNodeLightFalloff","node:ShaderNodeLightPath","node:ShaderNodeMapRange","node:ShaderNodeMapping","node:ShaderNodeMix"] +- commandBudget: max=48; read/exploration max=16 +- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1253-001 --write` + +## 目标 + +以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 ShaderNodeLightFalloff, ShaderNodeLightPath, ShaderNodeMapRange, ShaderNodeMapping, ShaderNodeMix 的真实 modifier/RNA 元数据。 + +## 输入与范围 + +- Blender modifier sources: `blender-5.2.0/source/blender/modifiers/intern/` +- RNA source: `blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc` +- Native reader: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Fixtures: `tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend` +- Chromium test: `web/tests/e2e/shader-main-reader-production.spec.ts` +- Selected modifier units: `modifier-source:ShaderNodeLightFalloff`, `modifier-source:ShaderNodeLightPath`, `modifier-source:ShaderNodeMapRange`, `modifier-source:ShaderNodeMapping`, `modifier-source:ShaderNodeMix` +- 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-P1253-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-P1253-001/module-receipt.json` +- Aggregate production evidence: `tests/golden/WBV2-P1253-001/modifier-reader-batch-production.json` +- Manifest: `tests/golden/WBV2-P1253-001/manifest.json` +- Status: `docs/status/WBV2-P1253-001.md` +- Rollback: restore WBV2-P1253-000 as queue parent without rewriting prior evidence. diff --git a/tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend b/tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend new file mode 100644 index 0000000000000000000000000000000000000000..de749d4d9b09b8874262f78d52c08dd4b882d061 GIT binary patch literal 98611 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%0D$PRhmpD*I4XHr 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

dE2PNZx55|^VNABzZDYP5C18*e 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

KfBpmME$_|c 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 literal 0 HcmV?d00001 diff --git a/tests/golden/WBV2-P1253-000/manifest.json b/tests/golden/WBV2-P1253-000/manifest.json new file mode 100644 index 000000000..ed418ba53 --- /dev/null +++ b/tests/golden/WBV2-P1253-000/manifest.json @@ -0,0 +1,50 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1253-000", + "parentTask": "WBV2-P1252-001", + "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1252-001/manifest.json", + "sha256": "90ac2c0738efbf391aab78c67742c540b730d0c4677b78f6262f68499743bc8e" + }, + "plan": { + "path": "tests/golden/WBV2-P1253-000/module-execution-plan.json", + "sha256": "c2763b32fe7fb53be0341c2625bb0c9f7a21b48e241155b37865798a6c5542fa" + }, + "report": { + "path": "tests/golden/WBV2-P1253-000/successor-authorization-report.json", + "sha256": "0389dda3dcccbab598a8622b6f7c98fe9de885da8a8d67ecd644993d1abecd19" + }, + "status": { + "path": "docs/status/WBV2-P1253-000.md", + "sha256": "c98648ecdc330eb82c06c4100aa2632e2365a225e62dbb2dcf452c950643533f" + } + }, + "assertions": { + "sourceBackedSuccessor": true, + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchSize": 5, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 934, + "dynamicUnverifiedUnits": 2811, + "boundUnitDelta": 0, + "fullHistoricalReproduction": false + }, + "nextTask": "WBV2-P1253-001" +} diff --git a/tests/golden/WBV2-P1253-000/module-execution-plan.json b/tests/golden/WBV2-P1253-000/module-execution-plan.json new file mode 100644 index 000000000..8b14d229b --- /dev/null +++ b/tests/golden/WBV2-P1253-000/module-execution-plan.json @@ -0,0 +1,25346 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_MODULE_EXECUTION_P1253", + "operation": "FUNCTION_MODULE_MIGRATION_PLAN", + "status": "COMPLETED_MODULE_EXECUTION", + "authority": "blender_main_source_and_existing_hash_bound_receipts", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "inventory": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "mutation": "forbidden_by_module_execution" + }, + "reusePolicy": { + "completedReceipts": "reuse_without_rerun", + "continuationEvidence": "excluded", + "duplicateValidation": "forbidden", + "fullFamilyParity": "never_inferred" + }, + "verificationPolicy": { + "browser": "chromium_only", + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "failure": "keep_module_in_progress_and_do_not_advance" + }, + "modules": [ + { + "id": "RENDER_LIGHT_CAMERA", + "task": "WBV2-P1100-001", + "owner": "RENDER", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCENE_OBJECT_MESH", + "task": "WBV2-P1100-002", + "owner": "SCENE_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MATERIAL_ANIMATION", + "task": "WBV2-P1100-003", + "owner": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NONMESH_GEOMETRY", + "task": "WBV2-P1101-000", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NODES_SIMULATION", + "task": "WBV2-P1101-001", + "owner": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ASSET_IO", + "task": "WBV2-P1101-002", + "owner": "ASSET", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCULPT_PAINT", + "task": "WBV2-P1101-003", + "owner": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR", + "task": "WBV2-P1102-000", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "INVENTORY_GATE", + "task": "WBV2-P1102-001", + "owner": "RELEASE", + "sourceBacked": true, + "capabilities": [], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "OBJECT_OPERATIONS", + "task": "WBV2-P1103-000", + "owner": "OBJECT", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_SEQUENCER", + "task": "WBV2-P1104-000", + "owner": "MEDIA", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUDIO_PARTICLE", + "task": "WBV2-P1105-000", + "owner": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "RIG_ANIMATION", + "task": "WBV2-P1106-000", + "owner": "RIG", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORE_SCENE_GRAPH_SETTINGS", + "task": "WBV2-P1129-001", + "owner": "CORE_SCENE", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR_VIEW2D_STATE", + "task": "WBV2-P1130-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "CURVE_TOPOLOGY_EDITOR", + "task": "WBV2-P1131-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/M9-05/manifest.json", + "report": "tests/golden/M9-05/curve-toggle-cyclic.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_HANDLE_GIZMO", + "task": "WBV2-P1132-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_SPLINES_TRANSACTION", + "task": "WBV2-P1133-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SURFACE_TOPOLOGY_TRANSACTION", + "task": "WBV2-P1134-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_BODY_TRANSACTION", + "task": "WBV2-P1135-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_PROPERTIES_TRANSACTION", + "task": "WBV2-P1136-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "METABALL_ELEMENTS_TRANSACTION", + "task": "WBV2-P1137-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXT_SOURCE_TRANSACTION", + "task": "WBV2-P1138-001", + "owner": "SCRIPTING", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXTURE_PROPERTIES_TRANSACTION", + "task": "WBV2-P1139-001", + "owner": "TEXTURE", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_GROUP_READER", + "task": "WBV2-P1140-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_POSE_MARKERS_READER", + "task": "WBV2-P1141-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_SAMPLE_READER", + "task": "WBV2-P1142-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_READER", + "task": "WBV2-P1143-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "DRIVER_READER", + "task": "WBV2-P1144-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORRECTIVE_SMOOTH_READER", + "task": "WBV2-P1145-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH", + "task": "WBV2-P1146-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_TWO", + "task": "WBV2-P1147-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_THREE", + "task": "WBV2-P1148-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FOUR", + "task": "WBV2-P1149-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FIVE", + "task": "WBV2-P1150-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "task": "WBV2-P1151-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_SIX", + "task": "WBV2-P1152-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "task": "WBV2-P1153-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOLIDIFY_DEPENDENCY_REUSE", + "task": "WBV2-P1154-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_RNA_READER_BATCH", + "task": "WBV2-P1155-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_VOLUME_DISPLACE_BATCH", + "task": "WBV2-P1156-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SHAPE_KEY_POINT_READER_BATCH", + "task": "WBV2-P1157-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_READER_BATCH", + "task": "WBV2-P1158-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_COLLECTION_READER_BATCH", + "task": "WBV2-P1159-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_SUBTYPE_READER_BATCH", + "task": "WBV2-P1160-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "task": "WBV2-P1161-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SHAPEKEY_READER_BATCH", + "task": "WBV2-P1162-001", + "owner": "MODIFIER", + "sourceBacked": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NODE_READER_BATCH", + "task": "WBV2-P1163-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NATIVE_NODE_BATCH", + "task": "WBV2-P1164-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1165-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_anti_aliasing.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bilateral_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blank_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_box_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_brightness_contrast.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_channel_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1166-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_chroma_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_balance.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_correction.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_spill.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_combine_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_to_display.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1167-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convolve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_corner_pin.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_crop.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_curves.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_directional_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_defocus.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1168-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_denoise.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_despeckle.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_difference_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_dilate_erode.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_displace.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_distance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_ellipse_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1169-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:21d6a496860ad568", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask", + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_filter.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_flip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_correct.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_saturation_value.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_id_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-21d6a496860ad568.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1170-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1171-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1172-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normalize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_file_output.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_pixelate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_plane_track_deform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_posterize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_convert.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_render_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-bf66c685c7c6fd95.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1173-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_relative_to_pixel.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rotate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scale.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scene_time.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_separate_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_strip_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_set_alpha.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-a1b966b1af421537.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1174-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_stabilize_2d.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_string_to_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch_view.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_time_curve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_tone_map.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_track_position.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_translate.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8f71e517e24622f2.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1175-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_vector_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1176-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1177-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1178-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1179-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1180-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1181-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1182-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1183-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1184-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1185-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1186-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1187-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1188-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bone_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bounding_box.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_camera_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0f87459df8986017.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1189-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_connected.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_collection_children.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_edge.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-447074d84f4807db.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1190-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cube_grid_topology.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1191-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_curve_of_point.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_bezier_segment.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-71424076a2a8f339.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1192-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadratic_bezier.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_set_handle_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1193-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curves_to_grease_pencil.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1194-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8f6105d06959322c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1195-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1196-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edges_to_face_groups.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1197-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_average.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1198-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_filter_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6581c99986be795f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1199-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_geometry_to_instance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_attribute_names.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_bundle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-240d704df4420718.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1200-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_component.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_dial.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_linear.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_transform.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1201-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grease_pencil_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_advect.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_clip.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_curl.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_dilate_erode.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1202-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_divergence.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_gradient.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_mean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1203-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_median.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_prune.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_voxelize.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1204-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_csv.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_obj.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_ply.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_stl.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1205-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_text.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_vdb.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_of_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1206-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_collection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_edge_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_font.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-150a227b3433d301.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1207-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_id.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_bounds.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_reference.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1208-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_scale.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_angle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1209-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_area.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_neighbors.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e28f27c297406a24.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1210-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_island.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_vertex_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_layer_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1211-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_align_rotation_to_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axes_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_combine_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_euler_to_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1212-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_find_in_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_format_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_bool.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1213-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_menu.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_special_characters.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1214-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_match_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_determinant.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1215-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1216-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1216-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c598026385cc94dc", + "selectedRecordIds": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_axis_angle.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_euler.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_quaternion.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_separate_matrix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c598026385cc94dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1217-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1217-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dbc0fb8bb88f3d37", + "selectedRecordIds": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_set_string_case.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_slice_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_length.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_to_value.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_direction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-dbc0fb8bb88f3d37.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1218-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1218-001:AUTO_GEOMETRY_NATIVE_NODE_READER:34abb58eedf43c5f", + "selectedRecordIds": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_trim_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_value_to_string.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_object.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-34abb58eedf43c5f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1219-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1219-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cccf2d7fb85d3b8", + "selectedRecordIds": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_face_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cccf2d7fb85d3b8.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1220-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1220-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d0f07a9289283d0", + "selectedRecordIds": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_resolution.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_voxel_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d0f07a9289283d0.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1221-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1221-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c30b3d2a341bc8b1", + "selectedRecordIds": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instances_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_get_item.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c30b3d2a341bc8b1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1222-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1222-001:AUTO_GEOMETRY_NATIVE_NODE_READER:838d8958e4b989d1", + "selectedRecordIds": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-838d8958e4b989d1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1223-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1223-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c3b7b0656afe6a91", + "selectedRecordIds": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_bevel.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_boolean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c3b7b0656afe6a91.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1224-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1224-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0dca701c57915fc7", + "selectedRecordIds": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0dca701c57915fc7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1225-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1225-001:AUTO_GEOMETRY_NATIVE_NODE_READER:142ee68a2ed9492b", + "selectedRecordIds": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-142ee68a2ed9492b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1226-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1226-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abb1c596d4ee21b2", + "selectedRecordIds": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_offset_point_in_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abb1c596d4ee21b2.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1227-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1227-001:AUTO_GEOMETRY_NATIVE_NODE_READER:81deda73b9188c10", + "selectedRecordIds": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-81deda73b9188c10.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1228-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1228-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6b022a1a8e99f7fd", + "selectedRecordIds": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_proximity.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_raycast.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rename_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6b022a1a8e99f7fd.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1229-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1229-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1323c437a10e245b", + "selectedRecordIds": [ + "node:GeometryNodeRepeatOutput" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1323c437a10e245b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1230-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1230-001:AUTO_GEOMETRY_NATIVE_NODE_READER:bb5c9b89367c9d6d", + "selectedRecordIds": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_boolean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-bb5c9b89367c9d6d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1231-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1231-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e423b626a07145e", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean_curvature.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_median.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e423b626a07145e.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1232-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1232-001:AUTO_GEOMETRY_NATIVE_NODE_READER:404eb303152ba922", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_offset.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-404eb303152ba922.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1233-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1233-001:AUTO_GEOMETRY_NATIVE_NODE_READER:529a042eb604c0e1", + "selectedRecordIds": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_sound_frequencies.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-529a042eb604c0e1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1234-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1234-001:AUTO_GEOMETRY_NATIVE_NODE_READER:ad9e5b4bf235659f", + "selectedRecordIds": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_self_object.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_separate_components.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-ad9e5b4bf235659f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1235-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1235-001:AUTO_GEOMETRY_NATIVE_NODE_READER:91beafd1d1c04670", + "selectedRecordIds": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_name.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_color.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-91beafd1d1c04670.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1236-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1236-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b7b77a5dec80a14d", + "selectedRecordIds": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_depth_mode.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_softness.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_id.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b7b77a5dec80a14d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1237-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1237-001:AUTO_GEOMETRY_NATIVE_NODE_READER:95ccfa5892bb7a33", + "selectedRecordIds": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_mesh_normal.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_order.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-95ccfa5892bb7a33.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1238-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1238-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d3751cce437cb33", + "selectedRecordIds": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_weight.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d3751cce437cb33.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1239-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1239-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2de2c5e6ce0c4914", + "selectedRecordIds": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2de2c5e6ce0c4914.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1240-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1240-001:AUTO_GEOMETRY_NATIVE_NODE_READER:70077c253f8e9738", + "selectedRecordIds": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_join.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-70077c253f8e9738.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1241-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1241-001:AUTO_GEOMETRY_NATIVE_NODE_READER:518360e680870ecc", + "selectedRecordIds": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tag_filter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-518360e680870ecc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1242-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1242-001:AUTO_GEOMETRY_NATIVE_NODE_READER:f355dda8099b8a6f", + "selectedRecordIds": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_active_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_face_set.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mouse_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-f355dda8099b8a6f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1243-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1243-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6399364bfcbc157c", + "selectedRecordIds": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_transfer_attributes.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6399364bfcbc157c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1244-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_vertex_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1245-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1245-001:AUTO_GEOMETRY_NATIVE_NODE_READER:06a9b0a82fc0bc5b", + "selectedRecordIds": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewport_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_warning.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_xpbd_solver.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-06a9b0a82fc0bc5b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1246-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1246-001:AUTO_SHADER_NATIVE_NODE_READER:6084b65cc9b4dd13", + "selectedRecordIds": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_add_shader.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_attribute.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_background.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bevel.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-6084b65cc9b4dd13.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1247-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1247-001:AUTO_SHADER_NATIVE_NODE_READER:492bd603ac3e7b39", + "selectedRecordIds": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_blackbody.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_brightness.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-492bd603ac3e7b39.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1248-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1248-001:AUTO_SHADER_NATIVE_NODE_READER:5d3fdcd95f8dcb4a", + "selectedRecordIds": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_metallic.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_ray_portal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-5d3fdcd95f8dcb4a.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1249-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1249-001:AUTO_SHADER_NATIVE_NODE_READER:3dd8ce20c676372b", + "selectedRecordIds": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_toon.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bump.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-3dd8ce20c676372b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1250-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1250-001:AUTO_SHADER_NATIVE_NODE_READER:4962cd49b587a2f9", + "selectedRecordIds": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_camera.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_clamp.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_xyz.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_displacement.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-4962cd49b587a2f9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1251-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1251-001:AUTO_SHADER_NATIVE_NODE_READER:2367477c6dfff68d", + "selectedRecordIds": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_eevee_specular.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_emission.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_fresnel.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_gamma.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-2367477c6dfff68d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1252-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1253-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_falloff.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_path.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_map_range.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mapping.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + } + ], + "tasks": [ + { + "id": "WBV2-P1096-000", + "phase": "1096", + "title": "supersede_generic_continuation_queue", + "kind": "bridge", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1095-003" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "bridge", + "gate": "QUEUE", + "card": "docs/tasks/WBV2-P1096-000.md", + "behavior": "Replace the generic continuation queue with a finite module execution plan without claiming capability parity.", + "outputs": [ + "bridge manifest", + "status" + ], + "acceptance": [ + "no parity claim", + "inventory preserved", + "module plan hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-000", + "phase": "1100", + "title": "reorganize_module_execution_plan", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1096-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-000.md", + "behavior": "Reuse completed source-backed work and activate finite module-level implementation and verification.", + "outputs": [ + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "completed receipts reused", + "generic continuation excluded", + "one module active", + "inventory preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-001", + "phase": "1100", + "title": "verify_render_light_camera_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1100-000" + ], + "parityId": "RENDER_LIGHT_CAMERA", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-render_light_camera", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-001.md", + "behavior": "Complete the RENDER_LIGHT_CAMERA module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_LIGHT_CAMERA", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "positive": [ + "setLightProperties", + "setWorldProperties", + "setCameraProperties", + "camera panorama", + "world environment", + "light shadow/cascade" + ], + "negative": [ + "invalid enum", + "invalid numeric bounds", + "near/far conflict", + "unknown target", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:lighting-field-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-lighting-fields-production.spec.ts tests/e2e/lighting-field-roundtrip.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-002", + "phase": "1100", + "title": "verify_scene_object_mesh_module", + "kind": "module", + "owner": "SCENE_MESH", + "dependsOn": [ + "WBV2-P1100-001" + ], + "parityId": "SCENE_OBJECT_MESH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-scene_object_mesh", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-002.md", + "behavior": "Complete the SCENE_OBJECT_MESH module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCENE_OBJECT_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "positive": [ + "mesh topology", + "visibility", + "transform", + "collection membership" + ], + "negative": [ + "invalid selection", + "stale revision", + "linked data" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts tests/e2e/wbv2-scene-object-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-003", + "phase": "1100", + "title": "verify_material_animation_module", + "kind": "module", + "owner": "MATERIAL_ANIMATION", + "dependsOn": [ + "WBV2-P1100-002" + ], + "parityId": "MATERIAL_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-material_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-003.md", + "behavior": "Complete the MATERIAL_ANIMATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "positive": [ + "principled material", + "image node", + "keyframe", + "FCurve" + ], + "negative": [ + "unsupported graph", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-animation-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-000", + "phase": "1101", + "title": "verify_nonmesh_geometry_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1100-003" + ], + "parityId": "NONMESH_GEOMETRY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nonmesh_geometry", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-000.md", + "behavior": "Complete the NONMESH_GEOMETRY module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NONMESH_GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "curve", + "surface", + "font", + "volume", + "metaball", + "grease pencil" + ], + "negative": [ + "unsupported data", + "resource missing", + "malformed geometry" + ], + "recovery": [ + "save/reopen", + "resource disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-viewport-nonmesh-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-001", + "phase": "1101", + "title": "verify_nodes_simulation_module", + "kind": "module", + "owner": "NODES_SIMULATION", + "dependsOn": [ + "WBV2-P1101-000" + ], + "parityId": "NODES_SIMULATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_simulation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-001.md", + "behavior": "Complete the NODES_SIMULATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted node graph", + "physics manifest", + "stable hash" + ], + "negative": [ + "unsupported node", + "budget exceeded", + "stale revision" + ], + "recovery": [ + "save/reopen", + "cache disposal" + ], + "commands": [ + "npm --prefix web run test:geometry-node-main-reader", + "npm --prefix web run test:physics-main-reader" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-002", + "phase": "1101", + "title": "verify_asset_io_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1101-001" + ], + "parityId": "ASSET_IO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-asset_io", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-002.md", + "behavior": "Complete the ASSET_IO module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ASSET_IO", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "positive": [ + "append", + "link", + "override", + "reload", + "asset catalog v2" + ], + "negative": [ + "missing source", + "ownership violation", + "hash drift", + "collision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "IndexedDB restart" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-v2", + "npm --prefix web run test:asset-catalog-migration", + "npm --prefix web run test:asset-catalog-negatives", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-link-override-production.spec.ts tests/e2e/wbv2-asset-catalog-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-003", + "phase": "1101", + "title": "verify_sculpt_paint_module", + "kind": "module", + "owner": "SCULPT_PAINT", + "dependsOn": [ + "WBV2-P1101-002" + ], + "parityId": "SCULPT_PAINT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-sculpt_paint", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-003.md", + "behavior": "Complete the SCULPT_PAINT module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "positive": [ + "vertex colors", + "vertex weights", + "bounded sculpt stroke" + ], + "negative": [ + "mirror unverified", + "invalid patch", + "unsupported brush" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:paint-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-paint-attributes-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-000", + "phase": "1102", + "title": "implement_ui_editor_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1101-003" + ], + "parityId": "UI_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-000.md", + "behavior": "Complete the UI_EDITOR module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "sourcePaths": [ + "web/protocol/editor-workflow.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "editor context", + "workspace", + "area/region" + ], + "negative": [ + "unsupported editor", + "invalid context" + ], + "recovery": [ + "worker restart", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:editor-main-reader", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-workflow-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-001", + "phase": "1102", + "title": "close_module_execution_gate", + "kind": "module", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P1102-000" + ], + "parityId": "INVENTORY_GATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-inventory_gate", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-001.md", + "behavior": "Complete the INVENTORY_GATE module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "INVENTORY_GATE", + "sourceBacked": true, + "capabilities": [], + "sourcePaths": [ + "tests/golden/WBV2-P0-002/parity-map.json", + "tests/golden/WBV2-P1100-000/module-execution-plan.json" + ], + "reuseReceipts": [], + "positive": [ + "aggregate module receipts", + "catalog hash" + ], + "negative": [ + "missing receipt", + "hash drift", + "false completion" + ], + "recovery": [ + "re-run affected module only" + ], + "commands": [ + "node tools/web/check-wbv2-module-execution.mjs", + "npm --prefix web run build" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1103-000", + "phase": "1103", + "title": "aggregate_object_operations_module", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1102-001" + ], + "parityId": "OBJECT_OPERATIONS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_operations", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1103-000.md", + "behavior": "Aggregate the existing source-backed Object Main operations into one module and revalidate the Chromium operator matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "OBJECT_OPERATIONS", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "positive": [ + "duplicate", + "create", + "parent", + "collection", + "rename", + "delete", + "transform apply" + ], + "negative": [ + "unknown object", + "invalid parent cycle", + "malformed transform" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts tests/e2e/wbv2-object-create-production.spec.ts tests/e2e/wbv2-object-parent-production.spec.ts tests/e2e/wbv2-collection-create-production.spec.ts tests/e2e/wbv2-object-rename-production.spec.ts tests/e2e/wbv2-object-delete-production.spec.ts tests/e2e/wbv2-object-transform-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1104-000", + "phase": "1104", + "title": "verify_compositor_sequencer_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1103-000" + ], + "parityId": "COMPOSITOR_SEQUENCER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_sequencer", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1104-000.md", + "behavior": "Verify the source-backed compositor and sequencer module through golden, unsupported-gate and media recovery cases.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main or compositor mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "COMPOSITOR_SEQUENCER", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/compositor.ts", + "web/protocol/sequencer.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "compositor node graph", + "sequencer still-image timeline", + "media cache contract" + ], + "negative": [ + "unsupported compositor node", + "invalid sequencer strip", + "stale media revision" + ], + "recovery": [ + "worker restart", + "save/reopen", + "media cache replay", + "movie codec blocked without READY receipt" + ], + "commands": [ + "npm --prefix web run test:compositor-node-golden", + "npm --prefix web run test:compositor-unsupported-gate", + "npm --prefix web run test:sequencer-main-reader", + "node --test web/tests/unit/sequencer-media-cache.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-021 sequencer|real Blender 5.2 sequencer\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1105-000", + "phase": "1105", + "title": "verify_audio_particle_module", + "kind": "module", + "owner": "AUDIO_PARTICLE", + "dependsOn": [ + "WBV2-P1104-000" + ], + "parityId": "AUDIO_PARTICLE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-audio_particle", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1105-000.md", + "behavior": "Verify Sound, Speaker and ParticleSettings mutations against authoritative Blender Main with explicit build capability gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven or a typed build capability blocker is recorded", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/protocol/io-media-commands.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "positive": [ + "Sound properties", + "Speaker properties", + "ParticleSettings properties" + ], + "negative": [ + "missing Main datablock", + "unsupported build feature", + "out-of-range property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker restart" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-audio-particle-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1106-000", + "phase": "1106", + "title": "verify_rig_animation_module", + "kind": "module", + "owner": "RIG", + "dependsOn": [ + "WBV2-P1105-000" + ], + "parityId": "RIG_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-rig_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1106-000.md", + "behavior": "Verify armature pose, constraints and NLA animation through the existing Blender Main primitives.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RIG_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "armature pose", + "constraint edit", + "NLA stack" + ], + "negative": [ + "missing bone", + "invalid constraint influence", + "stale NLA revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-rig-pose-production.spec.ts", + "npm --prefix web run test:nla-operator", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1107-000", + "phase": "1107", + "title": "verify_modifier_system_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1106-000" + ], + "parityId": "MODIFIER_SYSTEM", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_system", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1107-000.md", + "behavior": "Verify modifier stack visibility and bounded parameter mutation through authoritative Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SYSTEM", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER-STATE-MUTATION", + "CAP-MODIFIER-PARAMETER-EDIT", + "CAP-MODIFIER-STACK-READER" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/modifier-graph.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P9-002/manifest.json", + "report": "tests/golden/WBV2-P9-002/modifier-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P11-002/manifest.json", + "report": "tests/golden/WBV2-P11-002/modifier-parameter-receipt-report.json" + } + ], + "positive": [ + "modifier visibility toggle", + "bounded DECIMATE parameter mutation", + "modifier stack evaluation reader" + ], + "negative": [ + "unknown modifier UUID", + "stale mesh revision", + "out-of-range parameter" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts tests/e2e/wbv2-modifier-parameter-production.spec.ts", + "npm --prefix web run test:modifier-goldens", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1108-000", + "phase": "1108", + "title": "verify_nodes_graph_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1107-000" + ], + "parityId": "NODES_GRAPH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_graph", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1108-000.md", + "behavior": "Verify Geometry Nodes graph identity, allowlisted evaluation, field budgets and unsupported graph retention.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive graph reader/evaluation evidence is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_GRAPH", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-GRAPH", + "CAP-GEOMETRY-NODES-ALLOWLIST", + "CAP-GEOMETRY-NODES-FIELD-BUDGET" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted graph identity", + "Blender depsgraph geometry evaluation", + "field materialization with exact domain cardinality" + ], + "negative": [ + "unsupported node graph", + "field budget overflow", + "stale or invalid graph command" + ], + "recovery": [ + "save/reopen", + "worker restart", + "graph retention after rejected command", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:geometry-node-evaluator-golden", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1109-000", + "phase": "1109", + "title": "verify_io_format_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1108-000" + ], + "parityId": "IO_FORMAT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-io_format", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1109-000.md", + "behavior": "Verify format capability routing, runtime receipts, recovery and fail-closed file UI gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive format routing/readiness evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "IO_FORMAT", + "sourceBacked": true, + "capabilities": [ + "CAP-IO-FORMAT-CAPABILITY-MATRIX", + "CAP-IO-FORMAT-RUNTIME-RECEIPTS", + "CAP-IO-FORMAT-RECOVERY", + "CAP-IO-FORMAT-UI-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/asset-library-io.ts", + "web/protocol/io-format-capability-matrix.ts", + "web/protocol/io-format-receipt-binding.ts", + "web/protocol/io-format-runtime-receipt.ts", + "web/protocol/io-format-recovery.ts", + "web/protocol/io-format-ui-gate.ts", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "GLB export readiness", + "format runtime receipt inventory", + "declared .blend import route" + ], + "negative": [ + "unverified format route", + "cancelled or OOM operation", + "unsupported file extension" + ], + "recovery": [ + "worker restart", + "small operation recovery", + "deterministic receipt replay", + "fail-closed UI route" + ], + "commands": [ + "node tools/web/check-io-format-receipt-bindings.mjs", + "node tools/web/check-io-format-runtime-receipts.mjs", + "node tools/web/check-io-format-recovery.mjs", + "node tools/web/check-io-format-ui-gate.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/io-format-recovery.spec.ts tests/e2e/io-format-ui-gate.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1110-000", + "phase": "1110", + "title": "verify_render_pipeline_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1109-000" + ], + "parityId": "RENDER_PIPELINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-render_pipeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1110-000.md", + "behavior": "Verify render backend routing, explicit resource budgets and Blender reference comparison in Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive render/reference evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic render receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_PIPELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-BACKEND-ROUTING", + "CAP-RENDER-RESOURCE-BUDGET", + "CAP-RENDER-REFERENCE-COMPARISON" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/render-routing.ts", + "web/protocol/render-budget.ts", + "web/protocol/render-capabilities.ts", + "web/protocol/render-image-comparison.ts", + "web/protocol/server-render-job.ts", + "web/app/src/three-adapter/render-routing.ts", + "web/app/src/three-adapter/render-image-comparison.ts", + "web/app/src/workers/viewport-render.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "bounded local backend routing", + "reference render metrics", + "resource budget acceptance" + ], + "negative": [ + "unknown or unavailable backend", + "aggregate texture/light budget overflow", + "wrong composition reference" + ], + "recovery": [ + "retain previous texture set", + "offscreen renderer parity", + "worker restart", + "deterministic second render" + ], + "commands": [ + "npm --prefix web run test:render-resource-budget", + "npm --prefix web run test:render-routing", + "npm --prefix web run test:render-reference", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1111-000", + "phase": "1111", + "title": "verify_scripting_security_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1110-000" + ], + "parityId": "SCRIPTING_SECURITY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-scripting_security", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1111-000.md", + "behavior": "Verify script source Main reader, deny-by-default permission policy and sandbox isolation/recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader and policy evidence is proven", + "negative and recovery cases are proven", + "Chromium sandbox receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCRIPTING_SECURITY", + "sourceBacked": true, + "capabilities": [ + "CAP-SCRIPT-MAIN-READER", + "CAP-SCRIPT-PERMISSION-POLICY", + "CAP-SCRIPT-SANDBOX-ISOLATION", + "CAP-SCRIPT-SANDBOX-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/scripting-platform.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/script-permission-policy-test.worker.ts", + "web/app/src/workers/script-sandbox-isolation-test.worker.ts", + "web/app/src/workers/script-sandbox-recovery-test.worker.ts", + "web/app/src/testing/script-sandbox-recovery.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "script source inventory reader", + "explicit READ_MAIN permission", + "new-generation recovery audit" + ], + "negative": [ + "autorun denied by default", + "undeclared permission", + "sandbox crash/timeout/late result" + ], + "recovery": [ + "worker restart", + "sandbox generation rollover", + "continuous audit chain", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:script-main-reader", + "npm --prefix web run test:scripting-isolation", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/script-permission-policy.spec.ts tests/e2e/script-sandbox-isolation.spec.ts tests/e2e/script-sandbox-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1112-000", + "phase": "1112", + "title": "verify_animation_timeline_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1111-000" + ], + "parityId": "ANIMATION_TIMELINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-animation_timeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1112-000.md", + "behavior": "Verify frame evaluation and NLA time mapping through the production Worker and Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive frame/NLA evaluation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic evaluation receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ANIMATION_TIMELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-FRAME-EVALUATION", + "CAP-NLA-TIME-MAPPING", + "CAP-ANIMATION-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/protocol/depsgraph.ts", + "web/protocol/scene-ir.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "frame 1/5/10 evaluation", + "NLA track and strip mapping", + "Blender depsgraph animation result" + ], + "negative": [ + "stale NLA revision", + "invalid strip topology", + "unsupported animation domain" + ], + "recovery": [ + "save/reopen", + "worker restart", + "deterministic repeated evaluation", + "preserve rejected stack" + ], + "commands": [ + "npm --prefix web run test:frame-evaluation", + "node tools/web/check-nla-evaluation-golden.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/nla-evaluation-golden.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1113-000", + "phase": "1113", + "title": "verify_shader_material_module", + "kind": "module", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P1112-000" + ], + "parityId": "SHADER_MATERIAL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shader_material", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1113-000.md", + "behavior": "Verify bounded Shader graph compilation, stable compile keys and fail-closed pipeline recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Shader Main compilation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic compile receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHADER_MATERIAL", + "sourceBacked": true, + "capabilities": [ + "CAP-SHADER-GRAPH-COMPILER", + "CAP-SHADER-COMPILE-KEY", + "CAP-SHADER-FAIL-CLOSED-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/shader-graph.ts", + "web/protocol/shader-graph-commands.ts", + "web/protocol/shader-compiler.ts", + "web/protocol/render-capabilities.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "Principled/Image/Normal/Math graph compile", + "stable compile key", + "real Main shader material path" + ], + "negative": [ + "unknown shader node", + "graph cycle or duplicate link", + "unsupported renderer backend" + ], + "recovery": [ + "retain previous material after compile failure", + "worker restart", + "deterministic repeated compile", + "save/reopen material graph" + ], + "commands": [ + "npm --prefix web run test:shader-compile", + "npm --prefix web run test:shader-pipeline", + "npm --prefix web run test:shader-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1114-000", + "phase": "1114", + "title": "verify_grease_pencil_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1113-000" + ], + "parityId": "GREASE_PENCIL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1114-000.md", + "behavior": "Verify Grease Pencil layer/frame Main mutations, stable identity validation and roundtrip recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Grease Pencil Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-LAYER-FRAME", + "CAP-GREASE-PENCIL-STROKE-READER", + "CAP-GREASE-PENCIL-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/grease-pencil.ts", + "web/protocol/grease-pencil-reorder.ts", + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "create and reorder layer", + "insert and move frame", + "stable Grease Pencil drawing reader" + ], + "negative": [ + "forged drawing identity", + "occupied frame target", + "stale layer/frame revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic layer/frame replay" + ], + "commands": [ + "npm --prefix web run test:grease-pencil-reorder", + "npm --prefix web run test:grease-pencil", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1115-000", + "phase": "1115", + "title": "verify_curve_surface_editing_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1114-000" + ], + "parityId": "CURVE_SURFACE_EDITING", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_surface_editing", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1115-000.md", + "behavior": "Verify Curve topology/handle edits, Surface topology and non-mesh/font roundtrip through Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive non-mesh Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SURFACE_EDITING", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-HANDLES", + "CAP-SURFACE-TOPOLOGY", + "CAP-NONMESH-FONT-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nonmesh-geometry-commands.ts", + "web/protocol/curve-topology-editor.ts", + "web/protocol/non-mesh.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + } + ], + "positive": [ + "Curve control point and handle edit", + "Curve cyclic/topology operator", + "Surface and Font property mutation" + ], + "negative": [ + "invalid curve selection/domain", + "occupied or stale frame/topology target", + "malformed non-mesh property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic multispline replay" + ], + "commands": [ + "npm --prefix web run test:curve-topology-operator", + "npm --prefix web run test:nonmesh-roundtrip", + "npm --prefix web run test:nonmesh-desktop-golden", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1116-000", + "phase": "1116", + "title": "verify_storage_recovery_module", + "kind": "module", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1115-000" + ], + "parityId": "STORAGE_RECOVERY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-storage_recovery", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1116-000.md", + "behavior": "Verify IndexedDB catalog migration/restart and OPFS asset preview deduplication, quarantine and reference GC.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive storage commit/recovery evidence is proven", + "negative and quarantine cases are proven", + "Chromium restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "STORAGE_RECOVERY", + "sourceBacked": true, + "capabilities": [ + "CAP-INDEXEDDB-CATALOG-MIGRATION", + "CAP-OPFS-PREVIEW-COMMIT", + "CAP-OPFS-QUARANTINE-GC" + ], + "sourcePaths": [ + "web/protocol/storage.ts", + "web/protocol/storage-budget.ts", + "web/protocol/save-transaction.ts", + "web/protocol/recent-projects.ts", + "web/protocol/asset-preview.ts", + "web/protocol/asset-preview-decode.ts", + "web/app/src/storage/asset-catalog-indexeddb.ts", + "web/app/src/storage/asset-preview-opfs-commit.ts", + "web/app/src/storage/asset-preview-quarantine.ts", + "web/app/src/storage/asset-preview-reference-gc.ts", + "web/app/src/storage/opfs-files.ts", + "web/app/src/storage/migrations.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "v1 to v2 catalog migration", + "page/Worker restart identity", + "content-addressed preview deduplication" + ], + "negative": [ + "partial catalog migration", + "corrupt preview quarantine", + "cross-project or non-final reference GC" + ], + "recovery": [ + "IndexedDB restart", + "OPFS commit replay", + "quarantine cleanup", + "deterministic reference reclamation" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-restart", + "npm --prefix web run test:asset-preview-dedup", + "npm --prefix web run test:asset-preview-quarantine", + "npm --prefix web run test:asset-preview-reference-gc", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1117-000", + "phase": "1117", + "title": "verify_simulation_cache_module", + "kind": "module", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1116-000" + ], + "parityId": "SIMULATION_CACHE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-simulation_cache", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1117-000.md", + "behavior": "Verify simulation cache identity, physics-family payload integrity, lifecycle recovery and deterministic LRU pruning.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive cache identity/lifecycle evidence is proven", + "negative integrity and budget cases are proven", + "Chromium restart and quarantine receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SIMULATION_CACHE", + "sourceBacked": true, + "capabilities": [ + "CAP-SIMULATION-CACHE-IDENTITY", + "CAP-PHYSICS-CACHE-INTEGRITY", + "CAP-SIMULATION-CACHE-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/simulation-cache.ts", + "web/protocol/physics-simulation.ts", + "web/protocol/physics-cache-playback.ts", + "web/protocol/storage.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "graph/source/revision cache identity", + "all physics-family frame hashes", + "verified playback lifecycle" + ], + "negative": [ + "source or payload hash drift", + "revision/range mismatch", + "cache byte/frame budget overflow" + ], + "recovery": [ + "cancel and cleanup", + "LRU prune with protected playback", + "corruption quarantine", + "worker restart" + ], + "commands": [ + "npm --prefix web run test:simulation-cache-identity", + "npm --prefix web run test:simulation-cache-lifecycle", + "npm --prefix web run test:physics-cache-family", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1118-000", + "phase": "1118", + "title": "verify_ui_input_interaction_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1117-000" + ], + "parityId": "UI_INPUT_INTERACTION", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-ui_input_interaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1118-000.md", + "behavior": "Verify keyboard-only user actions, input mutex, IME/pointer state and responsive editor interaction under deployment CSP.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive keyboard Main mutation and save are proven", + "negative mutex/input cases are proven", + "Chromium accessibility and responsive receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_INPUT_INTERACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-KEYBOARD-USER-ACTIONS", + "CAP-INPUT-MODAL-STATE", + "CAP-IME-SHORTCUT-GUARD", + "CAP-RESPONSIVE-CSP-UI" + ], + "sourcePaths": [ + "web/app/index.html", + "web/app/src/app/App.tsx", + "web/app/src/app/app-shell.css", + "web/app/src/workers/web-engine.worker.ts", + "web/protocol/user-action-state.ts", + "web/protocol/project-action-mutex.ts", + "web/protocol/ime-composition.ts", + "web/protocol/input-modal.ts", + "web/protocol/pointer-contract.ts", + "web/protocol/worker-fault.ts", + "web/tests/unit/user-action-state.test.mjs", + "web/tests/unit/project-action-mutex.test.mjs", + "web/tests/unit/ime-composition.test.mjs", + "web/tests/unit/input-modal.test.mjs", + "web/tests/unit/pointer-contract.test.mjs" + ], + "reuseReceipts": [], + "positive": [ + "keyboard-only Add Cube Main mutation", + "keyboard save/reopen and GLB export", + "responsive controls at desktop/mobile viewports" + ], + "negative": [ + "concurrent project action mutex", + "IME shortcut suppression", + "pointer cancel/touch modal cleanup" + ], + "recovery": [ + "worker restart", + "save interruption recovery", + "responsive layout preservation", + "deterministic repeated keyboard loop" + ], + "commands": [ + "node --test web/tests/unit/user-action-state.test.mjs web/tests/unit/project-action-mutex.test.mjs web/tests/unit/ime-composition.test.mjs web/tests/unit/input-modal.test.mjs web/tests/unit/pointer-contract.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/user-action-state.spec.ts tests/e2e/project-action-mutex.spec.ts tests/e2e/keyboard-accessibility.spec.ts tests/e2e/responsive-layout.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1119-000", + "phase": "1119", + "title": "verify_library_workflow_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1118-000" + ], + "parityId": "LIBRARY_WORKFLOW", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-library_workflow", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1119-000.md", + "behavior": "Verify append, link, override and reload library flows through authoritative Main with path and dependency safety gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive library Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LIBRARY_WORKFLOW", + "sourceBacked": true, + "capabilities": [ + "CAP-LIBRARY-APPEND", + "CAP-LIBRARY-LINK", + "CAP-LIBRARY-OVERRIDE", + "CAP-LIBRARY-RELOAD-SAFETY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/library-main-append.ts", + "web/protocol/library-linked-mutation.ts", + "web/protocol/library-linked-reload.ts", + "web/protocol/library-linked-missing.ts", + "web/protocol/library-override-writer.ts", + "web/protocol/library-override-freshness.ts", + "web/protocol/library-negative-cases.ts", + "web/protocol/library-operation-identity.ts", + "web/protocol/library-source-origin.ts", + "web/protocol/asset-path.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P9-003/manifest.json", + "report": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json" + } + ], + "positive": [ + "append object into Main", + "linked read-only object", + "local override and reload identity" + ], + "negative": [ + "missing library source", + "dependency/cross-library cycle", + "unsafe path or ownership mutation" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic library replay" + ], + "commands": [ + "npm --prefix web run test:library-main-append", + "npm --prefix web run test:library-link-chromium", + "npm --prefix web run test:library-override-chromium", + "npm --prefix web run test:library-negative-cases", + "npm --prefix web run test:library-path-security", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1120-000", + "phase": "1120", + "title": "verify_volume_nanovdb_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1119-000" + ], + "parityId": "VOLUME_NANOVDB", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-volume_nanovdb", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1120-000.md", + "behavior": "Verify NanoVDB manifest, paged feedback, OPFS commit/restart and production viewport volume roundtrip.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive volume resource and viewport evidence is proven", + "negative and recovery cases are proven", + "Chromium OPFS/restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "VOLUME_NANOVDB", + "sourceBacked": true, + "capabilities": [ + "CAP-NANOVDB-MANIFEST", + "CAP-NANOVDB-PAGED-FEEDBACK", + "CAP-NANOVDB-OPFS-RESTART", + "CAP-NANOVDB-VIEWPORT-ROUNDTRIP" + ], + "sourcePaths": [ + "web/protocol/volume-vdb.ts", + "web/protocol/nanovdb-page-feedback.ts", + "web/protocol/nanovdb-device-recovery.ts", + "web/protocol/storage.ts", + "web/app/src/volume/nanovdb-opfs.ts", + "web/app/src/volume/nanovdb-stream.ts", + "web/app/src/volume/nanovdb-viewport.ts", + "web/app/src/volume/nanovdb-float32.ts", + "web/app/src/render/nanovdb-volume-renderer.ts", + "web/app/src/workers/vdb-opfs-test.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "validated NanoVDB bundle manifest", + "content-addressed OPFS commit", + "main/offscreen production viewport volume" + ], + "negative": [ + "manifest/chunk hash mismatch", + "stale source binding", + "WebGPU/resource availability block" + ], + "recovery": [ + "OPFS Worker restart", + "paged feedback resume", + "quota/device loss cleanup", + "deterministic volume save/reopen" + ], + "commands": [ + "npm --prefix web run test:vdb-availability", + "npm --prefix web run test:vdb-native", + "npm --prefix web run test:nanovdb-page-feedback", + "npm --prefix web run test:nanovdb-opfs-restart", + "npm --prefix web run test:nanovdb-volume-roundtrip", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1121-000", + "phase": "1121", + "title": "verify_paint_stroke_module", + "kind": "module", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P1120-000" + ], + "parityId": "PAINT_STROKE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-paint_stroke", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1121-000.md", + "behavior": "Verify paint pointer sessions, depth visibility and PBVH capability gates through the production Worker.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive paint Main transaction is proven", + "negative and recovery cases are proven", + "Chromium pointer/GPU receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "PAINT_STROKE", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-POINTER-SESSION", + "CAP-PAINT-DEPTH-VISIBILITY", + "CAP-PAINT-PBVH-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/sculpt.ts", + "web/protocol/paint.ts", + "web/protocol/paint-stroke-session.ts", + "web/protocol/paint-depth-visibility.ts", + "web/protocol/paint-pbvh-capability.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/three-adapter/paint-depth-visibility.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "ordered paint pointer chunks", + "main/offscreen depth visibility", + "PBVH inventory capability query" + ], + "negative": [ + "stale/discontinuous pointer chunks", + "forged or over-budget depth samples", + "missing PBVH WASM entrypoint" + ], + "recovery": [ + "pointer cancel without Main mutation", + "undo step after paint commit", + "worker restart", + "deterministic capability replay" + ], + "commands": [ + "npm --prefix web run test:paint-stroke-session", + "npm --prefix web run test:paint-depth-visibility", + "npm --prefix web run test:paint-pbvh-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1122-000", + "phase": "1122", + "title": "verify_engine_runtime_module", + "kind": "module", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1121-000" + ], + "parityId": "ENGINE_RUNTIME", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-engine_runtime", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1122-000.md", + "behavior": "Verify WebEngine variant manifest/selection, compiled WASM Main ABI and Worker crash recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive compiled WASM Main lifecycle is proven", + "negative variant/hash cases are proven", + "Chromium Worker restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ENGINE_RUNTIME", + "sourceBacked": true, + "capabilities": [ + "CAP-ENGINE-VARIANT-MANIFEST", + "CAP-ENGINE-WASM-MAIN-ABI", + "CAP-WORKER-CRASH-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.h", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/CMakeLists.txt", + "web/protocol/engine-variant.ts", + "web/protocol/worker-fault.ts", + "web/protocol/save-transaction.ts", + "web/app/src/engine-client/engine-variant-bootstrap.ts", + "web/app/src/engine-client/browser-engine-variant-session.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "single/pthread manifest binding", + "compiled WASM Main open/save lifecycle", + "engine and storage Worker recovery" + ], + "negative": [ + "malformed variant/resource declaration", + "mixed-version/hash mismatch", + "pthread unavailable fallback" + ], + "recovery": [ + "single-thread fallback", + "Worker crash restart", + "operation-log restore", + "deterministic repeated startup" + ], + "commands": [ + "npm --prefix web run test:engine-manifest-v2", + "npm --prefix web run test:engine-variant-selection", + "npm --prefix web run test:engine-variant-fallback", + "npm --prefix web run test:engine-variant-install", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-native-engine-production.spec.ts tests/e2e/worker-crash-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1123-000", + "phase": "1123", + "title": "repair_glb_roundtrip_dependency_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1122-000" + ], + "parityId": "GLB_ROUNDTRIP_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-glb_roundtrip_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1123-000.md", + "behavior": "Repair the standalone GLB checker dependency chain and verify mesh/non-mesh Blender roundtrip plus Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive GLB and non-mesh roundtrip are proven", + "negative and recovery cases are proven", + "Chromium save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GLB_ROUNDTRIP_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GLB-MESH-ROUNDTRIP", + "CAP-GLB-NONMESH-ROUNDTRIP", + "CAP-GLB-CHROMIUM-RECOVERY" + ], + "sourcePaths": [ + "tools/web/check-glb-blender-roundtrip.mjs", + "tools/web/check-nonmesh-glb-blender-roundtrip.mjs", + "tools/web/blender-check-glb-roundtrip.py", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/protocol/nonmesh-binary.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "mesh/material/skin/animation GLB roundtrip", + "Curve/Surface/Font/Metaball non-mesh mapping", + "desktop GLB Main persistence in Chromium" + ], + "negative": [ + "sparse or oversized GLB", + "external URI/extension rejection", + "non-mesh export loss gate" + ], + "recovery": [ + "cancel without publishing output", + "Worker restart", + "OPFS quota retains old asset", + "deterministic Blender roundtrip" + ], + "commands": [ + "npm --prefix web run test:glb-blender-roundtrip", + "npm --prefix web run test:nonmesh-glb-blender-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/glb-negative-cases.spec.ts tests/e2e/glb-recovery.spec.ts tests/e2e/glb-main-persistence.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1124-000", + "phase": "1124", + "title": "record_historical_hash_drift_module", + "kind": "module", + "owner": "PROVENANCE", + "dependsOn": [ + "WBV2-P1123-000" + ], + "parityId": "HISTORICAL_HASH_DRIFT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-historical_hash_drift", + "gate": "EVIDENCE", + "card": "docs/tasks/WBV2-P1124-000.md", + "behavior": "Record legacy M12 artifact hash drift without re-signing historical manifests or changing the immutable inventory.", + "outputs": [ + "drift report", + "module receipt", + "manifest", + "status" + ], + "acceptance": [ + "original and observed hashes are recorded", + "provenance remains BLOCKED_SOURCE_LOST where bytes cannot be restored", + "historical manifests and inventory remain unchanged", + "deterministic drift evidence is reproducible", + "no full-family parity claim" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "HISTORICAL_HASH_DRIFT", + "sourceBacked": true, + "capabilities": [ + "CAP-HISTORICAL-HASH-AUDIT", + "CAP-PROVENANCE-SOURCE-LOST-GATE" + ], + "sourcePaths": [ + "tools/web/check-m12-manifest-drift.mjs", + "tests/golden/corrective/rehydration/M12-manifest-sha-drift.json", + "tests/golden/WBV2-P0-002/parity-map.json" + ], + "reuseReceipts": [], + "positive": [ + "84 drift entries captured", + "43 affected artifact paths indexed", + "immutable inventory binding preserved" + ], + "negative": [ + "missing original bytes", + "attempted historical re-signing", + "inventory mutation" + ], + "recovery": [ + "deterministic report rerun", + "source cache can restore original bytes later", + "new capability manifests reference drift evidence only" + ], + "commands": [ + "node tools/web/check-m12-manifest-drift.mjs --write", + "node tools/web/check-m12-manifest-drift.mjs", + "node tools/web/check-wbv2-module-execution.mjs" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1125-000", + "phase": "1125", + "title": "repair_geometry_nodes_allowlist_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1124-000" + ], + "parityId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-geometry_nodes_allowlist_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1125-000.md", + "behavior": "Persist Geometry Nodes graph overrides in Web-safe Main storage and align allowlist assertions with real materialization behavior.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "supported graph Main materialization is proven", + "unsupported graph remains rejected without mutation", + "save/reopen graph retention is exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-MAIN-PERSISTENCE", + "CAP-GEOMETRY-NODES-ALLOWLIST-CONSISTENCY", + "CAP-GEOMETRY-NODES-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/web-engine.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/geometry-node-allowlist.spec.ts", + "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "allowlisted graph materializes into Main", + "Scene IDProperty graph override persists", + "save/reopen retains graph identity/hash" + ], + "negative": [ + "unsupported simulation node", + "invalid graph schema", + "missing node/link endpoint" + ], + "recovery": [ + "rejected graph leaves baseline unchanged", + "undo/redo graph override", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:geometry-node-allowlist", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1126-000", + "phase": "1126", + "title": "verify_grease_pencil_viewport_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1125-000" + ], + "parityId": "GREASE_PENCIL_VIEWPORT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-grease_pencil_viewport", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1126-000.md", + "behavior": "Verify Grease Pencil 2D/3D selection and marquee integration on both viewport backends using an isolated Chromium port.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "2D and 3D selection revisions converge", + "main-thread and Offscreen marquee are exact", + "stale/foreign selection cases remain fail-closed", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_VIEWPORT", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-SELECTION-REVISION", + "CAP-GREASE-PENCIL-MARQUEE-MAIN", + "CAP-GREASE-PENCIL-MARQUEE-OFFSCREEN" + ], + "sourcePaths": [ + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/workers/viewport-render.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "2D canvas selection revision", + "main-thread 3D marquee selection", + "OffscreenCanvas 3D marquee selection" + ], + "negative": [ + "stale selection revision", + "foreign drawing identity", + "duplicate or forged point candidate" + ], + "recovery": [ + "selection convergence across backends", + "worker viewport restart", + "deterministic repeated marquee", + "preserve Main revision" + ], + "commands": [ + "WEB_TEST_PORT=5331 npm --prefix web run test:e2e -- --workers=1 tests/e2e/grease-pencil-selection.spec.ts tests/e2e/grease-pencil-marquee.spec.ts", + "node --test web/tests/unit/grease-pencil-selection.test.mjs web/tests/unit/grease-pencil-marquee.test.mjs", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1127-000", + "phase": "1127", + "title": "verify_tracking_mask_module", + "kind": "module", + "owner": "TRACKING", + "dependsOn": [ + "WBV2-P1126-000" + ], + "parityId": "TRACKING_MASK", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-tracking_mask", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1127-000.md", + "behavior": "Verify Mask reader, editable point raycast/marquee and tracking capability gates through Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Mask reader and interaction evidence is proven", + "negative solve/resource cases are proven", + "Chromium stable IDs and recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TRACKING_MASK", + "sourceBacked": true, + "capabilities": [ + "CAP-MASK-MAIN-READER", + "CAP-MASK-POINT-RAYCAST", + "CAP-TRACKING-SOLVE-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/tracking-mask.ts", + "web/protocol/scene-ir.ts", + "web/app/src/tracking/MaskSelection.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/smoke.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Mask layers and splines reader", + "editable Mask point raycast", + "N-022 tracking marker/mask gate" + ], + "negative": [ + "foreign mask point identity", + "missing resource binding", + "camera solve unavailable" + ], + "recovery": [ + "main/offscreen marquee parity", + "worker restart", + "deterministic stable IDs", + "preserve source Main on blocked solve" + ], + "commands": [ + "npm --prefix web run test:mask-main-reader", + "WEB_TEST_PORT=5340 npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-022 tracking|real Blender 5.2 Mask\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1128-000", + "phase": "1128", + "title": "verify_ffmpeg_movie_codec_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1127-000" + ], + "parityId": "SEQUENCER_MOVIE_CODEC", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-sequencer_movie_codec", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1128-000.md", + "behavior": "Use a local ffmpeg.wasm Worker fallback for movie probing and proxy-frame extraction when Chromium HTML media decoding is unavailable.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and core-resource hashes are bound", + "positive MP4 probe and RGBA frame are proven", + "corrupt and source-identity cases are rejected", + "AbortSignal cancellation leaves no live Worker", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SEQUENCER_MOVIE_CODEC", + "sourceBacked": true, + "capabilities": [ + "CAP-FFMPEG-WASM-MOVIE-PROBE", + "CAP-FFMPEG-WASM-PROXY-FRAME", + "CAP-MOVIE-CODEC-RECOVERY" + ], + "sourcePaths": [ + "web/package.json", + "web/package-lock.json", + "web/protocol/sequencer.ts", + "web/app/src/sequencer/SequencerCodecProbe.ts", + "web/app/src/sequencer/FFmpegMovieProbe.ts", + "web/app/src/sequencer/ffmpeg-movie-probe.worker.ts", + "web/app/src/sequencer/SequencerMediaProxyCache.ts", + "web/app/src/vendor/ffmpeg/ffmpeg-core.js", + "web/app/src/vendor/ffmpeg/ffmpeg-core.wasm", + "web/app/public/vendor/ffmpeg/ffmpeg-core.js", + "web/app/public/vendor/ffmpeg/ffmpeg-core.wasm", + "third_party/ffmpeg.wasm/package.json", + "third_party/ffmpeg.wasm/README.md", + "web/tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "browser decode fallback to ffmpeg.wasm", + "16x16 MP4 metadata probe", + "8x8 RGBA proxy frame extraction" + ], + "negative": [ + "corrupt movie payload", + "source SHA mismatch", + "ffmpeg runtime unavailable" + ], + "recovery": [ + "AbortSignal cancellation", + "Worker termination after response", + "cache manifest identity binding", + "deterministic repeated probe" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5342 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1129-000", + "phase": "1129", + "title": "authorize_scene_settings_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1128-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1129", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-000.md", + "behavior": "Authorize one source-backed Core Scene Graph settings module after the terminal P1128 module epoch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1128 evidence remains hash-bound", + "existing receipts are reused", + "inventory remains immutable", + "one source-backed module is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ] + }, + { + "id": "WBV2-P1129-001", + "phase": "1129", + "title": "verify_scene_settings_module", + "kind": "module", + "owner": "CORE_SCENE", + "dependsOn": [ + "WBV2-P1129-000" + ], + "parityId": "CORE_SCENE_GRAPH_SETTINGS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-core_scene_graph_settings", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-001.md", + "behavior": "Verify the existing Blender Main scene compositor, performance and sampling setting transactions as one aggregate module.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutations are proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORE_SCENE_GRAPH_SETTINGS", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "positive": [ + "compositor device/precision mutation", + "performance thread/persistence mutation", + "sampling filter/dither mutation" + ], + "negative": [ + "invalid sampling range", + "unknown scene target", + "malformed property set" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic scene settings snapshot" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5344 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1130-000", + "phase": "1130", + "title": "authorize_editor_view2d_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1129-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1130", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-000.md", + "behavior": "Authorize one source-backed UI editor View2D reader/protocol module after the P1129 scene settings module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1129 evidence remains hash-bound", + "P1102 editor workflow source remains unchanged", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1130-001", + "phase": "1130", + "title": "verify_editor_view2d_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1130-000" + ], + "parityId": "UI_EDITOR_VIEW2D_STATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor_view2d_state", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-001.md", + "behavior": "Preserve Blender Graph/Dope Sheet View2D cur and mask state through the Web editor protocol without changing the existing editor workflow parser.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader state is proven", + "negative no-publish and recovery are proven", + "Chromium and save/reopen compatibility are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR_VIEW2D_STATE", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/editor-view2d.ts", + "web/app/src/workers/editor-view2d-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Graph main-region View2D cur retention", + "Graph main-region pixel mask retention", + "reader/protocol exact state" + ], + "negative": [ + "inverted View2D bounds", + "malformed mask range", + "missing View2D payload" + ], + "recovery": [ + "immutable base editor workflow", + "worker termination", + "deterministic repeated parse", + "save/reopen reader compatibility" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5346 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1131-000", + "phase": "1131", + "title": "authorize_curve_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1130-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1131", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-000.md", + "behavior": "Authorize one source-backed Curve topology editor module after the P1130 View2D module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1130 evidence remains hash-bound", + "Curve topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1131-001", + "phase": "1131", + "title": "verify_curve_topology_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1131-000" + ], + "parityId": "CURVE_TOPOLOGY_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_topology_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-001.md", + "behavior": "Verify the Blender Curve TOGGLE_CYCLIC topology transaction through the existing Main, protocol, Worker and frontend path.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_TOPOLOGY_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/curve-topology-editor.ts", + "web/app/src/workers/curve-topology-contract-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/curve-topology-contract.spec.ts", + "web/tests/e2e/curve-topology-operator.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "TOGGLE_CYCLIC Main mutation", + "operator gate exposes only verified capability", + "save/reopen preserves cyclic spline state" + ], + "negative": [ + "unknown curve operator", + "stale revision claim", + "selection and payload budget overflow" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic contract parse" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5347 npm --prefix web run test:e2e -- --workers=1 tests/e2e/curve-topology-contract.spec.ts tests/e2e/curve-topology-operator.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1132-000", + "phase": "1132", + "title": "authorize_curve_handle_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1131-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1132", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-000.md", + "behavior": "Authorize one source-backed Curve handle gizmo module after the P1131 topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1131 evidence remains hash-bound", + "Curve handle source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1132-001", + "phase": "1132", + "title": "verify_curve_handle_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1132-000" + ], + "parityId": "CURVE_HANDLE_GIZMO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_handle_gizmo", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-001.md", + "behavior": "Verify Curve handle position edits through Blender Main, protocol, Worker, renderer preview and frontend gizmo.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_HANDLE_GIZMO", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/nonmesh-interaction.ts", + "web/app/src/workers/nonmesh-interaction-test.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/nonmesh.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Curve handle position Main mutation", + "local handle gizmo preview", + "save/reopen preserves handle state" + ], + "negative": [ + "invalid handle identity", + "stale base revision", + "malformed handle position" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic preview" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5348 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1133-000", + "phase": "1133", + "title": "authorize_curve_splines_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1132-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1133", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-000.md", + "behavior": "Authorize one source-backed Curve spline transaction module after the P1132 handle module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1132 evidence remains hash-bound", + "Curve spline source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1133-001", + "phase": "1133", + "title": "verify_curve_splines_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1133-000" + ], + "parityId": "CURVE_SPLINES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_splines_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-001.md", + "behavior": "Verify complete Curve spline replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SPLINES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "complete Curve spline Main transaction", + "POLY/BEZIER descriptor retention", + "save/reopen preserves spline state" + ], + "negative": [ + "invalid spline offsets", + "stale base revision", + "mismatched handle payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic binary-geometry transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5349 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1134-000", + "phase": "1134", + "title": "authorize_surface_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1133-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1134", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-000.md", + "behavior": "Authorize one source-backed Surface topology transaction module after the P1133 Curve spline module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1133 evidence remains hash-bound", + "Surface topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1134-001", + "phase": "1134", + "title": "verify_surface_topology_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1134-000" + ], + "parityId": "SURFACE_TOPOLOGY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-surface_topology_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-001.md", + "behavior": "Verify Surface NURBS topology replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SURFACE_TOPOLOGY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Surface topology Main transaction", + "NURBS dimensions and weights retention", + "save/reopen preserves surface state" + ], + "negative": [ + "invalid surface dimensions", + "stale base revision", + "control grid budget mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic surface transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5350 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1135-000", + "phase": "1135", + "title": "authorize_font_body_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1134-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1135", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-000.md", + "behavior": "Authorize one source-backed Font body transaction module after the P1134 Surface topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1134 evidence remains hash-bound", + "Font body source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1135-001", + "phase": "1135", + "title": "verify_font_body_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1135-000" + ], + "parityId": "FONT_BODY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_body_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-001.md", + "behavior": "Verify Font body replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_BODY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-body-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font body Main mutation", + "UTF-8 text retention", + "save/reopen preserves text" + ], + "negative": [ + "unknown Font data ID", + "body byte budget overflow", + "malformed body payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic text state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5351 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-body-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1136-000", + "phase": "1136", + "title": "authorize_font_properties_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1135-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1136", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-000.md", + "behavior": "Authorize one source-backed Font properties transaction module after the P1135 Font body module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1135 evidence remains hash-bound", + "Font property source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1136-001", + "phase": "1136", + "title": "verify_font_properties_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1136-000" + ], + "parityId": "FONT_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-001.md", + "behavior": "Verify Font property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font property Main mutation", + "bounded alignment/extrude fields", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Font data ID", + "invalid alignment enum", + "out-of-range numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5352 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1137-000", + "phase": "1137", + "title": "authorize_metaball_elements_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1136-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1137", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-000.md", + "behavior": "Authorize one source-backed Metaball element transaction module after the P1136 Font properties module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1136 evidence remains hash-bound", + "Metaball element source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1137-001", + "phase": "1137", + "title": "verify_metaball_elements_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1137-000" + ], + "parityId": "METABALL_ELEMENTS_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-metaball_elements_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-001.md", + "behavior": "Verify Metaball element replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "METABALL_ELEMENTS_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Metaball element Main mutation", + "bounded position/radius/scale retention", + "save/reopen preserves elements" + ], + "negative": [ + "unknown Metaball data ID", + "invalid radius", + "element count topology mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic element state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1138-000", + "phase": "1138", + "title": "authorize_text_source_module", + "kind": "enabling", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1137-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1138", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-000.md", + "behavior": "Authorize a source-backed Text datablock mutation after the P1137 Metaball module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1137 evidence remains hash-bound", + "ID_TXT is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1138-001", + "phase": "1138", + "title": "verify_text_source_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1138-000" + ], + "parityId": "TEXT_SOURCE_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-text_source_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-001.md", + "behavior": "Verify Text source replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXT_SOURCE_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-text-source-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "positive": [ + "Text source Main mutation", + "ID_TXT registration in WITH_WEB", + "save/reopen preserves source" + ], + "negative": [ + "unknown Text data ID", + "source over 1 MiB", + "linked/read-only Text" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic source state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-text-source-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1139-000", + "phase": "1139", + "title": "authorize_texture_properties_module", + "kind": "enabling", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1138-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1139", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-000.md", + "behavior": "Authorize a source-backed Texture property mutation module after P1138 Text.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1138 evidence remains hash-bound", + "ID_TE is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1139-001", + "phase": "1139", + "title": "verify_texture_properties_module", + "kind": "module", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1139-000" + ], + "parityId": "TEXTURE_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-texture_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-001.md", + "behavior": "Verify Texture property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXTURE_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-texture-properties-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "positive": [ + "Texture property Main mutation", + "ID_TE registration in WITH_WEB", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Texture data ID", + "noise depth outside Blender bounds", + "non-finite numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-texture-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1140-000", + "phase": "1140", + "title": "authorize_action_group_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1139-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1140", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-000.md", + "behavior": "Authorize a source-backed ActionGroup reader and recovery module after P1139 Texture.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1139 evidence remains hash-bound", + "ActionGroup has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1140-001", + "phase": "1140", + "title": "verify_action_group_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-000" + ], + "parityId": "ACTION_GROUP_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_group_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-001.md", + "behavior": "Verify ActionGroup metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_GROUP_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-group-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "positive": [ + "ActionGroup Main reader exposes group and expanded metadata", + "three grouped location F-Curves remain grouped", + "save/reopen preserves group metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "unsupported group payload is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic group state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5356 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-group-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1141-000", + "phase": "1141", + "title": "authorize_action_pose_markers_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1141", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-000.md", + "behavior": "Authorize a source-backed ActionPoseMarkers reader and recovery module after P1140.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1140 evidence remains hash-bound", + "ActionPoseMarkers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1141-001", + "phase": "1141", + "title": "verify_action_pose_markers_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-000" + ], + "parityId": "ACTION_POSE_MARKERS_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_pose_markers_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-001.md", + "behavior": "Verify ActionPoseMarkers metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_POSE_MARKERS_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-pose-markers-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "positive": [ + "ActionPoseMarkers Main reader exposes marker names and frames", + "three Blender pose markers remain ordered", + "save/reopen preserves marker metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "non-finite marker frame is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic marker state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5359 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-pose-markers-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1142-000", + "phase": "1142", + "title": "authorize_fcurve_sample_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1142", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-000.md", + "behavior": "Authorize a source-backed FCurveSample reader and recovery module after P1141.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1141 evidence remains hash-bound", + "FCurveSample has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1142-001", + "phase": "1142", + "title": "verify_fcurve_sample_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-000" + ], + "parityId": "FCURVE_SAMPLE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_sample_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-001.md", + "behavior": "Verify FCurveSample data through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_SAMPLE_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-sample-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "positive": [ + "FCurveSample Main reader exposes sampled source and values", + "four native FPoint samples remain ordered", + "save/reopen preserves sampled data" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing sampled payload is fail-closed", + "non-finite sampled value is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic sampled state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5365 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-sample-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1143-000", + "phase": "1143", + "title": "authorize_fcurve_modifier_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1143", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-000.md", + "behavior": "Authorize a source-backed FCurve modifier reader and recovery module after P1142.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1142 evidence remains hash-bound", + "FCurveModifiers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1143-001", + "phase": "1143", + "title": "verify_fcurve_modifier_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-000" + ], + "parityId": "FCURVE_MODIFIER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-001.md", + "behavior": "Verify FCurve modifier metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "positive": [ + "FCurveModifiers Main reader exposes native modifier stack", + "FModifierCycles preserves type/name/flags/influence", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing modifier payload is fail-closed", + "unsupported modifier type is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic modifier state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5368 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1144-000", + "phase": "1144", + "title": "authorize_driver_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1144", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-000.md", + "behavior": "Authorize a source-backed Driver reader and recovery module after P1143.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1143 evidence remains hash-bound", + "Driver has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1144-001", + "phase": "1144", + "title": "verify_driver_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1144-000" + ], + "parityId": "DRIVER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-driver_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-001.md", + "behavior": "Verify Driver metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "DRIVER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-driver-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "positive": [ + "AnimData driver list is read from Blender Main", + "Driver preserves scripted expression and variables", + "save/reopen preserves driver metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing driver target is fail-closed", + "non-finite driver influence is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic driver state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-driver-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1145-000", + "phase": "1145", + "title": "authorize_corrective_smooth_reader_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1144-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1145", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-000.md", + "behavior": "Authorize a source-backed Corrective Smooth reader/recovery module after the Driver reader.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "Corrective Smooth has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1145-001", + "phase": "1145", + "title": "verify_corrective_smooth_reader_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1145-000" + ], + "parityId": "CORRECTIVE_SMOOTH_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-corrective_smooth_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-001.md", + "behavior": "Verify Corrective Smooth modifier type and RNA metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORRECTIVE_SMOOTH_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "Corrective Smooth type is read from Blender Main", + "RNA metadata is preserved", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported modifier data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1146-000", + "phase": "1146", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1145-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1146", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1146-001", + "phase": "1146", + "title": "verify modifier reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1146-000" + ], + "parityId": "MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_datatransfer type is read from Blender Main", + "MOD_dynamicpaint type is read from Blender Main", + "MOD_explode type is read from Blender Main", + "MOD_fluid type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_datatransfer", + "modifier-source:MOD_dynamicpaint", + "modifier-source:MOD_explode", + "modifier-source:MOD_fluid", + "rna-struct:DataTransferModifier", + "rna-struct:DynamicPaintModifier", + "rna-struct:ExplodeModifier", + "rna-struct:FluidModifier", + "rna-struct:FluidDomainSettings" + ] + } + }, + { + "id": "WBV2-P1147-000", + "phase": "1147", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1146-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1147", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1147-001", + "phase": "1147", + "title": "verify modifier reader batch two", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1147-000" + ], + "parityId": "MODIFIER_READER_BATCH_TWO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_two", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_TWO batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_TWO", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_laplaciandeform type is read from Blender Main", + "MOD_laplaciansmooth type is read from Blender Main", + "MOD_mask type is read from Blender Main", + "MOD_mesh_to_volume type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_laplaciandeform", + "modifier-source:MOD_laplaciansmooth", + "modifier-source:MOD_mask", + "modifier-source:MOD_shrinkwrap", + "rna-struct:LaplacianDeformModifier", + "rna-struct:LaplacianSmoothModifier", + "rna-struct:MaskModifier", + "rna-struct:ShrinkwrapModifier" + ] + } + }, + { + "id": "WBV2-P1148-000", + "phase": "1148", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1147-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1148", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1148-001", + "phase": "1148", + "title": "verify modifier reader batch three", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1148-000" + ], + "parityId": "MODIFIER_READER_BATCH_THREE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_three", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_THREE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_THREE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_remesh type is read from Blender Main", + "MOD_skin type is read from Blender Main", + "MOD_weighted_normal type is read from Blender Main", + "MOD_warp type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1148-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_three_scene.blend WBV2_BATCH_TYPES='[\"REMESH\",\"SKIN\",\"WEIGHTED_NORMAL\",\"WARP\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_remesh\",\"modifier-source:MOD_skin\",\"modifier-source:MOD_weighted_normal\",\"modifier-source:MOD_warp\",\"rna-struct:RemeshModifier\",\"rna-struct:SkinModifier\",\"rna-struct:WeightedNormalModifier\",\"rna-struct:WarpModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_remesh", + "modifier-source:MOD_skin", + "modifier-source:MOD_weighted_normal", + "modifier-source:MOD_warp", + "rna-struct:RemeshModifier", + "rna-struct:SkinModifier", + "rna-struct:WeightedNormalModifier", + "rna-struct:WarpModifier" + ] + } + }, + { + "id": "WBV2-P1149-000", + "phase": "1149", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1148-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1149", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1149-001", + "phase": "1149", + "title": "verify modifier reader batch four", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1149-000" + ], + "parityId": "MODIFIER_READER_BATCH_FOUR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_four", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FOUR batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FOUR", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_uvproject type is read from Blender Main", + "MOD_uvwarp type is read from Blender Main", + "MOD_volume_displace type is read from Blender Main", + "MOD_volume_to_mesh type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1149-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_four_scene.blend WBV2_BATCH_TYPES='[\"UV_PROJECT\",\"UV_WARP\",\"NORMAL_EDIT\",\"VOLUME_TO_MESH\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_uvproject\",\"modifier-source:MOD_uvwarp\",\"modifier-source:MOD_normal_edit\",\"modifier-source:MOD_volume_to_mesh\",\"rna-struct:UVProjectModifier\",\"rna-struct:UVWarpModifier\",\"rna-struct:NormalEditModifier\",\"rna-struct:VolumeToMeshModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1149-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_uvproject", + "modifier-source:MOD_uvwarp", + "modifier-source:MOD_normal_edit", + "modifier-source:MOD_volume_to_mesh", + "rna-struct:UVProjectModifier", + "rna-struct:UVWarpModifier", + "rna-struct:NormalEditModifier", + "rna-struct:VolumeToMeshModifier" + ] + } + }, + { + "id": "WBV2-P1150-000", + "phase": "1150", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1149-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1150", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1150-001", + "phase": "1150", + "title": "verify modifier reader batch five", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1150-000" + ], + "parityId": "MODIFIER_READER_BATCH_FIVE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_five", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FIVE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FIVE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_meshcache type is read from Blender Main", + "MOD_meshsequencecache type is read from Blender Main", + "MOD_multires type is read from Blender Main", + "MOD_ocean type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1150-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_five_scene.blend WBV2_BATCH_TYPES='[\"MESH_CACHE\",\"MESH_SEQUENCE_CACHE\",\"MULTIRES\",\"OCEAN\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_meshcache\",\"modifier-source:MOD_meshsequencecache\",\"modifier-source:MOD_multires\",\"modifier-source:MOD_ocean\",\"rna-struct:MeshCacheModifier\",\"rna-struct:MeshSequenceCacheModifier\",\"rna-struct:MultiresModifier\",\"rna-struct:OceanModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_meshcache", + "modifier-source:MOD_meshsequencecache", + "modifier-source:MOD_multires", + "modifier-source:MOD_ocean", + "rna-struct:MeshCacheModifier", + "rna-struct:MeshSequenceCacheModifier", + "rna-struct:MultiresModifier", + "rna-struct:OceanModifier" + ] + } + }, + { + "id": "WBV2-P1151-000", + "phase": "1151", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1150-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1151", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1151-001", + "phase": "1151", + "title": "verify Grease Pencil modifier reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1151-000" + ], + "parityId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil_modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-001.md", + "behavior": "Verify the GREASE_PENCIL_MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_grease_pencil_armature type is read from Blender Main", + "MOD_grease_pencil_array type is read from Blender Main", + "MOD_grease_pencil_build type is read from Blender Main", + "MOD_grease_pencil_color type is read from Blender Main", + "MOD_grease_pencil_dash type is read from Blender Main", + "MOD_grease_pencil_envelope type is read from Blender Main", + "MOD_grease_pencil_hook type is read from Blender Main", + "MOD_grease_pencil_lattice type is read from Blender Main", + "MOD_grease_pencil_length type is read from Blender Main", + "MOD_grease_pencil_mirror type is read from Blender Main", + "MOD_grease_pencil_multiply type is read from Blender Main", + "MOD_grease_pencil_noise type is read from Blender Main", + "MOD_grease_pencil_offset type is read from Blender Main", + "MOD_grease_pencil_opacity type is read from Blender Main", + "MOD_grease_pencil_outline type is read from Blender Main", + "MOD_grease_pencil_shrinkwrap type is read from Blender Main", + "MOD_grease_pencil_simplify type is read from Blender Main", + "MOD_grease_pencil_smooth type is read from Blender Main", + "MOD_grease_pencil_subdiv type is read from Blender Main", + "MOD_grease_pencil_texture type is read from Blender Main", + "MOD_grease_pencil_thickness type is read from Blender Main", + "MOD_grease_pencil_time type is read from Blender Main", + "MOD_grease_pencil_tint type is read from Blender Main", + "MOD_grease_pencil_weight_angle type is read from Blender Main", + "MOD_grease_pencil_weight_proximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1151-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_grease_pencil_scene.blend WBV2_BATCH_TYPES='[\"GREASE_PENCIL_ARMATURE\",\"GREASE_PENCIL_ARRAY\",\"GREASE_PENCIL_BUILD\",\"GREASE_PENCIL_COLOR\",\"GREASE_PENCIL_DASH\",\"GREASE_PENCIL_ENVELOPE\",\"GREASE_PENCIL_HOOK\",\"GREASE_PENCIL_LATTICE\",\"GREASE_PENCIL_LENGTH\",\"GREASE_PENCIL_MIRROR\",\"GREASE_PENCIL_MULTIPLY\",\"GREASE_PENCIL_NOISE\",\"GREASE_PENCIL_OFFSET\",\"GREASE_PENCIL_OPACITY\",\"GREASE_PENCIL_OUTLINE\",\"GREASE_PENCIL_SHRINKWRAP\",\"GREASE_PENCIL_SIMPLIFY\",\"GREASE_PENCIL_SMOOTH\",\"GREASE_PENCIL_SUBDIV\",\"GREASE_PENCIL_TEXTURE\",\"GREASE_PENCIL_THICKNESS\",\"GREASE_PENCIL_TIME\",\"GREASE_PENCIL_TINT\",\"GREASE_PENCIL_VERTEX_WEIGHT_ANGLE\",\"GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_grease_pencil_armature\",\"modifier-source:MOD_grease_pencil_array\",\"modifier-source:MOD_grease_pencil_build\",\"modifier-source:MOD_grease_pencil_color\",\"modifier-source:MOD_grease_pencil_dash\",\"modifier-source:MOD_grease_pencil_envelope\",\"modifier-source:MOD_grease_pencil_hook\",\"modifier-source:MOD_grease_pencil_lattice\",\"modifier-source:MOD_grease_pencil_length\",\"modifier-source:MOD_grease_pencil_mirror\",\"modifier-source:MOD_grease_pencil_multiply\",\"modifier-source:MOD_grease_pencil_noise\",\"modifier-source:MOD_grease_pencil_offset\",\"modifier-source:MOD_grease_pencil_opacity\",\"modifier-source:MOD_grease_pencil_outline\",\"modifier-source:MOD_grease_pencil_shrinkwrap\",\"modifier-source:MOD_grease_pencil_simplify\",\"modifier-source:MOD_grease_pencil_smooth\",\"modifier-source:MOD_grease_pencil_subdiv\",\"modifier-source:MOD_grease_pencil_texture\",\"modifier-source:MOD_grease_pencil_thickness\",\"modifier-source:MOD_grease_pencil_time\",\"modifier-source:MOD_grease_pencil_tint\",\"modifier-source:MOD_grease_pencil_weight_angle\",\"modifier-source:MOD_grease_pencil_weight_proximity\",\"rna-struct:GreasePencilArmatureModifier\",\"rna-struct:GreasePencilArrayModifier\",\"rna-struct:GreasePencilBuildModifier\",\"rna-struct:GreasePencilColorModifier\",\"rna-struct:GreasePencilEnvelopeModifier\",\"rna-struct:GreasePencilHookModifier\",\"rna-struct:GreasePencilLatticeModifier\",\"rna-struct:GreasePencilLengthModifier\",\"rna-struct:GreasePencilMirrorModifier\",\"rna-struct:GreasePencilMultiplyModifier\",\"rna-struct:GreasePencilNoiseModifier\",\"rna-struct:GreasePencilOffsetModifier\",\"rna-struct:GreasePencilOpacityModifier\",\"rna-struct:GreasePencilOutlineModifier\",\"rna-struct:GreasePencilShrinkwrapModifier\",\"rna-struct:GreasePencilSimplifyModifier\",\"rna-struct:GreasePencilSmoothModifier\",\"rna-struct:GreasePencilSubdivModifier\",\"rna-struct:GreasePencilTextureModifier\",\"rna-struct:GreasePencilTimeModifier\",\"rna-struct:GreasePencilTintModifier\",\"rna-struct:GreasePencilWeightAngleModifier\",\"rna-struct:GreasePencilWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_armature", + "modifier-source:MOD_grease_pencil_array", + "modifier-source:MOD_grease_pencil_build", + "modifier-source:MOD_grease_pencil_color", + "modifier-source:MOD_grease_pencil_dash", + "modifier-source:MOD_grease_pencil_envelope", + "modifier-source:MOD_grease_pencil_hook", + "modifier-source:MOD_grease_pencil_lattice", + "modifier-source:MOD_grease_pencil_length", + "modifier-source:MOD_grease_pencil_mirror", + "modifier-source:MOD_grease_pencil_multiply", + "modifier-source:MOD_grease_pencil_noise", + "modifier-source:MOD_grease_pencil_offset", + "modifier-source:MOD_grease_pencil_opacity", + "modifier-source:MOD_grease_pencil_outline", + "modifier-source:MOD_grease_pencil_shrinkwrap", + "modifier-source:MOD_grease_pencil_simplify", + "modifier-source:MOD_grease_pencil_smooth", + "modifier-source:MOD_grease_pencil_subdiv", + "modifier-source:MOD_grease_pencil_texture", + "modifier-source:MOD_grease_pencil_thickness", + "modifier-source:MOD_grease_pencil_time", + "modifier-source:MOD_grease_pencil_tint", + "modifier-source:MOD_grease_pencil_weight_angle", + "modifier-source:MOD_grease_pencil_weight_proximity", + "rna-struct:GreasePencilArmatureModifier", + "rna-struct:GreasePencilArrayModifier", + "rna-struct:GreasePencilBuildModifier", + "rna-struct:GreasePencilColorModifier", + "rna-struct:GreasePencilEnvelopeModifier", + "rna-struct:GreasePencilHookModifier", + "rna-struct:GreasePencilLatticeModifier", + "rna-struct:GreasePencilLengthModifier", + "rna-struct:GreasePencilMirrorModifier", + "rna-struct:GreasePencilMultiplyModifier", + "rna-struct:GreasePencilNoiseModifier", + "rna-struct:GreasePencilOffsetModifier", + "rna-struct:GreasePencilOpacityModifier", + "rna-struct:GreasePencilOutlineModifier", + "rna-struct:GreasePencilShrinkwrapModifier", + "rna-struct:GreasePencilSimplifyModifier", + "rna-struct:GreasePencilSmoothModifier", + "rna-struct:GreasePencilSubdivModifier", + "rna-struct:GreasePencilTextureModifier", + "rna-struct:GreasePencilTimeModifier", + "rna-struct:GreasePencilTintModifier", + "rna-struct:GreasePencilWeightAngleModifier", + "rna-struct:GreasePencilWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1152-000", + "phase": "1152", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1151-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1152", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1152-001", + "phase": "1152", + "title": "verify modifier reader batch six", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1152-000" + ], + "parityId": "MODIFIER_READER_BATCH_SIX", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_six", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_SIX batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_SIX", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_mesh_to_volume type is read from Blender Main", + "MOD_particleinstance type is read from Blender Main", + "MOD_surface type is read from Blender Main", + "MOD_weightvgedit type is read from Blender Main", + "MOD_weightvgmix type is read from Blender Main", + "MOD_weightvgproximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1152-001 WBV2_BATCH_FIXTURES='[\"tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend\",\"tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend\",\"tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend\",\"tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend\",\"tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend\",\"tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend\"]' WBV2_BATCH_TYPES='[\"MESH_TO_VOLUME\",\"PARTICLE_INSTANCE\",\"SURFACE\",\"VERTEX_WEIGHT_EDIT\",\"VERTEX_WEIGHT_MIX\",\"VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_mesh_to_volume\",\"modifier-source:MOD_particleinstance\",\"modifier-source:MOD_surface\",\"modifier-source:MOD_weightvgedit\",\"modifier-source:MOD_weightvgmix\",\"modifier-source:MOD_weightvgproximity\",\"rna-struct:MeshToVolumeModifier\",\"rna-struct:ParticleInstanceModifier\",\"rna-struct:SurfaceModifier\",\"rna-struct:VertexWeightEditModifier\",\"rna-struct:VertexWeightMixModifier\",\"rna-struct:VertexWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_mesh_to_volume", + "modifier-source:MOD_particleinstance", + "modifier-source:MOD_surface", + "modifier-source:MOD_weightvgedit", + "modifier-source:MOD_weightvgmix", + "modifier-source:MOD_weightvgproximity", + "rna-struct:MeshToVolumeModifier", + "rna-struct:ParticleInstanceModifier", + "rna-struct:SurfaceModifier", + "rna-struct:VertexWeightEditModifier", + "rna-struct:VertexWeightMixModifier", + "rna-struct:VertexWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1153-000", + "phase": "1153", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1152-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1153", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1153-001", + "phase": "1153", + "title": "reuse verified modifier receipts for shared source utilities", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1153-000" + ], + "parityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_source_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-001.md", + "behavior": "Verify the MODIFIER_SOURCE_DEPENDENCY_REUSE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "dependencyReuse": [ + { + "unitId": "modifier-source:MOD_grease_pencil_util", + "representativeUnitId": "modifier-source:MOD_grease_pencil_array", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "marker": "MOD_grease_pencil_util.hh", + "productionEvidence": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_mdd", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_mdd_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_pc2", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_pc2_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_util", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_util.hh", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_weightvg_util", + "representativeUnitId": "modifier-source:MOD_weightvgedit", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "marker": "MOD_weightvg_util.hh", + "productionEvidence": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + } + ], + "positive": [ + "MOD_grease_pencil_util type is read from Blender Main", + "MOD_meshcache_mdd type is read from Blender Main", + "MOD_meshcache_pc2 type is read from Blender Main", + "MOD_meshcache_util type is read from Blender Main", + "MOD_weightvg_util type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "node tools/web/reuse-wbv2-source-dependencies.mjs --task WBV2-P1153-001 --write" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_util", + "modifier-source:MOD_meshcache_mdd", + "modifier-source:MOD_meshcache_pc2", + "modifier-source:MOD_meshcache_util", + "modifier-source:MOD_weightvg_util" + ] + } + }, + { + "id": "WBV2-P1154-000", + "phase": "1154", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1153-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1154", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1154-001", + "phase": "1154", + "title": "verify solidify split helper sources", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1154-000" + ], + "parityId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_solidify_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-001.md", + "behavior": "Verify the MODIFIER_SOLIDIFY_HELPER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-READER", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_generate_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "positive": [ + "MOD_solidify_extrude type is read from Blender Main", + "MOD_solidify_nonmanifold type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1154-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/modifier_generate_scene.blend WBV2_BATCH_TYPES='[\"SOLIDIFY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_solidify_extrude\",\"modifier-source:MOD_solidify_nonmanifold\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_solidify_extrude", + "modifier-source:MOD_solidify_nonmanifold" + ] + } + }, + { + "id": "WBV2-P1155-000", + "phase": "1155", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1154-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1155", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1155-001", + "phase": "1155", + "title": "verify modifier RNA reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1155-000" + ], + "parityId": "MODIFIER_RNA_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_rna_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-001.md", + "behavior": "Verify the MODIFIER_RNA_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_RNA_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_lineart type is read from Blender Main", + "MOD_particlesystem type is read from Blender Main", + "MOD_decimate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1155-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURES='[\"tests/files/web/modifier_grease_pencil_scene.blend\",\"tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend\",\"tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend\"]' WBV2_BATCH_TYPES='[\"LINEART\",\"PARTICLE_SYSTEM\",\"DECIMATE\"]' WBV2_BATCH_UNITS='[\"rna-struct:GreasePencilLineartModifier\",\"rna-struct:ParticleSystemModifier\",\"rna-struct:DecimateModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "rna-struct:GreasePencilLineartModifier", + "rna-struct:ParticleSystemModifier", + "rna-struct:DecimateModifier" + ] + } + }, + { + "id": "WBV2-P1156-000", + "phase": "1156", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1155-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1156", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1156-001", + "phase": "1156", + "title": "verify volume displace modifier reader", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1156-000" + ], + "parityId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_volume_displace_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-001.md", + "behavior": "Verify the MODIFIER_VOLUME_DISPLACE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_volume_displace type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1156-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend WBV2_BATCH_TYPES='[\"VOLUME_DISPLACE\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_volume_displace\",\"rna-struct:VolumeDisplaceModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_volume_displace", + "rna-struct:VolumeDisplaceModifier" + ] + } + }, + { + "id": "WBV2-P1157-000", + "phase": "1157", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1156-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1157", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1157-001", + "phase": "1157", + "title": "verify shape key point reader", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1157-000" + ], + "parityId": "SHAPE_KEY_POINT_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shape_key_point_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-001.md", + "behavior": "Verify the SHAPE_KEY_POINT_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHAPE_KEY_POINT_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1157-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1157-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:ShapeKeyPoint\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1157-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:ShapeKeyPoint" + ] + } + }, + { + "id": "WBV2-P1158-000", + "phase": "1158", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1157-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1158", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1158-001", + "phase": "1158", + "title": "verify line style reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1158-000" + ], + "parityId": "LINE_STYLE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-001.md", + "behavior": "Verify the LINE_STYLE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1158-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1158-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FreestyleLineStyle\",\"rna-struct:LineStyleModifier\",\"rna-struct:LineStyleAlphaModifier\",\"rna-struct:LineStyleColorModifier\",\"rna-struct:LineStyleGeometryModifier\",\"rna-struct:LineStyleThicknessModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1158-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:FreestyleLineStyle", + "rna-struct:LineStyleModifier", + "rna-struct:LineStyleAlphaModifier", + "rna-struct:LineStyleColorModifier", + "rna-struct:LineStyleGeometryModifier", + "rna-struct:LineStyleThicknessModifier" + ] + } + }, + { + "id": "WBV2-P1159-000", + "phase": "1159", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1158-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1159", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1159-001", + "phase": "1159", + "title": "verify line style collection reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1159-000" + ], + "parityId": "LINE_STYLE_COLLECTION_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_collection_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-001.md", + "behavior": "Verify the LINE_STYLE_COLLECTION_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_COLLECTION_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1159-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1159-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_modifier_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:BlendDataLineStyles\",\"rna-struct:LineStyleColorModifiers\",\"rna-struct:LineStyleAlphaModifiers\",\"rna-struct:LineStyleThicknessModifiers\",\"rna-struct:LineStyleGeometryModifiers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1159-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:BlendDataLineStyles", + "rna-struct:LineStyleColorModifiers", + "rna-struct:LineStyleAlphaModifiers", + "rna-struct:LineStyleThicknessModifiers", + "rna-struct:LineStyleGeometryModifiers" + ] + } + }, + { + "id": "WBV2-P1160-000", + "phase": "1160", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1159-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1160", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1160-001", + "phase": "1160", + "title": "verify line style modifier subtype reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1160-000" + ], + "parityId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-001.md", + "behavior": "Verify the LINE_STYLE_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1160-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1160-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:LineStyleAlphaModifier_AlongStroke\",\"rna-struct:LineStyleAlphaModifier_CreaseAngle\",\"rna-struct:LineStyleAlphaModifier_Curvature_3D\",\"rna-struct:LineStyleAlphaModifier_DistanceFromCamera\",\"rna-struct:LineStyleAlphaModifier_DistanceFromObject\",\"rna-struct:LineStyleAlphaModifier_Material\",\"rna-struct:LineStyleAlphaModifier_Noise\",\"rna-struct:LineStyleAlphaModifier_Tangent\",\"rna-struct:LineStyleColorModifier_AlongStroke\",\"rna-struct:LineStyleColorModifier_CreaseAngle\",\"rna-struct:LineStyleColorModifier_Curvature_3D\",\"rna-struct:LineStyleColorModifier_DistanceFromCamera\",\"rna-struct:LineStyleColorModifier_DistanceFromObject\",\"rna-struct:LineStyleColorModifier_Material\",\"rna-struct:LineStyleColorModifier_Noise\",\"rna-struct:LineStyleColorModifier_Tangent\",\"rna-struct:LineStyleGeometryModifier_2DOffset\",\"rna-struct:LineStyleGeometryModifier_2DTransform\",\"rna-struct:LineStyleGeometryModifier_BackboneStretcher\",\"rna-struct:LineStyleGeometryModifier_BezierCurve\",\"rna-struct:LineStyleGeometryModifier_Blueprint\",\"rna-struct:LineStyleGeometryModifier_GuidingLines\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise1D\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise2D\",\"rna-struct:LineStyleGeometryModifier_Polygonalization\",\"rna-struct:LineStyleGeometryModifier_Sampling\",\"rna-struct:LineStyleGeometryModifier_Simplification\",\"rna-struct:LineStyleGeometryModifier_SinusDisplacement\",\"rna-struct:LineStyleGeometryModifier_SpatialNoise\",\"rna-struct:LineStyleGeometryModifier_TipRemover\",\"rna-struct:LineStyleThicknessModifier_AlongStroke\",\"rna-struct:LineStyleThicknessModifier_Calligraphy\",\"rna-struct:LineStyleThicknessModifier_CreaseAngle\",\"rna-struct:LineStyleThicknessModifier_Curvature_3D\",\"rna-struct:LineStyleThicknessModifier_DistanceFromCamera\",\"rna-struct:LineStyleThicknessModifier_DistanceFromObject\",\"rna-struct:LineStyleThicknessModifier_Material\",\"rna-struct:LineStyleThicknessModifier_Noise\",\"rna-struct:LineStyleThicknessModifier_Tangent\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1160-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:LineStyleAlphaModifier_AlongStroke", + "rna-struct:LineStyleAlphaModifier_CreaseAngle", + "rna-struct:LineStyleAlphaModifier_Curvature_3D", + "rna-struct:LineStyleAlphaModifier_DistanceFromCamera", + "rna-struct:LineStyleAlphaModifier_DistanceFromObject", + "rna-struct:LineStyleAlphaModifier_Material", + "rna-struct:LineStyleAlphaModifier_Noise", + "rna-struct:LineStyleAlphaModifier_Tangent", + "rna-struct:LineStyleColorModifier_AlongStroke", + "rna-struct:LineStyleColorModifier_CreaseAngle", + "rna-struct:LineStyleColorModifier_Curvature_3D", + "rna-struct:LineStyleColorModifier_DistanceFromCamera", + "rna-struct:LineStyleColorModifier_DistanceFromObject", + "rna-struct:LineStyleColorModifier_Material", + "rna-struct:LineStyleColorModifier_Noise", + "rna-struct:LineStyleColorModifier_Tangent", + "rna-struct:LineStyleGeometryModifier_2DOffset", + "rna-struct:LineStyleGeometryModifier_2DTransform", + "rna-struct:LineStyleGeometryModifier_BackboneStretcher", + "rna-struct:LineStyleGeometryModifier_BezierCurve", + "rna-struct:LineStyleGeometryModifier_Blueprint", + "rna-struct:LineStyleGeometryModifier_GuidingLines", + "rna-struct:LineStyleGeometryModifier_PerlinNoise1D", + "rna-struct:LineStyleGeometryModifier_PerlinNoise2D", + "rna-struct:LineStyleGeometryModifier_Polygonalization", + "rna-struct:LineStyleGeometryModifier_Sampling", + "rna-struct:LineStyleGeometryModifier_Simplification", + "rna-struct:LineStyleGeometryModifier_SinusDisplacement", + "rna-struct:LineStyleGeometryModifier_SpatialNoise", + "rna-struct:LineStyleGeometryModifier_TipRemover", + "rna-struct:LineStyleThicknessModifier_AlongStroke", + "rna-struct:LineStyleThicknessModifier_Calligraphy", + "rna-struct:LineStyleThicknessModifier_CreaseAngle", + "rna-struct:LineStyleThicknessModifier_Curvature_3D", + "rna-struct:LineStyleThicknessModifier_DistanceFromCamera", + "rna-struct:LineStyleThicknessModifier_DistanceFromObject", + "rna-struct:LineStyleThicknessModifier_Material", + "rna-struct:LineStyleThicknessModifier_Noise", + "rna-struct:LineStyleThicknessModifier_Tangent" + ] + } + }, + { + "id": "WBV2-P1161-000", + "phase": "1161", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1160-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1161", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1161-001", + "phase": "1161", + "title": "verify FCurve modifier subtype reader batch", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1161-000" + ], + "parityId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-001.md", + "behavior": "Verify the FCURVE_MODIFIER_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1161-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1161-001/fcurve-modifier-production.json WBV2_BATCH_FIXTURE=tests/files/web/fcurve_modifier_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FModifierEnvelope\",\"rna-struct:FModifierGenerator\",\"rna-struct:FModifierLimits\",\"rna-struct:FModifierNoise\",\"rna-struct:FModifierSmooth\",\"rna-struct:FModifierStepped\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1161-001/fcurve-modifier-production.json" + ], + "coverageBindings": [ + "rna-struct:FModifierEnvelope", + "rna-struct:FModifierGenerator", + "rna-struct:FModifierLimits", + "rna-struct:FModifierNoise", + "rna-struct:FModifierSmooth", + "rna-struct:FModifierStepped" + ] + } + }, + { + "id": "WBV2-P1162-000", + "phase": "1162", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1161-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1162", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1162-001", + "phase": "1162", + "title": "verify shape key modifier reader dependency", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1162-000" + ], + "parityId": "MODIFIER_SHAPEKEY_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_shapekey_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-001.md", + "behavior": "Verify the MODIFIER_SHAPEKEY_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "module": { + "moduleId": "MODIFIER_SHAPEKEY_READER_BATCH", + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_shapekey type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1162-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1162-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_shapekey\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1162-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_shapekey" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1163-000", + "phase": "1163", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1162-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1163", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1163-001", + "phase": "1163", + "title": "verify compositor node reader batch", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1163-000" + ], + "parityId": "COMPOSITOR_NODE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_node_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-001.md", + "behavior": "Verify the COMPOSITOR_NODE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "module": { + "moduleId": "COMPOSITOR_NODE_READER_BATCH", + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1163-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1163-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeGlare\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeGlare\",\"node:CompositorNodeViewer\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1163-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1164-000", + "phase": "1164", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1163-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1164", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1164-001", + "phase": "1164", + "title": "verify native compositor transform blur alpha reader", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1164-000" + ], + "parityId": "COMPOSITOR_NATIVE_NODE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_native_node_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-001.md", + "behavior": "Verify the COMPOSITOR_NATIVE_NODE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "module": { + "moduleId": "COMPOSITOR_NATIVE_NODE_BATCH", + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeTransform type is read from Blender Main", + "CompositorNodeBlur type is read from Blender Main", + "CompositorNodeAlphaOver type is read from Blender Main", + "CompositorNodeViewer type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1164-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1164-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_node_batch_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeTransform\",\"CompositorNodeBlur\",\"CompositorNodeAlphaOver\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeTransform\",\"node:CompositorNodeBlur\",\"node:CompositorNodeAlphaOver\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1164-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1165-000", + "phase": "1165", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1164-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1165", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1165-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1165-001", + "phase": "1165", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1165-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1165-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_anti_aliasing.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bilateral_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blank_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_box_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_brightness_contrast.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_channel_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeAntiAliasing type is read from Blender Main", + "CompositorNodeBilateralblur type is read from Blender Main", + "CompositorNodeBlankImage type is read from Blender Main", + "CompositorNodeBokehBlur type is read from Blender Main", + "CompositorNodeBokehImage type is read from Blender Main", + "CompositorNodeBoxMask type is read from Blender Main", + "CompositorNodeBrightContrast type is read from Blender Main", + "CompositorNodeChannelMatte type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1165-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1165-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend WBV2_BATCH_TYPES='[\"CompositorNodeAntiAliasing\",\"CompositorNodeBilateralblur\",\"CompositorNodeBlankImage\",\"CompositorNodeBokehBlur\",\"CompositorNodeBokehImage\",\"CompositorNodeBoxMask\",\"CompositorNodeBrightContrast\",\"CompositorNodeChannelMatte\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeAntiAliasing\",\"node:CompositorNodeBilateralblur\",\"node:CompositorNodeBlankImage\",\"node:CompositorNodeBokehBlur\",\"node:CompositorNodeBokehImage\",\"node:CompositorNodeBoxMask\",\"node:CompositorNodeBrightContrast\",\"node:CompositorNodeChannelMatte\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1165-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1166-000", + "phase": "1166", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1165-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1166", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1166-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1166-001", + "phase": "1166", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1166-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1166-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_chroma_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_balance.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_correction.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_spill.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_combine_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_to_display.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeChromaMatte type is read from Blender Main", + "CompositorNodeColorBalance type is read from Blender Main", + "CompositorNodeColorCorrection type is read from Blender Main", + "CompositorNodeColorMatte type is read from Blender Main", + "CompositorNodeColorSpill type is read from Blender Main", + "CompositorNodeCombineColor type is read from Blender Main", + "CompositorNodeConvertColorSpace type is read from Blender Main", + "CompositorNodeConvertToDisplay type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1166-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1166-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend WBV2_BATCH_TYPES='[\"CompositorNodeChromaMatte\",\"CompositorNodeColorBalance\",\"CompositorNodeColorCorrection\",\"CompositorNodeColorMatte\",\"CompositorNodeColorSpill\",\"CompositorNodeCombineColor\",\"CompositorNodeConvertColorSpace\",\"CompositorNodeConvertToDisplay\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeChromaMatte\",\"node:CompositorNodeColorBalance\",\"node:CompositorNodeColorCorrection\",\"node:CompositorNodeColorMatte\",\"node:CompositorNodeColorSpill\",\"node:CompositorNodeCombineColor\",\"node:CompositorNodeConvertColorSpace\",\"node:CompositorNodeConvertToDisplay\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1166-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1167-000", + "phase": "1167", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1166-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1167", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1167-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1167-001", + "phase": "1167", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1167-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1167-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convolve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_corner_pin.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_crop.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_curves.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_directional_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_defocus.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeConvolve type is read from Blender Main", + "CompositorNodeCornerPin type is read from Blender Main", + "CompositorNodeCrop type is read from Blender Main", + "CompositorNodeCryptomatte type is read from Blender Main", + "CompositorNodeCryptomatteV2 type is read from Blender Main", + "CompositorNodeCurveRGB type is read from Blender Main", + "CompositorNodeDBlur type is read from Blender Main", + "CompositorNodeDefocus type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1167-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1167-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend WBV2_BATCH_TYPES='[\"CompositorNodeConvolve\",\"CompositorNodeCornerPin\",\"CompositorNodeCrop\",\"CompositorNodeCryptomatte\",\"CompositorNodeCryptomatteV2\",\"CompositorNodeCurveRGB\",\"CompositorNodeDBlur\",\"CompositorNodeDefocus\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeConvolve\",\"node:CompositorNodeCornerPin\",\"node:CompositorNodeCrop\",\"node:CompositorNodeCryptomatte\",\"node:CompositorNodeCryptomatteV2\",\"node:CompositorNodeCurveRGB\",\"node:CompositorNodeDBlur\",\"node:CompositorNodeDefocus\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1167-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1168-000", + "phase": "1168", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1167-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1168", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1168-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1168-001", + "phase": "1168", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1168-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1168-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_denoise.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_despeckle.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_difference_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_dilate_erode.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_displace.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_distance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_ellipse_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeDenoise type is read from Blender Main", + "CompositorNodeDespeckle type is read from Blender Main", + "CompositorNodeDiffMatte type is read from Blender Main", + "CompositorNodeDilateErode type is read from Blender Main", + "CompositorNodeDisplace type is read from Blender Main", + "CompositorNodeDistanceMatte type is read from Blender Main", + "CompositorNodeDoubleEdgeMask type is read from Blender Main", + "CompositorNodeEllipseMask type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1168-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1168-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend WBV2_BATCH_TYPES='[\"CompositorNodeDenoise\",\"CompositorNodeDespeckle\",\"CompositorNodeDiffMatte\",\"CompositorNodeDilateErode\",\"CompositorNodeDisplace\",\"CompositorNodeDistanceMatte\",\"CompositorNodeDoubleEdgeMask\",\"CompositorNodeEllipseMask\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeDenoise\",\"node:CompositorNodeDespeckle\",\"node:CompositorNodeDiffMatte\",\"node:CompositorNodeDilateErode\",\"node:CompositorNodeDisplace\",\"node:CompositorNodeDistanceMatte\",\"node:CompositorNodeDoubleEdgeMask\",\"node:CompositorNodeEllipseMask\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1168-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1169-000", + "phase": "1169", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1168-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1169", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1169-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1169-001", + "phase": "1169", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1169-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1169-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:cd9ae59d0f9640d1", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:cd9ae59d0f9640d1", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_filter.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_flip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_correct.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_saturation_value.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_id_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-cd9ae59d0f9640d1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeFilter type is read from Blender Main", + "CompositorNodeFlip type is read from Blender Main", + "CompositorNodeHueCorrect type is read from Blender Main", + "CompositorNodeHueSat type is read from Blender Main", + "CompositorNodeIDMask type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1169-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1169-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-cd9ae59d0f9640d1.blend WBV2_BATCH_TYPES='[\"CompositorNodeFilter\",\"CompositorNodeFlip\",\"CompositorNodeHueCorrect\",\"CompositorNodeHueSat\",\"CompositorNodeIDMask\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeFilter\",\"node:CompositorNodeFlip\",\"node:CompositorNodeHueCorrect\",\"node:CompositorNodeHueSat\",\"node:CompositorNodeIDMask\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1169-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1170-000", + "phase": "1170", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1169-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1170", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1170-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1170-001", + "phase": "1170", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1170-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1170-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeImage type is read from Blender Main", + "CompositorNodeImageCoordinates type is read from Blender Main", + "CompositorNodeImageInfo type is read from Blender Main", + "CompositorNodeInpaint type is read from Blender Main", + "CompositorNodeKeying type is read from Blender Main", + "CompositorNodeKeyingScreen type is read from Blender Main", + "CompositorNodeKuwahara type is read from Blender Main", + "CompositorNodeLensdist type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1170-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1170-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend WBV2_BATCH_TYPES='[\"CompositorNodeImage\",\"CompositorNodeImageCoordinates\",\"CompositorNodeImageInfo\",\"CompositorNodeInpaint\",\"CompositorNodeKeying\",\"CompositorNodeKeyingScreen\",\"CompositorNodeKuwahara\",\"CompositorNodeLensdist\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeImage\",\"node:CompositorNodeImageCoordinates\",\"node:CompositorNodeImageInfo\",\"node:CompositorNodeInpaint\",\"node:CompositorNodeKeying\",\"node:CompositorNodeKeyingScreen\",\"node:CompositorNodeKuwahara\",\"node:CompositorNodeLensdist\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1170-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1171-000", + "phase": "1171", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1170-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1171", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1171-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1171-001", + "phase": "1171", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1171-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1171-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeLevels type is read from Blender Main", + "CompositorNodeLumaMatte type is read from Blender Main", + "CompositorNodeMapUV type is read from Blender Main", + "CompositorNodeMask type is read from Blender Main", + "CompositorNodeMaskToSDF type is read from Blender Main", + "CompositorNodeMovieClip type is read from Blender Main", + "CompositorNodeMovieDistortion type is read from Blender Main", + "CompositorNodeNormal type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1171-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1171-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend WBV2_BATCH_TYPES='[\"CompositorNodeLevels\",\"CompositorNodeLumaMatte\",\"CompositorNodeMapUV\",\"CompositorNodeMask\",\"CompositorNodeMaskToSDF\",\"CompositorNodeMovieClip\",\"CompositorNodeMovieDistortion\",\"CompositorNodeNormal\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeLevels\",\"node:CompositorNodeLumaMatte\",\"node:CompositorNodeMapUV\",\"node:CompositorNodeMask\",\"node:CompositorNodeMaskToSDF\",\"node:CompositorNodeMovieClip\",\"node:CompositorNodeMovieDistortion\",\"node:CompositorNodeNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1171-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1172-000", + "phase": "1172", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1171-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1172", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1172-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1172-001", + "phase": "1172", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1172-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1172-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normalize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_file_output.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_pixelate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_plane_track_deform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_posterize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_convert.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_render_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-bf66c685c7c6fd95.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeNormalize type is read from Blender Main", + "CompositorNodeOutputFile type is read from Blender Main", + "CompositorNodePixelate type is read from Blender Main", + "CompositorNodePlaneTrackDeform type is read from Blender Main", + "CompositorNodePosterize type is read from Blender Main", + "CompositorNodePremulKey type is read from Blender Main", + "CompositorNodeRGBToBW type is read from Blender Main", + "CompositorNodeRLayers type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1172-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1172-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-bf66c685c7c6fd95.blend WBV2_BATCH_TYPES='[\"CompositorNodeNormalize\",\"CompositorNodeOutputFile\",\"CompositorNodePixelate\",\"CompositorNodePlaneTrackDeform\",\"CompositorNodePosterize\",\"CompositorNodePremulKey\",\"CompositorNodeRGBToBW\",\"CompositorNodeRLayers\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeNormalize\",\"node:CompositorNodeOutputFile\",\"node:CompositorNodePixelate\",\"node:CompositorNodePlaneTrackDeform\",\"node:CompositorNodePosterize\",\"node:CompositorNodePremulKey\",\"node:CompositorNodeRGBToBW\",\"node:CompositorNodeRLayers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1172-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1173-000", + "phase": "1173", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1172-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1173", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1173-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1173-001", + "phase": "1173", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1173-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1173-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_relative_to_pixel.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rotate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scale.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scene_time.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_separate_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_strip_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_set_alpha.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-a1b966b1af421537.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeRelativeToPixel type is read from Blender Main", + "CompositorNodeRotate type is read from Blender Main", + "CompositorNodeScale type is read from Blender Main", + "CompositorNodeSceneTime type is read from Blender Main", + "CompositorNodeSeparateColor type is read from Blender Main", + "CompositorNodeSequencerStripInfo type is read from Blender Main", + "CompositorNodeSetAlpha type is read from Blender Main", + "CompositorNodeSplit type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1173-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1173-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-a1b966b1af421537.blend WBV2_BATCH_TYPES='[\"CompositorNodeRelativeToPixel\",\"CompositorNodeRotate\",\"CompositorNodeScale\",\"CompositorNodeSceneTime\",\"CompositorNodeSeparateColor\",\"CompositorNodeSequencerStripInfo\",\"CompositorNodeSetAlpha\",\"CompositorNodeSplit\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeRelativeToPixel\",\"node:CompositorNodeRotate\",\"node:CompositorNodeScale\",\"node:CompositorNodeSceneTime\",\"node:CompositorNodeSeparateColor\",\"node:CompositorNodeSequencerStripInfo\",\"node:CompositorNodeSetAlpha\",\"node:CompositorNodeSplit\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1173-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1174-000", + "phase": "1174", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1173-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1174", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1174-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1174-001", + "phase": "1174", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1174-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1174-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_stabilize_2d.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_string_to_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch_view.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_time_curve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_tone_map.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_track_position.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_translate.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8f71e517e24622f2.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeStabilize type is read from Blender Main", + "CompositorNodeStringToImage type is read from Blender Main", + "CompositorNodeSwitch type is read from Blender Main", + "CompositorNodeSwitchView type is read from Blender Main", + "CompositorNodeTime type is read from Blender Main", + "CompositorNodeTonemap type is read from Blender Main", + "CompositorNodeTrackPos type is read from Blender Main", + "CompositorNodeTranslate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1174-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1174-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8f71e517e24622f2.blend WBV2_BATCH_TYPES='[\"CompositorNodeStabilize\",\"CompositorNodeStringToImage\",\"CompositorNodeSwitch\",\"CompositorNodeSwitchView\",\"CompositorNodeTime\",\"CompositorNodeTonemap\",\"CompositorNodeTrackPos\",\"CompositorNodeTranslate\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeStabilize\",\"node:CompositorNodeStringToImage\",\"node:CompositorNodeSwitch\",\"node:CompositorNodeSwitchView\",\"node:CompositorNodeTime\",\"node:CompositorNodeTonemap\",\"node:CompositorNodeTrackPos\",\"node:CompositorNodeTranslate\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1174-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1175-000", + "phase": "1175", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1174-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1175", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1175-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1175-001", + "phase": "1175", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1175-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1175-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_vector_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeVecBlur type is read from Blender Main", + "CompositorNodeZcombine type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1175-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1175-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend WBV2_BATCH_TYPES='[\"CompositorNodeVecBlur\",\"CompositorNodeZcombine\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeVecBlur\",\"node:CompositorNodeZcombine\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1175-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1176-000", + "phase": "1176", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1175-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1176", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1176-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1176-001", + "phase": "1176", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1176-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1176-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1176-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1176-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1176-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1177-000", + "phase": "1177", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1176-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1177", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1177-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1177-001", + "phase": "1177", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1177-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1177-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1177-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1177-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1177-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1178-000", + "phase": "1178", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1177-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1178", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1178-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1178-001", + "phase": "1178", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1178-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1178-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1178-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1178-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1178-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1179-000", + "phase": "1179", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1178-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1179", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1179-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1179-001", + "phase": "1179", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1179-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1179-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1179-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1179-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1179-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1180-000", + "phase": "1180", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1179-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1180", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1180-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1180-001", + "phase": "1180", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1180-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1180-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1180-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1180-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1180-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1181-000", + "phase": "1181", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1180-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1181", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1181-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1181-001", + "phase": "1181", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1181-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1181-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1181-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1181-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1181-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1182-000", + "phase": "1182", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1181-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1182", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1182-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1182-001", + "phase": "1182", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1182-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1182-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1182-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1182-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1182-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1183-000", + "phase": "1183", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1182-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1183", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1183-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1183-001", + "phase": "1183", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1183-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1183-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1183-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1183-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1183-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1184-000", + "phase": "1184", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1183-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1184", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1184-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1184-001", + "phase": "1184", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1184-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1184-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1184-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1184-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1184-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1185-000", + "phase": "1185", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1184-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1185", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1185-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1185-001", + "phase": "1185", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1185-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1185-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1185-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1185-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1185-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1186-000", + "phase": "1186", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1185-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1186", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1186-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1186-001", + "phase": "1186", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1186-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1186-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1186-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1186-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1186-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1187-000", + "phase": "1187", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1186-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1187", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1187-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1187-001", + "phase": "1187", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1187-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1187-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1187-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1187-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1187-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1188-000", + "phase": "1188", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1187-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1188", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1188-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1188-001", + "phase": "1188", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1188-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1188-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bone_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bounding_box.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_camera_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0f87459df8986017.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeBoneInfo type is read from Blender Main", + "GeometryNodeBoundBox type is read from Blender Main", + "GeometryNodeCameraInfo type is read from Blender Main", + "GeometryNodeCaptureAttribute type is read from Blender Main", + "GeometryNodeClosureToList type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1188-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1188-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0f87459df8986017.blend WBV2_BATCH_TYPES='[\"GeometryNodeBoneInfo\",\"GeometryNodeBoundBox\",\"GeometryNodeCameraInfo\",\"GeometryNodeCaptureAttribute\",\"GeometryNodeClosureToList\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeBoneInfo\",\"node:GeometryNodeBoundBox\",\"node:GeometryNodeCameraInfo\",\"node:GeometryNodeCaptureAttribute\",\"node:GeometryNodeClosureToList\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1188-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1189-000", + "phase": "1189", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1188-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1189", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1189-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1189-001", + "phase": "1189", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1189-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1189-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_connected.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_collection_children.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_edge.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-447074d84f4807db.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeClusterByConnected type is read from Blender Main", + "GeometryNodeClusterByDistance type is read from Blender Main", + "GeometryNodeCollectionChildren type is read from Blender Main", + "GeometryNodeConvexHull type is read from Blender Main", + "GeometryNodeCornersOfEdge type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1189-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1189-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-447074d84f4807db.blend WBV2_BATCH_TYPES='[\"GeometryNodeClusterByConnected\",\"GeometryNodeClusterByDistance\",\"GeometryNodeCollectionChildren\",\"GeometryNodeConvexHull\",\"GeometryNodeCornersOfEdge\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeClusterByConnected\",\"node:GeometryNodeClusterByDistance\",\"node:GeometryNodeCollectionChildren\",\"node:GeometryNodeConvexHull\",\"node:GeometryNodeCornersOfEdge\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1189-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1190-000", + "phase": "1190", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1189-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1190", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1190-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1190-001", + "phase": "1190", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1190-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1190-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cube_grid_topology.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeCornersOfFace type is read from Blender Main", + "GeometryNodeCornersOfVertex type is read from Blender Main", + "GeometryNodeCubeGridTopology type is read from Blender Main", + "GeometryNodeCurveArc type is read from Blender Main", + "GeometryNodeCurveEndpointSelection type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1190-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1190-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.blend WBV2_BATCH_TYPES='[\"GeometryNodeCornersOfFace\",\"GeometryNodeCornersOfVertex\",\"GeometryNodeCubeGridTopology\",\"GeometryNodeCurveArc\",\"GeometryNodeCurveEndpointSelection\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCornersOfFace\",\"node:GeometryNodeCornersOfVertex\",\"node:GeometryNodeCubeGridTopology\",\"node:GeometryNodeCurveArc\",\"node:GeometryNodeCurveEndpointSelection\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1190-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1191-000", + "phase": "1191", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1190-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1191", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1191-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1191-001", + "phase": "1191", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1191-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1191-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_curve_of_point.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_bezier_segment.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-71424076a2a8f339.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeCurveHandleTypeSelection type is read from Blender Main", + "GeometryNodeCurveLength type is read from Blender Main", + "GeometryNodeCurveOfPoint type is read from Blender Main", + "GeometryNodeCurvePrimitiveBezierSegment type is read from Blender Main", + "GeometryNodeCurvePrimitiveCircle type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1191-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1191-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-71424076a2a8f339.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurveHandleTypeSelection\",\"GeometryNodeCurveLength\",\"GeometryNodeCurveOfPoint\",\"GeometryNodeCurvePrimitiveBezierSegment\",\"GeometryNodeCurvePrimitiveCircle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurveHandleTypeSelection\",\"node:GeometryNodeCurveLength\",\"node:GeometryNodeCurveOfPoint\",\"node:GeometryNodeCurvePrimitiveBezierSegment\",\"node:GeometryNodeCurvePrimitiveCircle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1191-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1192-000", + "phase": "1192", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1191-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1192", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1192-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1192-001", + "phase": "1192", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1192-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1192-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadratic_bezier.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_set_handle_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeCurvePrimitiveLine type is read from Blender Main", + "GeometryNodeCurvePrimitiveQuadrilateral type is read from Blender Main", + "GeometryNodeCurveQuadraticBezier type is read from Blender Main", + "GeometryNodeCurveSetHandles type is read from Blender Main", + "GeometryNodeCurveSpiral type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1192-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1192-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurvePrimitiveLine\",\"GeometryNodeCurvePrimitiveQuadrilateral\",\"GeometryNodeCurveQuadraticBezier\",\"GeometryNodeCurveSetHandles\",\"GeometryNodeCurveSpiral\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurvePrimitiveLine\",\"node:GeometryNodeCurvePrimitiveQuadrilateral\",\"node:GeometryNodeCurveQuadraticBezier\",\"node:GeometryNodeCurveSetHandles\",\"node:GeometryNodeCurveSpiral\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1192-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1193-000", + "phase": "1193", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1192-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1193", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1193-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1193-001", + "phase": "1193", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1193-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1193-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curves_to_grease_pencil.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeCurveSplineType type is read from Blender Main", + "GeometryNodeCurveStar type is read from Blender Main", + "GeometryNodeCurveToMesh type is read from Blender Main", + "GeometryNodeCurveToPoints type is read from Blender Main", + "GeometryNodeCurvesToGreasePencil type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1193-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1193-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurveSplineType\",\"GeometryNodeCurveStar\",\"GeometryNodeCurveToMesh\",\"GeometryNodeCurveToPoints\",\"GeometryNodeCurvesToGreasePencil\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurveSplineType\",\"node:GeometryNodeCurveStar\",\"node:GeometryNodeCurveToMesh\",\"node:GeometryNodeCurveToPoints\",\"node:GeometryNodeCurvesToGreasePencil\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1193-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1194-000", + "phase": "1194", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1193-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1194", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1194-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1194-001", + "phase": "1194", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1194-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1194-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8f6105d06959322c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeDeformCurvesOnSurface type is read from Blender Main", + "GeometryNodeDeleteGeometry type is read from Blender Main", + "GeometryNodeDistributePointsInGrid type is read from Blender Main", + "GeometryNodeDistributePointsInVolume type is read from Blender Main", + "GeometryNodeDistributePointsOnFaces type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1194-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1194-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8f6105d06959322c.blend WBV2_BATCH_TYPES='[\"GeometryNodeDeformCurvesOnSurface\",\"GeometryNodeDeleteGeometry\",\"GeometryNodeDistributePointsInGrid\",\"GeometryNodeDistributePointsInVolume\",\"GeometryNodeDistributePointsOnFaces\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeDeformCurvesOnSurface\",\"node:GeometryNodeDeleteGeometry\",\"node:GeometryNodeDistributePointsInGrid\",\"node:GeometryNodeDistributePointsInVolume\",\"node:GeometryNodeDistributePointsOnFaces\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1194-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1195-000", + "phase": "1195", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1194-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1195", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1195-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1195-001", + "phase": "1195", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1195-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1195-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeDualMesh type is read from Blender Main", + "GeometryNodeDuplicateElements type is read from Blender Main", + "GeometryNodeEdgePathsToCurves type is read from Blender Main", + "GeometryNodeEdgePathsToSelection type is read from Blender Main", + "GeometryNodeEdgesOfCorner type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1195-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1195-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.blend WBV2_BATCH_TYPES='[\"GeometryNodeDualMesh\",\"GeometryNodeDuplicateElements\",\"GeometryNodeEdgePathsToCurves\",\"GeometryNodeEdgePathsToSelection\",\"GeometryNodeEdgesOfCorner\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeDualMesh\",\"node:GeometryNodeDuplicateElements\",\"node:GeometryNodeEdgePathsToCurves\",\"node:GeometryNodeEdgePathsToSelection\",\"node:GeometryNodeEdgesOfCorner\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1195-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1196-000", + "phase": "1196", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1195-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1196", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1196-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1196-001", + "phase": "1196", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1196-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1196-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edges_to_face_groups.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeEdgesOfVertex type is read from Blender Main", + "GeometryNodeEdgesToFaceGroups type is read from Blender Main", + "GeometryNodeExtrudeMesh type is read from Blender Main", + "GeometryNodeFaceOfCorner type is read from Blender Main", + "GeometryNodeFieldAtIndex type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1196-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1196-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.blend WBV2_BATCH_TYPES='[\"GeometryNodeEdgesOfVertex\",\"GeometryNodeEdgesToFaceGroups\",\"GeometryNodeExtrudeMesh\",\"GeometryNodeFaceOfCorner\",\"GeometryNodeFieldAtIndex\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeEdgesOfVertex\",\"node:GeometryNodeEdgesToFaceGroups\",\"node:GeometryNodeExtrudeMesh\",\"node:GeometryNodeFaceOfCorner\",\"node:GeometryNodeFieldAtIndex\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1196-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1197-000", + "phase": "1197", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1196-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1197", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1197-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1197-001", + "phase": "1197", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1197-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1197-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_average.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeFieldAverage type is read from Blender Main", + "GeometryNodeFieldMinAndMax type is read from Blender Main", + "GeometryNodeFieldOnDomain type is read from Blender Main", + "GeometryNodeFieldToGrid type is read from Blender Main", + "GeometryNodeFieldToList type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1197-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1197-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.blend WBV2_BATCH_TYPES='[\"GeometryNodeFieldAverage\",\"GeometryNodeFieldMinAndMax\",\"GeometryNodeFieldOnDomain\",\"GeometryNodeFieldToGrid\",\"GeometryNodeFieldToList\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeFieldAverage\",\"node:GeometryNodeFieldMinAndMax\",\"node:GeometryNodeFieldOnDomain\",\"node:GeometryNodeFieldToGrid\",\"node:GeometryNodeFieldToList\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1197-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1198-000", + "phase": "1198", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1197-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1198", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1198-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1198-001", + "phase": "1198", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1198-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1198-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_filter_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6581c99986be795f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeFieldVariance type is read from Blender Main", + "GeometryNodeFillCurve type is read from Blender Main", + "GeometryNodeFilletCurve type is read from Blender Main", + "GeometryNodeFilterList type is read from Blender Main", + "GeometryNodeFlipFaces type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1198-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1198-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6581c99986be795f.blend WBV2_BATCH_TYPES='[\"GeometryNodeFieldVariance\",\"GeometryNodeFillCurve\",\"GeometryNodeFilletCurve\",\"GeometryNodeFilterList\",\"GeometryNodeFlipFaces\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeFieldVariance\",\"node:GeometryNodeFillCurve\",\"node:GeometryNodeFilletCurve\",\"node:GeometryNodeFilterList\",\"node:GeometryNodeFlipFaces\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1198-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1199-000", + "phase": "1199", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1198-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1199", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1199-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1199-001", + "phase": "1199", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1199-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1199-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_geometry_to_instance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_attribute_names.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_bundle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-240d704df4420718.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeForeachGeometryElementInput type is read from Blender Main", + "GeometryNodeForeachGeometryElementOutput type is read from Blender Main", + "GeometryNodeGeometryToInstance type is read from Blender Main", + "GeometryNodeGetAttributeNames type is read from Blender Main", + "GeometryNodeGetGeometryBundle type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1199-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1199-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-240d704df4420718.blend WBV2_BATCH_TYPES='[\"GeometryNodeForeachGeometryElementInput\",\"GeometryNodeForeachGeometryElementOutput\",\"GeometryNodeGeometryToInstance\",\"GeometryNodeGetAttributeNames\",\"GeometryNodeGetGeometryBundle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeForeachGeometryElementInput\",\"node:GeometryNodeForeachGeometryElementOutput\",\"node:GeometryNodeGeometryToInstance\",\"node:GeometryNodeGetAttributeNames\",\"node:GeometryNodeGetGeometryBundle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1199-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1200-000", + "phase": "1200", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1199-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1200", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1200-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1200-001", + "phase": "1200", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1200-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1200-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_component.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_dial.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_linear.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_transform.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeGetGeometryComponent type is read from Blender Main", + "GeometryNodeGetNamedGrid type is read from Blender Main", + "GeometryNodeGizmoDial type is read from Blender Main", + "GeometryNodeGizmoLinear type is read from Blender Main", + "GeometryNodeGizmoTransform type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1200-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1200-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.blend WBV2_BATCH_TYPES='[\"GeometryNodeGetGeometryComponent\",\"GeometryNodeGetNamedGrid\",\"GeometryNodeGizmoDial\",\"GeometryNodeGizmoLinear\",\"GeometryNodeGizmoTransform\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGetGeometryComponent\",\"node:GeometryNodeGetNamedGrid\",\"node:GeometryNodeGizmoDial\",\"node:GeometryNodeGizmoLinear\",\"node:GeometryNodeGizmoTransform\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1200-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1201-000", + "phase": "1201", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1200-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1201", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1201-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1201-001", + "phase": "1201", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1201-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1201-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grease_pencil_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_advect.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_clip.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_curl.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_dilate_erode.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeGreasePencilToCurves type is read from Blender Main", + "GeometryNodeGridAdvect type is read from Blender Main", + "GeometryNodeGridClip type is read from Blender Main", + "GeometryNodeGridCurl type is read from Blender Main", + "GeometryNodeGridDilateAndErode type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1201-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1201-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.blend WBV2_BATCH_TYPES='[\"GeometryNodeGreasePencilToCurves\",\"GeometryNodeGridAdvect\",\"GeometryNodeGridClip\",\"GeometryNodeGridCurl\",\"GeometryNodeGridDilateAndErode\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGreasePencilToCurves\",\"node:GeometryNodeGridAdvect\",\"node:GeometryNodeGridClip\",\"node:GeometryNodeGridCurl\",\"node:GeometryNodeGridDilateAndErode\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1201-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1202-000", + "phase": "1202", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1201-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1202", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1202-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1202-001", + "phase": "1202", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1202-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1202-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_divergence.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_gradient.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_mean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeGridDivergence type is read from Blender Main", + "GeometryNodeGridGradient type is read from Blender Main", + "GeometryNodeGridInfo type is read from Blender Main", + "GeometryNodeGridLaplacian type is read from Blender Main", + "GeometryNodeGridMean type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1202-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1202-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.blend WBV2_BATCH_TYPES='[\"GeometryNodeGridDivergence\",\"GeometryNodeGridGradient\",\"GeometryNodeGridInfo\",\"GeometryNodeGridLaplacian\",\"GeometryNodeGridMean\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGridDivergence\",\"node:GeometryNodeGridGradient\",\"node:GeometryNodeGridInfo\",\"node:GeometryNodeGridLaplacian\",\"node:GeometryNodeGridMean\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1202-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1203-000", + "phase": "1203", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1202-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1203", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1203-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1203-001", + "phase": "1203", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1203-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1203-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_median.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_prune.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_voxelize.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeGridMedian type is read from Blender Main", + "GeometryNodeGridPrune type is read from Blender Main", + "GeometryNodeGridToMesh type is read from Blender Main", + "GeometryNodeGridToPoints type is read from Blender Main", + "GeometryNodeGridVoxelize type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1203-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1203-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.blend WBV2_BATCH_TYPES='[\"GeometryNodeGridMedian\",\"GeometryNodeGridPrune\",\"GeometryNodeGridToMesh\",\"GeometryNodeGridToPoints\",\"GeometryNodeGridVoxelize\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGridMedian\",\"node:GeometryNodeGridPrune\",\"node:GeometryNodeGridToMesh\",\"node:GeometryNodeGridToPoints\",\"node:GeometryNodeGridVoxelize\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1203-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1204-000", + "phase": "1204", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1203-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1204", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1204-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1204-001", + "phase": "1204", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1204-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1204-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_csv.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_obj.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_ply.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_stl.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeImageTexture type is read from Blender Main", + "GeometryNodeImportCSV type is read from Blender Main", + "GeometryNodeImportOBJ type is read from Blender Main", + "GeometryNodeImportPLY type is read from Blender Main", + "GeometryNodeImportSTL type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1204-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1204-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.blend WBV2_BATCH_TYPES='[\"GeometryNodeImageTexture\",\"GeometryNodeImportCSV\",\"GeometryNodeImportOBJ\",\"GeometryNodeImportPLY\",\"GeometryNodeImportSTL\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeImageTexture\",\"node:GeometryNodeImportCSV\",\"node:GeometryNodeImportOBJ\",\"node:GeometryNodeImportPLY\",\"node:GeometryNodeImportSTL\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1204-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1205-000", + "phase": "1205", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1204-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1205", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1205-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1205-001", + "phase": "1205", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1205-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1205-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_text.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_vdb.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_of_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeImportText type is read from Blender Main", + "GeometryNodeImportVDB type is read from Blender Main", + "GeometryNodeIndexOfNearest type is read from Blender Main", + "GeometryNodeIndexSwitch type is read from Blender Main", + "GeometryNodeInputActiveCamera type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1205-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1205-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.blend WBV2_BATCH_TYPES='[\"GeometryNodeImportText\",\"GeometryNodeImportVDB\",\"GeometryNodeIndexOfNearest\",\"GeometryNodeIndexSwitch\",\"GeometryNodeInputActiveCamera\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeImportText\",\"node:GeometryNodeImportVDB\",\"node:GeometryNodeIndexOfNearest\",\"node:GeometryNodeIndexSwitch\",\"node:GeometryNodeInputActiveCamera\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1205-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1206-000", + "phase": "1206", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1205-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1206", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1206-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1206-001", + "phase": "1206", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1206-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1206-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_collection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_edge_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_font.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-150a227b3433d301.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputCollection type is read from Blender Main", + "GeometryNodeInputCurveHandlePositions type is read from Blender Main", + "GeometryNodeInputCurveTilt type is read from Blender Main", + "GeometryNodeInputEdgeSmooth type is read from Blender Main", + "GeometryNodeInputFont type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1206-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1206-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-150a227b3433d301.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputCollection\",\"GeometryNodeInputCurveHandlePositions\",\"GeometryNodeInputCurveTilt\",\"GeometryNodeInputEdgeSmooth\",\"GeometryNodeInputFont\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputCollection\",\"node:GeometryNodeInputCurveHandlePositions\",\"node:GeometryNodeInputCurveTilt\",\"node:GeometryNodeInputEdgeSmooth\",\"node:GeometryNodeInputFont\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1206-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1207-000", + "phase": "1207", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1206-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1207", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1207-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1207-001", + "phase": "1207", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1207-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1207-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_id.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_bounds.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_reference.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputID type is read from Blender Main", + "GeometryNodeInputImage type is read from Blender Main", + "GeometryNodeInputIndex type is read from Blender Main", + "GeometryNodeInputInstanceBounds type is read from Blender Main", + "GeometryNodeInputInstanceReference type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1207-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1207-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputID\",\"GeometryNodeInputImage\",\"GeometryNodeInputIndex\",\"GeometryNodeInputInstanceBounds\",\"GeometryNodeInputInstanceReference\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputID\",\"node:GeometryNodeInputImage\",\"node:GeometryNodeInputIndex\",\"node:GeometryNodeInputInstanceBounds\",\"node:GeometryNodeInputInstanceReference\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1207-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1208-000", + "phase": "1208", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1207-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1208", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1208-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1208-001", + "phase": "1208", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1208-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1208-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_scale.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_angle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputInstanceRotation type is read from Blender Main", + "GeometryNodeInputInstanceScale type is read from Blender Main", + "GeometryNodeInputMaterial type is read from Blender Main", + "GeometryNodeInputMaterialIndex type is read from Blender Main", + "GeometryNodeInputMeshEdgeAngle type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1208-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1208-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputInstanceRotation\",\"GeometryNodeInputInstanceScale\",\"GeometryNodeInputMaterial\",\"GeometryNodeInputMaterialIndex\",\"GeometryNodeInputMeshEdgeAngle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputInstanceRotation\",\"node:GeometryNodeInputInstanceScale\",\"node:GeometryNodeInputMaterial\",\"node:GeometryNodeInputMaterialIndex\",\"node:GeometryNodeInputMeshEdgeAngle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1208-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1209-000", + "phase": "1209", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1208-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1209", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1209-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1209-001", + "phase": "1209", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1209-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1209-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_area.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_neighbors.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e28f27c297406a24.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputMeshEdgeNeighbors type is read from Blender Main", + "GeometryNodeInputMeshEdgeVertices type is read from Blender Main", + "GeometryNodeInputMeshFaceArea type is read from Blender Main", + "GeometryNodeInputMeshFaceIsPlanar type is read from Blender Main", + "GeometryNodeInputMeshFaceNeighbors type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1209-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1209-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e28f27c297406a24.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputMeshEdgeNeighbors\",\"GeometryNodeInputMeshEdgeVertices\",\"GeometryNodeInputMeshFaceArea\",\"GeometryNodeInputMeshFaceIsPlanar\",\"GeometryNodeInputMeshFaceNeighbors\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputMeshEdgeNeighbors\",\"node:GeometryNodeInputMeshEdgeVertices\",\"node:GeometryNodeInputMeshFaceArea\",\"node:GeometryNodeInputMeshFaceIsPlanar\",\"node:GeometryNodeInputMeshFaceNeighbors\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1209-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1210-000", + "phase": "1210", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1209-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1210", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1210-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1210-001", + "phase": "1210", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1210-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1210-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_island.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_vertex_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_layer_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputMeshIsland type is read from Blender Main", + "GeometryNodeInputMeshVertexNeighbors type is read from Blender Main", + "GeometryNodeInputNamedAttribute type is read from Blender Main", + "GeometryNodeInputNamedLayerSelection type is read from Blender Main", + "GeometryNodeInputNormal type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1210-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1210-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputMeshIsland\",\"GeometryNodeInputMeshVertexNeighbors\",\"GeometryNodeInputNamedAttribute\",\"GeometryNodeInputNamedLayerSelection\",\"GeometryNodeInputNormal\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputMeshIsland\",\"node:GeometryNodeInputMeshVertexNeighbors\",\"node:GeometryNodeInputNamedAttribute\",\"node:GeometryNodeInputNamedLayerSelection\",\"node:GeometryNodeInputNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1210-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1211-000", + "phase": "1211", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1210-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1211", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1211-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1211-001", + "phase": "1211", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1211-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1211-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_align_rotation_to_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axes_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_combine_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_euler_to_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeAlignRotationToVector type is read from Blender Main", + "FunctionNodeAxesToRotation type is read from Blender Main", + "FunctionNodeAxisAngleToRotation type is read from Blender Main", + "FunctionNodeCombineMatrix type is read from Blender Main", + "FunctionNodeEulerToRotation type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1211-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1211-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.blend WBV2_BATCH_TYPES='[\"FunctionNodeAlignRotationToVector\",\"FunctionNodeAxesToRotation\",\"FunctionNodeAxisAngleToRotation\",\"FunctionNodeCombineMatrix\",\"FunctionNodeEulerToRotation\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeAlignRotationToVector\",\"node:FunctionNodeAxesToRotation\",\"node:FunctionNodeAxisAngleToRotation\",\"node:FunctionNodeCombineMatrix\",\"node:FunctionNodeEulerToRotation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1211-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1212-000", + "phase": "1212", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1211-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1212", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1212-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1212-001", + "phase": "1212", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1212-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1212-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_find_in_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_format_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_bool.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeFindInString type is read from Blender Main", + "FunctionNodeFormatString type is read from Blender Main", + "FunctionNodeInputBool type is read from Blender Main", + "FunctionNodeInputInt type is read from Blender Main", + "FunctionNodeInputIntVector type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1212-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1212-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.blend WBV2_BATCH_TYPES='[\"FunctionNodeFindInString\",\"FunctionNodeFormatString\",\"FunctionNodeInputBool\",\"FunctionNodeInputInt\",\"FunctionNodeInputIntVector\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeFindInString\",\"node:FunctionNodeFormatString\",\"node:FunctionNodeInputBool\",\"node:FunctionNodeInputInt\",\"node:FunctionNodeInputIntVector\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1212-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1213-000", + "phase": "1213", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1212-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1213", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1213-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1213-001", + "phase": "1213", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1213-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1213-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_menu.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_special_characters.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeInputMenu type is read from Blender Main", + "FunctionNodeInputRotation type is read from Blender Main", + "FunctionNodeInputSpecialCharacters type is read from Blender Main", + "FunctionNodeInputString type is read from Blender Main", + "FunctionNodeInputVector type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1213-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1213-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.blend WBV2_BATCH_TYPES='[\"FunctionNodeInputMenu\",\"FunctionNodeInputRotation\",\"FunctionNodeInputSpecialCharacters\",\"FunctionNodeInputString\",\"FunctionNodeInputVector\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeInputMenu\",\"node:FunctionNodeInputRotation\",\"node:FunctionNodeInputSpecialCharacters\",\"node:FunctionNodeInputString\",\"node:FunctionNodeInputVector\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1213-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1214-000", + "phase": "1214", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1213-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1214", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1214-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1214-001", + "phase": "1214", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1214-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1214-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_match_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_determinant.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeInvertMatrix type is read from Blender Main", + "FunctionNodeInvertRotation type is read from Blender Main", + "FunctionNodeMatchString type is read from Blender Main", + "FunctionNodeMatrixDeterminant type is read from Blender Main", + "FunctionNodeMatrixMultiply type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1214-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1214-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.blend WBV2_BATCH_TYPES='[\"FunctionNodeInvertMatrix\",\"FunctionNodeInvertRotation\",\"FunctionNodeMatchString\",\"FunctionNodeMatrixDeterminant\",\"FunctionNodeMatrixMultiply\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeInvertMatrix\",\"node:FunctionNodeInvertRotation\",\"node:FunctionNodeMatchString\",\"node:FunctionNodeMatrixDeterminant\",\"node:FunctionNodeMatrixMultiply\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1214-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1215-000", + "phase": "1215", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1214-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1215", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1215-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1215-001", + "phase": "1215", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1215-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1215-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeProjectPoint type is read from Blender Main", + "FunctionNodeQuaternionToRotation type is read from Blender Main", + "FunctionNodeReplaceString type is read from Blender Main", + "FunctionNodeReverseString type is read from Blender Main", + "FunctionNodeRotateRotation type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1215-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1215-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend WBV2_BATCH_TYPES='[\"FunctionNodeProjectPoint\",\"FunctionNodeQuaternionToRotation\",\"FunctionNodeReplaceString\",\"FunctionNodeReverseString\",\"FunctionNodeRotateRotation\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeProjectPoint\",\"node:FunctionNodeQuaternionToRotation\",\"node:FunctionNodeReplaceString\",\"node:FunctionNodeReverseString\",\"node:FunctionNodeRotateRotation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1215-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1216-000", + "phase": "1216", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1215-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1216", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1216-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1216-001", + "phase": "1216", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1216-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1216-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1216-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c598026385cc94dc", + "selectedRecordIds": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1216-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c598026385cc94dc", + "selectedRecordIds": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_axis_angle.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_euler.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_quaternion.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_separate_matrix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c598026385cc94dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeRotateVector type is read from Blender Main", + "FunctionNodeRotationToAxisAngle type is read from Blender Main", + "FunctionNodeRotationToEuler type is read from Blender Main", + "FunctionNodeRotationToQuaternion type is read from Blender Main", + "FunctionNodeSeparateMatrix type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1216-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1216-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c598026385cc94dc.blend WBV2_BATCH_TYPES='[\"FunctionNodeRotateVector\",\"FunctionNodeRotationToAxisAngle\",\"FunctionNodeRotationToEuler\",\"FunctionNodeRotationToQuaternion\",\"FunctionNodeSeparateMatrix\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeRotateVector\",\"node:FunctionNodeRotationToAxisAngle\",\"node:FunctionNodeRotationToEuler\",\"node:FunctionNodeRotationToQuaternion\",\"node:FunctionNodeSeparateMatrix\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1216-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1217-000", + "phase": "1217", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1216-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1217", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1217-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1217-001", + "phase": "1217", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1217-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1217-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1217-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dbc0fb8bb88f3d37", + "selectedRecordIds": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1217-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dbc0fb8bb88f3d37", + "selectedRecordIds": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_set_string_case.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_slice_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_length.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_to_value.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_direction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-dbc0fb8bb88f3d37.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeSetStringCase type is read from Blender Main", + "FunctionNodeSliceString type is read from Blender Main", + "FunctionNodeStringLength type is read from Blender Main", + "FunctionNodeStringToValue type is read from Blender Main", + "FunctionNodeTransformDirection type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1217-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1217-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-dbc0fb8bb88f3d37.blend WBV2_BATCH_TYPES='[\"FunctionNodeSetStringCase\",\"FunctionNodeSliceString\",\"FunctionNodeStringLength\",\"FunctionNodeStringToValue\",\"FunctionNodeTransformDirection\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeSetStringCase\",\"node:FunctionNodeSliceString\",\"node:FunctionNodeStringLength\",\"node:FunctionNodeStringToValue\",\"node:FunctionNodeTransformDirection\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1217-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1218-000", + "phase": "1218", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1217-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1218", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1218-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1218-001", + "phase": "1218", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1218-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1218-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1218-001:AUTO_GEOMETRY_NATIVE_NODE_READER:34abb58eedf43c5f", + "selectedRecordIds": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1218-001:AUTO_GEOMETRY_NATIVE_NODE_READER:34abb58eedf43c5f", + "selectedRecordIds": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_trim_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_value_to_string.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_object.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-34abb58eedf43c5f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeTransformPoint type is read from Blender Main", + "FunctionNodeTransposeMatrix type is read from Blender Main", + "FunctionNodeTrimString type is read from Blender Main", + "FunctionNodeValueToString type is read from Blender Main", + "GeometryNodeInputObject type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1218-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1218-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-34abb58eedf43c5f.blend WBV2_BATCH_TYPES='[\"FunctionNodeTransformPoint\",\"FunctionNodeTransposeMatrix\",\"FunctionNodeTrimString\",\"FunctionNodeValueToString\",\"GeometryNodeInputObject\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeTransformPoint\",\"node:FunctionNodeTransposeMatrix\",\"node:FunctionNodeTrimString\",\"node:FunctionNodeValueToString\",\"node:GeometryNodeInputObject\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1218-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1219-000", + "phase": "1219", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1218-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1219", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1219-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1219-001", + "phase": "1219", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1219-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1219-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1219-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cccf2d7fb85d3b8", + "selectedRecordIds": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1219-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cccf2d7fb85d3b8", + "selectedRecordIds": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_face_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cccf2d7fb85d3b8.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputPosition type is read from Blender Main", + "GeometryNodeInputRadius type is read from Blender Main", + "GeometryNodeInputSceneTime type is read from Blender Main", + "GeometryNodeInputShadeSmooth type is read from Blender Main", + "GeometryNodeInputShortestEdgePaths type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1219-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1219-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-3cccf2d7fb85d3b8.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputPosition\",\"GeometryNodeInputRadius\",\"GeometryNodeInputSceneTime\",\"GeometryNodeInputShadeSmooth\",\"GeometryNodeInputShortestEdgePaths\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputPosition\",\"node:GeometryNodeInputRadius\",\"node:GeometryNodeInputSceneTime\",\"node:GeometryNodeInputShadeSmooth\",\"node:GeometryNodeInputShortestEdgePaths\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1219-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1220-000", + "phase": "1220", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1219-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1220", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1220-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1220-001", + "phase": "1220", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1220-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1220-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1220-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d0f07a9289283d0", + "selectedRecordIds": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1220-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d0f07a9289283d0", + "selectedRecordIds": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_resolution.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_voxel_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d0f07a9289283d0.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputSplineCyclic type is read from Blender Main", + "GeometryNodeInputSplineResolution type is read from Blender Main", + "GeometryNodeInputTangent type is read from Blender Main", + "GeometryNodeInputVoxelIndex type is read from Blender Main", + "GeometryNodeInstanceOnPoints type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1220-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1220-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8d0f07a9289283d0.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputSplineCyclic\",\"GeometryNodeInputSplineResolution\",\"GeometryNodeInputTangent\",\"GeometryNodeInputVoxelIndex\",\"GeometryNodeInstanceOnPoints\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputSplineCyclic\",\"node:GeometryNodeInputSplineResolution\",\"node:GeometryNodeInputTangent\",\"node:GeometryNodeInputVoxelIndex\",\"node:GeometryNodeInstanceOnPoints\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1220-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1221-000", + "phase": "1221", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1220-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1221", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1221-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1221-001", + "phase": "1221", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1221-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1221-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1221-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c30b3d2a341bc8b1", + "selectedRecordIds": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1221-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c30b3d2a341bc8b1", + "selectedRecordIds": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instances_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_get_item.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c30b3d2a341bc8b1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInstanceTransform type is read from Blender Main", + "GeometryNodeInstancesToPoints type is read from Blender Main", + "GeometryNodeInterpolateCurves type is read from Blender Main", + "GeometryNodeIsViewport type is read from Blender Main", + "GeometryNodeListGetItem type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1221-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1221-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c30b3d2a341bc8b1.blend WBV2_BATCH_TYPES='[\"GeometryNodeInstanceTransform\",\"GeometryNodeInstancesToPoints\",\"GeometryNodeInterpolateCurves\",\"GeometryNodeIsViewport\",\"GeometryNodeListGetItem\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInstanceTransform\",\"node:GeometryNodeInstancesToPoints\",\"node:GeometryNodeInterpolateCurves\",\"node:GeometryNodeIsViewport\",\"node:GeometryNodeListGetItem\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1221-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1222-000", + "phase": "1222", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1221-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1222", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1222-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1222-001", + "phase": "1222", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1222-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1222-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1222-001:AUTO_GEOMETRY_NATIVE_NODE_READER:838d8958e4b989d1", + "selectedRecordIds": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1222-001:AUTO_GEOMETRY_NATIVE_NODE_READER:838d8958e4b989d1", + "selectedRecordIds": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-838d8958e4b989d1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeListLength type is read from Blender Main", + "GeometryNodeMaterialSelection type is read from Blender Main", + "GeometryNodeMenuSwitch type is read from Blender Main", + "GeometryNodeMergeByDistance type is read from Blender Main", + "GeometryNodeMergeLayers type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1222-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1222-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-838d8958e4b989d1.blend WBV2_BATCH_TYPES='[\"GeometryNodeListLength\",\"GeometryNodeMaterialSelection\",\"GeometryNodeMenuSwitch\",\"GeometryNodeMergeByDistance\",\"GeometryNodeMergeLayers\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeListLength\",\"node:GeometryNodeMaterialSelection\",\"node:GeometryNodeMenuSwitch\",\"node:GeometryNodeMergeByDistance\",\"node:GeometryNodeMergeLayers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1222-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1223-000", + "phase": "1223", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1222-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1223", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1223-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1223-001", + "phase": "1223", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1223-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1223-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1223-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c3b7b0656afe6a91", + "selectedRecordIds": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1223-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c3b7b0656afe6a91", + "selectedRecordIds": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_bevel.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_boolean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c3b7b0656afe6a91.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeMergePoints type is read from Blender Main", + "GeometryNodeMeshBevel type is read from Blender Main", + "GeometryNodeMeshBoolean type is read from Blender Main", + "GeometryNodeMeshCircle type is read from Blender Main", + "GeometryNodeMeshCone type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1223-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1223-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c3b7b0656afe6a91.blend WBV2_BATCH_TYPES='[\"GeometryNodeMergePoints\",\"GeometryNodeMeshBevel\",\"GeometryNodeMeshBoolean\",\"GeometryNodeMeshCircle\",\"GeometryNodeMeshCone\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMergePoints\",\"node:GeometryNodeMeshBevel\",\"node:GeometryNodeMeshBoolean\",\"node:GeometryNodeMeshCircle\",\"node:GeometryNodeMeshCone\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1223-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1224-000", + "phase": "1224", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1223-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1224", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1224-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1224-001", + "phase": "1224", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1224-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1224-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1224-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0dca701c57915fc7", + "selectedRecordIds": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1224-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0dca701c57915fc7", + "selectedRecordIds": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0dca701c57915fc7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeMeshCube type is read from Blender Main", + "GeometryNodeMeshCylinder type is read from Blender Main", + "GeometryNodeMeshFaceSetBoundaries type is read from Blender Main", + "GeometryNodeMeshGrid type is read from Blender Main", + "GeometryNodeMeshIcoSphere type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1224-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1224-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0dca701c57915fc7.blend WBV2_BATCH_TYPES='[\"GeometryNodeMeshCube\",\"GeometryNodeMeshCylinder\",\"GeometryNodeMeshFaceSetBoundaries\",\"GeometryNodeMeshGrid\",\"GeometryNodeMeshIcoSphere\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMeshCube\",\"node:GeometryNodeMeshCylinder\",\"node:GeometryNodeMeshFaceSetBoundaries\",\"node:GeometryNodeMeshGrid\",\"node:GeometryNodeMeshIcoSphere\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1224-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1225-000", + "phase": "1225", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1224-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1225", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1225-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1225-001", + "phase": "1225", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1225-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1225-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1225-001:AUTO_GEOMETRY_NATIVE_NODE_READER:142ee68a2ed9492b", + "selectedRecordIds": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1225-001:AUTO_GEOMETRY_NATIVE_NODE_READER:142ee68a2ed9492b", + "selectedRecordIds": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-142ee68a2ed9492b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeMeshLine type is read from Blender Main", + "GeometryNodeMeshToCurve type is read from Blender Main", + "GeometryNodeMeshToDensityGrid type is read from Blender Main", + "GeometryNodeMeshToPoints type is read from Blender Main", + "GeometryNodeMeshToSDFGrid type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1225-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1225-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-142ee68a2ed9492b.blend WBV2_BATCH_TYPES='[\"GeometryNodeMeshLine\",\"GeometryNodeMeshToCurve\",\"GeometryNodeMeshToDensityGrid\",\"GeometryNodeMeshToPoints\",\"GeometryNodeMeshToSDFGrid\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMeshLine\",\"node:GeometryNodeMeshToCurve\",\"node:GeometryNodeMeshToDensityGrid\",\"node:GeometryNodeMeshToPoints\",\"node:GeometryNodeMeshToSDFGrid\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1225-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1226-000", + "phase": "1226", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1225-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1226", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1226-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1226-001", + "phase": "1226", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1226-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1226-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1226-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abb1c596d4ee21b2", + "selectedRecordIds": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1226-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abb1c596d4ee21b2", + "selectedRecordIds": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_offset_point_in_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abb1c596d4ee21b2.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeMeshToVolume type is read from Blender Main", + "GeometryNodeMeshUVSphere type is read from Blender Main", + "GeometryNodeOffsetCornerInFace type is read from Blender Main", + "GeometryNodeOffsetPointInCurve type is read from Blender Main", + "GeometryNodePoints type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1226-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1226-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-abb1c596d4ee21b2.blend WBV2_BATCH_TYPES='[\"GeometryNodeMeshToVolume\",\"GeometryNodeMeshUVSphere\",\"GeometryNodeOffsetCornerInFace\",\"GeometryNodeOffsetPointInCurve\",\"GeometryNodePoints\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMeshToVolume\",\"node:GeometryNodeMeshUVSphere\",\"node:GeometryNodeOffsetCornerInFace\",\"node:GeometryNodeOffsetPointInCurve\",\"node:GeometryNodePoints\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1226-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1227-000", + "phase": "1227", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1226-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1227", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1227-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1227-001", + "phase": "1227", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1227-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1227-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1227-001:AUTO_GEOMETRY_NATIVE_NODE_READER:81deda73b9188c10", + "selectedRecordIds": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1227-001:AUTO_GEOMETRY_NATIVE_NODE_READER:81deda73b9188c10", + "selectedRecordIds": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-81deda73b9188c10.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodePointsOfCurve type is read from Blender Main", + "GeometryNodePointsToCurves type is read from Blender Main", + "GeometryNodePointsToSDFGrid type is read from Blender Main", + "GeometryNodePointsToVertices type is read from Blender Main", + "GeometryNodePointsToVolume type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1227-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1227-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-81deda73b9188c10.blend WBV2_BATCH_TYPES='[\"GeometryNodePointsOfCurve\",\"GeometryNodePointsToCurves\",\"GeometryNodePointsToSDFGrid\",\"GeometryNodePointsToVertices\",\"GeometryNodePointsToVolume\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodePointsOfCurve\",\"node:GeometryNodePointsToCurves\",\"node:GeometryNodePointsToSDFGrid\",\"node:GeometryNodePointsToVertices\",\"node:GeometryNodePointsToVolume\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1227-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1228-000", + "phase": "1228", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1227-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1228", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1228-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1228-001", + "phase": "1228", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1228-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1228-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1228-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6b022a1a8e99f7fd", + "selectedRecordIds": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1228-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6b022a1a8e99f7fd", + "selectedRecordIds": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_proximity.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_raycast.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rename_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6b022a1a8e99f7fd.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeProximity type is read from Blender Main", + "GeometryNodeRaycast type is read from Blender Main", + "GeometryNodeRemoveAttribute type is read from Blender Main", + "GeometryNodeRenameAttribute type is read from Blender Main", + "GeometryNodeRepeatInput type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1228-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1228-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6b022a1a8e99f7fd.blend WBV2_BATCH_TYPES='[\"GeometryNodeProximity\",\"GeometryNodeRaycast\",\"GeometryNodeRemoveAttribute\",\"GeometryNodeRenameAttribute\",\"GeometryNodeRepeatInput\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeProximity\",\"node:GeometryNodeRaycast\",\"node:GeometryNodeRemoveAttribute\",\"node:GeometryNodeRenameAttribute\",\"node:GeometryNodeRepeatInput\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1228-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1229-000", + "phase": "1229", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1228-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1229", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1229-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1229-001", + "phase": "1229", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1229-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1229-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1229-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1323c437a10e245b", + "selectedRecordIds": [ + "node:GeometryNodeRepeatOutput" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1229-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1323c437a10e245b", + "selectedRecordIds": [ + "node:GeometryNodeRepeatOutput" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1323c437a10e245b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeRepeatOutput type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1229-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1229-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1323c437a10e245b.blend WBV2_BATCH_TYPES='[\"GeometryNodeRepeatOutput\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeRepeatOutput\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1229-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeRepeatOutput" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1230-000", + "phase": "1230", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1229-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1230", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1230-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1230-001", + "phase": "1230", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1230-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1230-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1230-001:AUTO_GEOMETRY_NATIVE_NODE_READER:bb5c9b89367c9d6d", + "selectedRecordIds": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1230-001:AUTO_GEOMETRY_NATIVE_NODE_READER:bb5c9b89367c9d6d", + "selectedRecordIds": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_boolean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-bb5c9b89367c9d6d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeReplaceMaterial type is read from Blender Main", + "GeometryNodeResampleCurve type is read from Blender Main", + "GeometryNodeReverseCurve type is read from Blender Main", + "GeometryNodeRotateInstances type is read from Blender Main", + "GeometryNodeSDFGridBoolean type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1230-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1230-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-bb5c9b89367c9d6d.blend WBV2_BATCH_TYPES='[\"GeometryNodeReplaceMaterial\",\"GeometryNodeResampleCurve\",\"GeometryNodeReverseCurve\",\"GeometryNodeRotateInstances\",\"GeometryNodeSDFGridBoolean\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeReplaceMaterial\",\"node:GeometryNodeResampleCurve\",\"node:GeometryNodeReverseCurve\",\"node:GeometryNodeRotateInstances\",\"node:GeometryNodeSDFGridBoolean\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1230-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1231-000", + "phase": "1231", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1230-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1231", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1231-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1231-001", + "phase": "1231", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1231-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1231-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1231-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e423b626a07145e", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1231-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e423b626a07145e", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean_curvature.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_median.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e423b626a07145e.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSDFGridFillet type is read from Blender Main", + "GeometryNodeSDFGridLaplacian type is read from Blender Main", + "GeometryNodeSDFGridMean type is read from Blender Main", + "GeometryNodeSDFGridMeanCurvature type is read from Blender Main", + "GeometryNodeSDFGridMedian type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1231-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1231-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-4e423b626a07145e.blend WBV2_BATCH_TYPES='[\"GeometryNodeSDFGridFillet\",\"GeometryNodeSDFGridLaplacian\",\"GeometryNodeSDFGridMean\",\"GeometryNodeSDFGridMeanCurvature\",\"GeometryNodeSDFGridMedian\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSDFGridFillet\",\"node:GeometryNodeSDFGridLaplacian\",\"node:GeometryNodeSDFGridMean\",\"node:GeometryNodeSDFGridMeanCurvature\",\"node:GeometryNodeSDFGridMedian\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1231-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1232-000", + "phase": "1232", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1231-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1232", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1232-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1232-001", + "phase": "1232", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1232-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1232-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1232-001:AUTO_GEOMETRY_NATIVE_NODE_READER:404eb303152ba922", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1232-001:AUTO_GEOMETRY_NATIVE_NODE_READER:404eb303152ba922", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_offset.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-404eb303152ba922.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSDFGridOffset type is read from Blender Main", + "GeometryNodeSampleCurve type is read from Blender Main", + "GeometryNodeSampleGrid type is read from Blender Main", + "GeometryNodeSampleGridIndex type is read from Blender Main", + "GeometryNodeSampleIndex type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1232-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1232-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-404eb303152ba922.blend WBV2_BATCH_TYPES='[\"GeometryNodeSDFGridOffset\",\"GeometryNodeSampleCurve\",\"GeometryNodeSampleGrid\",\"GeometryNodeSampleGridIndex\",\"GeometryNodeSampleIndex\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSDFGridOffset\",\"node:GeometryNodeSampleCurve\",\"node:GeometryNodeSampleGrid\",\"node:GeometryNodeSampleGridIndex\",\"node:GeometryNodeSampleIndex\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1232-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1233-000", + "phase": "1233", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1232-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1233", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1233-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1233-001", + "phase": "1233", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1233-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1233-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1233-001:AUTO_GEOMETRY_NATIVE_NODE_READER:529a042eb604c0e1", + "selectedRecordIds": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1233-001:AUTO_GEOMETRY_NATIVE_NODE_READER:529a042eb604c0e1", + "selectedRecordIds": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_sound_frequencies.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-529a042eb604c0e1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSampleNearest type is read from Blender Main", + "GeometryNodeSampleNearestSurface type is read from Blender Main", + "GeometryNodeSampleSoundFrequencies type is read from Blender Main", + "GeometryNodeSampleUVSurface type is read from Blender Main", + "GeometryNodeScaleElements type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1233-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1233-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-529a042eb604c0e1.blend WBV2_BATCH_TYPES='[\"GeometryNodeSampleNearest\",\"GeometryNodeSampleNearestSurface\",\"GeometryNodeSampleSoundFrequencies\",\"GeometryNodeSampleUVSurface\",\"GeometryNodeScaleElements\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSampleNearest\",\"node:GeometryNodeSampleNearestSurface\",\"node:GeometryNodeSampleSoundFrequencies\",\"node:GeometryNodeSampleUVSurface\",\"node:GeometryNodeScaleElements\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1233-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1234-000", + "phase": "1234", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1233-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1234", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1234-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1234-001", + "phase": "1234", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1234-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1234-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1234-001:AUTO_GEOMETRY_NATIVE_NODE_READER:ad9e5b4bf235659f", + "selectedRecordIds": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1234-001:AUTO_GEOMETRY_NATIVE_NODE_READER:ad9e5b4bf235659f", + "selectedRecordIds": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_self_object.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_separate_components.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-ad9e5b4bf235659f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeScaleInstances type is read from Blender Main", + "GeometryNodeSelfObject type is read from Blender Main", + "GeometryNodeSeparateComponents type is read from Blender Main", + "GeometryNodeSetCurveHandlePositions type is read from Blender Main", + "GeometryNodeSetCurveNormal type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1234-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1234-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-ad9e5b4bf235659f.blend WBV2_BATCH_TYPES='[\"GeometryNodeScaleInstances\",\"GeometryNodeSelfObject\",\"GeometryNodeSeparateComponents\",\"GeometryNodeSetCurveHandlePositions\",\"GeometryNodeSetCurveNormal\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeScaleInstances\",\"node:GeometryNodeSelfObject\",\"node:GeometryNodeSeparateComponents\",\"node:GeometryNodeSetCurveHandlePositions\",\"node:GeometryNodeSetCurveNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1234-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1235-000", + "phase": "1235", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1234-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1235", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1235-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1235-001", + "phase": "1235", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1235-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1235-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1235-001:AUTO_GEOMETRY_NATIVE_NODE_READER:91beafd1d1c04670", + "selectedRecordIds": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1235-001:AUTO_GEOMETRY_NATIVE_NODE_READER:91beafd1d1c04670", + "selectedRecordIds": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_name.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_color.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-91beafd1d1c04670.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSetCurveRadius type is read from Blender Main", + "GeometryNodeSetCurveTilt type is read from Blender Main", + "GeometryNodeSetGeometryBundle type is read from Blender Main", + "GeometryNodeSetGeometryName type is read from Blender Main", + "GeometryNodeSetGreasePencilColor type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1235-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1235-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-91beafd1d1c04670.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetCurveRadius\",\"GeometryNodeSetCurveTilt\",\"GeometryNodeSetGeometryBundle\",\"GeometryNodeSetGeometryName\",\"GeometryNodeSetGreasePencilColor\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetCurveRadius\",\"node:GeometryNodeSetCurveTilt\",\"node:GeometryNodeSetGeometryBundle\",\"node:GeometryNodeSetGeometryName\",\"node:GeometryNodeSetGreasePencilColor\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1235-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1236-000", + "phase": "1236", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1235-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1236", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1236-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1236-001", + "phase": "1236", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1236-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1236-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1236-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b7b77a5dec80a14d", + "selectedRecordIds": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1236-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b7b77a5dec80a14d", + "selectedRecordIds": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_depth_mode.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_softness.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_id.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b7b77a5dec80a14d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSetGreasePencilDepth type is read from Blender Main", + "GeometryNodeSetGreasePencilSoftness type is read from Blender Main", + "GeometryNodeSetGridBackground type is read from Blender Main", + "GeometryNodeSetGridTransform type is read from Blender Main", + "GeometryNodeSetID type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1236-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1236-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b7b77a5dec80a14d.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetGreasePencilDepth\",\"GeometryNodeSetGreasePencilSoftness\",\"GeometryNodeSetGridBackground\",\"GeometryNodeSetGridTransform\",\"GeometryNodeSetID\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetGreasePencilDepth\",\"node:GeometryNodeSetGreasePencilSoftness\",\"node:GeometryNodeSetGridBackground\",\"node:GeometryNodeSetGridTransform\",\"node:GeometryNodeSetID\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1236-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1237-000", + "phase": "1237", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1236-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1237", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1237-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1237-001", + "phase": "1237", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1237-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1237-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1237-001:AUTO_GEOMETRY_NATIVE_NODE_READER:95ccfa5892bb7a33", + "selectedRecordIds": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1237-001:AUTO_GEOMETRY_NATIVE_NODE_READER:95ccfa5892bb7a33", + "selectedRecordIds": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_mesh_normal.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_order.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-95ccfa5892bb7a33.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSetInstanceTransform type is read from Blender Main", + "GeometryNodeSetMaterial type is read from Blender Main", + "GeometryNodeSetMaterialIndex type is read from Blender Main", + "GeometryNodeSetMeshNormal type is read from Blender Main", + "GeometryNodeSetNURBSOrder type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1237-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1237-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-95ccfa5892bb7a33.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetInstanceTransform\",\"GeometryNodeSetMaterial\",\"GeometryNodeSetMaterialIndex\",\"GeometryNodeSetMeshNormal\",\"GeometryNodeSetNURBSOrder\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetInstanceTransform\",\"node:GeometryNodeSetMaterial\",\"node:GeometryNodeSetMaterialIndex\",\"node:GeometryNodeSetMeshNormal\",\"node:GeometryNodeSetNURBSOrder\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1237-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1238-000", + "phase": "1238", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1237-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1238", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1238-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1238-001", + "phase": "1238", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1238-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1238-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1238-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d3751cce437cb33", + "selectedRecordIds": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1238-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d3751cce437cb33", + "selectedRecordIds": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_weight.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d3751cce437cb33.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSetNURBSWeight type is read from Blender Main", + "GeometryNodeSetPointRadius type is read from Blender Main", + "GeometryNodeSetShadeSmooth type is read from Blender Main", + "GeometryNodeSetSplineCyclic type is read from Blender Main", + "GeometryNodeSetSplineResolution type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1238-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1238-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8d3751cce437cb33.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetNURBSWeight\",\"GeometryNodeSetPointRadius\",\"GeometryNodeSetShadeSmooth\",\"GeometryNodeSetSplineCyclic\",\"GeometryNodeSetSplineResolution\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetNURBSWeight\",\"node:GeometryNodeSetPointRadius\",\"node:GeometryNodeSetShadeSmooth\",\"node:GeometryNodeSetSplineCyclic\",\"node:GeometryNodeSetSplineResolution\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1238-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1239-000", + "phase": "1239", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1238-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1239", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1239-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1239-001", + "phase": "1239", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1239-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1239-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1239-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2de2c5e6ce0c4914", + "selectedRecordIds": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1239-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2de2c5e6ce0c4914", + "selectedRecordIds": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2de2c5e6ce0c4914.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSortElements type is read from Blender Main", + "GeometryNodeSortList type is read from Blender Main", + "GeometryNodeSplineLength type is read from Blender Main", + "GeometryNodeSplineParameter type is read from Blender Main", + "GeometryNodeSplitEdges type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1239-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1239-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2de2c5e6ce0c4914.blend WBV2_BATCH_TYPES='[\"GeometryNodeSortElements\",\"GeometryNodeSortList\",\"GeometryNodeSplineLength\",\"GeometryNodeSplineParameter\",\"GeometryNodeSplitEdges\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSortElements\",\"node:GeometryNodeSortList\",\"node:GeometryNodeSplineLength\",\"node:GeometryNodeSplineParameter\",\"node:GeometryNodeSplitEdges\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1239-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1240-000", + "phase": "1240", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1239-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1240", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1240-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1240-001", + "phase": "1240", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1240-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1240-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1240-001:AUTO_GEOMETRY_NATIVE_NODE_READER:70077c253f8e9738", + "selectedRecordIds": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1240-001:AUTO_GEOMETRY_NATIVE_NODE_READER:70077c253f8e9738", + "selectedRecordIds": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_join.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-70077c253f8e9738.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSplitToInstances type is read from Blender Main", + "GeometryNodeStoreNamedGrid type is read from Blender Main", + "GeometryNodeStringJoin type is read from Blender Main", + "GeometryNodeStringToCurves type is read from Blender Main", + "GeometryNodeSubdivideCurve type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1240-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1240-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-70077c253f8e9738.blend WBV2_BATCH_TYPES='[\"GeometryNodeSplitToInstances\",\"GeometryNodeStoreNamedGrid\",\"GeometryNodeStringJoin\",\"GeometryNodeStringToCurves\",\"GeometryNodeSubdivideCurve\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSplitToInstances\",\"node:GeometryNodeStoreNamedGrid\",\"node:GeometryNodeStringJoin\",\"node:GeometryNodeStringToCurves\",\"node:GeometryNodeSubdivideCurve\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1240-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1241-000", + "phase": "1241", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1240-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1241", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1241-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1241-001", + "phase": "1241", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1241-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1241-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1241-001:AUTO_GEOMETRY_NATIVE_NODE_READER:518360e680870ecc", + "selectedRecordIds": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1241-001:AUTO_GEOMETRY_NATIVE_NODE_READER:518360e680870ecc", + "selectedRecordIds": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tag_filter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-518360e680870ecc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSubdivideMesh type is read from Blender Main", + "GeometryNodeSubdivisionSurface type is read from Blender Main", + "GeometryNodeSwitch type is read from Blender Main", + "GeometryNodeTagFilter type is read from Blender Main", + "GeometryNodeTool3DCursor type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1241-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1241-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-518360e680870ecc.blend WBV2_BATCH_TYPES='[\"GeometryNodeSubdivideMesh\",\"GeometryNodeSubdivisionSurface\",\"GeometryNodeSwitch\",\"GeometryNodeTagFilter\",\"GeometryNodeTool3DCursor\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSubdivideMesh\",\"node:GeometryNodeSubdivisionSurface\",\"node:GeometryNodeSwitch\",\"node:GeometryNodeTagFilter\",\"node:GeometryNodeTool3DCursor\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1241-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1242-000", + "phase": "1242", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1241-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1242", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1242-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1242-001", + "phase": "1242", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1242-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1242-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1242-001:AUTO_GEOMETRY_NATIVE_NODE_READER:f355dda8099b8a6f", + "selectedRecordIds": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1242-001:AUTO_GEOMETRY_NATIVE_NODE_READER:f355dda8099b8a6f", + "selectedRecordIds": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_active_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_face_set.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mouse_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-f355dda8099b8a6f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeToolActiveElement type is read from Blender Main", + "GeometryNodeToolFaceSet type is read from Blender Main", + "GeometryNodeToolMousePosition type is read from Blender Main", + "GeometryNodeToolSelection type is read from Blender Main", + "GeometryNodeToolSetFaceSet type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1242-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1242-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-f355dda8099b8a6f.blend WBV2_BATCH_TYPES='[\"GeometryNodeToolActiveElement\",\"GeometryNodeToolFaceSet\",\"GeometryNodeToolMousePosition\",\"GeometryNodeToolSelection\",\"GeometryNodeToolSetFaceSet\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeToolActiveElement\",\"node:GeometryNodeToolFaceSet\",\"node:GeometryNodeToolMousePosition\",\"node:GeometryNodeToolSelection\",\"node:GeometryNodeToolSetFaceSet\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1242-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1243-000", + "phase": "1243", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1242-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1243", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1243-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1243-001", + "phase": "1243", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1243-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1243-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1243-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6399364bfcbc157c", + "selectedRecordIds": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1243-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6399364bfcbc157c", + "selectedRecordIds": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_transfer_attributes.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6399364bfcbc157c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeToolSetSelection type is read from Blender Main", + "GeometryNodeTransferAttributes type is read from Blender Main", + "GeometryNodeTranslateInstances type is read from Blender Main", + "GeometryNodeTriangulate type is read from Blender Main", + "GeometryNodeTrimCurve type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1243-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1243-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6399364bfcbc157c.blend WBV2_BATCH_TYPES='[\"GeometryNodeToolSetSelection\",\"GeometryNodeTransferAttributes\",\"GeometryNodeTranslateInstances\",\"GeometryNodeTriangulate\",\"GeometryNodeTrimCurve\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeToolSetSelection\",\"node:GeometryNodeTransferAttributes\",\"node:GeometryNodeTranslateInstances\",\"node:GeometryNodeTriangulate\",\"node:GeometryNodeTrimCurve\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1243-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1244-000", + "phase": "1244", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1243-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1244", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1244-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1244-001", + "phase": "1244", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1244-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1244-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_vertex_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeUVPackIslands type is read from Blender Main", + "GeometryNodeUVTangent type is read from Blender Main", + "GeometryNodeUVUnwrap type is read from Blender Main", + "GeometryNodeVertexOfCorner type is read from Blender Main", + "GeometryNodeViewer type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1244-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1244-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend WBV2_BATCH_TYPES='[\"GeometryNodeUVPackIslands\",\"GeometryNodeUVTangent\",\"GeometryNodeUVUnwrap\",\"GeometryNodeVertexOfCorner\",\"GeometryNodeViewer\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeUVPackIslands\",\"node:GeometryNodeUVTangent\",\"node:GeometryNodeUVUnwrap\",\"node:GeometryNodeVertexOfCorner\",\"node:GeometryNodeViewer\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1244-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1245-000", + "phase": "1245", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1244-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1245", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1245-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1245-001", + "phase": "1245", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1245-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1245-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1245-001:AUTO_GEOMETRY_NATIVE_NODE_READER:06a9b0a82fc0bc5b", + "selectedRecordIds": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1245-001:AUTO_GEOMETRY_NATIVE_NODE_READER:06a9b0a82fc0bc5b", + "selectedRecordIds": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewport_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_warning.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_xpbd_solver.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-06a9b0a82fc0bc5b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeViewportTransform type is read from Blender Main", + "GeometryNodeVolumeCube type is read from Blender Main", + "GeometryNodeVolumeToMesh type is read from Blender Main", + "GeometryNodeWarning type is read from Blender Main", + "GeometryNodeXPBDSolver type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1245-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1245-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-06a9b0a82fc0bc5b.blend WBV2_BATCH_TYPES='[\"GeometryNodeViewportTransform\",\"GeometryNodeVolumeCube\",\"GeometryNodeVolumeToMesh\",\"GeometryNodeWarning\",\"GeometryNodeXPBDSolver\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeViewportTransform\",\"node:GeometryNodeVolumeCube\",\"node:GeometryNodeVolumeToMesh\",\"node:GeometryNodeWarning\",\"node:GeometryNodeXPBDSolver\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1245-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1246-000", + "phase": "1246", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1245-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1246", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1246-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1246-001", + "phase": "1246", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1246-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1246-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1246-001:AUTO_SHADER_NATIVE_NODE_READER:6084b65cc9b4dd13", + "selectedRecordIds": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1246-001:AUTO_SHADER_NATIVE_NODE_READER:6084b65cc9b4dd13", + "selectedRecordIds": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_add_shader.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_attribute.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_background.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bevel.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-6084b65cc9b4dd13.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeAddShader type is read from Blender Main", + "ShaderNodeAmbientOcclusion type is read from Blender Main", + "ShaderNodeAttribute type is read from Blender Main", + "ShaderNodeBackground type is read from Blender Main", + "ShaderNodeBevel type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1246-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1246-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-6084b65cc9b4dd13.blend WBV2_BATCH_TYPES='[\"ShaderNodeAddShader\",\"ShaderNodeAmbientOcclusion\",\"ShaderNodeAttribute\",\"ShaderNodeBackground\",\"ShaderNodeBevel\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeAddShader\",\"node:ShaderNodeAmbientOcclusion\",\"node:ShaderNodeAttribute\",\"node:ShaderNodeBackground\",\"node:ShaderNodeBevel\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 web/tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1246-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1247-000", + "phase": "1247", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1246-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1247", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1247-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1247-001", + "phase": "1247", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1247-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1247-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1247-001:AUTO_SHADER_NATIVE_NODE_READER:492bd603ac3e7b39", + "selectedRecordIds": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1247-001:AUTO_SHADER_NATIVE_NODE_READER:492bd603ac3e7b39", + "selectedRecordIds": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_blackbody.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_brightness.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-492bd603ac3e7b39.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeBlackbody type is read from Blender Main", + "ShaderNodeBrightContrast type is read from Blender Main", + "ShaderNodeBsdfAnisotropic type is read from Blender Main", + "ShaderNodeBsdfDiffuse type is read from Blender Main", + "ShaderNodeBsdfGlass type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1247-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1247-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-492bd603ac3e7b39.blend WBV2_BATCH_TYPES='[\"ShaderNodeBlackbody\",\"ShaderNodeBrightContrast\",\"ShaderNodeBsdfAnisotropic\",\"ShaderNodeBsdfDiffuse\",\"ShaderNodeBsdfGlass\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeBlackbody\",\"node:ShaderNodeBrightContrast\",\"node:ShaderNodeBsdfAnisotropic\",\"node:ShaderNodeBsdfDiffuse\",\"node:ShaderNodeBsdfGlass\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1247-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1248-000", + "phase": "1248", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1247-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1248", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1248-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1248-001", + "phase": "1248", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1248-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1248-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1248-001:AUTO_SHADER_NATIVE_NODE_READER:5d3fdcd95f8dcb4a", + "selectedRecordIds": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1248-001:AUTO_SHADER_NATIVE_NODE_READER:5d3fdcd95f8dcb4a", + "selectedRecordIds": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_metallic.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_ray_portal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-5d3fdcd95f8dcb4a.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeBsdfHair type is read from Blender Main", + "ShaderNodeBsdfHairPrincipled type is read from Blender Main", + "ShaderNodeBsdfMetallic type is read from Blender Main", + "ShaderNodeBsdfRayPortal type is read from Blender Main", + "ShaderNodeBsdfRefraction type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1248-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1248-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-5d3fdcd95f8dcb4a.blend WBV2_BATCH_TYPES='[\"ShaderNodeBsdfHair\",\"ShaderNodeBsdfHairPrincipled\",\"ShaderNodeBsdfMetallic\",\"ShaderNodeBsdfRayPortal\",\"ShaderNodeBsdfRefraction\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeBsdfHair\",\"node:ShaderNodeBsdfHairPrincipled\",\"node:ShaderNodeBsdfMetallic\",\"node:ShaderNodeBsdfRayPortal\",\"node:ShaderNodeBsdfRefraction\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1248-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1249-000", + "phase": "1249", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1248-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1249", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1249-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1249-001", + "phase": "1249", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1249-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1249-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1249-001:AUTO_SHADER_NATIVE_NODE_READER:3dd8ce20c676372b", + "selectedRecordIds": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1249-001:AUTO_SHADER_NATIVE_NODE_READER:3dd8ce20c676372b", + "selectedRecordIds": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_toon.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bump.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-3dd8ce20c676372b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeBsdfSheen type is read from Blender Main", + "ShaderNodeBsdfToon type is read from Blender Main", + "ShaderNodeBsdfTranslucent type is read from Blender Main", + "ShaderNodeBsdfTransparent type is read from Blender Main", + "ShaderNodeBump type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1249-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1249-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-3dd8ce20c676372b.blend WBV2_BATCH_TYPES='[\"ShaderNodeBsdfSheen\",\"ShaderNodeBsdfToon\",\"ShaderNodeBsdfTranslucent\",\"ShaderNodeBsdfTransparent\",\"ShaderNodeBump\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeBsdfSheen\",\"node:ShaderNodeBsdfToon\",\"node:ShaderNodeBsdfTranslucent\",\"node:ShaderNodeBsdfTransparent\",\"node:ShaderNodeBump\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1249-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1250-000", + "phase": "1250", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1249-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1250", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1250-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1250-001", + "phase": "1250", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1250-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1250-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1250-001:AUTO_SHADER_NATIVE_NODE_READER:4962cd49b587a2f9", + "selectedRecordIds": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1250-001:AUTO_SHADER_NATIVE_NODE_READER:4962cd49b587a2f9", + "selectedRecordIds": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_camera.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_clamp.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_xyz.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_displacement.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-4962cd49b587a2f9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeCameraData type is read from Blender Main", + "ShaderNodeClamp type is read from Blender Main", + "ShaderNodeCombineColor type is read from Blender Main", + "ShaderNodeCombineXYZ type is read from Blender Main", + "ShaderNodeDisplacement type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1250-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1250-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-4962cd49b587a2f9.blend WBV2_BATCH_TYPES='[\"ShaderNodeCameraData\",\"ShaderNodeClamp\",\"ShaderNodeCombineColor\",\"ShaderNodeCombineXYZ\",\"ShaderNodeDisplacement\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeCameraData\",\"node:ShaderNodeClamp\",\"node:ShaderNodeCombineColor\",\"node:ShaderNodeCombineXYZ\",\"node:ShaderNodeDisplacement\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1250-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1251-000", + "phase": "1251", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1250-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1251", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1251-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1251-001", + "phase": "1251", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1251-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1251-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1251-001:AUTO_SHADER_NATIVE_NODE_READER:2367477c6dfff68d", + "selectedRecordIds": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1251-001:AUTO_SHADER_NATIVE_NODE_READER:2367477c6dfff68d", + "selectedRecordIds": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_eevee_specular.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_emission.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_fresnel.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_gamma.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-2367477c6dfff68d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeEeveeSpecular type is read from Blender Main", + "ShaderNodeEmission type is read from Blender Main", + "ShaderNodeFloatCurve type is read from Blender Main", + "ShaderNodeFresnel type is read from Blender Main", + "ShaderNodeGamma type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1251-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1251-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-2367477c6dfff68d.blend WBV2_BATCH_TYPES='[\"ShaderNodeEeveeSpecular\",\"ShaderNodeEmission\",\"ShaderNodeFloatCurve\",\"ShaderNodeFresnel\",\"ShaderNodeGamma\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeEeveeSpecular\",\"node:ShaderNodeEmission\",\"node:ShaderNodeFloatCurve\",\"node:ShaderNodeFresnel\",\"node:ShaderNodeGamma\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1251-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1252-000", + "phase": "1252", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1251-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1252", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1252-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1252-001", + "phase": "1252", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1252-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1252-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeHairInfo type is read from Blender Main", + "ShaderNodeHoldout type is read from Blender Main", + "ShaderNodeHueSaturation type is read from Blender Main", + "ShaderNodeInvert type is read from Blender Main", + "ShaderNodeLayerWeight type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1252-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1252-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend WBV2_BATCH_TYPES='[\"ShaderNodeHairInfo\",\"ShaderNodeHoldout\",\"ShaderNodeHueSaturation\",\"ShaderNodeInvert\",\"ShaderNodeLayerWeight\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeHairInfo\",\"node:ShaderNodeHoldout\",\"node:ShaderNodeHueSaturation\",\"node:ShaderNodeInvert\",\"node:ShaderNodeLayerWeight\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1252-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1253-000", + "phase": "1253", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1252-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1253", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1253-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-P1253-001", + "phase": "1253", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1253-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1253-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_falloff.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_path.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_map_range.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mapping.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend", + "web/app/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": [ + "ShaderNodeLightFalloff type is read from Blender Main", + "ShaderNodeLightPath type is read from Blender Main", + "ShaderNodeMapRange type is read from Blender Main", + "ShaderNodeMapping type is read from Blender Main", + "ShaderNodeMix 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-P1253-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1253-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend WBV2_BATCH_TYPES='[\"ShaderNodeLightFalloff\",\"ShaderNodeLightPath\",\"ShaderNodeMapRange\",\"ShaderNodeMapping\",\"ShaderNodeMix\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeLightFalloff\",\"node:ShaderNodeLightPath\",\"node:ShaderNodeMapRange\",\"node:ShaderNodeMapping\",\"node:ShaderNodeMix\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1253-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + } + ] +} diff --git a/tests/golden/WBV2-P1253-001/manifest.json b/tests/golden/WBV2-P1253-001/manifest.json new file mode 100644 index 000000000..c6c751436 --- /dev/null +++ b/tests/golden/WBV2-P1253-001/manifest.json @@ -0,0 +1,116 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1253-001", + "parentTask": "WBV2-P1253-000", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "taskClass": "MODULE", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "BLENDER_WEB_FUNCTION_MODULE", + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1253-000/manifest.json", + "sha256": "3e5bd11f5207d8c4249c4205b434d95820918544858249d2acdb68697a6f1536" + }, + "source1": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_falloff.cc", + "sha256": "31ef2b8eff1d2d78cb4ccdc77fd8fe3a9e8affb8ab2e30ceec312baa2e67e304" + }, + "source2": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_path.cc", + "sha256": "ab0b242082237b130f662a4016a85636c3a372680315277d1061299cdae64c2d" + }, + "source3": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_map_range.cc", + "sha256": "40cab6e554c9b164d5c99767d405af44848aabca6083fd4c30a725d543903111" + }, + "source4": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mapping.cc", + "sha256": "49e99f72b473e13a49e451a1c1ddb991e3bf57486e95213c52e26977d956a8a3" + }, + "source5": { + "path": "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix.cc", + "sha256": "5a19dbd05562b2a230e31e7d79e3e76a23f754551c4a6e767328ec5c9c3af085" + }, + "source6": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "sha256": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "source7": { + "path": "web/tests/e2e/shader-main-reader-production.spec.ts", + "sha256": "1e43659a14084afd46821fb8bbdc1e564d6213ee87193271d172bc2b0452ea6d" + }, + "source8": { + "path": "tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend", + "sha256": "756f0e3898afd16d343d4e989289248d8bfe16c11247c470239b1a7df68df4fd" + }, + "source9": { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "sha256": "66fc59cba55a8c17d398b74d12ea4a9f09746c0f30c40f579c44aa34956e3072" + }, + "evidence1": { + "path": "tests/golden/WBV2-P1253-001/shader-main-reader-production.json", + "sha256": "ec5cee7a9e0b8a6a11b8bde169066a5c7ca11859918c9df2a1b80666d5014ae7" + }, + "moduleReceipt": { + "path": "tests/golden/WBV2-P1253-001/module-receipt.json", + "sha256": "cfaf012888032bf57364ee47691c201541fe3aef7c0d0f111e73b4ba6266c0e6" + }, + "status": { + "path": "docs/status/WBV2-P1253-001.md", + "sha256": "8d62078400067880c7c98f1bf4e4fba96348124416b93de7cdd1952be73d21ca" + }, + "log": { + "path": "tests/golden/WBV2-P1253-001/module-run.log", + "sha256": "e9bed5def7ecb48e9e33e73591f205449c075ccd196391fe1776d666980426e3" + }, + "plan": { + "path": "tests/golden/WBV2-P1253-000/module-execution-plan.json", + "sha256": "fe1b90fc4855e355c1573453d13d8a70ff7c04e4ac5bed4c6ec832923229bf56" + }, + "taskContext": { + "path": "tests/golden/WBV2-P1253-001/task-context.json", + "sha256": "d91487ed3a3c363d64f0a5bb23f1c7a887898a80cac11fae4047e0e412a9f4bc" + } + }, + "assertions": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "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": 939, + "dynamicUnverifiedUnits": 2806, + "planningEstimate": 5200, + "historicalInventoryTotal": 6900, + "historicalEffectiveCompleted": 290, + "historicalEffectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1253-001/module-receipt.json b/tests/golden/WBV2-P1253-001/module-receipt.json new file mode 100644 index 000000000..e10ff1eeb --- /dev/null +++ b/tests/golden/WBV2-P1253-001/module-receipt.json @@ -0,0 +1,154 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1253-001", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16, + "commandCount": 4, + "readCommandCount": 0, + "withinBudget": true + }, + "status": "PASS", + "source": { + "paths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_falloff.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_path.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_map_range.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mapping.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "auditedPaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_falloff.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_path.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_map_range.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mapping.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp" + ], + "before": { + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_falloff.cc": "31ef2b8eff1d2d78cb4ccdc77fd8fe3a9e8affb8ab2e30ceec312baa2e67e304", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_path.cc": "ab0b242082237b130f662a4016a85636c3a372680315277d1061299cdae64c2d", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_map_range.cc": "40cab6e554c9b164d5c99767d405af44848aabca6083fd4c30a725d543903111", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mapping.cc": "49e99f72b473e13a49e451a1c1ddb991e3bf57486e95213c52e26977d956a8a3", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix.cc": "5a19dbd05562b2a230e31e7d79e3e76a23f754551c4a6e767328ec5c9c3af085", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "after": { + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_falloff.cc": "31ef2b8eff1d2d78cb4ccdc77fd8fe3a9e8affb8ab2e30ceec312baa2e67e304", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_path.cc": "ab0b242082237b130f662a4016a85636c3a372680315277d1061299cdae64c2d", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_map_range.cc": "40cab6e554c9b164d5c99767d405af44848aabca6083fd4c30a725d543903111", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mapping.cc": "49e99f72b473e13a49e451a1c1ddb991e3bf57486e95213c52e26977d956a8a3", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix.cc": "5a19dbd05562b2a230e31e7d79e3e76a23f754551c4a6e767328ec5c9c3af085", + "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": [ + "ShaderNodeLightFalloff type is read from Blender Main", + "ShaderNodeLightPath type is read from Blender Main", + "ShaderNodeMapRange type is read from Blender Main", + "ShaderNodeMapping type is read from Blender Main", + "ShaderNodeMix 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": 151 + }, + { + "command": "npm --prefix web run typecheck", + "exitCode": 0, + "durationMs": 3382 + }, + { + "command": "npm --prefix web run build", + "exitCode": 0, + "durationMs": 3891 + }, + { + "command": "WBV2_BATCH_TASK=WBV2-P1253-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1253-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend WBV2_BATCH_TYPES='[\"ShaderNodeLightFalloff\",\"ShaderNodeLightPath\",\"ShaderNodeMapRange\",\"ShaderNodeMapping\",\"ShaderNodeMix\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeLightFalloff\",\"node:ShaderNodeLightPath\",\"node:ShaderNodeMapRange\",\"node:ShaderNodeMapping\",\"node:ShaderNodeMix\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts", + "exitCode": 0, + "durationMs": 2843 + } + ], + "verification": { + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "chromiumOnly": true, + "fullFamilyParity": false + }, + "efficiency": { + "existingEvidenceReused": false, + "skippedCommands": 0, + "totalDurationMs": 10267, + "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": "d8a740105d8efe49d9209dec8d65b8d30111c1db5bdb4e1ce4a7dc0c245ea61a", + "sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "unitCount": 3745, + "planningEstimate": 5200, + "hardTarget": false, + "verifiedUnits": 939, + "unverifiedUnits": 2806 + } + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1253-001/module-run.log b/tests/golden/WBV2-P1253-001/module-run.log new file mode 100644 index 000000000..b6740787b --- /dev/null +++ b/tests/golden/WBV2-P1253-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 462ms +[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-P1253-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1253-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend WBV2_BATCH_TYPES='["ShaderNodeLightFalloff","ShaderNodeLightPath","ShaderNodeMapRange","ShaderNodeMapping","ShaderNodeMix"]' WBV2_BATCH_UNITS='["node:ShaderNodeLightFalloff","node:ShaderNodeLightPath","node:ShaderNodeMapRange","node:ShaderNodeMapping","node:ShaderNodeMix"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts + +> blender-web-editor@0.1.0-rc.1 test:e2e +> playwright test --config playwright.config.ts --workers=1 tests/e2e/shader-main-reader-production.spec.ts + + +Running 1 test using 1 worker + + ✓ 1 tests/e2e/shader-main-reader-production.spec.ts:15:1 › WBV2-P1113-000 reads Shader nodes from Blender Main without JS simulation (1.7s) + + 1 passed (2.5s) +[WebServer] (node:1326700) 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:1326754) 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-P1253-001/shader-main-reader-production.json b/tests/golden/WBV2-P1253-001/shader-main-reader-production.json new file mode 100644 index 000000000..d98e09a22 --- /dev/null +++ b/tests/golden/WBV2-P1253-001/shader-main-reader-production.json @@ -0,0 +1,127 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1253-001", + "operation": "SHADER_MAIN_READER_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": "tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend", + "fixtureSha256": "756f0e3898afd16d343d4e989289248d8bfe16c11247c470239b1a7df68df4fd", + "sourceUnits": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "expectedTypes": [ + "ShaderNodeLightFalloff", + "ShaderNodeLightPath", + "ShaderNodeMapRange", + "ShaderNodeMapping", + "ShaderNodeMix" + ], + "sourceNodes": { + "node:ShaderNodeBsdfPrincipled": "material.nodes[type=PRINCIPLED]", + "node:ShaderNodeOutputMaterial": "material.nodes[type=OUTPUT]" + }, + "materials": [ + { + "id": "material:Material", + "nodes": [ + { + "type": "OUTPUT", + "name": "Material Output" + }, + { + "type": "PRINCIPLED", + "name": "Principled BSDF" + } + ], + "links": [ + { + "fromNodeId": "node:132449552:Principled BSDF", + "fromSocket": "BSDF", + "toNodeId": "node:156502014:Material Output", + "toSocket": "Surface" + } + ] + }, + { + "id": "material:WBV2 Shader Batch", + "nodes": [ + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeLightFalloff" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeLightPath" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeMapRange" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeMapping" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeMix" + } + ], + "links": [] + } + ], + "reopenedMaterials": [ + { + "id": "material:Material", + "nodes": [ + { + "type": "OUTPUT", + "name": "Material Output" + }, + { + "type": "PRINCIPLED", + "name": "Principled BSDF" + } + ], + "links": [ + { + "fromNodeId": "node:132449552:Principled BSDF", + "fromSocket": "BSDF", + "toNodeId": "node:156502014:Material Output", + "toSocket": "Surface" + } + ] + }, + { + "id": "material:WBV2 Shader Batch", + "nodes": [ + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeLightFalloff" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeLightPath" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeMapRange" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeMapping" + }, + { + "type": "UNSUPPORTED", + "name": "WBV2 ShaderNodeMix" + } + ], + "links": [] + } + ], + "openedRevision": 1, + "reopenedRevision": 1 +} diff --git a/tests/golden/WBV2-P1253-001/task-context.json b/tests/golden/WBV2-P1253-001/task-context.json new file mode 100644 index 000000000..8d4c22af5 --- /dev/null +++ b/tests/golden/WBV2-P1253-001/task-context.json @@ -0,0 +1,217 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1253-001", + "parentTask": "WBV2-P1253-000", + "status": "in_progress", + "goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 ShaderNodeLightFalloff, ShaderNodeLightPath, ShaderNodeMapRange, ShaderNodeMapping, ShaderNodeMix 的真实 modifier/RNA 元数据。", + "scope": { + "gap": "capability:AUTO_SHADER_NATIVE_NODE_READER", + "ownerFamily": "NODES", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P1253-001 --write" + ], + "inputPaths": [], + "inputMetadata": { + "docs/EXECUTION_QUEUE.md": { + "path": "docs/EXECUTION_QUEUE.md", + "exists": true, + "bytes": 4030, + "mtime_ns": "1788484627895063830", + "sha256": "f168366aecf1899689b201524f13ab3e6198218ef378860ed0d1a7719d1811a3" + }, + "docs/tasks/WBV2-P1253-001.md": { + "path": "docs/tasks/WBV2-P1253-001.md", + "exists": true, + "bytes": 2588, + "mtime_ns": "1788484617133503982", + "sha256": "19a55cbad112cb37e8252309caeab9d9ef2e965690ed1c3a08c62e848fafa54b" + }, + "tests/golden/WBV2-P1253-000/manifest.json": { + "path": "tests/golden/WBV2-P1253-000/manifest.json", + "exists": true, + "bytes": 1647, + "mtime_ns": "1788484617134452022", + "sha256": "3e5bd11f5207d8c4249c4205b434d95820918544858249d2acdb68697a6f1536" + }, + "docs/status/WBV2-P1253-000.md": { + "path": "docs/status/WBV2-P1253-000.md", + "exists": true, + "bytes": 362, + "mtime_ns": "1788484617133681541", + "sha256": "c98648ecdc330eb82c06c4100aa2632e2365a225e62dbb2dcf452c950643533f" + } + }, + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 1277, + "contextRemainingTokens": 318 + }, + "source": { + "bytes": 8627, + "tokens": 2158 + }, + "selected": [], + "excluded": [ + { + "path": "blender-5.2.0/source/blender/modifiers/intern/", + "bytes": 10155, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "bytes": 521651, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "bytes": 314614, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend", + "bytes": 98611, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/shader-main-reader-production.spec.ts", + "bytes": 3665, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1253-001/module-receipt.json", + "bytes": 7233, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1253-001/modifier-reader-batch-production.json", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P1253-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P1253-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-P1253-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P1253-000/manifest.json", + "parentStatus": "docs/status/WBV2-P1253-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P1253-001.md", + "tests/golden/WBV2-P1253-000/manifest.json", + "docs/status/WBV2-P1253-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-P1253-000", + "parentTask": "WBV2-P1252-001", + "status": "done", + "nextTask": "WBV2-P1253-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P1253-000 status", + "- task: `WBV2-P1253-000`; parent: `WBV2-P1252-001`; status: `done`", + "- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed", + "- source-backed batch authorized: `AUTO_SHADER_NATIVE_NODE_READER` (5 units)", + "- dynamic inventory: `3745` units; verified `934`; unverified `2811`; bound delta `0`", + "- nextTask: `WBV2-P1253-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 2588, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 49, + "taskTokens": 647 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 4030, + "lines": 58, + "tokens": 1008 + }, + { + "path": "docs/tasks/WBV2-P1253-001.md", + "bytes": 2588, + "lines": 49, + "tokens": 647 + }, + { + "path": "tests/golden/WBV2-P1253-000/manifest.json", + "bytes": 1647, + "lines": 51, + "tokens": 412 + }, + { + "path": "docs/status/WBV2-P1253-000.md", + "bytes": 362, + "lines": 8, + "tokens": 91 + } + ], + "sourceTokens": 2158, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 2158, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3182, + "serializedContextTokens": 673, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index 8d55bf697..bf4b598e4 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -283,3 +283,5 @@ {"id":"WBV2-P1251-001","gapId":"AUTO_SHADER_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1251","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} {"id":"WBV2-P1252-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1252","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} {"id":"WBV2-P1252-001","gapId":"AUTO_SHADER_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1252","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]} +{"id":"WBV2-P1253-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1253","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} +{"id":"WBV2-P1253-001","gapId":"AUTO_SHADER_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1253","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 7c003010a..12541dbd3 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-P1252-000/module-execution-plan.json","sha256":"0e9e81c32aee4949c8163a3bd9f39a5b398f8387dda556bea2f24907b301cb17"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"70c638034d92a815c89e64591805f599ec21ad4e937ded8efdbb7821cede0adc"},"taskCount":285,"activeTask":null,"entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":"WBV2-P1164-000"},"WBV2-P1164-000":{"line":107,"offset":38702,"length":303,"previous":"WBV2-P1163-001","next":"WBV2-P1164-001"},"WBV2-P1164-001":{"line":108,"offset":39005,"length":360,"previous":"WBV2-P1164-000","next":"WBV2-P1165-000"},"WBV2-P1165-000":{"line":109,"offset":39365,"length":303,"previous":"WBV2-P1164-001","next":"WBV2-P1165-001"},"WBV2-P1165-001":{"line":110,"offset":39668,"length":366,"previous":"WBV2-P1165-000","next":"WBV2-P1166-000"},"WBV2-P1166-000":{"line":111,"offset":40034,"length":303,"previous":"WBV2-P1165-001","next":"WBV2-P1166-001"},"WBV2-P1166-001":{"line":112,"offset":40337,"length":366,"previous":"WBV2-P1166-000","next":"WBV2-P1167-000"},"WBV2-P1167-000":{"line":113,"offset":40703,"length":303,"previous":"WBV2-P1166-001","next":"WBV2-P1167-001"},"WBV2-P1167-001":{"line":114,"offset":41006,"length":366,"previous":"WBV2-P1167-000","next":"WBV2-P1168-000"},"WBV2-P1168-000":{"line":115,"offset":41372,"length":303,"previous":"WBV2-P1167-001","next":"WBV2-P1168-001"},"WBV2-P1168-001":{"line":116,"offset":41675,"length":366,"previous":"WBV2-P1168-000","next":"WBV2-P1169-000"},"WBV2-P1169-000":{"line":117,"offset":42041,"length":303,"previous":"WBV2-P1168-001","next":"WBV2-P1169-001"},"WBV2-P1169-001":{"line":118,"offset":42344,"length":366,"previous":"WBV2-P1169-000","next":"WBV2-P1170-000"},"WBV2-P1170-000":{"line":119,"offset":42710,"length":303,"previous":"WBV2-P1169-001","next":"WBV2-P1170-001"},"WBV2-P1170-001":{"line":120,"offset":43013,"length":366,"previous":"WBV2-P1170-000","next":"WBV2-P1171-000"},"WBV2-P1171-000":{"line":121,"offset":43379,"length":303,"previous":"WBV2-P1170-001","next":"WBV2-P1171-001"},"WBV2-P1171-001":{"line":122,"offset":43682,"length":366,"previous":"WBV2-P1171-000","next":"WBV2-P1172-000"},"WBV2-P1172-000":{"line":123,"offset":44048,"length":303,"previous":"WBV2-P1171-001","next":"WBV2-P1172-001"},"WBV2-P1172-001":{"line":124,"offset":44351,"length":366,"previous":"WBV2-P1172-000","next":"WBV2-P1173-000"},"WBV2-P1173-000":{"line":125,"offset":44717,"length":303,"previous":"WBV2-P1172-001","next":"WBV2-P1173-001"},"WBV2-P1173-001":{"line":126,"offset":45020,"length":366,"previous":"WBV2-P1173-000","next":"WBV2-P1174-000"},"WBV2-P1174-000":{"line":127,"offset":45386,"length":303,"previous":"WBV2-P1173-001","next":"WBV2-P1174-001"},"WBV2-P1174-001":{"line":128,"offset":45689,"length":366,"previous":"WBV2-P1174-000","next":"WBV2-P1175-000"},"WBV2-P1175-000":{"line":129,"offset":46055,"length":303,"previous":"WBV2-P1174-001","next":"WBV2-P1175-001"},"WBV2-P1175-001":{"line":130,"offset":46358,"length":366,"previous":"WBV2-P1175-000","next":"WBV2-P1176-000"},"WBV2-P1176-000":{"line":131,"offset":46724,"length":303,"previous":"WBV2-P1175-001","next":"WBV2-P1176-001"},"WBV2-P1176-001":{"line":132,"offset":47027,"length":364,"previous":"WBV2-P1176-000","next":"WBV2-P1177-000"},"WBV2-P1177-000":{"line":133,"offset":47391,"length":303,"previous":"WBV2-P1176-001","next":"WBV2-P1177-001"},"WBV2-P1177-001":{"line":134,"offset":47694,"length":364,"previous":"WBV2-P1177-000","next":"WBV2-P1178-000"},"WBV2-P1178-000":{"line":135,"offset":48058,"length":303,"previous":"WBV2-P1177-001","next":"WBV2-P1178-001"},"WBV2-P1178-001":{"line":136,"offset":48361,"length":364,"previous":"WBV2-P1178-000","next":"WBV2-P1179-000"},"WBV2-P1179-000":{"line":137,"offset":48725,"length":303,"previous":"WBV2-P1178-001","next":"WBV2-P1179-001"},"WBV2-P1179-001":{"line":138,"offset":49028,"length":364,"previous":"WBV2-P1179-000","next":"WBV2-P1180-000"},"WBV2-P1180-000":{"line":139,"offset":49392,"length":303,"previous":"WBV2-P1179-001","next":"WBV2-P1180-001"},"WBV2-P1180-001":{"line":140,"offset":49695,"length":364,"previous":"WBV2-P1180-000","next":"WBV2-P1181-000"},"WBV2-P1181-000":{"line":141,"offset":50059,"length":303,"previous":"WBV2-P1180-001","next":"WBV2-P1181-001"},"WBV2-P1181-001":{"line":142,"offset":50362,"length":364,"previous":"WBV2-P1181-000","next":"WBV2-P1182-000"},"WBV2-P1182-000":{"line":143,"offset":50726,"length":303,"previous":"WBV2-P1181-001","next":"WBV2-P1182-001"},"WBV2-P1182-001":{"line":144,"offset":51029,"length":364,"previous":"WBV2-P1182-000","next":"WBV2-P1183-000"},"WBV2-P1183-000":{"line":145,"offset":51393,"length":303,"previous":"WBV2-P1182-001","next":"WBV2-P1183-001"},"WBV2-P1183-001":{"line":146,"offset":51696,"length":364,"previous":"WBV2-P1183-000","next":"WBV2-P1184-000"},"WBV2-P1184-000":{"line":147,"offset":52060,"length":303,"previous":"WBV2-P1183-001","next":"WBV2-P1184-001"},"WBV2-P1184-001":{"line":148,"offset":52363,"length":364,"previous":"WBV2-P1184-000","next":"WBV2-P1185-000"},"WBV2-P1185-000":{"line":149,"offset":52727,"length":303,"previous":"WBV2-P1184-001","next":"WBV2-P1185-001"},"WBV2-P1185-001":{"line":150,"offset":53030,"length":364,"previous":"WBV2-P1185-000","next":"WBV2-P1186-000"},"WBV2-P1186-000":{"line":151,"offset":53394,"length":303,"previous":"WBV2-P1185-001","next":"WBV2-P1186-001"},"WBV2-P1186-001":{"line":152,"offset":53697,"length":364,"previous":"WBV2-P1186-000","next":"WBV2-P1187-000"},"WBV2-P1187-000":{"line":153,"offset":54061,"length":303,"previous":"WBV2-P1186-001","next":"WBV2-P1187-001"},"WBV2-P1187-001":{"line":154,"offset":54364,"length":364,"previous":"WBV2-P1187-000","next":"WBV2-P1188-000"},"WBV2-P1188-000":{"line":155,"offset":54728,"length":303,"previous":"WBV2-P1187-001","next":"WBV2-P1188-001"},"WBV2-P1188-001":{"line":156,"offset":55031,"length":364,"previous":"WBV2-P1188-000","next":"WBV2-P1189-000"},"WBV2-P1189-000":{"line":157,"offset":55395,"length":303,"previous":"WBV2-P1188-001","next":"WBV2-P1189-001"},"WBV2-P1189-001":{"line":158,"offset":55698,"length":364,"previous":"WBV2-P1189-000","next":"WBV2-P1190-000"},"WBV2-P1190-000":{"line":159,"offset":56062,"length":303,"previous":"WBV2-P1189-001","next":"WBV2-P1190-001"},"WBV2-P1190-001":{"line":160,"offset":56365,"length":364,"previous":"WBV2-P1190-000","next":"WBV2-P1191-000"},"WBV2-P1191-000":{"line":161,"offset":56729,"length":303,"previous":"WBV2-P1190-001","next":"WBV2-P1191-001"},"WBV2-P1191-001":{"line":162,"offset":57032,"length":364,"previous":"WBV2-P1191-000","next":"WBV2-P1192-000"},"WBV2-P1192-000":{"line":163,"offset":57396,"length":303,"previous":"WBV2-P1191-001","next":"WBV2-P1192-001"},"WBV2-P1192-001":{"line":164,"offset":57699,"length":364,"previous":"WBV2-P1192-000","next":"WBV2-P1193-000"},"WBV2-P1193-000":{"line":165,"offset":58063,"length":303,"previous":"WBV2-P1192-001","next":"WBV2-P1193-001"},"WBV2-P1193-001":{"line":166,"offset":58366,"length":364,"previous":"WBV2-P1193-000","next":"WBV2-P1194-000"},"WBV2-P1194-000":{"line":167,"offset":58730,"length":303,"previous":"WBV2-P1193-001","next":"WBV2-P1194-001"},"WBV2-P1194-001":{"line":168,"offset":59033,"length":364,"previous":"WBV2-P1194-000","next":"WBV2-P1195-000"},"WBV2-P1195-000":{"line":169,"offset":59397,"length":303,"previous":"WBV2-P1194-001","next":"WBV2-P1195-001"},"WBV2-P1195-001":{"line":170,"offset":59700,"length":364,"previous":"WBV2-P1195-000","next":"WBV2-P1196-000"},"WBV2-P1196-000":{"line":171,"offset":60064,"length":303,"previous":"WBV2-P1195-001","next":"WBV2-P1196-001"},"WBV2-P1196-001":{"line":172,"offset":60367,"length":364,"previous":"WBV2-P1196-000","next":"WBV2-P1197-000"},"WBV2-P1197-000":{"line":173,"offset":60731,"length":303,"previous":"WBV2-P1196-001","next":"WBV2-P1197-001"},"WBV2-P1197-001":{"line":174,"offset":61034,"length":364,"previous":"WBV2-P1197-000","next":"WBV2-P1198-000"},"WBV2-P1198-000":{"line":175,"offset":61398,"length":303,"previous":"WBV2-P1197-001","next":"WBV2-P1198-001"},"WBV2-P1198-001":{"line":176,"offset":61701,"length":364,"previous":"WBV2-P1198-000","next":"WBV2-P1199-000"},"WBV2-P1199-000":{"line":177,"offset":62065,"length":303,"previous":"WBV2-P1198-001","next":"WBV2-P1199-001"},"WBV2-P1199-001":{"line":178,"offset":62368,"length":364,"previous":"WBV2-P1199-000","next":"WBV2-P1200-000"},"WBV2-P1200-000":{"line":179,"offset":62732,"length":303,"previous":"WBV2-P1199-001","next":"WBV2-P1200-001"},"WBV2-P1200-001":{"line":180,"offset":63035,"length":364,"previous":"WBV2-P1200-000","next":"WBV2-P1201-000"},"WBV2-P1201-000":{"line":181,"offset":63399,"length":303,"previous":"WBV2-P1200-001","next":"WBV2-P1201-001"},"WBV2-P1201-001":{"line":182,"offset":63702,"length":364,"previous":"WBV2-P1201-000","next":"WBV2-P1202-000"},"WBV2-P1202-000":{"line":183,"offset":64066,"length":303,"previous":"WBV2-P1201-001","next":"WBV2-P1202-001"},"WBV2-P1202-001":{"line":184,"offset":64369,"length":364,"previous":"WBV2-P1202-000","next":"WBV2-P1203-000"},"WBV2-P1203-000":{"line":185,"offset":64733,"length":303,"previous":"WBV2-P1202-001","next":"WBV2-P1203-001"},"WBV2-P1203-001":{"line":186,"offset":65036,"length":364,"previous":"WBV2-P1203-000","next":"WBV2-P1204-000"},"WBV2-P1204-000":{"line":187,"offset":65400,"length":303,"previous":"WBV2-P1203-001","next":"WBV2-P1204-001"},"WBV2-P1204-001":{"line":188,"offset":65703,"length":364,"previous":"WBV2-P1204-000","next":"WBV2-P1205-000"},"WBV2-P1205-000":{"line":189,"offset":66067,"length":303,"previous":"WBV2-P1204-001","next":"WBV2-P1205-001"},"WBV2-P1205-001":{"line":190,"offset":66370,"length":364,"previous":"WBV2-P1205-000","next":"WBV2-P1206-000"},"WBV2-P1206-000":{"line":191,"offset":66734,"length":303,"previous":"WBV2-P1205-001","next":"WBV2-P1206-001"},"WBV2-P1206-001":{"line":192,"offset":67037,"length":364,"previous":"WBV2-P1206-000","next":"WBV2-P1207-000"},"WBV2-P1207-000":{"line":193,"offset":67401,"length":303,"previous":"WBV2-P1206-001","next":"WBV2-P1207-001"},"WBV2-P1207-001":{"line":194,"offset":67704,"length":364,"previous":"WBV2-P1207-000","next":"WBV2-P1208-000"},"WBV2-P1208-000":{"line":195,"offset":68068,"length":303,"previous":"WBV2-P1207-001","next":"WBV2-P1208-001"},"WBV2-P1208-001":{"line":196,"offset":68371,"length":364,"previous":"WBV2-P1208-000","next":"WBV2-P1209-000"},"WBV2-P1209-000":{"line":197,"offset":68735,"length":303,"previous":"WBV2-P1208-001","next":"WBV2-P1209-001"},"WBV2-P1209-001":{"line":198,"offset":69038,"length":364,"previous":"WBV2-P1209-000","next":"WBV2-P1210-000"},"WBV2-P1210-000":{"line":199,"offset":69402,"length":303,"previous":"WBV2-P1209-001","next":"WBV2-P1210-001"},"WBV2-P1210-001":{"line":200,"offset":69705,"length":364,"previous":"WBV2-P1210-000","next":"WBV2-P1211-000"},"WBV2-P1211-000":{"line":201,"offset":70069,"length":303,"previous":"WBV2-P1210-001","next":"WBV2-P1211-001"},"WBV2-P1211-001":{"line":202,"offset":70372,"length":364,"previous":"WBV2-P1211-000","next":"WBV2-P1212-000"},"WBV2-P1212-000":{"line":203,"offset":70736,"length":303,"previous":"WBV2-P1211-001","next":"WBV2-P1212-001"},"WBV2-P1212-001":{"line":204,"offset":71039,"length":364,"previous":"WBV2-P1212-000","next":"WBV2-P1213-000"},"WBV2-P1213-000":{"line":205,"offset":71403,"length":303,"previous":"WBV2-P1212-001","next":"WBV2-P1213-001"},"WBV2-P1213-001":{"line":206,"offset":71706,"length":364,"previous":"WBV2-P1213-000","next":"WBV2-P1214-000"},"WBV2-P1214-000":{"line":207,"offset":72070,"length":303,"previous":"WBV2-P1213-001","next":"WBV2-P1214-001"},"WBV2-P1214-001":{"line":208,"offset":72373,"length":364,"previous":"WBV2-P1214-000","next":"WBV2-P1215-000"},"WBV2-P1215-000":{"line":209,"offset":72737,"length":303,"previous":"WBV2-P1214-001","next":"WBV2-P1215-001"},"WBV2-P1215-001":{"line":210,"offset":73040,"length":364,"previous":"WBV2-P1215-000","next":"WBV2-P1216-000"},"WBV2-P1216-000":{"line":211,"offset":73404,"length":303,"previous":"WBV2-P1215-001","next":"WBV2-P1216-001"},"WBV2-P1216-001":{"line":212,"offset":73707,"length":364,"previous":"WBV2-P1216-000","next":"WBV2-P1217-000"},"WBV2-P1217-000":{"line":213,"offset":74071,"length":303,"previous":"WBV2-P1216-001","next":"WBV2-P1217-001"},"WBV2-P1217-001":{"line":214,"offset":74374,"length":364,"previous":"WBV2-P1217-000","next":"WBV2-P1218-000"},"WBV2-P1218-000":{"line":215,"offset":74738,"length":303,"previous":"WBV2-P1217-001","next":"WBV2-P1218-001"},"WBV2-P1218-001":{"line":216,"offset":75041,"length":364,"previous":"WBV2-P1218-000","next":"WBV2-P1219-000"},"WBV2-P1219-000":{"line":217,"offset":75405,"length":303,"previous":"WBV2-P1218-001","next":"WBV2-P1219-001"},"WBV2-P1219-001":{"line":218,"offset":75708,"length":364,"previous":"WBV2-P1219-000","next":"WBV2-P1220-000"},"WBV2-P1220-000":{"line":219,"offset":76072,"length":303,"previous":"WBV2-P1219-001","next":"WBV2-P1220-001"},"WBV2-P1220-001":{"line":220,"offset":76375,"length":364,"previous":"WBV2-P1220-000","next":"WBV2-P1221-000"},"WBV2-P1221-000":{"line":221,"offset":76739,"length":303,"previous":"WBV2-P1220-001","next":"WBV2-P1221-001"},"WBV2-P1221-001":{"line":222,"offset":77042,"length":364,"previous":"WBV2-P1221-000","next":"WBV2-P1222-000"},"WBV2-P1222-000":{"line":223,"offset":77406,"length":303,"previous":"WBV2-P1221-001","next":"WBV2-P1222-001"},"WBV2-P1222-001":{"line":224,"offset":77709,"length":364,"previous":"WBV2-P1222-000","next":"WBV2-P1223-000"},"WBV2-P1223-000":{"line":225,"offset":78073,"length":303,"previous":"WBV2-P1222-001","next":"WBV2-P1223-001"},"WBV2-P1223-001":{"line":226,"offset":78376,"length":364,"previous":"WBV2-P1223-000","next":"WBV2-P1224-000"},"WBV2-P1224-000":{"line":227,"offset":78740,"length":303,"previous":"WBV2-P1223-001","next":"WBV2-P1224-001"},"WBV2-P1224-001":{"line":228,"offset":79043,"length":364,"previous":"WBV2-P1224-000","next":"WBV2-P1225-000"},"WBV2-P1225-000":{"line":229,"offset":79407,"length":303,"previous":"WBV2-P1224-001","next":"WBV2-P1225-001"},"WBV2-P1225-001":{"line":230,"offset":79710,"length":364,"previous":"WBV2-P1225-000","next":"WBV2-P1226-000"},"WBV2-P1226-000":{"line":231,"offset":80074,"length":303,"previous":"WBV2-P1225-001","next":"WBV2-P1226-001"},"WBV2-P1226-001":{"line":232,"offset":80377,"length":364,"previous":"WBV2-P1226-000","next":"WBV2-P1227-000"},"WBV2-P1227-000":{"line":233,"offset":80741,"length":303,"previous":"WBV2-P1226-001","next":"WBV2-P1227-001"},"WBV2-P1227-001":{"line":234,"offset":81044,"length":364,"previous":"WBV2-P1227-000","next":"WBV2-P1228-000"},"WBV2-P1228-000":{"line":235,"offset":81408,"length":303,"previous":"WBV2-P1227-001","next":"WBV2-P1228-001"},"WBV2-P1228-001":{"line":236,"offset":81711,"length":364,"previous":"WBV2-P1228-000","next":"WBV2-P1229-000"},"WBV2-P1229-000":{"line":237,"offset":82075,"length":303,"previous":"WBV2-P1228-001","next":"WBV2-P1229-001"},"WBV2-P1229-001":{"line":238,"offset":82378,"length":364,"previous":"WBV2-P1229-000","next":"WBV2-P1230-000"},"WBV2-P1230-000":{"line":239,"offset":82742,"length":303,"previous":"WBV2-P1229-001","next":"WBV2-P1230-001"},"WBV2-P1230-001":{"line":240,"offset":83045,"length":364,"previous":"WBV2-P1230-000","next":"WBV2-P1231-000"},"WBV2-P1231-000":{"line":241,"offset":83409,"length":303,"previous":"WBV2-P1230-001","next":"WBV2-P1231-001"},"WBV2-P1231-001":{"line":242,"offset":83712,"length":364,"previous":"WBV2-P1231-000","next":"WBV2-P1232-000"},"WBV2-P1232-000":{"line":243,"offset":84076,"length":303,"previous":"WBV2-P1231-001","next":"WBV2-P1232-001"},"WBV2-P1232-001":{"line":244,"offset":84379,"length":364,"previous":"WBV2-P1232-000","next":"WBV2-P1233-000"},"WBV2-P1233-000":{"line":245,"offset":84743,"length":303,"previous":"WBV2-P1232-001","next":"WBV2-P1233-001"},"WBV2-P1233-001":{"line":246,"offset":85046,"length":364,"previous":"WBV2-P1233-000","next":"WBV2-P1234-000"},"WBV2-P1234-000":{"line":247,"offset":85410,"length":303,"previous":"WBV2-P1233-001","next":"WBV2-P1234-001"},"WBV2-P1234-001":{"line":248,"offset":85713,"length":364,"previous":"WBV2-P1234-000","next":"WBV2-P1235-000"},"WBV2-P1235-000":{"line":249,"offset":86077,"length":303,"previous":"WBV2-P1234-001","next":"WBV2-P1235-001"},"WBV2-P1235-001":{"line":250,"offset":86380,"length":364,"previous":"WBV2-P1235-000","next":"WBV2-P1236-000"},"WBV2-P1236-000":{"line":251,"offset":86744,"length":303,"previous":"WBV2-P1235-001","next":"WBV2-P1236-001"},"WBV2-P1236-001":{"line":252,"offset":87047,"length":364,"previous":"WBV2-P1236-000","next":"WBV2-P1237-000"},"WBV2-P1237-000":{"line":253,"offset":87411,"length":303,"previous":"WBV2-P1236-001","next":"WBV2-P1237-001"},"WBV2-P1237-001":{"line":254,"offset":87714,"length":364,"previous":"WBV2-P1237-000","next":"WBV2-P1238-000"},"WBV2-P1238-000":{"line":255,"offset":88078,"length":303,"previous":"WBV2-P1237-001","next":"WBV2-P1238-001"},"WBV2-P1238-001":{"line":256,"offset":88381,"length":364,"previous":"WBV2-P1238-000","next":"WBV2-P1239-000"},"WBV2-P1239-000":{"line":257,"offset":88745,"length":303,"previous":"WBV2-P1238-001","next":"WBV2-P1239-001"},"WBV2-P1239-001":{"line":258,"offset":89048,"length":364,"previous":"WBV2-P1239-000","next":"WBV2-P1240-000"},"WBV2-P1240-000":{"line":259,"offset":89412,"length":303,"previous":"WBV2-P1239-001","next":"WBV2-P1240-001"},"WBV2-P1240-001":{"line":260,"offset":89715,"length":364,"previous":"WBV2-P1240-000","next":"WBV2-P1241-000"},"WBV2-P1241-000":{"line":261,"offset":90079,"length":303,"previous":"WBV2-P1240-001","next":"WBV2-P1241-001"},"WBV2-P1241-001":{"line":262,"offset":90382,"length":364,"previous":"WBV2-P1241-000","next":"WBV2-P1242-000"},"WBV2-P1242-000":{"line":263,"offset":90746,"length":303,"previous":"WBV2-P1241-001","next":"WBV2-P1242-001"},"WBV2-P1242-001":{"line":264,"offset":91049,"length":364,"previous":"WBV2-P1242-000","next":"WBV2-P1243-000"},"WBV2-P1243-000":{"line":265,"offset":91413,"length":303,"previous":"WBV2-P1242-001","next":"WBV2-P1243-001"},"WBV2-P1243-001":{"line":266,"offset":91716,"length":364,"previous":"WBV2-P1243-000","next":"WBV2-P1244-000"},"WBV2-P1244-000":{"line":267,"offset":92080,"length":303,"previous":"WBV2-P1243-001","next":"WBV2-P1244-001"},"WBV2-P1244-001":{"line":268,"offset":92383,"length":364,"previous":"WBV2-P1244-000","next":"WBV2-P1245-000"},"WBV2-P1245-000":{"line":269,"offset":92747,"length":303,"previous":"WBV2-P1244-001","next":"WBV2-P1245-001"},"WBV2-P1245-001":{"line":270,"offset":93050,"length":364,"previous":"WBV2-P1245-000","next":"WBV2-P1246-000"},"WBV2-P1246-000":{"line":271,"offset":93414,"length":303,"previous":"WBV2-P1245-001","next":"WBV2-P1246-001"},"WBV2-P1246-001":{"line":272,"offset":93717,"length":362,"previous":"WBV2-P1246-000","next":"WBV2-P1247-000"},"WBV2-P1247-000":{"line":273,"offset":94079,"length":303,"previous":"WBV2-P1246-001","next":"WBV2-P1247-001"},"WBV2-P1247-001":{"line":274,"offset":94382,"length":362,"previous":"WBV2-P1247-000","next":"WBV2-P1248-000"},"WBV2-P1248-000":{"line":275,"offset":94744,"length":303,"previous":"WBV2-P1247-001","next":"WBV2-P1248-001"},"WBV2-P1248-001":{"line":276,"offset":95047,"length":362,"previous":"WBV2-P1248-000","next":"WBV2-P1249-000"},"WBV2-P1249-000":{"line":277,"offset":95409,"length":303,"previous":"WBV2-P1248-001","next":"WBV2-P1249-001"},"WBV2-P1249-001":{"line":278,"offset":95712,"length":362,"previous":"WBV2-P1249-000","next":"WBV2-P1250-000"},"WBV2-P1250-000":{"line":279,"offset":96074,"length":303,"previous":"WBV2-P1249-001","next":"WBV2-P1250-001"},"WBV2-P1250-001":{"line":280,"offset":96377,"length":362,"previous":"WBV2-P1250-000","next":"WBV2-P1251-000"},"WBV2-P1251-000":{"line":281,"offset":96739,"length":303,"previous":"WBV2-P1250-001","next":"WBV2-P1251-001"},"WBV2-P1251-001":{"line":282,"offset":97042,"length":362,"previous":"WBV2-P1251-000","next":"WBV2-P1252-000"},"WBV2-P1252-000":{"line":283,"offset":97404,"length":303,"previous":"WBV2-P1251-001","next":"WBV2-P1252-001"},"WBV2-P1252-001":{"line":284,"offset":97707,"length":362,"previous":"WBV2-P1252-000","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1253-000/module-execution-plan.json","sha256":"fe1b90fc4855e355c1573453d13d8a70ff7c04e4ac5bed4c6ec832923229bf56"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"ea1595989796bd8a58dc8dd554645bae6ff1421ac81def2225ea7c8c6ad823f8"},"taskCount":287,"activeTask":null,"entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":"WBV2-P1164-000"},"WBV2-P1164-000":{"line":107,"offset":38702,"length":303,"previous":"WBV2-P1163-001","next":"WBV2-P1164-001"},"WBV2-P1164-001":{"line":108,"offset":39005,"length":360,"previous":"WBV2-P1164-000","next":"WBV2-P1165-000"},"WBV2-P1165-000":{"line":109,"offset":39365,"length":303,"previous":"WBV2-P1164-001","next":"WBV2-P1165-001"},"WBV2-P1165-001":{"line":110,"offset":39668,"length":366,"previous":"WBV2-P1165-000","next":"WBV2-P1166-000"},"WBV2-P1166-000":{"line":111,"offset":40034,"length":303,"previous":"WBV2-P1165-001","next":"WBV2-P1166-001"},"WBV2-P1166-001":{"line":112,"offset":40337,"length":366,"previous":"WBV2-P1166-000","next":"WBV2-P1167-000"},"WBV2-P1167-000":{"line":113,"offset":40703,"length":303,"previous":"WBV2-P1166-001","next":"WBV2-P1167-001"},"WBV2-P1167-001":{"line":114,"offset":41006,"length":366,"previous":"WBV2-P1167-000","next":"WBV2-P1168-000"},"WBV2-P1168-000":{"line":115,"offset":41372,"length":303,"previous":"WBV2-P1167-001","next":"WBV2-P1168-001"},"WBV2-P1168-001":{"line":116,"offset":41675,"length":366,"previous":"WBV2-P1168-000","next":"WBV2-P1169-000"},"WBV2-P1169-000":{"line":117,"offset":42041,"length":303,"previous":"WBV2-P1168-001","next":"WBV2-P1169-001"},"WBV2-P1169-001":{"line":118,"offset":42344,"length":366,"previous":"WBV2-P1169-000","next":"WBV2-P1170-000"},"WBV2-P1170-000":{"line":119,"offset":42710,"length":303,"previous":"WBV2-P1169-001","next":"WBV2-P1170-001"},"WBV2-P1170-001":{"line":120,"offset":43013,"length":366,"previous":"WBV2-P1170-000","next":"WBV2-P1171-000"},"WBV2-P1171-000":{"line":121,"offset":43379,"length":303,"previous":"WBV2-P1170-001","next":"WBV2-P1171-001"},"WBV2-P1171-001":{"line":122,"offset":43682,"length":366,"previous":"WBV2-P1171-000","next":"WBV2-P1172-000"},"WBV2-P1172-000":{"line":123,"offset":44048,"length":303,"previous":"WBV2-P1171-001","next":"WBV2-P1172-001"},"WBV2-P1172-001":{"line":124,"offset":44351,"length":366,"previous":"WBV2-P1172-000","next":"WBV2-P1173-000"},"WBV2-P1173-000":{"line":125,"offset":44717,"length":303,"previous":"WBV2-P1172-001","next":"WBV2-P1173-001"},"WBV2-P1173-001":{"line":126,"offset":45020,"length":366,"previous":"WBV2-P1173-000","next":"WBV2-P1174-000"},"WBV2-P1174-000":{"line":127,"offset":45386,"length":303,"previous":"WBV2-P1173-001","next":"WBV2-P1174-001"},"WBV2-P1174-001":{"line":128,"offset":45689,"length":366,"previous":"WBV2-P1174-000","next":"WBV2-P1175-000"},"WBV2-P1175-000":{"line":129,"offset":46055,"length":303,"previous":"WBV2-P1174-001","next":"WBV2-P1175-001"},"WBV2-P1175-001":{"line":130,"offset":46358,"length":366,"previous":"WBV2-P1175-000","next":"WBV2-P1176-000"},"WBV2-P1176-000":{"line":131,"offset":46724,"length":303,"previous":"WBV2-P1175-001","next":"WBV2-P1176-001"},"WBV2-P1176-001":{"line":132,"offset":47027,"length":364,"previous":"WBV2-P1176-000","next":"WBV2-P1177-000"},"WBV2-P1177-000":{"line":133,"offset":47391,"length":303,"previous":"WBV2-P1176-001","next":"WBV2-P1177-001"},"WBV2-P1177-001":{"line":134,"offset":47694,"length":364,"previous":"WBV2-P1177-000","next":"WBV2-P1178-000"},"WBV2-P1178-000":{"line":135,"offset":48058,"length":303,"previous":"WBV2-P1177-001","next":"WBV2-P1178-001"},"WBV2-P1178-001":{"line":136,"offset":48361,"length":364,"previous":"WBV2-P1178-000","next":"WBV2-P1179-000"},"WBV2-P1179-000":{"line":137,"offset":48725,"length":303,"previous":"WBV2-P1178-001","next":"WBV2-P1179-001"},"WBV2-P1179-001":{"line":138,"offset":49028,"length":364,"previous":"WBV2-P1179-000","next":"WBV2-P1180-000"},"WBV2-P1180-000":{"line":139,"offset":49392,"length":303,"previous":"WBV2-P1179-001","next":"WBV2-P1180-001"},"WBV2-P1180-001":{"line":140,"offset":49695,"length":364,"previous":"WBV2-P1180-000","next":"WBV2-P1181-000"},"WBV2-P1181-000":{"line":141,"offset":50059,"length":303,"previous":"WBV2-P1180-001","next":"WBV2-P1181-001"},"WBV2-P1181-001":{"line":142,"offset":50362,"length":364,"previous":"WBV2-P1181-000","next":"WBV2-P1182-000"},"WBV2-P1182-000":{"line":143,"offset":50726,"length":303,"previous":"WBV2-P1181-001","next":"WBV2-P1182-001"},"WBV2-P1182-001":{"line":144,"offset":51029,"length":364,"previous":"WBV2-P1182-000","next":"WBV2-P1183-000"},"WBV2-P1183-000":{"line":145,"offset":51393,"length":303,"previous":"WBV2-P1182-001","next":"WBV2-P1183-001"},"WBV2-P1183-001":{"line":146,"offset":51696,"length":364,"previous":"WBV2-P1183-000","next":"WBV2-P1184-000"},"WBV2-P1184-000":{"line":147,"offset":52060,"length":303,"previous":"WBV2-P1183-001","next":"WBV2-P1184-001"},"WBV2-P1184-001":{"line":148,"offset":52363,"length":364,"previous":"WBV2-P1184-000","next":"WBV2-P1185-000"},"WBV2-P1185-000":{"line":149,"offset":52727,"length":303,"previous":"WBV2-P1184-001","next":"WBV2-P1185-001"},"WBV2-P1185-001":{"line":150,"offset":53030,"length":364,"previous":"WBV2-P1185-000","next":"WBV2-P1186-000"},"WBV2-P1186-000":{"line":151,"offset":53394,"length":303,"previous":"WBV2-P1185-001","next":"WBV2-P1186-001"},"WBV2-P1186-001":{"line":152,"offset":53697,"length":364,"previous":"WBV2-P1186-000","next":"WBV2-P1187-000"},"WBV2-P1187-000":{"line":153,"offset":54061,"length":303,"previous":"WBV2-P1186-001","next":"WBV2-P1187-001"},"WBV2-P1187-001":{"line":154,"offset":54364,"length":364,"previous":"WBV2-P1187-000","next":"WBV2-P1188-000"},"WBV2-P1188-000":{"line":155,"offset":54728,"length":303,"previous":"WBV2-P1187-001","next":"WBV2-P1188-001"},"WBV2-P1188-001":{"line":156,"offset":55031,"length":364,"previous":"WBV2-P1188-000","next":"WBV2-P1189-000"},"WBV2-P1189-000":{"line":157,"offset":55395,"length":303,"previous":"WBV2-P1188-001","next":"WBV2-P1189-001"},"WBV2-P1189-001":{"line":158,"offset":55698,"length":364,"previous":"WBV2-P1189-000","next":"WBV2-P1190-000"},"WBV2-P1190-000":{"line":159,"offset":56062,"length":303,"previous":"WBV2-P1189-001","next":"WBV2-P1190-001"},"WBV2-P1190-001":{"line":160,"offset":56365,"length":364,"previous":"WBV2-P1190-000","next":"WBV2-P1191-000"},"WBV2-P1191-000":{"line":161,"offset":56729,"length":303,"previous":"WBV2-P1190-001","next":"WBV2-P1191-001"},"WBV2-P1191-001":{"line":162,"offset":57032,"length":364,"previous":"WBV2-P1191-000","next":"WBV2-P1192-000"},"WBV2-P1192-000":{"line":163,"offset":57396,"length":303,"previous":"WBV2-P1191-001","next":"WBV2-P1192-001"},"WBV2-P1192-001":{"line":164,"offset":57699,"length":364,"previous":"WBV2-P1192-000","next":"WBV2-P1193-000"},"WBV2-P1193-000":{"line":165,"offset":58063,"length":303,"previous":"WBV2-P1192-001","next":"WBV2-P1193-001"},"WBV2-P1193-001":{"line":166,"offset":58366,"length":364,"previous":"WBV2-P1193-000","next":"WBV2-P1194-000"},"WBV2-P1194-000":{"line":167,"offset":58730,"length":303,"previous":"WBV2-P1193-001","next":"WBV2-P1194-001"},"WBV2-P1194-001":{"line":168,"offset":59033,"length":364,"previous":"WBV2-P1194-000","next":"WBV2-P1195-000"},"WBV2-P1195-000":{"line":169,"offset":59397,"length":303,"previous":"WBV2-P1194-001","next":"WBV2-P1195-001"},"WBV2-P1195-001":{"line":170,"offset":59700,"length":364,"previous":"WBV2-P1195-000","next":"WBV2-P1196-000"},"WBV2-P1196-000":{"line":171,"offset":60064,"length":303,"previous":"WBV2-P1195-001","next":"WBV2-P1196-001"},"WBV2-P1196-001":{"line":172,"offset":60367,"length":364,"previous":"WBV2-P1196-000","next":"WBV2-P1197-000"},"WBV2-P1197-000":{"line":173,"offset":60731,"length":303,"previous":"WBV2-P1196-001","next":"WBV2-P1197-001"},"WBV2-P1197-001":{"line":174,"offset":61034,"length":364,"previous":"WBV2-P1197-000","next":"WBV2-P1198-000"},"WBV2-P1198-000":{"line":175,"offset":61398,"length":303,"previous":"WBV2-P1197-001","next":"WBV2-P1198-001"},"WBV2-P1198-001":{"line":176,"offset":61701,"length":364,"previous":"WBV2-P1198-000","next":"WBV2-P1199-000"},"WBV2-P1199-000":{"line":177,"offset":62065,"length":303,"previous":"WBV2-P1198-001","next":"WBV2-P1199-001"},"WBV2-P1199-001":{"line":178,"offset":62368,"length":364,"previous":"WBV2-P1199-000","next":"WBV2-P1200-000"},"WBV2-P1200-000":{"line":179,"offset":62732,"length":303,"previous":"WBV2-P1199-001","next":"WBV2-P1200-001"},"WBV2-P1200-001":{"line":180,"offset":63035,"length":364,"previous":"WBV2-P1200-000","next":"WBV2-P1201-000"},"WBV2-P1201-000":{"line":181,"offset":63399,"length":303,"previous":"WBV2-P1200-001","next":"WBV2-P1201-001"},"WBV2-P1201-001":{"line":182,"offset":63702,"length":364,"previous":"WBV2-P1201-000","next":"WBV2-P1202-000"},"WBV2-P1202-000":{"line":183,"offset":64066,"length":303,"previous":"WBV2-P1201-001","next":"WBV2-P1202-001"},"WBV2-P1202-001":{"line":184,"offset":64369,"length":364,"previous":"WBV2-P1202-000","next":"WBV2-P1203-000"},"WBV2-P1203-000":{"line":185,"offset":64733,"length":303,"previous":"WBV2-P1202-001","next":"WBV2-P1203-001"},"WBV2-P1203-001":{"line":186,"offset":65036,"length":364,"previous":"WBV2-P1203-000","next":"WBV2-P1204-000"},"WBV2-P1204-000":{"line":187,"offset":65400,"length":303,"previous":"WBV2-P1203-001","next":"WBV2-P1204-001"},"WBV2-P1204-001":{"line":188,"offset":65703,"length":364,"previous":"WBV2-P1204-000","next":"WBV2-P1205-000"},"WBV2-P1205-000":{"line":189,"offset":66067,"length":303,"previous":"WBV2-P1204-001","next":"WBV2-P1205-001"},"WBV2-P1205-001":{"line":190,"offset":66370,"length":364,"previous":"WBV2-P1205-000","next":"WBV2-P1206-000"},"WBV2-P1206-000":{"line":191,"offset":66734,"length":303,"previous":"WBV2-P1205-001","next":"WBV2-P1206-001"},"WBV2-P1206-001":{"line":192,"offset":67037,"length":364,"previous":"WBV2-P1206-000","next":"WBV2-P1207-000"},"WBV2-P1207-000":{"line":193,"offset":67401,"length":303,"previous":"WBV2-P1206-001","next":"WBV2-P1207-001"},"WBV2-P1207-001":{"line":194,"offset":67704,"length":364,"previous":"WBV2-P1207-000","next":"WBV2-P1208-000"},"WBV2-P1208-000":{"line":195,"offset":68068,"length":303,"previous":"WBV2-P1207-001","next":"WBV2-P1208-001"},"WBV2-P1208-001":{"line":196,"offset":68371,"length":364,"previous":"WBV2-P1208-000","next":"WBV2-P1209-000"},"WBV2-P1209-000":{"line":197,"offset":68735,"length":303,"previous":"WBV2-P1208-001","next":"WBV2-P1209-001"},"WBV2-P1209-001":{"line":198,"offset":69038,"length":364,"previous":"WBV2-P1209-000","next":"WBV2-P1210-000"},"WBV2-P1210-000":{"line":199,"offset":69402,"length":303,"previous":"WBV2-P1209-001","next":"WBV2-P1210-001"},"WBV2-P1210-001":{"line":200,"offset":69705,"length":364,"previous":"WBV2-P1210-000","next":"WBV2-P1211-000"},"WBV2-P1211-000":{"line":201,"offset":70069,"length":303,"previous":"WBV2-P1210-001","next":"WBV2-P1211-001"},"WBV2-P1211-001":{"line":202,"offset":70372,"length":364,"previous":"WBV2-P1211-000","next":"WBV2-P1212-000"},"WBV2-P1212-000":{"line":203,"offset":70736,"length":303,"previous":"WBV2-P1211-001","next":"WBV2-P1212-001"},"WBV2-P1212-001":{"line":204,"offset":71039,"length":364,"previous":"WBV2-P1212-000","next":"WBV2-P1213-000"},"WBV2-P1213-000":{"line":205,"offset":71403,"length":303,"previous":"WBV2-P1212-001","next":"WBV2-P1213-001"},"WBV2-P1213-001":{"line":206,"offset":71706,"length":364,"previous":"WBV2-P1213-000","next":"WBV2-P1214-000"},"WBV2-P1214-000":{"line":207,"offset":72070,"length":303,"previous":"WBV2-P1213-001","next":"WBV2-P1214-001"},"WBV2-P1214-001":{"line":208,"offset":72373,"length":364,"previous":"WBV2-P1214-000","next":"WBV2-P1215-000"},"WBV2-P1215-000":{"line":209,"offset":72737,"length":303,"previous":"WBV2-P1214-001","next":"WBV2-P1215-001"},"WBV2-P1215-001":{"line":210,"offset":73040,"length":364,"previous":"WBV2-P1215-000","next":"WBV2-P1216-000"},"WBV2-P1216-000":{"line":211,"offset":73404,"length":303,"previous":"WBV2-P1215-001","next":"WBV2-P1216-001"},"WBV2-P1216-001":{"line":212,"offset":73707,"length":364,"previous":"WBV2-P1216-000","next":"WBV2-P1217-000"},"WBV2-P1217-000":{"line":213,"offset":74071,"length":303,"previous":"WBV2-P1216-001","next":"WBV2-P1217-001"},"WBV2-P1217-001":{"line":214,"offset":74374,"length":364,"previous":"WBV2-P1217-000","next":"WBV2-P1218-000"},"WBV2-P1218-000":{"line":215,"offset":74738,"length":303,"previous":"WBV2-P1217-001","next":"WBV2-P1218-001"},"WBV2-P1218-001":{"line":216,"offset":75041,"length":364,"previous":"WBV2-P1218-000","next":"WBV2-P1219-000"},"WBV2-P1219-000":{"line":217,"offset":75405,"length":303,"previous":"WBV2-P1218-001","next":"WBV2-P1219-001"},"WBV2-P1219-001":{"line":218,"offset":75708,"length":364,"previous":"WBV2-P1219-000","next":"WBV2-P1220-000"},"WBV2-P1220-000":{"line":219,"offset":76072,"length":303,"previous":"WBV2-P1219-001","next":"WBV2-P1220-001"},"WBV2-P1220-001":{"line":220,"offset":76375,"length":364,"previous":"WBV2-P1220-000","next":"WBV2-P1221-000"},"WBV2-P1221-000":{"line":221,"offset":76739,"length":303,"previous":"WBV2-P1220-001","next":"WBV2-P1221-001"},"WBV2-P1221-001":{"line":222,"offset":77042,"length":364,"previous":"WBV2-P1221-000","next":"WBV2-P1222-000"},"WBV2-P1222-000":{"line":223,"offset":77406,"length":303,"previous":"WBV2-P1221-001","next":"WBV2-P1222-001"},"WBV2-P1222-001":{"line":224,"offset":77709,"length":364,"previous":"WBV2-P1222-000","next":"WBV2-P1223-000"},"WBV2-P1223-000":{"line":225,"offset":78073,"length":303,"previous":"WBV2-P1222-001","next":"WBV2-P1223-001"},"WBV2-P1223-001":{"line":226,"offset":78376,"length":364,"previous":"WBV2-P1223-000","next":"WBV2-P1224-000"},"WBV2-P1224-000":{"line":227,"offset":78740,"length":303,"previous":"WBV2-P1223-001","next":"WBV2-P1224-001"},"WBV2-P1224-001":{"line":228,"offset":79043,"length":364,"previous":"WBV2-P1224-000","next":"WBV2-P1225-000"},"WBV2-P1225-000":{"line":229,"offset":79407,"length":303,"previous":"WBV2-P1224-001","next":"WBV2-P1225-001"},"WBV2-P1225-001":{"line":230,"offset":79710,"length":364,"previous":"WBV2-P1225-000","next":"WBV2-P1226-000"},"WBV2-P1226-000":{"line":231,"offset":80074,"length":303,"previous":"WBV2-P1225-001","next":"WBV2-P1226-001"},"WBV2-P1226-001":{"line":232,"offset":80377,"length":364,"previous":"WBV2-P1226-000","next":"WBV2-P1227-000"},"WBV2-P1227-000":{"line":233,"offset":80741,"length":303,"previous":"WBV2-P1226-001","next":"WBV2-P1227-001"},"WBV2-P1227-001":{"line":234,"offset":81044,"length":364,"previous":"WBV2-P1227-000","next":"WBV2-P1228-000"},"WBV2-P1228-000":{"line":235,"offset":81408,"length":303,"previous":"WBV2-P1227-001","next":"WBV2-P1228-001"},"WBV2-P1228-001":{"line":236,"offset":81711,"length":364,"previous":"WBV2-P1228-000","next":"WBV2-P1229-000"},"WBV2-P1229-000":{"line":237,"offset":82075,"length":303,"previous":"WBV2-P1228-001","next":"WBV2-P1229-001"},"WBV2-P1229-001":{"line":238,"offset":82378,"length":364,"previous":"WBV2-P1229-000","next":"WBV2-P1230-000"},"WBV2-P1230-000":{"line":239,"offset":82742,"length":303,"previous":"WBV2-P1229-001","next":"WBV2-P1230-001"},"WBV2-P1230-001":{"line":240,"offset":83045,"length":364,"previous":"WBV2-P1230-000","next":"WBV2-P1231-000"},"WBV2-P1231-000":{"line":241,"offset":83409,"length":303,"previous":"WBV2-P1230-001","next":"WBV2-P1231-001"},"WBV2-P1231-001":{"line":242,"offset":83712,"length":364,"previous":"WBV2-P1231-000","next":"WBV2-P1232-000"},"WBV2-P1232-000":{"line":243,"offset":84076,"length":303,"previous":"WBV2-P1231-001","next":"WBV2-P1232-001"},"WBV2-P1232-001":{"line":244,"offset":84379,"length":364,"previous":"WBV2-P1232-000","next":"WBV2-P1233-000"},"WBV2-P1233-000":{"line":245,"offset":84743,"length":303,"previous":"WBV2-P1232-001","next":"WBV2-P1233-001"},"WBV2-P1233-001":{"line":246,"offset":85046,"length":364,"previous":"WBV2-P1233-000","next":"WBV2-P1234-000"},"WBV2-P1234-000":{"line":247,"offset":85410,"length":303,"previous":"WBV2-P1233-001","next":"WBV2-P1234-001"},"WBV2-P1234-001":{"line":248,"offset":85713,"length":364,"previous":"WBV2-P1234-000","next":"WBV2-P1235-000"},"WBV2-P1235-000":{"line":249,"offset":86077,"length":303,"previous":"WBV2-P1234-001","next":"WBV2-P1235-001"},"WBV2-P1235-001":{"line":250,"offset":86380,"length":364,"previous":"WBV2-P1235-000","next":"WBV2-P1236-000"},"WBV2-P1236-000":{"line":251,"offset":86744,"length":303,"previous":"WBV2-P1235-001","next":"WBV2-P1236-001"},"WBV2-P1236-001":{"line":252,"offset":87047,"length":364,"previous":"WBV2-P1236-000","next":"WBV2-P1237-000"},"WBV2-P1237-000":{"line":253,"offset":87411,"length":303,"previous":"WBV2-P1236-001","next":"WBV2-P1237-001"},"WBV2-P1237-001":{"line":254,"offset":87714,"length":364,"previous":"WBV2-P1237-000","next":"WBV2-P1238-000"},"WBV2-P1238-000":{"line":255,"offset":88078,"length":303,"previous":"WBV2-P1237-001","next":"WBV2-P1238-001"},"WBV2-P1238-001":{"line":256,"offset":88381,"length":364,"previous":"WBV2-P1238-000","next":"WBV2-P1239-000"},"WBV2-P1239-000":{"line":257,"offset":88745,"length":303,"previous":"WBV2-P1238-001","next":"WBV2-P1239-001"},"WBV2-P1239-001":{"line":258,"offset":89048,"length":364,"previous":"WBV2-P1239-000","next":"WBV2-P1240-000"},"WBV2-P1240-000":{"line":259,"offset":89412,"length":303,"previous":"WBV2-P1239-001","next":"WBV2-P1240-001"},"WBV2-P1240-001":{"line":260,"offset":89715,"length":364,"previous":"WBV2-P1240-000","next":"WBV2-P1241-000"},"WBV2-P1241-000":{"line":261,"offset":90079,"length":303,"previous":"WBV2-P1240-001","next":"WBV2-P1241-001"},"WBV2-P1241-001":{"line":262,"offset":90382,"length":364,"previous":"WBV2-P1241-000","next":"WBV2-P1242-000"},"WBV2-P1242-000":{"line":263,"offset":90746,"length":303,"previous":"WBV2-P1241-001","next":"WBV2-P1242-001"},"WBV2-P1242-001":{"line":264,"offset":91049,"length":364,"previous":"WBV2-P1242-000","next":"WBV2-P1243-000"},"WBV2-P1243-000":{"line":265,"offset":91413,"length":303,"previous":"WBV2-P1242-001","next":"WBV2-P1243-001"},"WBV2-P1243-001":{"line":266,"offset":91716,"length":364,"previous":"WBV2-P1243-000","next":"WBV2-P1244-000"},"WBV2-P1244-000":{"line":267,"offset":92080,"length":303,"previous":"WBV2-P1243-001","next":"WBV2-P1244-001"},"WBV2-P1244-001":{"line":268,"offset":92383,"length":364,"previous":"WBV2-P1244-000","next":"WBV2-P1245-000"},"WBV2-P1245-000":{"line":269,"offset":92747,"length":303,"previous":"WBV2-P1244-001","next":"WBV2-P1245-001"},"WBV2-P1245-001":{"line":270,"offset":93050,"length":364,"previous":"WBV2-P1245-000","next":"WBV2-P1246-000"},"WBV2-P1246-000":{"line":271,"offset":93414,"length":303,"previous":"WBV2-P1245-001","next":"WBV2-P1246-001"},"WBV2-P1246-001":{"line":272,"offset":93717,"length":362,"previous":"WBV2-P1246-000","next":"WBV2-P1247-000"},"WBV2-P1247-000":{"line":273,"offset":94079,"length":303,"previous":"WBV2-P1246-001","next":"WBV2-P1247-001"},"WBV2-P1247-001":{"line":274,"offset":94382,"length":362,"previous":"WBV2-P1247-000","next":"WBV2-P1248-000"},"WBV2-P1248-000":{"line":275,"offset":94744,"length":303,"previous":"WBV2-P1247-001","next":"WBV2-P1248-001"},"WBV2-P1248-001":{"line":276,"offset":95047,"length":362,"previous":"WBV2-P1248-000","next":"WBV2-P1249-000"},"WBV2-P1249-000":{"line":277,"offset":95409,"length":303,"previous":"WBV2-P1248-001","next":"WBV2-P1249-001"},"WBV2-P1249-001":{"line":278,"offset":95712,"length":362,"previous":"WBV2-P1249-000","next":"WBV2-P1250-000"},"WBV2-P1250-000":{"line":279,"offset":96074,"length":303,"previous":"WBV2-P1249-001","next":"WBV2-P1250-001"},"WBV2-P1250-001":{"line":280,"offset":96377,"length":362,"previous":"WBV2-P1250-000","next":"WBV2-P1251-000"},"WBV2-P1251-000":{"line":281,"offset":96739,"length":303,"previous":"WBV2-P1250-001","next":"WBV2-P1251-001"},"WBV2-P1251-001":{"line":282,"offset":97042,"length":362,"previous":"WBV2-P1251-000","next":"WBV2-P1252-000"},"WBV2-P1252-000":{"line":283,"offset":97404,"length":303,"previous":"WBV2-P1251-001","next":"WBV2-P1252-001"},"WBV2-P1252-001":{"line":284,"offset":97707,"length":362,"previous":"WBV2-P1252-000","next":"WBV2-P1253-000"},"WBV2-P1253-000":{"line":285,"offset":98069,"length":303,"previous":"WBV2-P1252-001","next":"WBV2-P1253-001"},"WBV2-P1253-001":{"line":286,"offset":98372,"length":362,"previous":"WBV2-P1253-000","next":null}}}