{ "schemaVersion": 1, "planId": "BLENDER_WEB_MODULE_EXECUTION_P1145", "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 } ], "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 } } ] }