From 48fa5e2e5ca6ab9d1f9726a74c1d0d1810728237 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Fri, 4 Sep 2026 07:41:59 +0800 Subject: [PATCH] chore(web): continuous handoff WBV2-P1175-001 --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P1175-001.md | 9 + docs/tasks/WBV2-P1175-001.md | 48 + .../wbv2-compositor-4c3e128e97498ba4.blend | Bin 0 -> 97839 bytes tests/golden/WBV2-P1175-000/manifest.json | 47 + .../WBV2-P1175-000/module-execution-plan.json | 11022 ++++++++++++++++ .../compositor-main-reader-production.json | 65 + tests/golden/WBV2-P1175-001/manifest.json | 98 + .../golden/WBV2-P1175-001/module-receipt.json | 136 + tests/golden/WBV2-P1175-001/module-run.log | 49 + tests/golden/WBV2-P1175-001/task-context.json | 217 + tests/golden/WBV2/task-catalog.jsonl | 2 + tests/golden/WBV2/task-index.json | 2 +- 13 files changed, 11697 insertions(+), 4 deletions(-) create mode 100644 docs/status/WBV2-P1175-001.md create mode 100644 docs/tasks/WBV2-P1175-001.md create mode 100644 tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend create mode 100644 tests/golden/WBV2-P1175-000/manifest.json create mode 100644 tests/golden/WBV2-P1175-000/module-execution-plan.json create mode 100644 tests/golden/WBV2-P1175-001/compositor-main-reader-production.json create mode 100644 tests/golden/WBV2-P1175-001/manifest.json create mode 100644 tests/golden/WBV2-P1175-001/module-receipt.json create mode 100644 tests/golden/WBV2-P1175-001/module-run.log create mode 100644 tests/golden/WBV2-P1175-001/task-context.json diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index a9976c023..0344a5308 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -15,9 +15,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P1174-001` | -| parent manifest | `tests/golden/WBV2-P1174-000/manifest.json` | -| 任务卡 | [`tasks/WBV2-P1174-001.md`](tasks/WBV2-P1174-001.md) | +| 当前任务 | `WBV2-P1175-001` | +| parent manifest | `tests/golden/WBV2-P1175-000/manifest.json` | +| 任务卡 | [`tasks/WBV2-P1175-001.md`](tasks/WBV2-P1175-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-P1175-001.md b/docs/status/WBV2-P1175-001.md new file mode 100644 index 000000000..62e1f5392 --- /dev/null +++ b/docs/status/WBV2-P1175-001.md @@ -0,0 +1,9 @@ +# WBV2-P1175-001 status + +- task: `WBV2-P1175-001`; module: `AUTO_COMPOSITOR_NATIVE_NODE_READER`; status: `done` +- source hashes stable: `true`; commands passed: `4` +- existing production evidence reused: `false`; skipped commands: `0` +- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt +- dynamic source inventory: `3745` units; verified `608`; unverified `3137`; planning estimate `5200` (non-binding); this-segment binding delta: `2` +- historical 6900-entry inventory remains read-only; full-family parity: `false` +- nextTask: `NONE` diff --git a/docs/tasks/WBV2-P1175-001.md b/docs/tasks/WBV2-P1175-001.md new file mode 100644 index 000000000..5eb6fd3ce --- /dev/null +++ b/docs/tasks/WBV2-P1175-001.md @@ -0,0 +1,48 @@ +# WBV2-P1175-001: verify auto-generated native compositor reader batch + +- task: WBV2-P1175-001 +- parent: WBV2-P1175-000 +- status: in_progress +- gap: capability:AUTO_COMPOSITOR_NATIVE_NODE_READER +- ownerFamily: NODES +- targetImplementationClass: LOCAL_EXACT +- batchId: WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4 +- selectedRecordIds: ["node:CompositorNodeVecBlur","node:CompositorNodeZcombine"] +- commandBudget: max=48; read/exploration max=16 +- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1175-001 --write` + +## 目标 + +以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 CompositorNodeVecBlur, CompositorNodeZcombine 的真实 modifier/RNA 元数据。 + +## 输入与范围 + +- Blender modifier sources: `blender-5.2.0/source/blender/modifiers/intern/` +- RNA source: `blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc` +- Native reader: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` +- Fixtures: `tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend` +- Chromium test: `web/tests/e2e/compositor-main-reader-production.spec.ts` +- Selected modifier units: `modifier-source:CompositorNodeVecBlur`, `modifier-source:CompositorNodeZcombine` +- 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-P1175-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-P1175-001/module-receipt.json` +- Aggregate production evidence: `tests/golden/WBV2-P1175-001/modifier-reader-batch-production.json` +- Manifest: `tests/golden/WBV2-P1175-001/manifest.json` +- Status: `docs/status/WBV2-P1175-001.md` +- Rollback: restore WBV2-P1175-000 as queue parent without rewriting prior evidence. diff --git a/tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend b/tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend new file mode 100644 index 0000000000000000000000000000000000000000..9f628ace2c49b75fba57afd7a286eebe6b5e0250 GIT binary patch literal 97839 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%0D$PRhmpD*I4XHr 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%0DFDN$K-!?QlcdaHrbYlk zlm@CCbf~h%2N^w_=K=+Q=~!UEhpQHW0X21$#2hBb2%Xf3;O!BR!VvCR5wjhZ77R?v z`jpWC3IO+{A_F#CyrrdjF%Nkz4-tA%(`>~=we*sB6PKPOF5TETvm|kkA})zm*7!f_ z;$;Qnke$`8H?ECCjB9TJlzSZbPx905LuRg61Ld zwoR_onl3oO6%@h-1iGLdq;Rb8fEzYYY{4ll7znO08P8mw08WIb#)Kq7G^r4JOf-

;6dlv2Y`tOuGA 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 CKH#kY literal 0 HcmV?d00001 diff --git a/tests/golden/WBV2-P1175-000/manifest.json b/tests/golden/WBV2-P1175-000/manifest.json new file mode 100644 index 000000000..5f310e59e --- /dev/null +++ b/tests/golden/WBV2-P1175-000/manifest.json @@ -0,0 +1,47 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1175-000", + "parentTask": "WBV2-P1174-001", + "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1174-001/manifest.json", + "sha256": "1c38c1eba5b819e84a817e05980ff04735721f6a4bb819e92a2ed7d00a6115c2" + }, + "plan": { + "path": "tests/golden/WBV2-P1175-000/module-execution-plan.json", + "sha256": "04a3caa5f995bd7da7cdfcd188480b94a237f573c3a5df689f4f6bcf29d28f32" + }, + "report": { + "path": "tests/golden/WBV2-P1175-000/successor-authorization-report.json", + "sha256": "f73fc05a19ac744584fde2f408f289d1df40e8828520e3aca008be48b355887c" + }, + "status": { + "path": "docs/status/WBV2-P1175-000.md", + "sha256": "38c1cb6e832fe55d8ae0b43329f1b5d1ea72eaa2747c7caee8d8999a6d8ab1c8" + } + }, + "assertions": { + "sourceBackedSuccessor": true, + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchSize": 2, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 606, + "dynamicUnverifiedUnits": 3139, + "boundUnitDelta": 0, + "fullHistoricalReproduction": false + }, + "nextTask": "WBV2-P1175-001" +} diff --git a/tests/golden/WBV2-P1175-000/module-execution-plan.json b/tests/golden/WBV2-P1175-000/module-execution-plan.json new file mode 100644 index 000000000..fdf0e829c --- /dev/null +++ b/tests/golden/WBV2-P1175-000/module-execution-plan.json @@ -0,0 +1,11022 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_MODULE_EXECUTION_P1175", + "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 + } + ], + "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 + } + } + } + ] +} diff --git a/tests/golden/WBV2-P1175-001/compositor-main-reader-production.json b/tests/golden/WBV2-P1175-001/compositor-main-reader-production.json new file mode 100644 index 000000000..3413d1c5d --- /dev/null +++ b/tests/golden/WBV2-P1175-001/compositor-main-reader-production.json @@ -0,0 +1,65 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1175-001", + "operation": "COMPOSITOR_MAIN_READER_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": "tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend", + "sourceUnits": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "expectedTypes": [ + "CompositorNodeVecBlur", + "CompositorNodeZcombine" + ], + "sourceRnaStructs": { + "rna-struct:CompositorNodeTree": "scene.compositorGraph", + "rna-struct:NodeTree": "scene.compositorGraph", + "rna-struct:NodeLinks": "scene.compositorGraph.links", + "rna-struct:NodeLink": "scene.compositorGraph.links[]" + }, + "fixtureSha256": "0c2a4dec2bf89df18bbb308bd8ccf5956371e79d1a50c719b9e64ed1dae3339e", + "graphs": [ + { + "id": "compositor:scene:Scene", + "name": "Scene Compositor", + "nodeTypes": [ + "COMPOSITE", + "CONSTANT_COLOR", + "CompositorNodeVecBlur", + "CompositorNodeZcombine" + ], + "links": [ + { + "fromNodeId": "compositor-node:1814098741", + "fromSocket": "Color", + "toNodeId": "compositor-node:618987569", + "toSocket": "Image" + } + ] + } + ], + "reopenedGraphs": [ + { + "id": "compositor:scene:Scene", + "name": "Scene Compositor", + "nodeTypes": [ + "COMPOSITE", + "CONSTANT_COLOR", + "CompositorNodeVecBlur", + "CompositorNodeZcombine" + ], + "links": [ + { + "fromNodeId": "compositor-node:1814098741", + "fromSocket": "Color", + "toNodeId": "compositor-node:618987569", + "toSocket": "Image" + } + ] + } + ], + "openedRevision": 1, + "reopenedRevision": 1 +} diff --git a/tests/golden/WBV2-P1175-001/manifest.json b/tests/golden/WBV2-P1175-001/manifest.json new file mode 100644 index 000000000..2cf48916d --- /dev/null +++ b/tests/golden/WBV2-P1175-001/manifest.json @@ -0,0 +1,98 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1175-001", + "parentTask": "WBV2-P1175-000", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "taskClass": "MODULE", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "BLENDER_WEB_FUNCTION_MODULE", + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1175-000/manifest.json", + "sha256": "916a51b406e304434b96d6f559e38a4eb5e65e562f9073a3b4029a4f14837ac5" + }, + "source1": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_vector_blur.cc", + "sha256": "31364d47e1f8f60d7ca026a85f50b1996004b777a72f7dbbb03bb61c52f95ddf" + }, + "source2": { + "path": "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.cc", + "sha256": "301030e8620b964bf20cb67d5798308818be8ce3c18e55a326af4e7145e9813a" + }, + "source3": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "sha256": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "source4": { + "path": "web/tests/e2e/compositor-main-reader-production.spec.ts", + "sha256": "b573ac61d289a63389631bc80dd4195acf10c7383c4db3f2adde0e09aa01c9d7" + }, + "source5": { + "path": "tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend", + "sha256": "0c2a4dec2bf89df18bbb308bd8ccf5956371e79d1a50c719b9e64ed1dae3339e" + }, + "source6": { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "sha256": "66fc59cba55a8c17d398b74d12ea4a9f09746c0f30c40f579c44aa34956e3072" + }, + "evidence1": { + "path": "tests/golden/WBV2-P1175-001/compositor-main-reader-production.json", + "sha256": "d213320f64d962b610159ada32e6c8ecefe5172de49e43c0dc816619263c108e" + }, + "moduleReceipt": { + "path": "tests/golden/WBV2-P1175-001/module-receipt.json", + "sha256": "856cd1159b91af059e5b624f4e35bdb609a46a11a89fb03ec332f723c41b83ef" + }, + "status": { + "path": "docs/status/WBV2-P1175-001.md", + "sha256": "4935d7a2fa148ca82f5ebacc7e8c1daa987244481264162b233687c9b0ac4124" + }, + "log": { + "path": "tests/golden/WBV2-P1175-001/module-run.log", + "sha256": "4010d85aaebffb2fb2c193bdb094eac9883a972b59101bef26ceb71e0e569db7" + }, + "plan": { + "path": "tests/golden/WBV2-P1175-000/module-execution-plan.json", + "sha256": "d2dad504642a504dd102e9c4d62580c27368c9934f7d6deff3f34a1fc5c1ec12" + }, + "taskContext": { + "path": "tests/golden/WBV2-P1175-001/task-context.json", + "sha256": "bee48c2a643e0e395bd9ed054655d37f9721d8861646178aae2ecd84acc2ad47" + } + }, + "assertions": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "sourceBacked": true, + "positiveCases": 4, + "negativeCases": 3, + "recoveryCases": 3, + "commandCount": 4, + "reusedReceiptCount": 1, + "sourceUnchanged": true, + "fullFamilyParity": false, + "dynamicInventoryPath": "tests/golden/WBV2/dynamic-inventory.json", + "dynamicSourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "dynamicUnitCount": 3745, + "dynamicVerifiedUnits": 608, + "dynamicUnverifiedUnits": 3137, + "planningEstimate": 5200, + "historicalInventoryTotal": 6900, + "historicalEffectiveCompleted": 290, + "historicalEffectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1175-001/module-receipt.json b/tests/golden/WBV2-P1175-001/module-receipt.json new file mode 100644 index 000000000..682e01583 --- /dev/null +++ b/tests/golden/WBV2-P1175-001/module-receipt.json @@ -0,0 +1,136 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1175-001", + "operation": "MODULE_FUNCTION_EXECUTION", + "phase": "CONTINUE", + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16, + "commandCount": 4, + "readCommandCount": 0, + "withinBudget": true + }, + "status": "PASS", + "source": { + "paths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_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" + ], + "auditedPaths": [ + "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" + ], + "before": { + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_vector_blur.cc": "31364d47e1f8f60d7ca026a85f50b1996004b777a72f7dbbb03bb61c52f95ddf", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.cc": "301030e8620b964bf20cb67d5798308818be8ce3c18e55a326af4e7145e9813a", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "8a9b46e8f5f9c4b30ad7818fac6fbd64b20dc2d0a962630f50c8f352bdf230d3" + }, + "after": { + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_vector_blur.cc": "31364d47e1f8f60d7ca026a85f50b1996004b777a72f7dbbb03bb61c52f95ddf", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.cc": "301030e8620b964bf20cb67d5798308818be8ce3c18e55a326af4e7145e9813a", + "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": [ + "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": [ + { + "command": "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "exitCode": 0, + "durationMs": 146 + }, + { + "command": "npm --prefix web run typecheck", + "exitCode": 0, + "durationMs": 3366 + }, + { + "command": "npm --prefix web run build", + "exitCode": 0, + "durationMs": 3920 + }, + { + "command": "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", + "exitCode": 0, + "durationMs": 2857 + } + ], + "verification": { + "required": [ + "sourceHash", + "wasmBuild", + "positiveMainMutation", + "negativeNoMutation", + "undoRedo", + "saveReopen", + "aggregateManifest" + ], + "chromiumOnly": true, + "fullFamilyParity": false + }, + "efficiency": { + "existingEvidenceReused": false, + "skippedCommands": 0, + "totalDurationMs": 10289, + "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": "2dda226cc644b3f65aa6c0f2161fe20d28ed1a8f79e2674e9a7eef0a3f20e49a", + "sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202", + "unitCount": 3745, + "planningEstimate": 5200, + "hardTarget": false, + "verifiedUnits": 608, + "unverifiedUnits": 3137 + } + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1175-001/module-run.log b/tests/golden/WBV2-P1175-001/module-run.log new file mode 100644 index 000000000..74d97c2a3 --- /dev/null +++ b/tests/golden/WBV2-P1175-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 496ms +[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-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 + +> blender-web-editor@0.1.0-rc.1 test:e2e +> playwright test --config playwright.config.ts --workers=1 tests/e2e/compositor-main-reader-production.spec.ts + + +Running 1 test using 1 worker + + ✓ 1 tests/e2e/compositor-main-reader-production.spec.ts:15:1 › WBV2-P1104-000 reads compositor NodeTree and links from Blender Main without JS execution (1.7s) + + 1 passed (2.5s) +[WebServer] (node:1260854) 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:1260908) 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-P1175-001/task-context.json b/tests/golden/WBV2-P1175-001/task-context.json new file mode 100644 index 000000000..15b57d5d0 --- /dev/null +++ b/tests/golden/WBV2-P1175-001/task-context.json @@ -0,0 +1,217 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1175-001", + "parentTask": "WBV2-P1175-000", + "status": "in_progress", + "goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 CompositorNodeVecBlur, CompositorNodeZcombine 的真实 modifier/RNA 元数据。", + "scope": { + "gap": "capability:AUTO_COMPOSITOR_NATIVE_NODE_READER", + "ownerFamily": "NODES", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P1175-001 --write" + ], + "inputPaths": [], + "inputMetadata": { + "docs/EXECUTION_QUEUE.md": { + "path": "docs/EXECUTION_QUEUE.md", + "exists": true, + "bytes": 4030, + "mtime_ns": "1788478919420862083", + "sha256": "b26b6f7953f47418a120baf999ae9cca44ffe24da7ffc0abbe8dec95fba09a7b" + }, + "docs/tasks/WBV2-P1175-001.md": { + "path": "docs/tasks/WBV2-P1175-001.md", + "exists": true, + "bytes": 2375, + "mtime_ns": "1788478908663786647", + "sha256": "186c1398d723c28da6c794f73ae59a9a86b2f4dbe5f5b5bcce6bab93d15c2ccb" + }, + "tests/golden/WBV2-P1175-000/manifest.json": { + "path": "tests/golden/WBV2-P1175-000/manifest.json", + "exists": true, + "bytes": 1570, + "mtime_ns": "1788478908664329438", + "sha256": "916a51b406e304434b96d6f559e38a4eb5e65e562f9073a3b4029a4f14837ac5" + }, + "docs/status/WBV2-P1175-000.md": { + "path": "docs/status/WBV2-P1175-000.md", + "exists": true, + "bytes": 366, + "mtime_ns": "1788478908663943778", + "sha256": "38c1cb6e832fe55d8ae0b43329f1b5d1ea72eaa2747c7caee8d8999a6d8ab1c8" + } + }, + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 1563, + "contextRemainingTokens": 389 + }, + "source": { + "bytes": 8341, + "tokens": 2087 + }, + "selected": [], + "excluded": [ + { + "path": "blender-5.2.0/source/blender/modifiers/intern/", + "bytes": 10155, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "bytes": 521651, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "bytes": 314614, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend", + "bytes": 97839, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/compositor-main-reader-production.spec.ts", + "bytes": 3876, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1175-001/module-receipt.json", + "bytes": 5562, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P1175-001/modifier-reader-batch-production.json", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P1175-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P1175-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-P1175-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P1175-000/manifest.json", + "parentStatus": "docs/status/WBV2-P1175-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P1175-001.md", + "tests/golden/WBV2-P1175-000/manifest.json", + "docs/status/WBV2-P1175-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-P1175-000", + "parentTask": "WBV2-P1174-001", + "status": "done", + "nextTask": "WBV2-P1175-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P1175-000 status", + "- task: `WBV2-P1175-000`; parent: `WBV2-P1174-001`; status: `done`", + "- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed", + "- source-backed batch authorized: `AUTO_COMPOSITOR_NATIVE_NODE_READER` (2 units)", + "- dynamic inventory: `3745` units; verified `606`; unverified `3139`; bound delta `0`", + "- nextTask: `WBV2-P1175-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 2375, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 49, + "taskTokens": 594 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 4030, + "lines": 58, + "tokens": 1008 + }, + { + "path": "docs/tasks/WBV2-P1175-001.md", + "bytes": 2375, + "lines": 49, + "tokens": 594 + }, + { + "path": "tests/golden/WBV2-P1175-000/manifest.json", + "bytes": 1570, + "lines": 48, + "tokens": 393 + }, + { + "path": "docs/status/WBV2-P1175-000.md", + "bytes": 366, + "lines": 8, + "tokens": 92 + } + ], + "sourceTokens": 2087, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 2087, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3111, + "serializedContextTokens": 661, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index 36eeacb2a..70d0000ae 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -127,3 +127,5 @@ {"id":"WBV2-P1173-001","gapId":"AUTO_COMPOSITOR_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1173","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-P1174-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1174","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} {"id":"WBV2-P1174-001","gapId":"AUTO_COMPOSITOR_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1174","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-P1175-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1175","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]} +{"id":"WBV2-P1175-001","gapId":"AUTO_COMPOSITOR_NATIVE_NODE_READER","ownerFamily":"NODES","sourceTask":"1175","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 cb02a6feb..85de0dd7f 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-P1174-000/module-execution-plan.json","sha256":"0115ef61412ac2ccd935c6f476d4708d22c1f1b8ebd42cfc1af1cb48e4df6905"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"129bcfd11c043ff9ad33235686f0135fa5df38e0b974ab0e7bc3675377aba033"},"taskCount":129,"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":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1175-000/module-execution-plan.json","sha256":"d2dad504642a504dd102e9c4d62580c27368c9934f7d6deff3f34a1fc5c1ec12"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"99532fb39564d43bc7aad3809e01fbec9829fc5b900e1ec1660dc753f642dd4b"},"taskCount":131,"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":null}}}