Files
workinf_Blender_Wasm/tests/golden/WBV2-P1145-000/module-execution-plan.json
2026-09-02 18:35:58 +08:00

5519 lines
186 KiB
JSON

{
"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
}
}
]
}