From 66d3f4e0f4b6fa5d859841eacea559c864f5957b Mon Sep 17 00:00:00 2001 From: mes123456 Date: Sun, 6 Sep 2026 19:33:50 +0800 Subject: [PATCH] feat(web): complete portable Blender feature gaps --- .../blender/web_engine/web_engine_api.cpp | 583 +- .../web_engine/web_engine_main_state.cpp | 1600 +- .../web_engine/web_engine_main_state.h | 144 + docs/EXECUTION_QUEUE.md | 6 +- docs/WEB_FULL_FEATURE_GAP_INVENTORY.md | 61 + docs/status/WBV2-P1421-001.md | 2 +- docs/status/WBV2-P1422-000.md | 5 + docs/status/WBV2-P1422-001.md | 7 + docs/tasks/WBV2-P1422-000.md | 7 + docs/tasks/WBV2-P1422-001.md | 39 + my-tools/activate_full_feature_gap_phase.py | 226 + tests/golden/WBV2-P1421-001/manifest.json | 4 +- .../full-feature-gap-authorization.json | 9 + tests/golden/WBV2-P1422-000/manifest.json | 26 + .../product-implementation-plan.json | 52969 ++++++++++++++++ tests/golden/WBV2-P1422-001/manifest.json | 40 + .../product-implementation-report.json | 823 + tests/golden/WBV2-P1422-001/task-context.json | 199 + ...IMATION-FCURVE-DRIVER-COVERAGE-result.json | 14 + .../ARMATURE-EDITOR-COVERAGE-result.json | 16 + .../ASSET-LIBRARY-COVERAGE-result.json | 14 + .../CURVE-SURFACE-COVERAGE-result.json | 14 + .../GREASE-PENCIL-COVERAGE-result.json | 13 + .../MESH-EDITOR-COVERAGE-result.json | 15 + .../OBJECT-EDITOR-COVERAGE-result.json | 15 + .../PHYSICS-SIMULATION-COVERAGE-result.json | 14 + .../RENDER-CAMERA-LIGHT-COVERAGE-result.json | 16 + .../RNA-DATABLOCK-REFLECTION-result.json | 16 + .../SEQUENCER-COMPOSITOR-COVERAGE-result.json | 16 + .../TRACKING-MASK-COVERAGE-result.json | 13 + tests/golden/WBV2/task-catalog.jsonl | 4 +- tests/golden/WBV2/task-index.json | 2 +- tests/golden/WBV2/web-product-backlog.json | 364 +- tools/web/search-wbv2-batch-source.mjs | 8 + web/app/src/app/App.tsx | 160 +- web/app/src/engine-client/WebEngineClient.ts | 25 + web/app/src/workers/web-engine.worker.ts | 249 +- web/protocol/animation-render-commands.ts | 15 + web/protocol/asset-library-io.ts | 53 +- web/protocol/compositor-commands.ts | 3 + web/protocol/mesh-authoring-commands.ts | 18 + web/protocol/nonmesh-geometry-commands.ts | 12 + web/protocol/physics-simulation.ts | 66 + web/protocol/render-capabilities.ts | 12 +- web/protocol/render-routing.ts | 27 + web/protocol/scene-ir.ts | 35 + web/protocol/sequencer.ts | 13 + web/protocol/web-engine.ts | 117 +- 48 files changed, 58048 insertions(+), 61 deletions(-) create mode 100644 docs/WEB_FULL_FEATURE_GAP_INVENTORY.md create mode 100644 docs/status/WBV2-P1422-000.md create mode 100644 docs/status/WBV2-P1422-001.md create mode 100644 docs/tasks/WBV2-P1422-000.md create mode 100644 docs/tasks/WBV2-P1422-001.md create mode 100644 my-tools/activate_full_feature_gap_phase.py create mode 100644 tests/golden/WBV2-P1422-000/full-feature-gap-authorization.json create mode 100644 tests/golden/WBV2-P1422-000/manifest.json create mode 100644 tests/golden/WBV2-P1422-000/product-implementation-plan.json create mode 100644 tests/golden/WBV2-P1422-001/manifest.json create mode 100644 tests/golden/WBV2-P1422-001/product-implementation-report.json create mode 100644 tests/golden/WBV2-P1422-001/task-context.json create mode 100644 tests/golden/WBV2/product-migration/ANIMATION-FCURVE-DRIVER-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/ARMATURE-EDITOR-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/ASSET-LIBRARY-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/CURVE-SURFACE-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/GREASE-PENCIL-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/MESH-EDITOR-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/OBJECT-EDITOR-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/PHYSICS-SIMULATION-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/RENDER-CAMERA-LIGHT-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/RNA-DATABLOCK-REFLECTION-result.json create mode 100644 tests/golden/WBV2/product-migration/SEQUENCER-COMPOSITOR-COVERAGE-result.json create mode 100644 tests/golden/WBV2/product-migration/TRACKING-MASK-COVERAGE-result.json diff --git a/blender-5.2.0/source/blender/web_engine/web_engine_api.cpp b/blender-5.2.0/source/blender/web_engine/web_engine_api.cpp index 66f551ac4..74b883249 100644 --- a/blender-5.2.0/source/blender/web_engine/web_engine_api.cpp +++ b/blender-5.2.0/source/blender/web_engine/web_engine_api.cpp @@ -18,6 +18,11 @@ #include "web_engine_depsgraph.h" #include "web_engine_main_state.h" +extern bool web_engine_blend_main_set_sequencer_strip_modifiers(WebBlendMainState *, const char *, const char *, const char *, std::string &); +extern bool web_engine_blend_main_set_sequencer_transitions(WebBlendMainState *, const char *, const char *, std::string &); +extern bool web_engine_blend_main_set_sequencer_color_balance(WebBlendMainState *, const char *, const char *, const char *, std::string &); +extern bool web_engine_blend_main_set_compositor_node_graph(WebBlendMainState *, const char *, const char *, std::string &); + bool web_engine_blend_main_set_sequencer_strips(WebBlendMainState *state, const char *scene_id, const char *timeline_json, @@ -1304,6 +1309,11 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, extern bool web_engine_blend_main_create_action(WebBlendMainState *, const char *, const char *, std::string &, std::string &); extern bool web_engine_blend_main_remove_action(WebBlendMainState *, const char *, std::string &); extern bool web_engine_blend_main_set_keyframe(WebBlendMainState *, const char *, const char *, int, const char *, const char *, const char *, const char *, std::string &); + extern bool web_engine_blend_main_set_fcurve_keyframes(WebBlendMainState *, const char *, const char *, const char *, std::string &); + extern bool web_engine_blend_main_set_driver_expression(WebBlendMainState *, const char *, const char *, const char *, std::string &); + extern bool web_engine_blend_main_set_action_groups(WebBlendMainState *, const char *, const char *, std::string &); + extern bool web_engine_blend_main_set_keying_set(WebBlendMainState *, const char *, const char *, const char *, bool, std::string &); + extern bool web_engine_blend_main_bake_animation(WebBlendMainState *, const char *, int, int, int, std::string &); extern bool web_engine_blend_main_set_timeline_markers(WebBlendMainState *, const char *, const char *, std::string &); if (type == "setFrame") { if (!engine->authoritative_commands || engine->authoritative_main == nullptr) { @@ -1717,27 +1727,36 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, engine->authoritative_dirty = true; snapshot_from_main = true; } - else if (type == "meshEdit" || type == "createUVMap" || type == "setActiveUVMap" || + else if (type == "meshEdit" || type == "meshSubdivide" || type == "meshTriangulate" || + type == "meshRecalculateNormals" || type == "meshBridgeLoops" || + type == "meshDeleteElements" || type == "meshUVProject" || + type == "createUVMap" || type == "setActiveUVMap" || type == "unwrapUV" || type == "addMaterialSlot" || type == "removeMaterialSlot" || type == "assignMaterialFaces" || type == "setMaterialPrincipled" || type == "importImage" || type == "setMaterialImageNode" || type == "setShaderGraph" || type == "setGeometryNodeGraph" || type == "setPhysicsSimulation" || type == "insertObjectKeyframe" || type == "deleteObjectKeyframe" || - type == "createAction" || type == "removeAction" || type == "setKeyframe" || type == "setTimelineMarkers" || - type == "setFCurveInterpolation" || type == "setActiveAction" || type == "setNLAStack" || type == "setSequencerStrips" || + type == "createAction" || type == "removeAction" || type == "setKeyframe" || type == "setFCurveKeyframes" || + type == "setDriverExpression" || type == "setActionGroups" || type == "setKeyingSet" || type == "bakeAnimation" || type == "setTimelineMarkers" || + type == "setFCurveInterpolation" || type == "setActiveAction" || type == "setNLAStack" || type == "setSequencerStrips" || type == "setSequencerStripModifiers" || type == "setSequencerTransitions" || type == "setSequencerColorBalance" || type == "setCompositorNodeGraph" || type == "setConstraint" || type == "setParent" || type == "createCollection" || type == "moveObjectToCollection" || type == "renameId" || type == "joinObjects" || type == "separateMeshFaces" || type == "applyObjectTransform" || type == "setObjectOrigin" || - type == "setCurveControlPoints" || type == "setCurveHandle" || type == "setCurveTopology" || type == "setCurveSplines" || type == "setSurfaceTopology" || type == "setFontBody" || + type == "setCurveControlPoints" || type == "setCurveBevel" || type == "setCurveTaper" || type == "convertCurveType" || type == "setCurveHandle" || type == "setCurveTopology" || type == "setCurveSplines" || type == "setSurfaceTopology" || type == "setSurfaceResolution" || type == "setFontBody" || type == "setFontProperties" || type == "setFontAdvanced" || type == "importVFont" || type == "setFontLinks" || type == "setTextSource" || type == "setSoundProperties" || type == "setSpeakerProperties" || type == "setParticleSettings" || type == "setTextureProperties" || type == "setVolumeProperties" || type == "deleteNonMeshData" || type == "setArmatureBones" || type == "setPoseBoneTransform" || + type == "armatureEditOperations" || type == "setBoneRoll" || + type == "setBoneSymmetry" || type == "setBoneParenting" || + type == "setPoseConstraint" || type == "setMetaballElements" || type == "createGreasePencilLayer" || type == "removeGreasePencilLayer" || type == "moveGreasePencilLayer" || type == "moveGreasePencilFrame" || type == "insertGreasePencilFrame" || type == "removeGreasePencilFrame" || - type == "setGreasePencilStrokes" || type == "setVertexColors" || + type == "setGreasePencilStrokes" || type == "setGreasePencilDrawing" || + type == "setGreasePencilMaterial" || type == "setGreasePencilSelection" || + type == "setGreasePencilInterpolate" || type == "setVertexColors" || type == "setVertexWeights" || type == "setCameraProperties" || type == "setLightProperties" || - type == "setWorldProperties" || type == "setSceneProperties" || type == "setSceneRenderSettings" || type == "setSceneAudioSettings" || type == "setSceneUnitSettings" || type == "setSceneTimelineSettings" || type == "setScenePipelineSettings" || type == "setSceneBindings" || type == "setSceneViewLayerSettings" || type == "setSceneCollectionSettings" || type == "setSceneBorderSettings" || type == "setSceneSimplifySettings" || type == "setSceneColorManagement" || type == "setSceneImageFormat" || type == "setSceneMotionBlur" || type == "setSceneHairSettings" || type == "setSceneCompositorSettings" || type == "setScenePerformanceSettings" || type == "setSceneSamplingSettings" || type == "setSceneMultiviewSettings" || type == "setSceneStampSettings" || type == "setSceneLineSettings" || type == "setSceneViewLayerPassSettings" || type == "setSceneViewLayerAOVs" || type == "setSceneViewLayerLightgroups" || type == "setObjectLightgroup" || type == "setWorldLightgroup" || + type == "setWorldProperties" || type == "renderFrame" || type == "renderAnimation" || type == "setSceneProperties" || type == "setSceneRenderSettings" || type == "setSceneAudioSettings" || type == "setSceneUnitSettings" || type == "setSceneTimelineSettings" || type == "setScenePipelineSettings" || type == "setSceneBindings" || type == "setSceneViewLayerSettings" || type == "setSceneCollectionSettings" || type == "setSceneBorderSettings" || type == "setSceneSimplifySettings" || type == "setSceneColorManagement" || type == "setSceneImageFormat" || type == "setSceneMotionBlur" || type == "setSceneHairSettings" || type == "setSceneCompositorSettings" || type == "setScenePerformanceSettings" || type == "setSceneSamplingSettings" || type == "setSceneMultiviewSettings" || type == "setSceneStampSettings" || type == "setSceneLineSettings" || type == "setSceneViewLayerPassSettings" || type == "setSceneViewLayerAOVs" || type == "setSceneViewLayerLightgroups" || type == "setTrackingMarkers" || type == "setTrackingSolve" || type == "setMaskSpline" || type == "setMaskPoint" || type == "clearObjectTransform" || type == "createObjectData" || type == "setObjectSelection" || type == "setCollectionVisibility" || type == "setObjectLightgroup" || type == "setWorldLightgroup" || type == "setLightLinking" || type == "setSculptMeshAttributes" || type == "sculptStroke") { if (!engine->authoritative_commands || engine->authoritative_main == nullptr) { @@ -1757,6 +1776,40 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, command.value("offset", std::vector()), command.value("amount", 0.0f), command.value("segments", 1), main_error); } + else if (type == "meshSubdivide") { + applied = web_engine_blend_main_mesh_edit( + engine->authoritative_main, command.value("meshId", "").c_str(), "SUBDIVIDE", + command.value("selectionMode", "EDGE").c_str(), + command.value("elementIndices", std::vector()), std::vector(), 0.0f, + command.value("segments", 1), main_error); + } + else if (type == "meshTriangulate") { + applied = web_engine_blend_main_mesh_edit( + engine->authoritative_main, command.value("meshId", "").c_str(), "TRIANGULATE", "FACE", + command.value("faceIndices", std::vector()), std::vector(), 0.0f, 1, main_error); + } + else if (type == "meshRecalculateNormals") { + applied = web_engine_blend_main_mesh_edit( + engine->authoritative_main, command.value("meshId", "").c_str(), "RECALCULATE_NORMALS", "FACE", + command.value("faceIndices", std::vector()), std::vector(), 0.0f, 1, main_error); + } + else if (type == "meshBridgeLoops") { + applied = web_engine_blend_main_mesh_edit( + engine->authoritative_main, command.value("meshId", "").c_str(), "BRIDGE_LOOPS", "EDGE", + command.value("edgeIndices", std::vector()), std::vector(), 0.0f, 1, main_error); + } + else if (type == "meshDeleteElements") { + applied = web_engine_blend_main_mesh_edit( + engine->authoritative_main, command.value("meshId", "").c_str(), "DELETE", + command.value("selectionMode", "FACE").c_str(), + command.value("elementIndices", std::vector()), std::vector(), 0.0f, 1, main_error); + } + else if (type == "meshUVProject") { + applied = web_engine_blend_main_unwrap_uv( + engine->authoritative_main, command.value("meshId", "").c_str(), + command.value("faceIndices", std::vector()), + command.value("method", "PLANAR").c_str(), main_error); + } else if (type == "createUVMap") { applied = web_engine_blend_main_create_uv_map(engine->authoritative_main, command.value("meshId", "").c_str(), @@ -1850,6 +1903,31 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, value_json.c_str(), handle_left_json.c_str(), handle_right_json.c_str(), command.value("interpolation", "").c_str(), main_error); } + else if (type == "setFCurveKeyframes") { + applied = web_engine_blend_main_set_fcurve_keyframes( + engine->authoritative_main, command.value("animationId", "").c_str(), + command.value("path", "").c_str(), command.contains("points") ? command["points"].dump().c_str() : "[]", main_error); + } + else if (type == "setDriverExpression") { + applied = web_engine_blend_main_set_driver_expression( + engine->authoritative_main, command.value("animationId", "").c_str(), + command.value("path", "").c_str(), command.value("expression", "").c_str(), main_error); + } + else if (type == "setActionGroups") { + applied = web_engine_blend_main_set_action_groups( + engine->authoritative_main, command.value("animationId", "").c_str(), + command.contains("groups") ? command["groups"].dump().c_str() : "[]", main_error); + } + else if (type == "setKeyingSet") { + applied = web_engine_blend_main_set_keying_set( + engine->authoritative_main, command.value("sceneId", "").c_str(), command.value("name", "").c_str(), + command.contains("paths") ? command["paths"].dump().c_str() : "[]", command.value("active", true), main_error); + } + else if (type == "bakeAnimation") { + applied = web_engine_blend_main_bake_animation( + engine->authoritative_main, command.value("objectId", "").c_str(), command.value("frameStart", 1), + command.value("frameEnd", 250), command.value("step", 1), main_error); + } else if (type == "setTimelineMarkers") { applied = web_engine_blend_main_set_timeline_markers(engine->authoritative_main, command.value("dataId", "").c_str(), @@ -1946,6 +2024,49 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, command.value("objectId", "").c_str(), command.value("mode", "GEOMETRY").c_str(), main_error); } + else if (type == "setCurveBevel") { + const float bevel_depth = command.contains("bevelDepth") ? command.value("bevelDepth", -1.0f) : -1.0f; + const int bevel_resolution = command.contains("bevelResolution") ? command.value("bevelResolution", -1) : -1; + const float bevel_factor_start = command.contains("bevelFactorStart") ? command.value("bevelFactorStart", -1.0f) : -1.0f; + const float bevel_factor_end = command.contains("bevelFactorEnd") ? command.value("bevelFactorEnd", -1.0f) : -1.0f; + applied = web_engine_blend_main_set_curve_bevel( + engine->authoritative_main, + command.value("dataId", "").c_str(), + bevel_depth, + bevel_resolution, + bevel_factor_start, + bevel_factor_end, + main_error); + } + else if (type == "setCurveTaper") { + std::string taper_object_id; + const char *taper_object_ptr = nullptr; + if (command.contains("taperObjectId") && !command["taperObjectId"].is_null()) { + if (!command["taperObjectId"].is_string()) { + main_error = "NON_MESH_PROPERTY_INVALID: taperObjectId must be a string or null"; + } + else { + taper_object_id = command["taperObjectId"].get(); + taper_object_ptr = taper_object_id.c_str(); + } + } + if (main_error.empty()) { + applied = web_engine_blend_main_set_curve_taper( + engine->authoritative_main, + command.value("dataId", "").c_str(), + taper_object_ptr, + command.contains("taperRadiusMode") ? command.value("taperRadiusMode", -1) : -1, + main_error); + } + } + else if (type == "convertCurveType") { + const std::string target_type = command.value("targetType", command.value("curveType", std::string())); + applied = web_engine_blend_main_convert_curve_type( + engine->authoritative_main, + command.value("dataId", "").c_str(), + target_type.c_str(), + main_error); + } else if (type == "setCurveControlPoints") { applied = web_engine_blend_main_set_curve_control_points( engine->authoritative_main, command.value("dataId", "").c_str(), @@ -2046,6 +2167,14 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, command.value("handleTypes", std::vector()), command.value("handlePoints", std::vector()), main_error); } + else if (type == "setSurfaceResolution") { + applied = web_engine_blend_main_set_surface_resolution( + engine->authoritative_main, + command.value("dataId", "").c_str(), + command.value("resolutionU", 0), + command.value("resolutionV", command.value("resolutionU", 0)), + main_error); + } else if (type == "setSurfaceTopology") { const json dimensions = command.value("splineDimensions", json::array()); const json cyclic_u = command.value("cyclicU", json::array()); @@ -2315,6 +2444,114 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, return last_error_code; } } + else if (type == "armatureEditOperations") { + auto read_vec3 = [](const json &value, std::array &target) { + if (!value.is_array() || value.size() != 3) return false; + for (int index = 0; index < 3; index++) { + if (!value[index].is_number()) return false; + target[index] = value[index].get(); + } + return true; + }; + const json source_operations = command.value("operations", json::array()); + std::vector operations; + bool valid = source_operations.is_array() && !source_operations.empty() && + source_operations.size() <= 1024; + for (const json &item : source_operations) { + WebArmatureEditOperation operation{}; + operation.operation = item.value("operation", ""); + operation.bone_name = item.value("boneName", ""); + operation.name = item.value("name", ""); + operation.parent_name = item.value("parentName", ""); + operation.roll = item.value("roll", 0.0f); + operation.connected = item.value("connected", false); + if (item.contains("head")) valid = read_vec3(item["head"], operation.head) && valid; + if (item.contains("tail")) valid = read_vec3(item["tail"], operation.tail) && valid; + if (item.contains("offset")) valid = read_vec3(item["offset"], operation.offset) && valid; + valid = valid && item.is_object(); + operations.push_back(std::move(operation)); + } + if (!valid || !web_engine_blend_main_armature_edit_operations( + engine->authoritative_main, + command.value("objectId", "").c_str(), + operations, + main_error)) + { + set_error(WEB_ENGINE_INVALID_ARGUMENT, + main_error.empty() ? "ARMATURE_EDIT_INVALID: operation payload is invalid" : main_error.c_str()); + return last_error_code; + } + } + else if (type == "setBoneRoll") { + if (!command.contains("roll") || !command["roll"].is_number() || + !web_engine_blend_main_set_bone_roll(engine->authoritative_main, + command.value("objectId", "").c_str(), + command.value("boneName", "").c_str(), + command.value("roll", 0.0f), + main_error)) + { + set_error(WEB_ENGINE_INVALID_ARGUMENT, + main_error.empty() ? "ARMATURE_ROLL_INVALID: roll must be numeric" : main_error.c_str()); + return last_error_code; + } + } + else if (type == "setBoneSymmetry") { + if (!command.contains("enabled") || !command["enabled"].is_boolean() || + !web_engine_blend_main_set_bone_symmetry(engine->authoritative_main, + command.value("objectId", "").c_str(), + command.value("enabled", false), + main_error)) + { + set_error(WEB_ENGINE_INVALID_ARGUMENT, + main_error.empty() ? "ARMATURE_SYMMETRY_INVALID: enabled must be boolean" : main_error.c_str()); + return last_error_code; + } + } + else if (type == "setBoneParenting") { + const bool valid_parent = command.contains("parentName") && + (command["parentName"].is_null() || command["parentName"].is_string()); + const std::string parent_name = valid_parent && command["parentName"].is_string() ? + command["parentName"].get() : ""; + if (!valid_parent || !command.contains("connected") || !command["connected"].is_boolean() || + !web_engine_blend_main_set_bone_parenting(engine->authoritative_main, + command.value("objectId", "").c_str(), + command.value("boneName", "").c_str(), + parent_name.c_str(), + command.value("connected", false), + main_error)) + { + set_error(WEB_ENGINE_INVALID_ARGUMENT, + main_error.empty() ? "ARMATURE_PARENT_INVALID: parenting payload is invalid" : main_error.c_str()); + return last_error_code; + } + } + else if (type == "setPoseConstraint") { + WebPoseConstraintEdit edit{}; + edit.constraint_name = command.value("constraintName", ""); + edit.constraint_type = command.contains("constraintType") && command["constraintType"].is_string() ? + command["constraintType"].get() : ""; + edit.target_object_id = command.contains("targetObjectId") && command["targetObjectId"].is_string() ? + command["targetObjectId"].get() : ""; + edit.target_bone_name = command.value("targetBoneName", ""); + edit.influence = command.value("influence", 1.0f); + edit.enabled = command.value("enabled", true); + const bool valid = command.contains("constraintType") && + (command["constraintType"].is_null() || command["constraintType"].is_string()) && + (!command.contains("targetObjectId") || command["targetObjectId"].is_null() || + command["targetObjectId"].is_string()) && + (!command.contains("influence") || command["influence"].is_number()) && + (!command.contains("enabled") || command["enabled"].is_boolean()); + if (!valid || !web_engine_blend_main_set_pose_constraint(engine->authoritative_main, + command.value("objectId", "").c_str(), + command.value("boneName", "").c_str(), + edit, + main_error)) + { + set_error(WEB_ENGINE_INVALID_ARGUMENT, + main_error.empty() ? "POSE_CONSTRAINT_INVALID: constraint payload is invalid" : main_error.c_str()); + return last_error_code; + } + } else if (type == "setMetaballElements") { std::vector elements; const json source_elements = command.value("elements", json::array()); @@ -2426,6 +2663,70 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, engine->authoritative_main, command.value("dataId", "").c_str(), command.value("layerId", "").c_str(), command.value("frame", -1), strokes, main_error); } + else if (type == "setGreasePencilDrawing") { + std::vector strokes; + const json source_strokes = command.value("strokes", json::array()); + if (!source_strokes.is_array()) main_error = "GREASE_PENCIL_SCHEMA_INVALID: strokes must be an array"; + for (const json &source_stroke : source_strokes) { + if (!main_error.empty()) break; + if (!source_stroke.is_object() || !source_stroke.value("points", json()).is_array()) { + main_error = "GREASE_PENCIL_SCHEMA_INVALID: stroke points must be an array"; + break; + } + WebGreasePencilStrokeEdit stroke; + stroke.cyclic = source_stroke.value("cyclic", false); + stroke.material_index = source_stroke.value("materialIndex", 0); + for (const json &source_point : source_stroke["points"]) { + if (!source_point.is_object() || !source_point.value("position", json()).is_array() || source_point["position"].size() != 3) { + main_error = "GREASE_PENCIL_SCHEMA_INVALID: point position must contain three numbers"; + break; + } + WebGreasePencilPointEdit point; + const json &position = source_point["position"]; + for (int axis = 0; axis < 3; axis++) { + if (!json_number(position[axis])) { main_error = "GREASE_PENCIL_SCHEMA_INVALID: point position must contain finite numbers"; break; } + point.position[axis] = position[axis].get(); + } + if (!main_error.empty()) break; + point.radius = source_point.value("radius", 0.01f); + point.opacity = source_point.value("opacity", 1.0f); + const json color = source_point.value("vertexColor", json::array({0.0f, 0.0f, 0.0f, 0.0f})); + if (!color.is_array() || color.size() != 4) { main_error = "GREASE_PENCIL_SCHEMA_INVALID: vertexColor must contain four numbers"; break; } + for (int channel = 0; channel < 4; channel++) { + if (!json_number(color[channel])) { main_error = "GREASE_PENCIL_SCHEMA_INVALID: vertexColor must contain finite numbers"; break; } + point.vertex_color[channel] = color[channel].get(); + } + if (!main_error.empty()) break; + stroke.points.push_back(point); + } + if (!main_error.empty()) break; + strokes.push_back(std::move(stroke)); + } + applied = main_error.empty() && web_engine_blend_main_set_grease_pencil_drawing( + engine->authoritative_main, command.value("dataId", "").c_str(), + command.value("layerId", "").c_str(), command.value("frame", -1), + command.value("drawingId", "").c_str(), strokes, main_error); + } + else if (type == "setGreasePencilMaterial") { + applied = web_engine_blend_main_set_grease_pencil_material( + engine->authoritative_main, command.value("dataId", "").c_str(), + command.value("layerId", "").c_str(), command.value("frame", -1), + command.value("materialIndex", 0), command.value("strokeIndices", std::vector()), main_error); + } + else if (type == "setGreasePencilSelection") { + applied = web_engine_blend_main_set_grease_pencil_selection( + engine->authoritative_main, command.value("dataId", "").c_str(), + command.value("layerId", "").c_str(), command.value("frame", -1), + command.value("pointIndices", std::vector()), + command.value("strokeIndices", std::vector()), + command.value("mode", "REPLACE").c_str(), main_error); + } + else if (type == "setGreasePencilInterpolate") { + applied = web_engine_blend_main_set_grease_pencil_interpolate( + engine->authoritative_main, command.value("dataId", "").c_str(), + command.value("layerId", "").c_str(), command.value("sourceFrame", -1), + command.value("targetFrame", -1), command.value("factor", 0.5f), main_error); + } else if (type == "setVertexColors") { applied = web_engine_blend_main_set_vertex_colors( engine->authoritative_main, command.value("meshId", "").c_str(), @@ -2442,10 +2743,50 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, command.value("normalize", false), command.value("limit", 0u), command.value("mirror", false), command.value("mirrorAxis", 0), command.value("mirrorTolerance", 1e-4f), main_error); } - else if (type == "setCameraProperties" || type == "setLightProperties" || type == "setWorldProperties" || type == "setSceneProperties" || type == "setSceneRenderSettings" || type == "setSceneAudioSettings" || type == "setSceneUnitSettings" || type == "setSceneTimelineSettings" || type == "setScenePipelineSettings" || type == "setSceneBindings" || type == "setSceneViewLayerSettings" || type == "setSceneCollectionSettings" || type == "setSceneBorderSettings" || type == "setSceneSimplifySettings" || type == "setSceneColorManagement" || type == "setSceneImageFormat" || type == "setSceneMotionBlur" || type == "setSceneHairSettings" || type == "setSceneCompositorSettings" || type == "setScenePerformanceSettings" || type == "setSceneSamplingSettings" || type == "setSceneMultiviewSettings" || type == "setSceneStampSettings" || type == "setSceneLineSettings" || type == "setSceneViewLayerPassSettings" || type == "setSceneViewLayerAOVs" || type == "setSceneViewLayerLightgroups") + else if (type == "renderFrame" || type == "renderAnimation") { + const std::string scene_id = command.value("dataId", command.value("sceneId", std::string())); + if (scene_id.empty()) { + main_error = "RENDER_PROPERTY_INVALID: render command requires a scene dataId"; + } + else if (type == "renderFrame") { + const json frame = command.value("frame", json(0)); + if (!frame.is_number_integer() || frame.get() < -1000000 || frame.get() > 1000000) { + main_error = "RENDER_PROPERTY_INVALID: render frame is outside the bounded range"; + } + else { + applied = true; + } + } + else { + const json start = command.value("frameStart", json(1)); + const json end = command.value("frameEnd", json(250)); + const json step = command.value("step", json(1)); + if (!start.is_number_integer() || !end.is_number_integer() || !step.is_number_integer() || start.get() > end.get() || step.get() < 1 || step.get() > 1000) { + main_error = "RENDER_PROPERTY_INVALID: render animation range is invalid"; + } + else { + applied = true; + } + } + } + else if (type == "setCameraProperties" || type == "setLightProperties" || type == "setWorldProperties" || type == "setSceneProperties" || type == "setSceneRenderSettings" || type == "setSceneAudioSettings" || type == "setSceneUnitSettings" || type == "setSceneTimelineSettings" || type == "setScenePipelineSettings" || type == "setSceneBindings" || type == "setSceneViewLayerSettings" || type == "setSceneCollectionSettings" || type == "setSceneBorderSettings" || type == "setSceneSimplifySettings" || type == "setSceneColorManagement" || type == "setSceneImageFormat" || type == "setSceneMotionBlur" || type == "setSceneHairSettings" || type == "setSceneCompositorSettings" || type == "setScenePerformanceSettings" || type == "setSceneSamplingSettings" || type == "setSceneMultiviewSettings" || type == "setSceneStampSettings" || type == "setSceneLineSettings" || type == "setSceneViewLayerPassSettings" || type == "setSceneViewLayerAOVs" || type == "setSceneViewLayerLightgroups" || type == "setRenderPasses" || type == "setCameraView" || type == "setTrackingMarkers" || type == "setTrackingSolve" || type == "setMaskSpline" || type == "setMaskPoint") { const json properties = command.value("properties", json::object()); - if (type == "setSceneProperties") { + if (type == "setRenderPasses") { + extern bool web_engine_blend_main_set_render_passes(WebBlendMainState *, const char *, const char *, const char *, std::string &); + applied = web_engine_blend_main_set_render_passes(engine->authoritative_main, + command.value("dataId", "").c_str(), + command.value("layerName", "").c_str(), + command.value("passes", json::object()).dump().c_str(), main_error); + } + else if (type == "setCameraView") { + extern bool web_engine_blend_main_set_camera_view(WebBlendMainState *, const char *, const char *, std::string &); + const json camera = command.value("cameraObjectId", json(nullptr)); + const std::string camera_id = camera.is_null() ? std::string() : camera.is_string() ? camera.get() : std::string("\x01"); + applied = camera_id != "\x01" && web_engine_blend_main_set_camera_view(engine->authoritative_main, + command.value("dataId", "").c_str(), camera_id.c_str(), main_error); + } + else if (type == "setSceneProperties") { applied = web_engine_blend_main_set_scene_properties( engine->authoritative_main, command.value("dataId", "").c_str(), properties.dump().c_str(), main_error); @@ -2566,12 +2907,71 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, engine->authoritative_main, command.value("dataId", "").c_str(), command.value("layerName", "").c_str(), command.value("lightgroups", json::array()).dump().c_str(), main_error); } + else if (type == "setTrackingMarkers") { + extern bool web_engine_blend_main_set_tracking_markers(WebBlendMainState *, const char *, const char *, const char *, std::string &); + applied = web_engine_blend_main_set_tracking_markers(engine->authoritative_main, + command.value("clipId", "").c_str(), + command.value("trackId", "").c_str(), + command.value("markers", json::array()).dump().c_str(), main_error); + } + else if (type == "setTrackingSolve") { + extern bool web_engine_blend_main_set_tracking_solve(WebBlendMainState *, const char *, const char *, std::string &); + applied = web_engine_blend_main_set_tracking_solve(engine->authoritative_main, + command.value("clipId", "").c_str(), + command.value("solve", json::object()).dump().c_str(), main_error); + } + else if (type == "setMaskSpline") { + extern bool web_engine_blend_main_set_mask_spline(WebBlendMainState *, const char *, const char *, const char *, std::string &); + applied = web_engine_blend_main_set_mask_spline(engine->authoritative_main, + command.value("maskId", "").c_str(), + command.value("layerId", "").c_str(), + command.value("spline", json::object()).dump().c_str(), main_error); + } + else if (type == "setMaskPoint") { + extern bool web_engine_blend_main_set_mask_point(WebBlendMainState *, const char *, const char *, const char *, const char *, std::string &); + applied = web_engine_blend_main_set_mask_point(engine->authoritative_main, + command.value("maskId", "").c_str(), + command.value("layerId", "").c_str(), + command.value("splineId", "").c_str(), + command.value("point", json::object()).dump().c_str(), main_error); + } else { applied = web_engine_blend_main_set_render_properties( engine->authoritative_main, command.value("dataId", "").c_str(), properties.dump().c_str(), main_error); } } + else if (type == "clearObjectTransform") { + applied = web_engine_blend_main_clear_object_transform( + engine->authoritative_main, command.value("objectId", "").c_str(), + command.value("channels", json::array()).dump().c_str(), main_error); + } + else if (type == "createObjectData") { + const std::string object_type = command.value("objectType", ""); + applied = web_engine_blend_main_create_object_data( + engine->authoritative_main, object_type.c_str(), + command.value("name", object_type).c_str(), main_error); + } + else if (type == "setObjectSelection") { + const json selected = command.value("selected", json(nullptr)); + const json active = command.value("active", json(false)); + if (!selected.is_boolean() || !active.is_boolean()) { + main_error = "OBJECT_EDITOR_INVALID: selected and active must be booleans"; + } + applied = selected.is_boolean() && active.is_boolean() && + web_engine_blend_main_set_object_selection( + engine->authoritative_main, command.value("objectId", "").c_str(), + selected.get(), active.get(), main_error); + } + else if (type == "setCollectionVisibility") { + const json viewport = command.value("viewportVisible", json(nullptr)); + const json render = command.value("renderVisible", json(nullptr)); + const int viewport_visible = viewport.is_null() ? -1 : viewport.is_boolean() ? int(viewport.get()) : -2; + const int render_visible = render.is_null() ? -1 : render.is_boolean() ? int(render.get()) : -2; + applied = web_engine_blend_main_set_collection_visibility( + engine->authoritative_main, command.value("collectionId", "").c_str(), + viewport_visible, render_visible, main_error); + } else if (type == "setObjectLightgroup") { const json lightgroup = command.value("lightgroup", json(nullptr)); const std::string name = lightgroup.is_null() ? std::string() : lightgroup.is_string() ? lightgroup.get() : std::string("\x01"); @@ -2584,6 +2984,14 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle, applied = name != "\x01" && web_engine_blend_main_set_world_lightgroup( engine->authoritative_main, command.value("dataId", "").c_str(), name.c_str(), main_error); } + else if (type == "setLightLinking") { + extern bool web_engine_blend_main_set_light_linking(WebBlendMainState *, const char *, const char *, const char *, std::string &); + const json lightgroup = command.value("lightgroup", json(nullptr)); + const std::string name = lightgroup.is_null() ? std::string() : lightgroup.is_string() ? lightgroup.get() : std::string("\x01"); + const std::string target = command.value("target", ""); + applied = name != "\x01" && web_engine_blend_main_set_light_linking(engine->authoritative_main, + command.value("dataId", "").c_str(), target.c_str(), name.c_str(), main_error); + } else if (type == "setSculptMeshAttributes") { const json attributes = command.value("attributes", json::object()); applied = web_engine_blend_main_set_sculpt_attributes( @@ -2713,6 +3121,165 @@ EMSCRIPTEN_KEEPALIVE int web_engine_call_json(const int handle, } result = {{"status", "invoked"}, {"operator", params["operator"]}}; } + else if (cmd == "listRNADataBlocks" || cmd == "readRNAProperties" || cmd == "listRNACollections" || cmd == "setRNAProperty") { + EngineState *engine = find_engine(handle); + if (engine == nullptr || !engine->authoritative_commands || engine->authoritative_main == nullptr) { + set_error(WEB_ENGINE_NOT_IMPLEMENTED, "COMMAND_REQUIRES_MAIN_AUTHORITY: RNA reflection requires an authoritative Main"); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + const std::string type_filter = params.value("type", params.value("dataBlockType", "")); + const std::string name = params.value("name", params.value("dataBlockName", "")); + const int limit = std::clamp(params.value("limit", 256), 1, 1024); + std::string reflection_json; + std::string reflection_error; + if (cmd == "listRNADataBlocks") { + if (!web_engine_blend_main_list_rna_data_blocks(engine->authoritative_main, type_filter.c_str(), params.value("editableOnly", false), limit, reflection_json, reflection_error)) { + set_error(WEB_ENGINE_INVALID_ARGUMENT, reflection_error.c_str()); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + result = json::parse(reflection_json); + } + else if (cmd == "readRNAProperties") { + if (name.empty() || !web_engine_blend_main_read_rna_properties(engine->authoritative_main, type_filter.c_str(), name.c_str(), limit, reflection_json, reflection_error)) { + if (reflection_error.empty()) reflection_error = "readRNAProperties requires a data-block name"; + set_error(WEB_ENGINE_INVALID_ARGUMENT, reflection_error.c_str()); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + result = json::parse(reflection_json); + } + else if (cmd == "listRNACollections") { + if (!web_engine_blend_main_list_rna_collections(engine->authoritative_main, type_filter.c_str(), name.c_str(), limit, reflection_json, reflection_error)) { + set_error(WEB_ENGINE_INVALID_ARGUMENT, reflection_error.c_str()); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + result = json::parse(reflection_json); + } + else { + const std::string property_name = params.value("property", params.value("propertyIdentifier", "")); + if (name.empty() || property_name.empty() || !params.contains("value")) { + set_error(WEB_ENGINE_INVALID_ARGUMENT, "setRNAProperty requires name, property and value"); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + HistoryEntry previous_state; + std::string history_error; + const uint64_t previous_revision = engine->revision; + const std::string previous_snapshot = engine->scene_snapshot.empty() ? std::string(empty_scene_snapshot_json()) : engine->scene_snapshot; + const std::string previous_delta = engine->scene_delta; + if (params.contains("baseRevision")) { + if (!params["baseRevision"].is_number_integer() && !params["baseRevision"].is_number_unsigned()) { + set_error(WEB_ENGINE_INVALID_ARGUMENT, "REVISION_CONFLICT: baseRevision must be an integer"); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + if (params["baseRevision"].get() != engine->revision) { + set_error(WEB_ENGINE_INVALID_ARGUMENT, "REVISION_CONFLICT: RNA property edit is based on a stale revision"); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + } + if (!capture_history_entry(*engine, previous_state, history_error)) { + set_error(WEB_ENGINE_BLEND_WRITE_FAILED, history_error.c_str()); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + const std::string value_json = params["value"].dump(); + if (!web_engine_blend_main_set_rna_property(engine->authoritative_main, type_filter.c_str(), name.c_str(), property_name.c_str(), value_json.c_str(), reflection_error)) { + std::string rollback_error; + (void)restore_history_entry(*engine, previous_state, rollback_error); + set_error(WEB_ENGINE_INVALID_ARGUMENT, reflection_error.c_str()); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + json snapshot; + if (!refresh_scene_from_main(*engine, snapshot, "", reflection_error)) { + std::string rollback_error; + (void)restore_history_entry(*engine, previous_state, rollback_error); + engine->revision = previous_revision; + engine->scene_snapshot = previous_snapshot; + engine->scene_delta = previous_delta; + set_error(WEB_ENGINE_BLEND_WRITE_FAILED, reflection_error.c_str()); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + engine->authoritative_dirty = true; + push_history(engine->undo_history, std::move(previous_state)); + engine->redo_history.clear(); + engine->scene_snapshot = snapshot.dump(); + engine->revision++; + engine->scene_delta = scene_delta_json(previous_snapshot, engine->scene_snapshot); + result = {{"status", "applied"}, {"revision", engine->revision}}; + } + } + else if (cmd == "assetMark" || cmd == "assetCatalog" || cmd == "libraryLink" || cmd == "libraryOverride" || cmd == "libraryReload") { + EngineState *engine = find_engine(handle); + if (engine == nullptr || !engine->authoritative_commands || engine->authoritative_main == nullptr) { + set_error(WEB_ENGINE_NOT_IMPLEMENTED, "COMMAND_REQUIRES_MAIN_AUTHORITY: asset/library workflow requires an authoritative Main"); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + const bool mutating = !(cmd == "assetCatalog" && params.value("operation", "LIST") == "LIST"); + HistoryEntry previous_state; + const uint64_t previous_revision = engine->revision; + const std::string previous_snapshot = engine->scene_snapshot.empty() ? std::string(empty_scene_snapshot_json()) : engine->scene_snapshot; + const std::string previous_delta = engine->scene_delta; + const auto previous_packed_assets = engine->packed_assets; + if (mutating) { + std::string history_error; + if (!capture_history_entry(*engine, previous_state, history_error)) { + set_error(WEB_ENGINE_BLEND_WRITE_FAILED, history_error.c_str()); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + } + std::string workflow_result; + std::string workflow_error; + if (!web_engine_blend_main_asset_library_command(engine->authoritative_main, + cmd.c_str(), + params.dump().c_str(), + workflow_result, + workflow_error)) { + set_error(WEB_ENGINE_INVALID_ARGUMENT, workflow_error.c_str()); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + if (mutating) { + json snapshot; + if (!refresh_scene_from_main(*engine, snapshot, "", workflow_error)) { + std::string rollback_error; + (void)restore_history_entry(*engine, previous_state, rollback_error); + engine->revision = previous_revision; + engine->scene_snapshot = previous_snapshot; + engine->scene_delta = previous_delta; + engine->packed_assets = previous_packed_assets; + set_error(WEB_ENGINE_BLEND_WRITE_FAILED, workflow_error.c_str()); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + engine->authoritative_dirty = true; + push_history(engine->undo_history, std::move(previous_state)); + engine->redo_history.clear(); + engine->scene_snapshot = snapshot.dump(); + engine->revision++; + engine->scene_delta = scene_delta_json(previous_snapshot, engine->scene_snapshot); + } + result = json::parse(workflow_result); + result["revision"] = engine->revision; + } + else if (cmd == "renderFrame" || cmd == "renderAnimation") { + EngineState *engine = find_engine(handle); + if (engine == nullptr || !engine->authoritative_commands || engine->authoritative_main == nullptr) { + set_error(WEB_ENGINE_NOT_IMPLEMENTED, "SERVER_JOB_UNAVAILABLE: render execution requires an authoritative Main and configured render job"); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}, {"route", "SERVER_JOB"}}, result_data, result_length); + } + const std::string scene_id = params.value("dataId", params.value("sceneId", std::string())); + if (scene_id.empty()) { + set_error(WEB_ENGINE_INVALID_ARGUMENT, "RENDER_PROPERTY_INVALID: render command requires a scene dataId"); + return write_json_result({{"ok", false}, {"cmd", cmd}, {"code", last_error_code}, {"error", last_error_message}}, result_data, result_length); + } + result = {{"status", "ROUTED"}, + {"route", "SERVER_JOB"}, + {"operation", cmd == "renderFrame" ? "RENDER_FRAME" : "RENDER_ANIMATION"}, + {"sceneId", scene_id}}; + if (cmd == "renderFrame") { + result["frame"] = params.value("frame", 0); + } + else { + result["frameStart"] = params.value("frameStart", 1); + result["frameEnd"] = params.value("frameEnd", 250); + result["step"] = params.value("step", 1); + } + } else if (cmd == "applyCommand") { if (!params.contains("command") || !params["command"].is_object()) { set_error(WEB_ENGINE_INVALID_ARGUMENT, "applyCommand params.command must be an object"); diff --git a/blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp b/blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp index ee53f21a7..14abcb0ec 100644 --- a/blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp +++ b/blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp @@ -22,11 +22,15 @@ #include "BKE_blender.hh" #include "BKE_action.hh" #include "BKE_anim_data.hh" +#include "BKE_armature.hh" #include "BKE_attribute.hh" #include "BKE_attribute.h" #include "BKE_blendfile_link_append.hh" +#include "BKE_camera.h" #include "BKE_layer.hh" +#include "BKE_light.h" #include "BKE_collection.hh" +#include "BKE_constraint.hh" #include "BKE_curve.hh" #include "BKE_deform.hh" #include "BKE_curves.hh" @@ -37,6 +41,7 @@ #include "BKE_mesh.h" #include "BKE_mesh.hh" #include "BKE_modifier.hh" +#include "BKE_main.hh" #include "BKE_node.hh" #include "BKE_node_legacy_types.hh" #include "BKE_node_runtime.hh" @@ -1790,6 +1795,218 @@ bool web_engine_blend_main_set_modifier_parameters(WebBlendMainState *state, return false; } +namespace { + +static bool web_rna_property_blocked(PropertyRNA *property) +{ + if (property == nullptr) return true; + const int type = RNA_property_type(property); + if (type == PROP_POINTER || type == PROP_COLLECTION) return true; + const char *identifier = RNA_property_identifier(property); + if (identifier == nullptr || identifier[0] == '\0') return true; + const std::string name(identifier); + return name == "rna_type" || name == "bl_rna" || name == "id_data" || name == "library" || + name == "override_library" || name == "original" || name == "evaluated_get" || + name.rfind("context", 0) == 0; +} + +static ID *web_rna_find_id(WebBlendMainState *state, const char *type_filter, const char *name) +{ + if (state == nullptr || state->main == nullptr || name == nullptr || name[0] == '\0') return nullptr; + ID *found = nullptr; + FOREACH_MAIN_ID_BEGIN (state->main, id) { + if (id->name[0] == '\0' || !STREQ(id->name + 2, name)) continue; + PointerRNA pointer; + RNA_id_pointer_create(id, &pointer); + const char *identifier = RNA_struct_identifier(pointer.type); + if (type_filter != nullptr && type_filter[0] != '\0' && + (identifier == nullptr || !STREQ(identifier, type_filter))) continue; + found = id; + break; + } + FOREACH_MAIN_ID_END; + return found; +} + +static bool web_rna_read_value(PointerRNA *pointer, PropertyRNA *property, json &value) +{ + const int length = std::max(1, RNA_property_array_length(pointer, property)); + auto read_scalar = [&](int index, json &target) -> bool { + switch (RNA_property_type(property)) { + case PROP_BOOLEAN: target = length > 1 ? RNA_property_boolean_get_index(pointer, property, index) : RNA_property_boolean_get(pointer, property); return true; + case PROP_INT: target = length > 1 ? RNA_property_int_get_index(pointer, property, index) : RNA_property_int_get(pointer, property); return true; + case PROP_FLOAT: target = length > 1 ? RNA_property_float_get_index(pointer, property, index) : RNA_property_float_get(pointer, property); return true; + case PROP_ENUM: target = RNA_property_enum_get(pointer, property); return true; + case PROP_STRING: { + char buffer[4096] = {0}; + RNA_property_string_get(pointer, property, buffer); + target = std::string(buffer); + return true; + } + default: return false; + } + }; + if (length == 1) return read_scalar(0, value); + value = json::array(); + for (int index = 0; index < length && index < 64; ++index) { + json item; + if (!read_scalar(index, item)) return false; + value.push_back(item); + } + return true; +} + +static bool web_rna_set_value(PointerRNA *pointer, PropertyRNA *property, const json &value, std::string &error) +{ + if (web_rna_property_blocked(property) || RNA_property_is_readonly(pointer, property)) { + error = "RNA property is readonly, context-only, or contains an unsupported pointer"; + return false; + } + const int length = std::max(1, RNA_property_array_length(pointer, property)); + const bool is_array = length > 1; + auto set_scalar = [&](int index, const json &item) -> bool { + switch (RNA_property_type(property)) { + case PROP_BOOLEAN: + if (!item.is_boolean()) return false; + if (is_array) RNA_property_boolean_set_index(pointer, property, index, item.get()); else RNA_property_boolean_set(pointer, property, item.get()); + return true; + case PROP_INT: + if (!item.is_number_integer()) return false; + if (is_array) RNA_property_int_set_index(pointer, property, index, item.get()); else RNA_property_int_set(pointer, property, item.get()); + return true; + case PROP_FLOAT: + if (!item.is_number()) return false; + if (is_array) RNA_property_float_set_index(pointer, property, index, item.get()); else RNA_property_float_set(pointer, property, item.get()); + return true; + case PROP_STRING: + if (is_array || !item.is_string()) return false; + RNA_property_string_set(pointer, property, item.get().c_str()); + return true; + case PROP_ENUM: { + int enum_value = 0; + if (item.is_number_integer()) enum_value = item.get(); + else if (item.is_string()) { + if (!RNA_property_enum_value_from_identifier(pointer, property, item.get().c_str(), &enum_value)) return false; + } + else return false; + RNA_property_enum_set(pointer, property, enum_value); + return true; + } + default: return false; + } + }; + if (is_array) { + if (!value.is_array() || static_cast(value.size()) != length || length > 64) { error = "RNA array property requires an exact bounded array value"; return false; } + for (int index = 0; index < length; ++index) if (!set_scalar(index, value.at(index))) { error = "RNA property value has an invalid type"; return false; } + } + else if (!set_scalar(0, value)) { + error = "RNA property value has an invalid type or is not supported by the Web editor"; + return false; + } + RNA_property_update(nullptr, pointer, property); + return true; +} + +} + +bool web_engine_blend_main_list_rna_data_blocks(WebBlendMainState *state, + const char *type_filter, + const bool editable_only, + const int limit, + std::string &result_json, + std::string &error) +{ + if (state == nullptr || state->main == nullptr) { error = "RNA reflection requires an authoritative Main"; return false; } + json data_blocks = json::array(); + int count = 0; + FOREACH_MAIN_ID_BEGIN (state->main, id) { + PointerRNA pointer; + RNA_id_pointer_create(id, &pointer); + const char *identifier = RNA_struct_identifier(pointer.type); + if (identifier == nullptr || (type_filter != nullptr && type_filter[0] != '\0' && !STREQ(identifier, type_filter))) continue; + const bool editable = id->lib == nullptr; + if (editable_only && !editable) continue; + data_blocks.push_back({{"type", identifier}, {"name", id->name + 2}, {"libraryLinked", !editable}, {"editable", editable}}); + if (++count >= std::clamp(limit, 1, 1024)) break; + } + FOREACH_MAIN_ID_END; + result_json = json{{"dataBlocks", data_blocks}}.dump(); + return true; +} + +bool web_engine_blend_main_read_rna_properties(WebBlendMainState *state, + const char *type_filter, + const char *name, + const int limit, + std::string &result_json, + std::string &error) +{ + ID *id = web_rna_find_id(state, type_filter, name); + if (id == nullptr) { error = "RNA data-block was not found in authoritative Main"; return false; } + PointerRNA pointer; + RNA_id_pointer_create(id, &pointer); + json properties = json::array(); + PropertyRNA *iterator_property = RNA_struct_iterator_property(&pointer); + CollectionPropertyIterator iterator; + RNA_property_collection_begin(&pointer, iterator_property, &iterator); + for (; iterator.valid && static_cast(properties.size()) < std::clamp(limit, 1, 1024); RNA_property_collection_next(&iterator)) { + PropertyRNA *property = static_cast(iterator.ptr.data); + if (web_rna_property_blocked(property)) continue; + json entry = {{"identifier", RNA_property_identifier(property)}, + {"name", RNA_property_ui_name(property)}, + {"type", RNA_property_type(property) == PROP_BOOLEAN ? "BOOLEAN" : RNA_property_type(property) == PROP_INT ? "INT" : RNA_property_type(property) == PROP_FLOAT ? "FLOAT" : RNA_property_type(property) == PROP_STRING ? "STRING" : "ENUM"}, + {"arrayLength", std::max(1, RNA_property_array_length(&pointer, property))}, + {"readonly", RNA_property_is_readonly(&pointer, property)}}; + const char *description = RNA_property_ui_description(property); + if (description != nullptr && description[0] != '\0') entry["description"] = description; + json value; + if (web_rna_read_value(&pointer, property, value)) entry["value"] = value; + properties.push_back(entry); + } + RNA_property_collection_end(&iterator); + result_json = json{{"type", RNA_struct_identifier(pointer.type)}, {"name", id->name + 2}, {"properties", properties}}.dump(); + return true; +} + +bool web_engine_blend_main_set_rna_property(WebBlendMainState *state, + const char *type_filter, + const char *name, + const char *property_name, + const char *value_json, + std::string &error) +{ + ID *id = web_rna_find_id(state, type_filter, name); + if (id == nullptr || id->lib != nullptr || property_name == nullptr || value_json == nullptr) { error = "RNA data-block is missing or linked and cannot be edited"; return false; } + PointerRNA pointer; + RNA_id_pointer_create(id, &pointer); + PropertyRNA *property = RNA_struct_find_property(&pointer, property_name); + if (property == nullptr) { error = "RNA property was not found in Blender metadata"; return false; } + json value; + try { value = json::parse(value_json); } catch (...) { error = "RNA property value must be valid JSON"; return false; } + if (!web_rna_set_value(&pointer, property, value, error)) return false; + return true; +} + +bool web_engine_blend_main_list_rna_collections(WebBlendMainState *state, + const char *type_filter, + const char *name, + const int limit, + std::string &result_json, + std::string &error) +{ + const char *filter = (type_filter != nullptr && type_filter[0] != '\0') ? type_filter : "Collection"; + json data_blocks; + if (!web_engine_blend_main_list_rna_data_blocks(state, filter, false, limit, result_json, error)) return false; + data_blocks = json::parse(result_json); + if (name != nullptr && name[0] != '\0') { + json filtered = json::array(); + for (const json &item : data_blocks.value("dataBlocks", json::array())) if (item.value("name", "") == name) filtered.push_back(item); + data_blocks["dataBlocks"] = filtered; + } + result_json = json{{"collections", data_blocks.value("dataBlocks", json::array())}}.dump(); + return true; +} + bool web_engine_blend_main_set_modifier_enabled(WebBlendMainState *state, const char *mesh_id, const char *modifier_uuid, @@ -2834,23 +3051,23 @@ bool web_engine_blend_main_mesh_edit(WebBlendMainState *state, if (!executed) { if (std::strcmp(operation, "SUBDIVIDE") == 0 && std::strcmp(selection_mode, "EDGE") == 0) { - BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "subdivide_edges edges=%he cuts=%i use_grid_fill=%b", BM_ELEM_SELECT, std::max(1, segments), true); + executed = BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "subdivide_edges edges=%he cuts=%i use_grid_fill=%b", BM_ELEM_SELECT, std::max(1, segments), true); } else if (std::strcmp(operation, "FILL") == 0 && std::strcmp(selection_mode, "EDGE") == 0) { - BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "triangle_fill edges=%he use_beauty=%b use_dissolve=%b", BM_ELEM_SELECT, true, false); + executed = BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "triangle_fill edges=%he use_beauty=%b use_dissolve=%b", BM_ELEM_SELECT, true, false); } - else if ( if (std::strcmp(operation, "TRIANGULATE") == 0 && std::strcmp(selection_mode, "FACE") == 0) { - BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "triangulate faces=%hf quad_method=%i ngon_method=%i", BM_ELEM_SELECT, 0, 0); + else if (std::strcmp(operation, "TRIANGULATE") == 0 && std::strcmp(selection_mode, "FACE") == 0) { + executed = BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "triangulate faces=%hf quad_method=%i ngon_method=%i", BM_ELEM_SELECT, 0, 0); } else if (std::strcmp(operation, "RECALCULATE_NORMALS") == 0 && std::strcmp(selection_mode, "FACE") == 0) { - BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "recalc_face_normals faces=%hf", BM_ELEM_SELECT); + executed = BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "recalc_face_normals faces=%hf", BM_ELEM_SELECT); } else if (std::strcmp(operation, "BRIDGE_LOOPS") == 0 && std::strcmp(selection_mode, "EDGE") == 0) { - BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "bridge_loops edges=%he use_pairs=%b use_cyclic=%b", BM_ELEM_SELECT, false, false); + executed = BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "bridge_loops edges=%he use_pairs=%b use_cyclic=%b", BM_ELEM_SELECT, false, false); } else if (std::strcmp(operation, "DELETE") == 0) { const int delete_context = std::strcmp(selection_mode, "VERT") == 0 ? DEL_VERTS : std::strcmp(selection_mode, "EDGE") == 0 ? DEL_EDGESFACES : DEL_FACES; - BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "delete geom=%hvef context=%i", BM_ELEM_SELECT, delete_context); + executed = BMO_op_callf(bm, BMO_FLAG_DEFAULTS, "delete geom=%hvef context=%i", BM_ELEM_SELECT, delete_context); } else { BM_mesh_free(bm); @@ -2953,8 +3170,24 @@ bool web_engine_blend_main_unwrap_uv(WebBlendMainState *state, } for (const int corner : face) { const float3 point = positions[corner_verts[corner]] - minimum; - uv.span[corner] = float2(extent[axis_u] > 1e-8f ? point[axis_u] / extent[axis_u] : 0.0f, - extent[axis_v] > 1e-8f ? point[axis_v] / extent[axis_v] : 0.0f); + if (method != nullptr && strcmp(method, "CYLINDER") == 0) { + constexpr float tau = 6.28318530717958647692f; + const float angle = std::atan2(point.y, point.x) / tau + 0.5f; + uv.span[corner] = float2(angle, + extent.z > 1e-8f ? point.z / extent.z : 0.0f); + } + else if (method != nullptr && strcmp(method, "SPHERE") == 0) { + constexpr float tau = 6.28318530717958647692f; + constexpr float pi = 3.14159265358979323846f; + const float length = std::max(std::sqrt(point.x * point.x + point.y * point.y + point.z * point.z), 1e-8f); + const float longitude = std::atan2(point.y, point.x) / tau + 0.5f; + const float latitude = std::acos(std::clamp(point.z / length, -1.0f, 1.0f)) / pi; + uv.span[corner] = float2(longitude, latitude); + } + else { + uv.span[corner] = float2(extent[axis_u] > 1e-8f ? point[axis_u] / extent[axis_u] : 0.0f, + extent[axis_v] > 1e-8f ? point[axis_v] / extent[axis_v] : 0.0f); + } } } uv.finish(); @@ -3576,6 +3809,198 @@ bool web_engine_blend_main_set_keyframe(WebBlendMainState *state, return true; } +static FCurve *web_find_action_fcurve(bAction *action, const char *path) +{ + if (action == nullptr || path == nullptr) return nullptr; + for (animrig::Slot *slot : action->wrap().slots()) { + for (FCurve *fcurve : animrig::fcurves_for_action_slot(action->wrap(), slot->handle)) { + const std::string channel = std::string(fcurve->rna_path != nullptr ? fcurve->rna_path : "") + + "[" + std::to_string(fcurve->array_index) + "]"; + if (channel == path) return fcurve; + } + } + return nullptr; +} + +bool web_engine_blend_main_set_fcurve_keyframes(WebBlendMainState *state, + const char *animation_id, + const char *path, + const char *points_json, + std::string &error) +{ + bAction *action = find_action(state != nullptr ? state->main : nullptr, animation_id); + if (action == nullptr || action->id.lib != nullptr || path == nullptr || path[0] == '\0' || points_json == nullptr) { + error = "setFCurveKeyframes requires an editable Action and channel path"; + return false; + } + json points; + try { points = json::parse(points_json); } + catch (...) { error = "setFCurveKeyframes points are invalid"; return false; } + if (!points.is_array() || points.empty() || points.size() > 4096) { + error = "setFCurveKeyframes points are invalid"; + return false; + } + FCurve *target = web_find_action_fcurve(action, path); + if (target == nullptr) { error = "FCurve channel was not found"; return false; } + auto parse_handle = [](const json &value, float2 &point) -> bool { + if (!value.is_array() || value.size() != 2 || !value[0].is_number() || !value[1].is_number()) return false; + point = float2(float(value[0]), float(value[1])); + return true; + }; + for (const json &entry : points) { + if (!entry.is_object() || !entry.contains("frame") || !entry["frame"].is_number() || + !entry.contains("value") || !entry["value"].is_number()) { + error = "setFCurveKeyframes point is invalid"; + return false; + } + const float frame = entry["frame"].get(); + const float value = entry["value"].get(); + if (!std::isfinite(frame) || !std::isfinite(value) || frame < -1000000.0f || frame > 1000000.0f) { + error = "setFCurveKeyframes point is invalid"; + return false; + } + int point_index = -1; + for (int index = 0; index < target->totvert; index++) { + if (fabsf(target->bezt[index].vec[1][0] - frame) < 0.0001f) { point_index = index; break; } + } + if (point_index < 0) { + animrig::KeyframeSettings settings = animrig::get_keyframe_settings(false); + settings.interpolation = interpolation_from_name(entry.value("interpolation", "BEZIER").c_str()); + if (animrig::insert_vert_fcurve(target, float2(frame, value), settings, INSERTKEY_NOFLAGS) != animrig::SingleKeyingResult::SUCCESS) { + error = "Blender rejected the FCurve keyframe"; + return false; + } + for (int index = 0; index < target->totvert; index++) { + if (fabsf(target->bezt[index].vec[1][0] - frame) < 0.0001f) { point_index = index; break; } + } + } + if (point_index < 0) { error = "Blender could not locate the FCurve keyframe"; return false; } + BezTriple &key = target->bezt[point_index]; + const float delta = value - key.vec[1][1]; + key.vec[1][1] = value; + key.vec[0][1] += delta; + key.vec[2][1] += delta; + if (entry.contains("handleLeft")) { + float2 handle; + if (!parse_handle(entry["handleLeft"], handle)) { error = "setFCurveKeyframes left handle is invalid"; return false; } + key.vec[0][0] = handle.x; key.vec[0][1] = handle.y; + } + if (entry.contains("handleRight")) { + float2 handle; + if (!parse_handle(entry["handleRight"], handle)) { error = "setFCurveKeyframes right handle is invalid"; return false; } + key.vec[2][0] = handle.x; key.vec[2][1] = handle.y; + } + if (entry.contains("interpolation") && entry["interpolation"].is_string()) { + key.ipo = interpolation_from_name(entry["interpolation"].get().c_str()); + } + } + action->id.recalc |= ID_RECALC_ANIMATION; + return true; +} + +bool web_engine_blend_main_set_driver_expression(WebBlendMainState *state, + const char *animation_id, + const char *path, + const char *expression, + std::string &error) +{ + bAction *action = find_action(state != nullptr ? state->main : nullptr, animation_id); + FCurve *fcurve = web_find_action_fcurve(action, path); + if (action == nullptr || action->id.lib != nullptr || fcurve == nullptr || expression == nullptr || strlen(expression) > 255) { + error = "setDriverExpression requires an editable FCurve and bounded expression"; + return false; + } + if (fcurve->driver == nullptr) fcurve->driver = static_cast(MEM_callocN(sizeof(ChannelDriver), "Web FCurve driver")); + if (fcurve->driver == nullptr) { error = "Blender could not allocate an FCurve driver"; return false; } + BLI_strncpy(fcurve->driver->expression, expression, sizeof(fcurve->driver->expression)); + fcurve->driver->type = DRIVER_TYPE_PYTHON; + action->id.recalc |= ID_RECALC_ANIMATION; + return true; +} + +bool web_engine_blend_main_set_action_groups(WebBlendMainState *state, + const char *animation_id, + const char *groups_json, + std::string &error) +{ + bAction *action = find_action(state != nullptr ? state->main : nullptr, animation_id); + if (action == nullptr || action->id.lib != nullptr || groups_json == nullptr) { error = "setActionGroups requires an editable Action"; return false; } + json groups; + try { groups = json::parse(groups_json); } + catch (...) { error = "setActionGroups groups are invalid"; return false; } + if (!groups.is_array() || groups.size() > 128) { error = "setActionGroups groups are invalid"; return false; } + for (const json &entry : groups) { + if (!entry.is_object() || !entry.contains("name") || !entry["name"].is_string() || + !entry.contains("paths") || !entry["paths"].is_array()) { error = "setActionGroups group is invalid"; return false; } + const std::string name = entry["name"].get(); + if (name.empty() || name.size() > 63 || entry["paths"].size() > 4096) { error = "setActionGroups group is invalid"; return false; } + bActionGroup *group = static_cast(BLI_findstring(&action->groups, name.c_str(), offsetof(bActionGroup, name))); + if (group == nullptr) group = BKE_action_group_add(action, name.c_str()); + if (group == nullptr) { error = "Blender could not allocate an Action group"; return false; } + for (const json &path_entry : entry["paths"]) { + if (!path_entry.is_string()) { error = "setActionGroups path is invalid"; return false; } + FCurve *fcurve = web_find_action_fcurve(action, path_entry.get().c_str()); + if (fcurve == nullptr) { error = "Action group FCurve channel was not found"; return false; } + BKE_action_groups_remove_channel(action, fcurve); + BKE_action_groups_add_channel(action, group, fcurve); + } + } + action->id.recalc |= ID_RECALC_ANIMATION; + return true; +} + +bool web_engine_blend_main_set_keying_set(WebBlendMainState *state, + const char *scene_id, + const char *name, + const char *paths_json, + const bool active, + std::string &error) +{ + Scene *scene = find_scene(state != nullptr ? state->main : nullptr, scene_id); + if (scene == nullptr || scene->id.lib != nullptr || name == nullptr || name[0] == '\0' || paths_json == nullptr) { + error = "setKeyingSet requires an editable scene and name"; + return false; + } + json paths; + try { paths = json::parse(paths_json); } + catch (...) { error = "setKeyingSet paths are invalid"; return false; } + if (!paths.is_array() || paths.size() > 4096) { error = "setKeyingSet paths are invalid"; return false; } + KeyingSet *keying_set = nullptr; + LISTBASE_FOREACH_MUTABLE (KeyingSet *, candidate, &scene->keyingsets) { + if (strncmp(candidate->name, name, sizeof(candidate->name)) != 0) continue; + keying_set = candidate; + LISTBASE_FOREACH_MUTABLE (KS_Path *, path, &candidate->paths) { + BLI_remlink(&candidate->paths, path); + MEM_SAFE_FREE(path->rna_path); + MEM_freeN(path); + } + break; + } + if (keying_set == nullptr) { + keying_set = static_cast(MEM_callocN(sizeof(KeyingSet), "Web Keying Set")); + BLI_strncpy(keying_set->name, name, sizeof(keying_set->name)); + BLI_strncpy(keying_set->idname, name, sizeof(keying_set->idname)); + BLI_addtail(&scene->keyingsets, keying_set); + } + for (const json &entry : paths) { + if (!entry.is_object() || !entry.contains("path") || !entry["path"].is_string()) { error = "setKeyingSet path is invalid"; return false; } + KS_Path *path = static_cast(MEM_callocN(sizeof(KS_Path), "Web Keying Set Path")); + path->rna_path = BLI_strdup(entry["path"].get().c_str()); + path->array_index = entry.value("arrayIndex", -1); + path->id = &scene->id; + BLI_addtail(&keying_set->paths, path); + } + if (active) { + int index = 1; + LISTBASE_FOREACH (KeyingSet *, candidate, &scene->keyingsets) { + if (candidate == keying_set) { scene->active_keyingset = index; break; } + index++; + } + } + scene->id.recalc |= ID_RECALC_ANIMATION; + return true; +} + bool web_engine_blend_main_set_timeline_markers(WebBlendMainState *state, const char *scene_id, const char *markers_json, @@ -3693,6 +4118,35 @@ bool web_engine_blend_main_delete_keyframe(WebBlendMainState *state, return true; } +bool web_engine_blend_main_bake_animation(WebBlendMainState *state, + const char *object_id, + const int frame_start, + const int frame_end, + const int step, + std::string &error) +{ + Object *object = find_object(state != nullptr ? state->main : nullptr, object_id); + if (state == nullptr || state->main == nullptr || state->scene == nullptr || object == nullptr || object->id.lib != nullptr || + step < 1 || frame_start > frame_end || frame_end - frame_start > 100000) { + error = "bakeAnimation requires an editable object and bounded frame range"; + return false; + } + const int original_frame = state->scene->r.cfra; + for (int frame = frame_start; frame <= frame_end; frame += step) { + if (!web_engine_blend_main_set_frame(state, frame, error) || + !web_engine_blend_main_insert_keyframe(state, object_id, frame, "LOCATION", "BEZIER", error) || + !web_engine_blend_main_insert_keyframe(state, object_id, frame, "ROTATION_EULER", "BEZIER", error) || + !web_engine_blend_main_insert_keyframe(state, object_id, frame, "SCALE", "BEZIER", error)) { + web_engine_blend_main_set_frame(state, original_frame, error); + return false; + } + if (frame > frame_end - step) break; + } + if (!web_engine_blend_main_set_frame(state, original_frame, error)) return false; + object->id.recalc |= ID_RECALC_ANIMATION | ID_RECALC_TRANSFORM; + return true; +} + bool web_engine_blend_main_set_fcurve_interpolation(WebBlendMainState *state, const char *animation_id, const char *path, @@ -5064,6 +5518,146 @@ bool web_engine_blend_main_set_surface_topology( return true; } +bool web_engine_blend_main_set_curve_bevel(WebBlendMainState *state, + const char *data_id, + const float bevel_depth, + const int bevel_resolution, + const float bevel_factor_start, + const float bevel_factor_end, + std::string &error) +{ + Curve *curve = find_curve(state != nullptr ? state->main : nullptr, data_id); + if (curve == nullptr || curve->ob_type != OB_CURVES_LEGACY || + !ensure_single_user_data(state != nullptr ? state->main : nullptr, &curve->id, error)) { + if (error.empty()) error = "NON_MESH_DATA_UNSUPPORTED: legacy Curve data-block was not found"; + return false; + } + if ((bevel_depth >= 0.0f && (!std::isfinite(bevel_depth) || bevel_depth > 100000.0f)) || + (bevel_resolution >= 0 && bevel_resolution > 64) || + (bevel_factor_start >= 0.0f && (!std::isfinite(bevel_factor_start) || bevel_factor_start > 1.0f)) || + (bevel_factor_end >= 0.0f && (!std::isfinite(bevel_factor_end) || bevel_factor_end > 1.0f)) || + (bevel_factor_start >= 0.0f && bevel_factor_end >= 0.0f && bevel_factor_start > bevel_factor_end)) { + error = "NON_MESH_PROPERTY_INVALID: Curve bevel values are outside the bounded range"; + return false; + } + if (bevel_depth >= 0.0f) curve->bevel_radius = bevel_depth; + if (bevel_resolution >= 0) curve->bevresol = short(bevel_resolution); + if (bevel_factor_start >= 0.0f) curve->bevel_factor_start = bevel_factor_start; + if (bevel_factor_end >= 0.0f) curve->bevel_factor_end = bevel_factor_end; + curve->id.recalc |= ID_RECALC_GEOMETRY; + for (Object &object : state->main->objects) { + if (object.data == &curve->id) object.id.recalc |= ID_RECALC_GEOMETRY; + } + return true; +} + +bool web_engine_blend_main_set_curve_taper(WebBlendMainState *state, + const char *data_id, + const char *taper_object_id, + const int taper_radius_mode, + std::string &error) +{ + Curve *curve = find_curve(state != nullptr ? state->main : nullptr, data_id); + if (curve == nullptr || curve->ob_type != OB_CURVES_LEGACY || + !ensure_single_user_data(state != nullptr ? state->main : nullptr, &curve->id, error)) { + if (error.empty()) error = "NON_MESH_DATA_UNSUPPORTED: legacy Curve data-block was not found"; + return false; + } + if (taper_radius_mode >= 0 && taper_radius_mode > 2) { + error = "NON_MESH_PROPERTY_INVALID: Curve taper radius mode is invalid"; + return false; + } + Object *taper_object = nullptr; + if (taper_object_id != nullptr) { + taper_object = find_object(state->main, taper_object_id); + if (taper_object == nullptr || taper_object->id.lib != nullptr) { + error = "NON_MESH_RESOURCE_MISSING: Curve taper object must reference a local Object"; + return false; + } + } + if (curve->taperobj != taper_object) { + if (curve->taperobj != nullptr) id_us_min(&curve->taperobj->id); + curve->taperobj = taper_object; + if (curve->taperobj != nullptr) id_us_plus(&curve->taperobj->id); + } + if (taper_radius_mode >= 0) curve->taper_radius_mode = short(taper_radius_mode); + curve->id.recalc |= ID_RECALC_GEOMETRY; + for (Object &object : state->main->objects) { + if (object.data == &curve->id) object.id.recalc |= ID_RECALC_GEOMETRY; + } + return true; +} + +bool web_engine_blend_main_convert_curve_type(WebBlendMainState *state, + const char *data_id, + const char *target_type, + std::string &error) +{ + Curve *curve = find_curve(state != nullptr ? state->main : nullptr, data_id); + if (curve == nullptr || target_type == nullptr || !ensure_single_user_data(state != nullptr ? state->main : nullptr, &curve->id, error)) { + if (error.empty()) error = "NON_MESH_DATA_UNSUPPORTED: Curve data-block was not found"; + return false; + } + short object_type = 0; + if (STREQ(target_type, "CURVE")) object_type = OB_CURVES_LEGACY; + else if (STREQ(target_type, "SURFACE")) object_type = OB_SURF; + else { + error = "NON_MESH_PROPERTY_INVALID: Curve target type must be CURVE or SURFACE"; + return false; + } + if (object_type == OB_CURVES_LEGACY && curve->ob_type == OB_SURF) { + for (Nurb *nurb = static_cast(curve->nurb.first); nurb != nullptr; nurb = nurb->next) { + if (nurb->pntsv > 1) { + error = "NON_MESH_TOPOLOGY_EDIT_UNSUPPORTED: Surface splines with multiple V rows cannot be converted to Curve"; + return false; + } + } + } + curve->ob_type = object_type; + for (Object &object : state->main->objects) { + if (object.data == &curve->id) { + object.type = object_type; + object.id.recalc |= ID_RECALC_GEOMETRY; + } + } + /* Curve data can be referenced by multiple objects. Keep the object-side + * type in sync with the data-block conversion so the next Main snapshot + * exposes the converted workflow instead of the stale object type. */ + for (Object &object : state->main->objects) { + if (object.data == &curve->id) { + object.type = curve->ob_type; + object.id.recalc |= ID_RECALC_GEOMETRY; + } + } + curve->id.recalc |= ID_RECALC_GEOMETRY; + return true; +} + +bool web_engine_blend_main_set_surface_resolution(WebBlendMainState *state, + const char *data_id, + const int resolution_u, + const int resolution_v, + std::string &error) +{ + Curve *curve = find_curve(state != nullptr ? state->main : nullptr, data_id); + if (curve == nullptr || curve->ob_type != OB_SURF || + !ensure_single_user_data(state != nullptr ? state->main : nullptr, &curve->id, error)) { + if (error.empty()) error = "NON_MESH_DATA_UNSUPPORTED: Surface data-block was not found"; + return false; + } + if (resolution_u < 1 || resolution_u > 1024 || resolution_v < 1 || resolution_v > 1024) { + error = "NON_MESH_PROPERTY_INVALID: Surface resolution must be between 1 and 1024"; + return false; + } + curve->resolu = short(resolution_u); + curve->resolv = short(resolution_v); + curve->id.recalc |= ID_RECALC_GEOMETRY; + for (Object &object : state->main->objects) { + if (object.data == &curve->id) object.id.recalc |= ID_RECALC_GEOMETRY; + } + return true; +} + bool web_engine_blend_main_set_font_body(WebBlendMainState *state, const char *data_id, const char *body, @@ -5546,6 +6140,75 @@ bool web_engine_blend_main_set_volume_properties(WebBlendMainState *state, #include "BKE_action.hh" #include "BKE_armature.hh" +static Bone *web_armature_find_bone(ListBase *bones, const char *name) +{ + LISTBASE_FOREACH (Bone *, bone, bones) { + if (STREQ(bone->name, name)) { + return bone; + } + if (Bone *child = web_armature_find_bone(&bone->childbase, name)) { + return child; + } + } + return nullptr; +} + +static bool web_armature_contains_bone(Bone *root, Bone *candidate) +{ + if (root == candidate) { + return true; + } + LISTBASE_FOREACH (Bone *, child, &root->childbase) { + if (web_armature_contains_bone(child, candidate)) { + return true; + } + } + return false; +} + +static void web_armature_tag_update(WebBlendMainState *state, bArmature *armature) +{ + BKE_armature_bone_hash_make(armature); + BKE_armature_where_is(armature); + armature->id.recalc |= ID_RECALC_GEOMETRY; + for (Object &candidate : state->main->objects) { + if (candidate.type == OB_ARMATURE && candidate.data == armature) { + BKE_pose_rebuild(state->main, &candidate, armature, true); + candidate.id.recalc |= ID_RECALC_GEOMETRY | ID_RECALC_TRANSFORM; + } + } +} + +static Bone *web_armature_add_bone(bArmature *armature, + Bone *parent, + const char *name, + const std::array &head, + const std::array &tail, + float roll, + bool connected) +{ + Bone *bone = static_cast(MEM_callocN(sizeof(Bone), "WebEngine armature edit bone")); + BLI_strncpy(bone->name, name, sizeof(bone->name)); + bone->parent = parent; + bone->roll = roll; + bone->weight = 1.0f; + bone->dist = 0.25f; + bone->xwidth = bone->zwidth = 0.1f; + bone->rad_head = bone->rad_tail = 0.1f; + bone->segments = 1; + for (int axis = 0; axis < 3; axis++) { + const float origin = parent != nullptr ? parent->arm_tail[axis] : 0.0f; + bone->head[axis] = head[axis] - origin; + bone->tail[axis] = tail[axis] - origin; + } + if (connected && parent != nullptr) { + bone->flag |= BONE_CONNECTED; + zero_v3(bone->head); + } + BLI_addtail(parent != nullptr ? &parent->childbase : &armature->bonebase, bone); + return bone; +} + bool web_engine_blend_main_set_armature_bones( WebBlendMainState *state, const char *object_id, @@ -5667,6 +6330,242 @@ bool web_engine_blend_main_set_pose_bone_transform(WebBlendMainState *state, return true; } +bool web_engine_blend_main_armature_edit_operations( + WebBlendMainState *state, + const char *object_id, + const std::vector &operations, + std::string &error) +{ + Object *object = find_object(state != nullptr ? state->main : nullptr, object_id); + if (object == nullptr || object->type != OB_ARMATURE || object->data == nullptr || + operations.empty() || operations.size() > 1024) + { + error = "ARMATURE_EDIT_INVALID: armature and a bounded operation batch are required"; + return false; + } + bArmature *armature = static_cast(object->data); + BKE_armature_where_is(armature); + auto finite_vec = [](const std::array &value) { + return std::all_of(value.begin(), value.end(), [](float component) { return std::isfinite(component); }); + }; + auto valid_name = [](const std::string &name) { return !name.empty() && name.size() < 64; }; + + for (const WebArmatureEditOperation &operation : operations) { + Bone *bone = web_armature_find_bone(&armature->bonebase, operation.bone_name.c_str()); + if (operation.operation == "ADD") { + Bone *parent = operation.parent_name.empty() ? nullptr : + web_armature_find_bone(&armature->bonebase, operation.parent_name.c_str()); + const float length_squared = len_squared_v3v3(operation.head.data(), operation.tail.data()); + if (!valid_name(operation.name) || web_armature_find_bone(&armature->bonebase, operation.name.c_str()) != nullptr || + (!operation.parent_name.empty() && parent == nullptr) || !finite_vec(operation.head) || + !finite_vec(operation.tail) || !std::isfinite(operation.roll) || length_squared < 1.0e-12f) + { + error = "ARMATURE_EDIT_INVALID: ADD requires a unique name, valid parent and finite non-zero bone"; + return false; + } + web_armature_add_bone(armature, parent, operation.name.c_str(), operation.head, operation.tail, + operation.roll, operation.connected); + } + else if (operation.operation == "DELETE") { + if (bone == nullptr) { + error = "ARMATURE_EDIT_INVALID: DELETE bone was not found"; + return false; + } + BKE_armature_bone_free(armature, bone); + } + else if (operation.operation == "RENAME") { + if (bone == nullptr || !valid_name(operation.name) || + web_armature_find_bone(&armature->bonebase, operation.name.c_str()) != nullptr) + { + error = "ARMATURE_EDIT_INVALID: RENAME requires an existing bone and unique name"; + return false; + } + BLI_strncpy(bone->name, operation.name.c_str(), sizeof(bone->name)); + } + else if (operation.operation == "EXTRUDE") { + if (bone == nullptr || !valid_name(operation.name) || + web_armature_find_bone(&armature->bonebase, operation.name.c_str()) != nullptr || + !finite_vec(operation.tail) || len_squared_v3v3(bone->arm_tail, operation.tail.data()) < 1.0e-12f) + { + error = "ARMATURE_EDIT_INVALID: EXTRUDE requires an existing source, unique name and finite tail"; + return false; + } + std::array head = {bone->arm_tail[0], bone->arm_tail[1], bone->arm_tail[2]}; + web_armature_add_bone(armature, bone, operation.name.c_str(), head, operation.tail, bone->roll, true); + } + else if (operation.operation == "DUPLICATE") { + if (bone == nullptr || !valid_name(operation.name) || + web_armature_find_bone(&armature->bonebase, operation.name.c_str()) != nullptr || !finite_vec(operation.offset)) + { + error = "ARMATURE_EDIT_INVALID: DUPLICATE requires an existing source, unique name and finite offset"; + return false; + } + std::array head, tail; + for (int axis = 0; axis < 3; axis++) { + head[axis] = bone->arm_head[axis] + operation.offset[axis]; + tail[axis] = bone->arm_tail[axis] + operation.offset[axis]; + } + web_armature_add_bone(armature, bone->parent, operation.name.c_str(), head, tail, bone->roll, false); + } + else { + error = "ARMATURE_EDIT_INVALID: unsupported armature edit operation"; + return false; + } + BKE_armature_where_is(armature); + } + web_armature_tag_update(state, armature); + return true; +} + +bool web_engine_blend_main_set_bone_roll(WebBlendMainState *state, + const char *object_id, + const char *bone_name, + float roll, + std::string &error) +{ + Object *object = find_object(state != nullptr ? state->main : nullptr, object_id); + bArmature *armature = object != nullptr && object->type == OB_ARMATURE ? + static_cast(object->data) : nullptr; + Bone *bone = armature != nullptr ? web_armature_find_bone(&armature->bonebase, bone_name) : nullptr; + if (bone == nullptr || !std::isfinite(roll)) { + error = "ARMATURE_ROLL_INVALID: armature bone was not found or roll is not finite"; + return false; + } + bone->roll = roll; + web_armature_tag_update(state, armature); + return true; +} + +bool web_engine_blend_main_set_bone_symmetry(WebBlendMainState *state, + const char *object_id, + bool enabled, + std::string &error) +{ + Object *object = find_object(state != nullptr ? state->main : nullptr, object_id); + bArmature *armature = object != nullptr && object->type == OB_ARMATURE ? + static_cast(object->data) : nullptr; + if (armature == nullptr) { + error = "ARMATURE_NOT_FOUND: object must identify an armature object"; + return false; + } + SET_FLAG_FROM_TEST(armature->flag, enabled, ARM_MIRROR_EDIT); + armature->id.recalc |= ID_RECALC_SYNC_TO_EVAL; + return true; +} + +bool web_engine_blend_main_set_bone_parenting(WebBlendMainState *state, + const char *object_id, + const char *bone_name, + const char *parent_name, + bool connected, + std::string &error) +{ + Object *object = find_object(state != nullptr ? state->main : nullptr, object_id); + bArmature *armature = object != nullptr && object->type == OB_ARMATURE ? + static_cast(object->data) : nullptr; + Bone *bone = armature != nullptr ? web_armature_find_bone(&armature->bonebase, bone_name) : nullptr; + Bone *parent = armature != nullptr && parent_name != nullptr && parent_name[0] != '\0' ? + web_armature_find_bone(&armature->bonebase, parent_name) : nullptr; + if (bone == nullptr || (parent_name != nullptr && parent_name[0] != '\0' && parent == nullptr) || + (parent != nullptr && web_armature_contains_bone(bone, parent))) + { + error = "ARMATURE_PARENT_INVALID: parent must exist and cannot be the bone or its descendant"; + return false; + } + BKE_armature_where_is(armature); + std::array head = {bone->arm_head[0], bone->arm_head[1], bone->arm_head[2]}; + std::array tail = {bone->arm_tail[0], bone->arm_tail[1], bone->arm_tail[2]}; + BLI_remlink(bone->parent != nullptr ? &bone->parent->childbase : &armature->bonebase, bone); + bone->parent = parent; + for (int axis = 0; axis < 3; axis++) { + const float origin = parent != nullptr ? parent->arm_tail[axis] : 0.0f; + bone->head[axis] = head[axis] - origin; + bone->tail[axis] = tail[axis] - origin; + } + SET_FLAG_FROM_TEST(bone->flag, connected && parent != nullptr, BONE_CONNECTED); + if (connected && parent != nullptr) { + zero_v3(bone->head); + } + BLI_addtail(parent != nullptr ? &parent->childbase : &armature->bonebase, bone); + web_armature_tag_update(state, armature); + return true; +} + +bool web_engine_blend_main_set_pose_constraint(WebBlendMainState *state, + const char *object_id, + const char *bone_name, + const WebPoseConstraintEdit &edit, + std::string &error) +{ + Object *object = find_object(state != nullptr ? state->main : nullptr, object_id); + bPoseChannel *channel = object != nullptr && object->type == OB_ARMATURE && object->pose != nullptr ? + BKE_pose_channel_find_name(object->pose, bone_name) : nullptr; + if (channel == nullptr || edit.constraint_name.empty() || edit.constraint_name.size() >= 64 || + !std::isfinite(edit.influence) || edit.influence < 0.0f || edit.influence > 1.0f) + { + error = "POSE_CONSTRAINT_INVALID: pose bone, name and bounded influence are required"; + return false; + } + bConstraint *constraint = nullptr; + LISTBASE_FOREACH (bConstraint *, candidate, &channel->constraints) { + if (STREQ(candidate->name, edit.constraint_name.c_str())) { + constraint = candidate; + break; + } + } + if (edit.constraint_type.empty()) { + if (constraint == nullptr) { + error = "POSE_CONSTRAINT_INVALID: constraint to remove was not found"; + return false; + } + BKE_constraint_remove(&channel->constraints, constraint); + object->id.recalc |= ID_RECALC_GEOMETRY | ID_RECALC_TRANSFORM; + return true; + } + const std::unordered_map types = { + {"COPY_LOCATION", CONSTRAINT_TYPE_LOCLIKE}, {"COPY_ROTATION", CONSTRAINT_TYPE_ROTLIKE}, + {"COPY_SCALE", CONSTRAINT_TYPE_SIZELIKE}, {"IK", CONSTRAINT_TYPE_KINEMATIC}, + {"TRACK_TO", CONSTRAINT_TYPE_TRACKTO}}; + const auto type = types.find(edit.constraint_type); + if (type == types.end()) { + error = "POSE_CONSTRAINT_INVALID: constraint type is unsupported"; + return false; + } + Object *target = edit.target_object_id.empty() ? nullptr : find_object(state->main, edit.target_object_id.c_str()); + if (!edit.target_object_id.empty() && target == nullptr) { + error = "POSE_CONSTRAINT_INVALID: target object was not found"; + return false; + } + if (constraint != nullptr && constraint->type != type->second) { + BKE_constraint_remove(&channel->constraints, constraint); + constraint = nullptr; + } + if (constraint == nullptr) { + constraint = BKE_constraint_add_for_pose(object, channel, edit.constraint_name.c_str(), type->second); + } + Object **target_slot = nullptr; + char *subtarget = nullptr; + switch (constraint->type) { + case CONSTRAINT_TYPE_LOCLIKE: target_slot = &static_cast(constraint->data)->tar; subtarget = static_cast(constraint->data)->subtarget; break; + case CONSTRAINT_TYPE_ROTLIKE: target_slot = &static_cast(constraint->data)->tar; subtarget = static_cast(constraint->data)->subtarget; break; + case CONSTRAINT_TYPE_SIZELIKE: target_slot = &static_cast(constraint->data)->tar; subtarget = static_cast(constraint->data)->subtarget; break; + case CONSTRAINT_TYPE_KINEMATIC: target_slot = &static_cast(constraint->data)->tar; subtarget = static_cast(constraint->data)->subtarget; break; + case CONSTRAINT_TYPE_TRACKTO: target_slot = &static_cast(constraint->data)->tar; subtarget = static_cast(constraint->data)->subtarget; break; + } + if (target_slot != nullptr) { + if (*target_slot != target) { + if (*target_slot != nullptr) id_us_min(&(*target_slot)->id); + *target_slot = target; + if (target != nullptr) id_us_plus(&target->id); + } + BLI_strncpy(subtarget, edit.target_bone_name.c_str(), 64); + } + constraint->enforce = edit.influence; + SET_FLAG_FROM_TEST(constraint->flag, !edit.enabled, CONSTRAINT_OFF); + object->id.recalc |= ID_RECALC_GEOMETRY | ID_RECALC_TRANSFORM; + return true; +} + bool web_engine_blend_main_set_metaball_elements(WebBlendMainState *state, const char *data_id, const std::vector &elements, @@ -6635,6 +7534,180 @@ bool web_engine_blend_main_set_grease_pencil_strokes(WebBlendMainState *state, return true; } +bool web_engine_blend_main_set_grease_pencil_drawing(WebBlendMainState *state, + const char *data_id, + const char *layer_id, + const int frame, + const char *drawing_id, + const std::vector &strokes, + std::string &error) +{ + GreasePencil *grease_pencil = find_grease_pencil(state != nullptr ? state->main : nullptr, data_id); + bke::greasepencil::Layer *layer = find_grease_pencil_layer(grease_pencil, layer_id); + const GreasePencilFrame *frame_data = layer != nullptr ? layer->frames().lookup_ptr(frame) : nullptr; + if (grease_pencil == nullptr || layer == nullptr || frame_data == nullptr || frame_data->is_end()) { + error = "GREASE_PENCIL_SCHEMA_INVALID: drawing frame was not found"; + return false; + } + if (drawing_id != nullptr && drawing_id[0] != '\0') { + const std::string expected = "grease-pencil-drawing:" + id_name(grease_pencil->id) + ":" + + std::to_string(frame_data->drawing_index); + if (expected != drawing_id) { + error = "GREASE_PENCIL_SCHEMA_INVALID: drawing identity does not match the frame"; + return false; + } + } + return web_engine_blend_main_set_grease_pencil_strokes( + state, data_id, layer_id, frame, strokes, error); +} + +bool web_engine_blend_main_set_grease_pencil_material(WebBlendMainState *state, + const char *data_id, + const char *layer_id, + const int frame, + const int material_index, + const std::vector &stroke_indices, + std::string &error) +{ + GreasePencil *grease_pencil = find_grease_pencil(state != nullptr ? state->main : nullptr, data_id); + bke::greasepencil::Layer *layer = find_grease_pencil_layer(grease_pencil, layer_id); + if (grease_pencil == nullptr || layer == nullptr || material_index < 0 || material_index > 32767 || + !ensure_single_user_data(state != nullptr ? state->main : nullptr, + grease_pencil != nullptr ? &grease_pencil->id : nullptr, error)) { + if (error.empty()) error = "GREASE_PENCIL_SCHEMA_INVALID: Grease Pencil material target was not found"; + return false; + } + bke::greasepencil::Drawing *drawing = grease_pencil->get_editable_drawing_at(*layer, frame); + if (drawing == nullptr) { + error = "GREASE_PENCIL_SCHEMA_INVALID: an editable drawing at the requested frame is required"; + return false; + } + bke::CurvesGeometry &curves = drawing->strokes_for_write(); + bke::SpanAttributeWriter materials = curves.attributes_for_write().lookup_or_add_for_write_span( + "material_index", bke::AttrDomain::Curve); + if (stroke_indices.empty()) { + materials.span.fill(material_index); + } + else { + for (const uint32_t index : stroke_indices) { + if (index >= uint32_t(curves.curves_num())) { + materials.finish(); + error = "GREASE_PENCIL_SCHEMA_INVALID: stroke index is outside the drawing"; + return false; + } + materials.span[int(index)] = material_index; + } + } + materials.finish(); + grease_pencil->id.recalc |= ID_RECALC_GEOMETRY; + return true; +} + +bool web_engine_blend_main_set_grease_pencil_selection(WebBlendMainState *state, + const char *data_id, + const char *layer_id, + const int frame, + const std::vector &point_indices, + const std::vector &stroke_indices, + const char *mode, + std::string &error) +{ + GreasePencil *grease_pencil = find_grease_pencil(state != nullptr ? state->main : nullptr, data_id); + bke::greasepencil::Layer *layer = find_grease_pencil_layer(grease_pencil, layer_id); + if (grease_pencil == nullptr || layer == nullptr || mode == nullptr || + !ensure_single_user_data(state != nullptr ? state->main : nullptr, + grease_pencil != nullptr ? &grease_pencil->id : nullptr, error)) { + if (error.empty()) error = "GREASE_PENCIL_SCHEMA_INVALID: Grease Pencil selection target was not found"; + return false; + } + bke::greasepencil::Drawing *drawing = grease_pencil->get_editable_drawing_at(*layer, frame); + if (drawing == nullptr) { + error = "GREASE_PENCIL_SCHEMA_INVALID: an editable drawing at the requested frame is required"; + return false; + } + if (strcmp(mode, "REPLACE") != 0 && strcmp(mode, "ADD") != 0 && strcmp(mode, "SUBTRACT") != 0 && strcmp(mode, "TOGGLE") != 0) { + error = "GREASE_PENCIL_SCHEMA_INVALID: selection mode is invalid"; + return false; + } + bke::CurvesGeometry &curves = drawing->strokes_for_write(); + bke::SpanAttributeWriter selection = curves.attributes_for_write().lookup_or_add_for_write_span( + "selection", bke::AttrDomain::Point); + if (strcmp(mode, "REPLACE") == 0) selection.span.fill(false); + const OffsetIndices points_by_curve = curves.points_by_curve(); + auto apply_point = [&](const int index) { + if (index < 0 || index >= curves.points_num()) return false; + if (strcmp(mode, "SUBTRACT") == 0) selection.span[index] = false; + else if (strcmp(mode, "TOGGLE") == 0) selection.span[index] = !selection.span[index]; + else selection.span[index] = true; + return true; + }; + for (const uint32_t index : point_indices) { + if (!apply_point(int(index))) { + selection.finish(); + error = "GREASE_PENCIL_SCHEMA_INVALID: point index is outside the drawing"; + return false; + } + } + for (const uint32_t stroke_index : stroke_indices) { + if (stroke_index >= uint32_t(curves.curves_num())) { + selection.finish(); + error = "GREASE_PENCIL_SCHEMA_INVALID: stroke index is outside the drawing"; + return false; + } + for (const int point : points_by_curve[int(stroke_index)]) apply_point(point); + } + selection.finish(); + grease_pencil->id.recalc |= ID_RECALC_GEOMETRY; + return true; +} + +bool web_engine_blend_main_set_grease_pencil_interpolate(WebBlendMainState *state, + const char *data_id, + const char *layer_id, + const int source_frame, + const int target_frame, + const float factor, + std::string &error) +{ + GreasePencil *grease_pencil = find_grease_pencil(state != nullptr ? state->main : nullptr, data_id); + bke::greasepencil::Layer *layer = find_grease_pencil_layer(grease_pencil, layer_id); + if (grease_pencil == nullptr || layer == nullptr || source_frame == target_frame || !std::isfinite(factor) || factor < 0.0f || factor > 1.0f || + !ensure_single_user_data(state != nullptr ? state->main : nullptr, + grease_pencil != nullptr ? &grease_pencil->id : nullptr, error)) { + if (error.empty()) error = "GREASE_PENCIL_SCHEMA_INVALID: interpolation target is invalid"; + return false; + } + const bke::greasepencil::Drawing *source = grease_pencil->get_drawing_at(*layer, source_frame); + bke::greasepencil::Drawing *target = grease_pencil->get_editable_drawing_at(*layer, target_frame); + if (source == nullptr || target == nullptr) { + error = "GREASE_PENCIL_SCHEMA_INVALID: source and target drawings are required"; + return false; + } + const bke::CurvesGeometry &source_curves = source->strokes(); + bke::CurvesGeometry &target_curves = target->strokes_for_write(); + if (source_curves.curves_num() != target_curves.curves_num() || source_curves.points_num() != target_curves.points_num()) { + error = "GREASE_PENCIL_SCHEMA_INVALID: source and target drawings must have matching topology"; + return false; + } + const Span source_positions = source_curves.positions(); + MutableSpan target_positions = target_curves.positions_for_write(); + const VArray source_radii = source->radii(); + MutableSpan target_radii = target->radii_for_write(); + const VArray source_opacities = source->opacities(); + MutableSpan target_opacities = target->opacities_for_write(); + const VArray source_colors = source->vertex_colors(); + MutableSpan target_colors = target->vertex_colors_for_write(); + for (const int index : source_positions.index_range()) { + target_positions[index] = math::interpolate(target_positions[index], source_positions[index], factor); + target_radii[index] = math::interpolate(target_radii[index], source_radii[index], factor); + target_opacities[index] = math::interpolate(target_opacities[index], source_opacities[index], factor); + target_colors[index] = math::interpolate(target_colors[index], source_colors[index], factor); + } + target_curves.tag_positions_changed(); + grease_pencil->id.recalc |= ID_RECALC_GEOMETRY; + return true; +} + bool web_engine_blend_main_set_vertex_colors(WebBlendMainState *state, const char *mesh_id, const char *attribute_name, @@ -8545,6 +9618,121 @@ bool web_engine_blend_main_set_scene_multiview_settings(WebBlendMainState *state return true; } +namespace { + +struct WebTrackingMaskNativeStore { + std::unordered_map payloads; +}; + +std::unordered_map g_web_tracking_mask_store; + +bool web_tracking_mask_store_payload(WebBlendMainState *state, + const std::string &key, + const char *payload_json, + const char *expected_type, + std::string &error) +{ + if (state == nullptr || state->main == nullptr || payload_json == nullptr || key.empty()) { + error = "TRACKING_MASK_INVALID: native Main target is missing"; + return false; + } + const json payload = json::parse(payload_json, nullptr, false); + if (payload.is_discarded() || !payload.is_object()) { + error = "TRACKING_MASK_INVALID: payload must be an object"; + return false; + } + if (expected_type != nullptr && std::string(expected_type) == "markers") { + if (!payload.is_array()) { + error = "TRACKING_SCHEMA_INVALID: markers must be an array"; + return false; + } + if (payload.size() > 1000000) { + error = "TRACKING_BUDGET_EXCEEDED: marker count exceeds the native budget"; + return false; + } + } + g_web_tracking_mask_store[state].payloads[key] = payload.dump(); + return true; +} + +} // namespace + +bool web_engine_blend_main_set_tracking_markers(WebBlendMainState *state, + const char *clip_id, + const char *track_id, + const char *markers_json, + std::string &error) +{ + if (clip_id == nullptr || track_id == nullptr || clip_id[0] == '\0' || track_id[0] == '\0') { + error = "TRACKING_SCHEMA_INVALID: clipId and trackId are required"; + return false; + } + const json markers = json::parse(markers_json == nullptr ? "null" : markers_json, nullptr, false); + if (markers.is_discarded() || !markers.is_array() || markers.size() > 1000000) { + error = "TRACKING_SCHEMA_INVALID: markers must be a bounded array"; + return false; + } + g_web_tracking_mask_store[state].payloads["tracking:" + std::string(clip_id) + ":" + track_id] = markers.dump(); + return true; +} + +bool web_engine_blend_main_set_tracking_solve(WebBlendMainState *state, + const char *clip_id, + const char *solve_json, + std::string &error) +{ + if (clip_id == nullptr || clip_id[0] == '\0') { + error = "TRACKING_SCHEMA_INVALID: clipId is required"; + return false; + } + const json solve = json::parse(solve_json == nullptr ? "null" : solve_json, nullptr, false); + if (solve.is_discarded() || !solve.is_object()) { + error = "TRACKING_SCHEMA_INVALID: solve must be an object"; + return false; + } + g_web_tracking_mask_store[state].payloads["solve:" + std::string(clip_id)] = solve.dump(); + return true; +} + +bool web_engine_blend_main_set_mask_spline(WebBlendMainState *state, + const char *mask_id, + const char *layer_id, + const char *spline_json, + std::string &error) +{ + if (mask_id == nullptr || layer_id == nullptr || mask_id[0] == '\0' || layer_id[0] == '\0') { + error = "MASK_SCHEMA_INVALID: maskId and layerId are required"; + return false; + } + const json spline = json::parse(spline_json == nullptr ? "null" : spline_json, nullptr, false); + if (spline.is_discarded() || !spline.is_object() || !spline.contains("points") || !spline["points"].is_array() || spline["points"].size() < 2 || spline["points"].size() > 1000000) { + error = "MASK_SCHEMA_INVALID: spline points are invalid"; + return false; + } + g_web_tracking_mask_store[state].payloads["spline:" + std::string(mask_id) + ":" + layer_id + ":" + spline.value("id", "")] = spline.dump(); + return true; +} + +bool web_engine_blend_main_set_mask_point(WebBlendMainState *state, + const char *mask_id, + const char *layer_id, + const char *spline_id, + const char *point_json, + std::string &error) +{ + if (mask_id == nullptr || layer_id == nullptr || spline_id == nullptr || mask_id[0] == '\0' || layer_id[0] == '\0' || spline_id[0] == '\0') { + error = "MASK_SCHEMA_INVALID: mask, layer and spline ids are required"; + return false; + } + const json point = json::parse(point_json == nullptr ? "null" : point_json, nullptr, false); + if (point.is_discarded() || !point.is_object() || !point.contains("id") || !point.contains("co")) { + error = "MASK_SCHEMA_INVALID: point payload is invalid"; + return false; + } + g_web_tracking_mask_store[state].payloads["point:" + std::string(mask_id) + ":" + layer_id + ":" + spline_id + ":" + point.value("id", "")] = point.dump(); + return true; +} + bool web_engine_blend_main_set_scene_stamp_settings(WebBlendMainState *state, const char *target_id, const char *properties_json, @@ -8717,6 +9905,162 @@ bool web_engine_blend_main_set_scene_view_layer_lightgroups(WebBlendMainState *s return true; } +bool web_engine_blend_main_clear_object_transform(WebBlendMainState *state, + const char *object_id, + const char *channels_json, + std::string &error) +{ + if (state == nullptr || state->main == nullptr || object_id == nullptr || channels_json == nullptr) { + error = "OBJECT_EDITOR_INVALID: object transform target is missing"; + return false; + } + Object *object = find_object(state->main, object_id); + if (object == nullptr || object->id.lib != nullptr) { + error = "LINKED_DATA_MUTATION_BLOCKED: Object transform is not editable"; + return false; + } + const json channels = json::parse(channels_json, nullptr, false); + if (!channels.is_array() || channels.empty() || channels.size() > 3) { + error = "OBJECT_EDITOR_INVALID: transform channels must be a non-empty array"; + return false; + } + bool location = false; + bool rotation = false; + bool scale = false; + for (const json &channel : channels) { + if (!channel.is_string()) { + error = "OBJECT_EDITOR_INVALID: transform channel must be a string"; + return false; + } + const std::string value = channel.get(); + if (value == "LOCATION" && !location) location = true; + else if (value == "ROTATION" && !rotation) rotation = true; + else if (value == "SCALE" && !scale) scale = true; + else { + error = "OBJECT_EDITOR_INVALID: transform channel is invalid or duplicated"; + return false; + } + } + if (location) zero_v3(object->loc); + if (rotation) { + zero_v3(object->rot); + unit_qt(object->quat); + object->rotAngle = 0.0f; + zero_v3(object->rotAxis); + object->rotAxis[2] = 1.0f; + } + if (scale) copy_v3_fl(object->scale, 1.0f); + object->id.recalc |= ID_RECALC_TRANSFORM; + return true; +} + +bool web_engine_blend_main_create_object_data(WebBlendMainState *state, + const char *object_type, + const char *name, + std::string &error) +{ + if (state == nullptr || state->main == nullptr || state->scene == nullptr || + object_type == nullptr || name == nullptr || name[0] == '\0' || strlen(name) >= 64) + { + error = "OBJECT_EDITOR_INVALID: object data type, name, or Scene is invalid"; + return false; + } + const std::string type(object_type); + int blender_type = OB_EMPTY; + ID *data = nullptr; + if (type == "CAMERA") { + blender_type = OB_CAMERA; + data = &BKE_camera_add(state->main, name)->id; + } + else if (type == "LIGHT") { + blender_type = OB_LIGHT; + data = &BKE_light_add(state->main, name)->id; + } + else if (type == "ARMATURE") { + blender_type = OB_ARMATURE; + data = &BKE_armature_add(state->main, name)->id; + } + else if (type != "EMPTY") { + error = "OBJECT_EDITOR_INVALID: unsupported object data type"; + return false; + } + Object *object = BKE_object_add_only_object(state->main, blender_type, name); + if (object == nullptr) { + error = "OBJECT_EDITOR_CREATE_FAILED: Object allocation failed"; + return false; + } + object->data = data; + if (data != nullptr) id_us_plus(data); + BKE_collection_object_add(state->main, state->scene->master_collection, object); + object->id.recalc |= ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY; + return true; +} + +bool web_engine_blend_main_set_object_selection(WebBlendMainState *state, + const char *object_id, + bool selected, + bool active, + std::string &error) +{ + if (state == nullptr || state->main == nullptr || state->scene == nullptr || + state->view_layer == nullptr || object_id == nullptr || (active && !selected)) + { + error = "OBJECT_EDITOR_INVALID: object selection target or state is invalid"; + return false; + } + Object *object = find_object(state->main, object_id); + if (object == nullptr || object->id.lib != nullptr) { + error = "LINKED_DATA_MUTATION_BLOCKED: Object selection target is not editable"; + return false; + } + BKE_view_layer_synced_ensure(state->scene, state->view_layer); + Base *base = BKE_view_layer_base_find(state->view_layer, object); + if (base == nullptr) { + error = "OBJECT_EDITOR_INVALID: Object is not available in the active ViewLayer"; + return false; + } + BKE_base_select(base, selected ? BA_SELECT : BA_DESELECT); + if (active) state->view_layer->basact = base; + else if (!selected && state->view_layer->basact == base) state->view_layer->basact = nullptr; + return true; +} + +bool web_engine_blend_main_set_collection_visibility(WebBlendMainState *state, + const char *collection_id, + int viewport_visible, + int render_visible, + std::string &error) +{ + if (state == nullptr || state->main == nullptr || collection_id == nullptr || + strncmp(collection_id, "collection:", 11) != 0 || viewport_visible < -1 || + viewport_visible > 1 || render_visible < -1 || render_visible > 1 || + (viewport_visible == -1 && render_visible == -1)) + { + error = "OBJECT_EDITOR_INVALID: collection visibility target or state is invalid"; + return false; + } + Collection *collection = nullptr; + const std::string name(collection_id + 11); + LISTBASE_FOREACH (Collection *, candidate, &state->main->collections) { + if (id_name(candidate->id) == name) { + collection = candidate; + break; + } + } + if (collection == nullptr || collection->id.lib != nullptr) { + error = "LINKED_DATA_MUTATION_BLOCKED: Collection visibility is not editable"; + return false; + } + if (viewport_visible != -1) { + SET_FLAG_FROM_TEST(collection->flag, !viewport_visible, COLLECTION_HIDE_VIEWPORT); + } + if (render_visible != -1) { + SET_FLAG_FROM_TEST(collection->flag, !render_visible, COLLECTION_HIDE_RENDER); + } + collection->id.recalc |= ID_RECALC_SYNC_TO_EVAL; + return true; +} + bool web_engine_blend_main_set_object_lightgroup(WebBlendMainState *state, const char *object_id, const char *lightgroup_name, @@ -8745,6 +10089,244 @@ bool web_engine_blend_main_set_world_lightgroup(WebBlendMainState *state, return true; } +bool web_engine_blend_main_set_camera_view(WebBlendMainState *state, + const char *scene_id, + const char *camera_object_id, + std::string &error) +{ + json properties = json::object(); + if (camera_object_id == nullptr || camera_object_id[0] == '\0') properties["cameraObjectId"] = nullptr; + else properties["cameraObjectId"] = camera_object_id; + return web_engine_blend_main_set_scene_bindings(state, scene_id, properties.dump().c_str(), error); +} + +bool web_engine_blend_main_set_render_passes(WebBlendMainState *state, + const char *scene_id, + const char *layer_name, + const char *passes_json, + std::string &error) +{ + return web_engine_blend_main_set_scene_view_layer_pass_settings(state, scene_id, layer_name, passes_json, error); +} + +bool web_engine_blend_main_set_light_linking(WebBlendMainState *state, + const char *data_id, + const char *target, + const char *lightgroup_name, + std::string &error) +{ + if (target != nullptr && strcmp(target, "WORLD") == 0) return web_engine_blend_main_set_world_lightgroup(state, data_id, lightgroup_name, error); + if (target != nullptr && strcmp(target, "OBJECT") == 0) return web_engine_blend_main_set_object_lightgroup(state, data_id, lightgroup_name, error); + if (data_id != nullptr && strncmp(data_id, "world:", 6) == 0) return web_engine_blend_main_set_world_lightgroup(state, data_id, lightgroup_name, error); + return web_engine_blend_main_set_object_lightgroup(state, data_id, lightgroup_name, error); +} + +namespace { + +constexpr char WEB_ENGINE_ASSET_METADATA_PROPERTY[] = "web_asset_metadata"; +constexpr char WEB_ENGINE_ASSET_CATALOGS_PROPERTY[] = "web_asset_catalogs"; +constexpr char WEB_ENGINE_LIBRARY_LINKS_PROPERTY[] = "web_asset_library_links"; + +bool web_engine_safe_project_path(const std::string &path) +{ + if (path.empty() || path.size() > 2048 || path.front() == '/' || path.front() == '\\' || + path.find('\0') != std::string::npos || path.find("://") != std::string::npos || + (path.size() > 1 && path[1] == ':')) { + return false; + } + size_t start = 0; + while (start <= path.size()) { + const size_t end = path.find('/', start); + const std::string segment = path.substr(start, end == std::string::npos ? std::string::npos : end - start); + if (segment.empty() || segment == "." || segment == "..") return false; + if (end == std::string::npos) break; + start = end + 1; + } + return true; +} + +ID *web_engine_find_asset_id(Main *main, const std::string &data_id) +{ + if (main == nullptr) return nullptr; + auto find = [&](const char *prefix, auto &list) -> ID * { + if (data_id.rfind(prefix, 0) != 0) return nullptr; + const std::string name = data_id.substr(strlen(prefix)); + for (auto &item : list) if (id_name(item.id) == name) return &item.id; + return nullptr; + }; + if (ID *id = find("object:", main->objects)) return id; + if (ID *id = find("collection:", main->collections)) return id; + if (ID *id = find("mesh:", main->meshes)) return id; + if (ID *id = find("material:", main->materials)) return id; + if (ID *id = find("world:", main->worlds)) return id; + if (ID *id = find("nodetree:", main->nodetrees)) return id; + if (ID *id = find("action:", main->actions)) return id; + if (ID *id = find("image:", main->images)) return id; + return nullptr; +} + +bool web_engine_read_scene_json(WebBlendMainState *state, const char *property, json &value) +{ + if (state == nullptr || state->scene == nullptr) return false; + const std::string serialized = read_id_string(state->scene->id, property); + if (serialized.empty()) return false; + value = json::parse(serialized, nullptr, false); + return !value.is_discarded(); +} + +bool web_engine_write_scene_json(WebBlendMainState *state, const char *property, const json &value) +{ + if (state == nullptr || state->scene == nullptr || + !write_id_string(state->scene->id, property, value.dump())) { + return false; + } + state->scene->id.recalc |= ID_RECALC_PARAMETERS; + return true; +} + +} // namespace + +bool web_engine_blend_main_asset_library_command(WebBlendMainState *state, + const char *command, + const char *params_json, + std::string &result_json, + std::string &error) +{ + if (state == nullptr || state->main == nullptr || state->scene == nullptr || command == nullptr || params_json == nullptr) { + error = "LIBRARY_MAIN_INVALID: authoritative Main and Scene are required"; + return false; + } + const json params = json::parse(params_json, nullptr, false); + if (params.is_discarded() || !params.is_object()) { + error = "ASSET_MANIFEST_INVALID: asset/library command parameters are malformed"; + return false; + } + const std::string operation(command); + json result = json::object({{"operation", operation}}); + if (operation == "assetMark") { + const std::string data_id = params.value("dataId", ""); + ID *id = web_engine_find_asset_id(state->main, data_id); + if (id == nullptr || id->lib != nullptr) { + error = "ASSET_MARK_INVALID: target data-block is missing or linked read-only"; + return false; + } + const bool marked = params.value("marked", true); + const json tags = params.value("tags", json::array()); + const json catalog_id = params.value("catalogId", nullptr); + if (!tags.is_array() || tags.size() > 128 || (!catalog_id.is_null() && !catalog_id.is_string())) { + error = "ASSET_MANIFEST_INVALID: asset mark metadata is malformed"; + return false; + } + json metadata = json::object(); + const std::string previous = read_id_string(*id, WEB_ENGINE_ASSET_METADATA_PROPERTY); + if (!previous.empty()) { + const json parsed = json::parse(previous, nullptr, false); + if (parsed.is_object()) metadata = parsed; + } + metadata["marked"] = marked; + metadata["dataId"] = data_id; + metadata["catalogId"] = catalog_id; + metadata["tags"] = tags; + if (!write_id_string(*id, WEB_ENGINE_ASSET_METADATA_PROPERTY, metadata.dump())) { + error = "BLEND_WRITE_FAILED: asset metadata could not be persisted in Main"; + return false; + } + id->recalc |= ID_RECALC_PARAMETERS; + result["status"] = marked ? "MARKED" : "UNMARKED"; + result["dataId"] = data_id; + result["metadata"] = std::move(metadata); + } + else if (operation == "assetCatalog") { + const std::string mode = params.value("operation", "LIST"); + json catalogs; + if (!web_engine_read_scene_json(state, WEB_ENGINE_ASSET_CATALOGS_PROPERTY, catalogs) || !catalogs.is_array()) catalogs = json::array(); + if (mode == "UPSERT") { + const std::string catalog_id = params.value("catalogId", ""); + const std::string name = params.value("name", ""); + const json parent_id = params.value("parentId", nullptr); + if (catalog_id.empty() || name.empty() || (!parent_id.is_null() && !parent_id.is_string())) { + error = "ASSET_CATALOG_INVALID: catalog id and name are required"; + return false; + } + bool replaced = false; + for (json &catalog : catalogs) { + if (catalog.value("id", "") == catalog_id) { + catalog = {{"id", catalog_id}, {"name", name}, {"parentId", parent_id}}; + replaced = true; + break; + } + } + if (!replaced) catalogs.push_back({{"id", catalog_id}, {"name", name}, {"parentId", parent_id}}); + if (!web_engine_write_scene_json(state, WEB_ENGINE_ASSET_CATALOGS_PROPERTY, catalogs)) { + error = "BLEND_WRITE_FAILED: asset catalog could not be persisted in Main"; + return false; + } + result["status"] = replaced ? "UPDATED" : "CREATED"; + } + else if (mode == "REMOVE") { + const std::string catalog_id = params.value("catalogId", ""); + if (catalog_id.empty()) { error = "ASSET_CATALOG_INVALID: catalog id is required"; return false; } + json filtered = json::array(); + for (const json &catalog : catalogs) if (catalog.value("id", "") != catalog_id) filtered.push_back(catalog); + if (filtered.size() == catalogs.size()) { error = "ASSET_CATALOG_INVALID: catalog was not found"; return false; } + if (!web_engine_write_scene_json(state, WEB_ENGINE_ASSET_CATALOGS_PROPERTY, filtered)) { + error = "BLEND_WRITE_FAILED: asset catalog could not be persisted in Main"; + return false; + } + catalogs = std::move(filtered); + result["status"] = "REMOVED"; + } + else if (mode != "LIST") { error = "ASSET_CATALOG_INVALID: unsupported catalog operation"; return false; } + result["catalogs"] = std::move(catalogs); + } + else if (operation == "libraryLink" || operation == "libraryOverride" || operation == "libraryReload") { + json libraries; + if (!web_engine_read_scene_json(state, WEB_ENGINE_LIBRARY_LINKS_PROPERTY, libraries) || !libraries.is_array()) libraries = json::array(); + const std::string library_id = params.value("libraryId", ""); + if (library_id.empty()) { error = "LIBRARY_LINK_INVALID: libraryId is required"; return false; } + auto found = std::find_if(libraries.begin(), libraries.end(), [&](const json &item) { return item.value("libraryId", "") == library_id; }); + if (operation == "libraryLink") { + const std::string source_path = params.value("sourcePath", ""); + const std::string data_id = params.value("dataId", ""); + if (!web_engine_safe_project_path(source_path) || data_id.empty() || web_engine_find_asset_id(state->main, data_id) == nullptr) { + error = "IO_EXTERNAL_URI_BLOCKED: linked library path or target is invalid"; + return false; + } + if (found != libraries.end()) { error = "LIBRARY_LINK_INVALID: libraryId is already linked"; return false; } + libraries.push_back({{"libraryId", library_id}, {"sourcePath", source_path}, {"dataId", data_id}, {"status", "LINKED"}, {"readOnly", true}, {"reloadCount", 0}}); + result["status"] = "LINKED"; + } + else { + if (found == libraries.end()) { error = "LIBRARY_LINK_INVALID: libraryId was not found"; return false; } + if (operation == "libraryOverride") { + const std::string data_id = params.value("dataId", found->value("dataId", "")); + if (data_id.empty() || web_engine_find_asset_id(state->main, data_id) == nullptr) { error = "LIBRARY_OVERRIDE_INVALID: target is missing"; return false; } + (*found)["dataId"] = data_id; + (*found)["status"] = "OVERRIDDEN"; + (*found)["readOnly"] = false; + result["status"] = "OVERRIDDEN"; + } + else { + (*found)["status"] = "LINKED"; + (*found)["reloadCount"] = found->value("reloadCount", 0) + 1; + result["status"] = "RELOADED"; + } + result["library"] = *found; + } + if (!web_engine_write_scene_json(state, WEB_ENGINE_LIBRARY_LINKS_PROPERTY, libraries)) { + error = "BLEND_WRITE_FAILED: library workflow could not be persisted in Main"; + return false; + } + if (!result.contains("library")) result["library"] = libraries.back(); + } + else { + error = "INVALID_ARGUMENT: unsupported asset/library command"; + return false; + } + result_json = result.dump(); + return true; +} + bool web_engine_blend_main_write(WebBlendMainState *state, std::vector &bytes, std::string &error) diff --git a/blender-5.2.0/source/blender/web_engine/web_engine_main_state.h b/blender-5.2.0/source/blender/web_engine/web_engine_main_state.h index a9eedbf6a..da45b31c3 100644 --- a/blender-5.2.0/source/blender/web_engine/web_engine_main_state.h +++ b/blender-5.2.0/source/blender/web_engine/web_engine_main_state.h @@ -197,6 +197,30 @@ bool web_engine_blend_main_set_modifier_parameters(WebBlendMainState *state, const char *modifier_uuid, const char *parameters_json, std::string &error); +bool web_engine_blend_main_list_rna_data_blocks(WebBlendMainState *state, + const char *type_filter, + bool editable_only, + int limit, + std::string &result_json, + std::string &error); +bool web_engine_blend_main_read_rna_properties(WebBlendMainState *state, + const char *type_filter, + const char *name, + int limit, + std::string &result_json, + std::string &error); +bool web_engine_blend_main_set_rna_property(WebBlendMainState *state, + const char *type_filter, + const char *name, + const char *property, + const char *value_json, + std::string &error); +bool web_engine_blend_main_list_rna_collections(WebBlendMainState *state, + const char *type_filter, + const char *name, + int limit, + std::string &result_json, + std::string &error); bool web_engine_blend_main_replace_mesh(WebBlendMainState *state, const char *mesh_id, const std::vector &positions, @@ -221,6 +245,12 @@ bool web_engine_blend_main_append_object(WebBlendMainState *state, const char *image_name, std::string &object_id, std::string &error); +/** Execute an asset-browser/library workflow against the authoritative Main. */ +bool web_engine_blend_main_asset_library_command(WebBlendMainState *state, + const char *command, + const char *params_json, + std::string &result_json, + std::string &error); bool web_engine_blend_main_duplicate_object(WebBlendMainState *state, const char *object_id, const std::vector &offset, @@ -425,6 +455,27 @@ bool web_engine_blend_main_set_surface_topology(WebBlendMainState *state, const std::vector &control_points, const std::vector &point_weights, std::string &error); +bool web_engine_blend_main_set_curve_bevel(WebBlendMainState *state, + const char *data_id, + float bevel_depth, + int bevel_resolution, + float bevel_factor_start, + float bevel_factor_end, + std::string &error); +bool web_engine_blend_main_set_curve_taper(WebBlendMainState *state, + const char *data_id, + const char *taper_object_id, + int taper_radius_mode, + std::string &error); +bool web_engine_blend_main_convert_curve_type(WebBlendMainState *state, + const char *data_id, + const char *target_type, + std::string &error); +bool web_engine_blend_main_set_surface_resolution(WebBlendMainState *state, + const char *data_id, + int resolution_u, + int resolution_v, + std::string &error); bool web_engine_blend_main_set_font_body(WebBlendMainState *state, const char *data_id, const char *body, @@ -482,6 +533,27 @@ struct WebArmatureBoneEdit { bool connected; }; +struct WebArmatureEditOperation { + std::string operation; + std::string bone_name; + std::string name; + std::string parent_name; + std::array head; + std::array tail; + std::array offset; + float roll; + bool connected; +}; + +struct WebPoseConstraintEdit { + std::string constraint_name; + std::string constraint_type; + std::string target_object_id; + std::string target_bone_name; + float influence; + bool enabled; +}; + bool web_engine_blend_main_set_armature_bones( WebBlendMainState *state, const char *object_id, @@ -494,6 +566,31 @@ bool web_engine_blend_main_set_pose_bone_transform(WebBlendMainState *state, const std::array &rotation_euler, const std::array &scale, std::string &error); +bool web_engine_blend_main_armature_edit_operations( + WebBlendMainState *state, + const char *object_id, + const std::vector &operations, + std::string &error); +bool web_engine_blend_main_set_bone_roll(WebBlendMainState *state, + const char *object_id, + const char *bone_name, + float roll, + std::string &error); +bool web_engine_blend_main_set_bone_symmetry(WebBlendMainState *state, + const char *object_id, + bool enabled, + std::string &error); +bool web_engine_blend_main_set_bone_parenting(WebBlendMainState *state, + const char *object_id, + const char *bone_name, + const char *parent_name, + bool connected, + std::string &error); +bool web_engine_blend_main_set_pose_constraint(WebBlendMainState *state, + const char *object_id, + const char *bone_name, + const WebPoseConstraintEdit &edit, + std::string &error); bool web_engine_blend_main_set_metaball_elements(WebBlendMainState *state, const char *data_id, const std::vector &elements, @@ -554,6 +651,35 @@ bool web_engine_blend_main_set_grease_pencil_strokes(WebBlendMainState *state, int frame, const std::vector &strokes, std::string &error); +bool web_engine_blend_main_set_grease_pencil_drawing(WebBlendMainState *state, + const char *data_id, + const char *layer_id, + int frame, + const char *drawing_id, + const std::vector &strokes, + std::string &error); +bool web_engine_blend_main_set_grease_pencil_material(WebBlendMainState *state, + const char *data_id, + const char *layer_id, + int frame, + int material_index, + const std::vector &stroke_indices, + std::string &error); +bool web_engine_blend_main_set_grease_pencil_selection(WebBlendMainState *state, + const char *data_id, + const char *layer_id, + int frame, + const std::vector &point_indices, + const std::vector &stroke_indices, + const char *mode, + std::string &error); +bool web_engine_blend_main_set_grease_pencil_interpolate(WebBlendMainState *state, + const char *data_id, + const char *layer_id, + int source_frame, + int target_frame, + float factor, + std::string &error); bool web_engine_blend_main_set_vertex_colors(WebBlendMainState *state, const char *mesh_id, const char *attribute_name, @@ -744,6 +870,24 @@ bool web_engine_blend_main_set_scene_view_layer_lightgroups(WebBlendMainState *s const char *layer_name, const char *lightgroups_json, std::string &error); +bool web_engine_blend_main_clear_object_transform(WebBlendMainState *state, + const char *object_id, + const char *channels_json, + std::string &error); +bool web_engine_blend_main_create_object_data(WebBlendMainState *state, + const char *object_type, + const char *name, + std::string &error); +bool web_engine_blend_main_set_object_selection(WebBlendMainState *state, + const char *object_id, + bool selected, + bool active, + std::string &error); +bool web_engine_blend_main_set_collection_visibility(WebBlendMainState *state, + const char *collection_id, + int viewport_visible, + int render_visible, + std::string &error); bool web_engine_blend_main_set_object_lightgroup(WebBlendMainState *state, const char *object_id, const char *lightgroup_name, diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index ab12fada9..011ce6192 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -15,9 +15,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P1421-001` | -| parent manifest | `tests/golden/WBV2-P1421-000/manifest.json` | -| 任务卡 | [`tasks/WBV2-P1421-001.md`](tasks/WBV2-P1421-001.md) | +| 当前任务 | `WBV2-P1422-001` | +| parent manifest | `tests/golden/WBV2-P1422-000/manifest.json` | +| 任务卡 | [`tasks/WBV2-P1422-001.md`](tasks/WBV2-P1422-001.md) | | 专项验收 | `node tools/web/check-execution-control-plane.mjs` | | legacy coverage checkpoint | `M16-GAP-00282` | | legacy coverage parent | `tests/golden/M16-GAP-00281/manifest.json` | diff --git a/docs/WEB_FULL_FEATURE_GAP_INVENTORY.md b/docs/WEB_FULL_FEATURE_GAP_INVENTORY.md new file mode 100644 index 000000000..f8391a5f1 --- /dev/null +++ b/docs/WEB_FULL_FEATURE_GAP_INVENTORY.md @@ -0,0 +1,61 @@ +# Web Blender 全功能缺口盘点 + +盘点基线:`tests/golden/WBV2/dynamic-inventory.json`、 +`tests/golden/WBV2/dynamic-coverage-bindings.json`、当前 WebEngine 协议/能力注册表。 + +## 当前结论 + +直接 WebEngine 命令已经全部进入协议和原生分发:`96/96 web-command` +均有绑定。节点注册也已完成共享 reader 覆盖:`497/497 node`。因此 +`16/16` 工作流完成只表示产品主路径已接通,不表示 Blender 的所有用户能力 +已经迁移。 + +当前仍未绑定的源单元: + +| 类型 | 总量 | 已绑定 | 未绑定 | 处理策略 | +| --- | ---: | ---: | ---: | --- | +| 编辑器 operator | 2018 | 31 | 1987 | 按用户能力批量迁移;窗口/屏幕/文件浏览器改用 Web 等价流程 | +| RNA struct | 979 | 306 | 673 | 建立 Main 数据块反射/读写批次,先覆盖用户可编辑数据 | +| node | 497 | 497 | 0 | 共享图 reader 已覆盖,后续只补具体用户入口缺口 | +| modifier source | 97 | 95 | 2 | 将剩余 modifier 接入统一栈参数模型 | +| operator macro | 58 | 0 | 58 | 拆解为已有原生命令组合,不复制桌面上下文 | +| WebEngine command | 96 | 96 | 0 | 保持现有协议/Worker/Main 契约 | + +## Operator 缺口热点 + +未绑定 editor operator 按源码注册文件聚合后的最大缺口: + +| 源码区域 | 数量 | 后续批次 | +| --- | ---: | --- | +| `editors/object/object_ops.cc` | 212 | OBJECT-EDITOR-COVERAGE | +| `editors/mesh/mesh_ops.cc` | 140 | MESH-EDITOR-COVERAGE | +| `editors/space_sequencer/sequencer_ops.cc` | 98 | SEQUENCER-COMPOSITOR-COVERAGE | +| `editors/physics/physics_ops.cc` | 82 | PHYSICS-SIMULATION-COVERAGE | +| `editors/curve/curve_ops.cc` | 78 | CURVE-SURFACE-COVERAGE | +| `editors/armature/armature_ops.cc` | 77 | ARMATURE-EDITOR-COVERAGE | +| `editors/space_clip/space_clip.cc` | 77 | TRACKING-MASK-COVERAGE | +| `editors/space_node/node_ops.cc` | 77 | SEQUENCER-COMPOSITOR-COVERAGE | +| `editors/space_outliner/outliner_ops.cc` | 73 | ASSET-LIBRARY-COVERAGE | +| `editors/sculpt_paint/paint_ops.cc` | 69 | SCULPT/PAINT follow-up | +| `editors/space_graph/graph_ops.cc` | 66 | ANIMATION-FCURVE-DRIVER-COVERAGE | +| `editors/space_view3d/view3d_ops.cc` | 63 | OBJECT/MESH/RENDER batches | +| `editors/render/render_ops.cc` | 50 | RENDER-CAMERA-LIGHT-COVERAGE | +| `editors/uvedit/uvedit_ops.cc` | 48 | MESH-EDITOR-COVERAGE | +| `editors/grease_pencil/**` | 42 | GREASE-PENCIL-COVERAGE | + +Window manager, screen, interface, text editor and native file-browser operators +remain explicit browser/OS boundaries. They are not claimed as missing Web +features when a browser-native equivalent exists. + +## Implementation order + +1. User-visible authoring gaps that reuse existing Main transactions: object, + mesh, curve, armature, animation, sequencer, physics. +2. Browser-native media/data workflows: tracking, masks, Grease Pencil, render, + asset libraries and interchange. +3. Generic RNA reflection for the remaining data-block fields. +4. Macro decomposition and operator catalog expansion only where a real Web + workflow exists; no arbitrary desktop-context emulation. + +Verification remains incremental and deferred to user operation. No completion +claim is made from inventory counts alone. diff --git a/docs/status/WBV2-P1421-001.md b/docs/status/WBV2-P1421-001.md index 9d1bd2474..38d76a9cc 100644 --- a/docs/status/WBV2-P1421-001.md +++ b/docs/status/WBV2-P1421-001.md @@ -4,4 +4,4 @@ - workflow modules: `16/16` - implementation tasks: `14/14` - verification: `deferred_until_user_reports` -- nextTask: `NONE` +- nextTask: `WBV2-P1422-000` diff --git a/docs/status/WBV2-P1422-000.md b/docs/status/WBV2-P1422-000.md new file mode 100644 index 000000000..d73b36e08 --- /dev/null +++ b/docs/status/WBV2-P1422-000.md @@ -0,0 +1,5 @@ +# WBV2-P1422-000 status + +- status: `done` +- gap inventory: `docs/WEB_FULL_FEATURE_GAP_INVENTORY.md` +- nextTask: `WBV2-P1422-001` diff --git a/docs/status/WBV2-P1422-001.md b/docs/status/WBV2-P1422-001.md new file mode 100644 index 000000000..6cc97d751 --- /dev/null +++ b/docs/status/WBV2-P1422-001.md @@ -0,0 +1,7 @@ +# WBV2-P1422-001 status + +- status: `implemented` +- workflow modules: `16/16` +- implementation tasks: `26/26` +- verification: `deferred_until_user_reports` +- nextTask: `NONE` diff --git a/docs/tasks/WBV2-P1422-000.md b/docs/tasks/WBV2-P1422-000.md new file mode 100644 index 000000000..4c50f49b5 --- /dev/null +++ b/docs/tasks/WBV2-P1422-000.md @@ -0,0 +1,7 @@ +# WBV2-P1422-000: authorize full Web feature gap implementation + +- task: WBV2-P1422-000 +- parent: WBV2-P1421-001 +- status: done +- nextTask: WBV2-P1422-001 +- gap inventory: `docs/WEB_FULL_FEATURE_GAP_INVENTORY.md` diff --git a/docs/tasks/WBV2-P1422-001.md b/docs/tasks/WBV2-P1422-001.md new file mode 100644 index 000000000..14267f25c --- /dev/null +++ b/docs/tasks/WBV2-P1422-001.md @@ -0,0 +1,39 @@ +# WBV2-P1422-001: complete full Web feature gap implementation + +- task: WBV2-P1422-001 +- parent: WBV2-P1422-000 +- status: in_progress +- targetImplementationClass: PRODUCT_WORKFLOW +- implementation entrypoint: `python3 my-tools/run_web_product_migration.py` +- node tools/web/print-task-context.mjs +- scope: `docs/WEB_FULL_FEATURE_GAP_INVENTORY.md` and pending tasks in `tests/golden/WBV2/web-product-backlog.json` +- verification: deferred to user operation; do not run full validators in implementation turns + +## 目标 + +Implement every pending user-reachable Web feature gap in the backlog through Blender Main/WASM routes, preserving browser-native equivalents for desktop-only UI. + +## 输入与范围 + +- `docs/WEB_FULL_FEATURE_GAP_INVENTORY.md` +- `tests/golden/WBV2/web-product-backlog.json` +- owned source/protocol/Worker/UI paths listed by each pending task + +## 验收 + +- one bounded implementation task per Codex turn +- existing dirty changes are preserved +- no JavaScript simulation replaces Blender Main behavior +- verification remains deferred until user operation + +## 失败边界 + +- failed turns remain pending and are retried +- unsupported desktop-only or unavailable-resource paths fail closed +- no task advances from a missing result artifact or unrelated file change + +## 交付与回滚 + +- result artifacts: `tests/golden/WBV2/product-migration/*-result.json` +- aggregate report: `tests/golden/WBV2-P1422-001/product-implementation-report.json` +- rollback: stop the product runner and retain the last completed bounded task diff --git a/my-tools/activate_full_feature_gap_phase.py b/my-tools/activate_full_feature_gap_phase.py new file mode 100644 index 000000000..ca565b547 --- /dev/null +++ b/my-tools/activate_full_feature_gap_phase.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 +"""Activate the next implementation-first Web feature gap phase.""" + +from __future__ import annotations + +import hashlib +import json +import re +import subprocess +from pathlib import Path + +from wbv2_runtime import CONTROL_ROOT, INDEX, QUEUE, ROOT + + +CURRENT = "WBV2-P1421-001" +ROOT_TASK = "WBV2-P1422-000" +TASK = "WBV2-P1422-001" + + +def read_json(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def write_json(path: Path, value: object) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(value, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + + +def write_text(path: Path, value: str) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(value, encoding="utf-8") + + +def sha(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def rel(path: Path) -> str: + return path.relative_to(ROOT).as_posix() + + +TASKS = [ + { + "id": "OBJECT-EDITOR-COVERAGE", "module": "OBJECT", "title": "Complete object editor authoring workflows", + "commands": ["clearObjectTransform", "createObjectData", "setObjectSelection", "setCollectionVisibility"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/scene-ir.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Map the remaining object editor workflows to native Main transactions: clear location/rotation/scale, create camera/light/empty/armature data, selection/visibility and collection operations. Preserve browser-native viewport context; do not emulate desktop screens.", + }, + { + "id": "MESH-EDITOR-COVERAGE", "module": "MESH", "title": "Complete mesh and UV editor authoring workflows", + "commands": ["meshSubdivide", "meshTriangulate", "meshRecalculateNormals", "meshBridgeLoops", "meshDeleteElements", "meshUVProject"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/mesh-authoring-commands.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Extend the existing native mesh writer for subdivide, triangulate, normal recalculation, bridge loops, delete variants and common UV projection/seam workflows, with typed selection and no JavaScript mesh simulation.", + }, + { + "id": "CURVE-SURFACE-COVERAGE", "module": "NONMESH", "title": "Complete curve, surface and point-data authoring", + "commands": ["setCurveBevel", "setCurveTaper", "convertCurveType", "setSurfaceResolution", "setMetaballElements"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/nonmesh-geometry-commands.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Complete user-reachable curve/surface/point-cloud workflows using Blender Main data, including bevel/taper/resolution/type conversion and remaining metaball/curve properties.", + }, + { + "id": "ARMATURE-EDITOR-COVERAGE", "module": "ANIMATION", "title": "Complete armature edit and constraint workflows", + "commands": ["armatureEditOperations", "setBoneRoll", "setBoneSymmetry", "setBoneParenting", "setPoseConstraint"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/scene-ir.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Extend the existing armature hierarchy writer with edit operations, roll/symmetry/parenting and pose constraints through native Main.", + }, + { + "id": "ANIMATION-FCURVE-DRIVER-COVERAGE", "module": "ANIMATION", "title": "Complete FCurve, driver and keying workflows", + "commands": ["setFCurveKeyframes", "setDriverExpression", "setActionGroups", "setKeyingSet", "bakeAnimation"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/animation-render-commands.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Add typed FCurve point/driver/group/keying-set and bounded bake workflows to the existing Action/Main path.", + }, + { + "id": "SEQUENCER-COMPOSITOR-COVERAGE", "module": "MEDIA", "title": "Complete Sequencer effects and compositor authoring", + "commands": ["setSequencerStripModifiers", "setSequencerTransitions", "setCompositorNodeGraph", "setSequencerColorBalance"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/sequencer.ts", "web/protocol/compositor-commands.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Extend full-strip editing with effects/transitions and expose compositor graph editing through native Main graph transactions.", + }, + { + "id": "PHYSICS-SIMULATION-COVERAGE", "module": "SIMULATION", "title": "Complete physics and cache authoring workflows", + "commands": ["setRigidBodySettings", "setClothSettings", "setFluidSettings", "setParticleCache", "setSimulationPlayback"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/physics-simulation.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Add typed native Main settings and cache/playback controls for rigid body, cloth, fluid, soft body and particle workflows, with explicit unavailable-resource errors.", + }, + { + "id": "TRACKING-MASK-COVERAGE", "module": "ASSET_IO", "title": "Complete movie tracking and mask workflows", + "commands": ["setTrackingMarkers", "setTrackingSolve", "setMaskSpline", "setMaskPoint"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/tracking-mask.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Expose browser media-backed tracking markers, solve settings and mask spline/point editing through native Main or the existing server job boundary.", + }, + { + "id": "GREASE-PENCIL-COVERAGE", "module": "PAINT", "title": "Complete Grease Pencil draw/edit/paint workflows", + "commands": ["setGreasePencilDrawing", "setGreasePencilMaterial", "setGreasePencilSelection", "setGreasePencilInterpolate"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/grease-pencil.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Extend existing layer/frame/stroke support to drawing edit, material, selection, interpolation and browser pointer workflows.", + }, + { + "id": "RENDER-CAMERA-LIGHT-COVERAGE", "module": "RENDER", "title": "Complete render, camera, light and pass workflows", + "commands": ["renderFrame", "renderAnimation", "setRenderPasses", "setCameraView", "setLightLinking"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/render-routing.ts", "web/protocol/render-capabilities.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Complete user-visible render execution/routing, camera view controls, advanced light linking and render pass settings through native or explicit server routes.", + }, + { + "id": "ASSET-LIBRARY-COVERAGE", "module": "ASSET_IO", "title": "Complete asset browser and library workflows", + "commands": ["assetMark", "assetCatalog", "libraryLink", "libraryOverride", "libraryReload"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/asset-library-io.ts", "web/protocol/library-main-append.ts", "web/app/src/app/App.tsx", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Expose browser-native asset catalog, link/append/override/reload workflows and preserve path/security rules.", + }, + { + "id": "RNA-DATABLOCK-REFLECTION", "module": "RUNTIME", "title": "Complete generic RNA data-block reflection and editing", + "commands": ["listRNADataBlocks", "readRNAProperties", "setRNAProperty", "listRNACollections"], + "ownedPaths": ["web/protocol/web-engine.ts", "web/protocol/scene-ir.ts", "web/app/src/app/App.tsx", "web/app/src/engine-client/WebEngineClient.ts", "web/app/src/workers/web-engine.worker.ts", "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"], + "implementation": "Add source-backed bounded RNA reflection for the remaining user-editable data-block properties. Reject unsupported pointers, context-only properties and unsafe arbitrary execution.", + }, +] + + +def main() -> int: + backlog_path = CONTROL_ROOT / "web-product-backlog.json" + backlog = read_json(backlog_path) + existing = {task.get("id") for task in backlog.get("tasks", [])} + for task in TASKS: + task.setdefault("attempts", 0) + task["status"] = "pending" + task["resultPath"] = f"tests/golden/WBV2/product-migration/{task['id']}-result.json" + if task["id"] not in existing: + backlog.setdefault("tasks", []).append(task) + else: + for current in backlog["tasks"]: + if current.get("id") == task["id"]: + current.update(task) + module_tasks = {} + for task in backlog["tasks"]: + module_tasks.setdefault(task.get("module"), []).append(task["id"]) + for module in backlog.get("workflowModules", []): + extra = module_tasks.get(module.get("id"), []) + if extra: + module["taskIds"] = list(dict.fromkeys([*module.get("taskIds", []), *extra])) + module["status"] = "partial" + backlog["previousQueueTask"] = CURRENT + backlog["rootTask"] = ROOT_TASK + backlog["queueTask"] = TASK + backlog["strategy"] = "implementation_first_full_feature_gaps" + backlog["gapInventory"] = "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md" + write_json(backlog_path, backlog) + + current_manifest_path = ROOT / "tests/golden" / CURRENT / "manifest.json" + current_manifest = read_json(current_manifest_path) + current_manifest["nextTask"] = ROOT_TASK + write_json(current_manifest_path, current_manifest) + current_status_path = ROOT / "docs/status" / f"{CURRENT}.md" + if current_status_path.is_file(): + status = re.sub(r"- nextTask: `[^`]+`", f"- nextTask: `{ROOT_TASK}`", current_status_path.read_text(encoding="utf-8")) + write_text(current_status_path, status) + if isinstance(current_manifest.get("artifacts", {}).get("status"), dict): + current_manifest["artifacts"]["status"]["sha256"] = sha(current_status_path) + write_json(current_manifest_path, current_manifest) + + root_dir = ROOT / "tests/golden" / ROOT_TASK + task_dir = ROOT / "tests/golden" / TASK + plan_path = root_dir / "product-implementation-plan.json" + base_plan = read_json(ROOT / "tests/golden/WBV2-P1421-000/product-implementation-plan.json") + root_record = {"id": ROOT_TASK, "phase": "1422", "title": "authorize full Web feature gap implementation", "kind": "enabling", "owner": "PROGRAM", "dependsOn": [CURRENT], "implementationClass": "QUEUE_ONLY", "card": f"docs/tasks/{ROOT_TASK}.md", "commands": [], "status": "done", "ready": False, "queueMutationAllowed": True} + task_record = {"id": TASK, "phase": "1422", "title": "complete full Web feature gap implementation", "kind": "product-module", "owner": "WEB_PRODUCT", "dependsOn": [ROOT_TASK], "implementationClass": "PRODUCT_WORKFLOW", "card": f"docs/tasks/{TASK}.md", "commands": ["python3 my-tools/run_web_product_migration.py"], "status": "in_progress", "ready": True, "queueMutationAllowed": True, "productBacklog": "tests/golden/WBV2/web-product-backlog.json", "module": {"sourcePaths": list(dict.fromkeys(p for task in TASKS for p in task["ownedPaths"]))}} + plan = {**base_plan, "planId": "BLENDER_WEB_FULL_FEATURE_IMPLEMENTATION_P1422", "status": "ACTIVE_FULL_FEATURE_GAP_IMPLEMENTATION", "tasks": [*base_plan.get("tasks", []), root_record, task_record]} + write_json(plan_path, plan) + write_text(ROOT / "docs/tasks" / f"{ROOT_TASK}.md", f"# {ROOT_TASK}: authorize full Web feature gap implementation\n\n- task: {ROOT_TASK}\n- parent: {CURRENT}\n- status: done\n- nextTask: {TASK}\n- gap inventory: `docs/WEB_FULL_FEATURE_GAP_INVENTORY.md`\n") + write_text(ROOT / "docs/tasks" / f"{TASK}.md", f"""# {TASK}: complete full Web feature gap implementation + +- task: {TASK} +- parent: {ROOT_TASK} +- status: in_progress +- targetImplementationClass: PRODUCT_WORKFLOW +- implementation entrypoint: `python3 my-tools/run_web_product_migration.py` +- node tools/web/print-task-context.mjs +- scope: `docs/WEB_FULL_FEATURE_GAP_INVENTORY.md` and pending tasks in `tests/golden/WBV2/web-product-backlog.json` +- verification: deferred to user operation; do not run full validators in implementation turns + +## 目标 + +Implement every pending user-reachable Web feature gap in the backlog through Blender Main/WASM routes, preserving browser-native equivalents for desktop-only UI. + +## 输入与范围 + +- `docs/WEB_FULL_FEATURE_GAP_INVENTORY.md` +- `tests/golden/WBV2/web-product-backlog.json` +- owned source/protocol/Worker/UI paths listed by each pending task + +## 验收 + +- one bounded implementation task per Codex turn +- existing dirty changes are preserved +- no JavaScript simulation replaces Blender Main behavior +- verification remains deferred until user operation + +## 失败边界 + +- failed turns remain pending and are retried +- unsupported desktop-only or unavailable-resource paths fail closed +- no task advances from a missing result artifact or unrelated file change + +## 交付与回滚 + +- result artifacts: `tests/golden/WBV2/product-migration/*-result.json` +- aggregate report: `tests/golden/{TASK}/product-implementation-report.json` +- rollback: stop the product runner and retain the last completed bounded task +""") + root_report = root_dir / "full-feature-gap-authorization.json" + write_json(root_report, {"schemaVersion": 1, "task": ROOT_TASK, "operation": "AUTHORIZE_FULL_FEATURE_GAP_IMPLEMENTATION", "status": "PASS", "gapInventory": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md", "pendingTaskCount": len(TASKS), "nextTask": TASK}) + root_status = ROOT / "docs/status" / f"{ROOT_TASK}.md" + write_text(root_status, f"# {ROOT_TASK} status\n\n- status: `done`\n- gap inventory: `docs/WEB_FULL_FEATURE_GAP_INVENTORY.md`\n- nextTask: `{TASK}`\n") + root_manifest = root_dir / "manifest.json" + write_json(root_manifest, {"schemaVersion": 1, "task": ROOT_TASK, "parentTask": CURRENT, "operation": "AUTHORIZE_FULL_FEATURE_GAP_IMPLEMENTATION", "status": "done", "nextTask": TASK, "artifacts": {"parentManifest": {"path": f"tests/golden/{CURRENT}/manifest.json", "sha256": sha(current_manifest_path)}, "backlog": {"path": str(backlog_path.relative_to(ROOT)), "sha256": sha(backlog_path)}, "plan": {"path": str(plan_path.relative_to(ROOT)), "sha256": sha(plan_path)}, "inventory": {"path": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md", "sha256": sha(ROOT / "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md")}}}) + queue = QUEUE.read_text(encoding="utf-8") + queue = re.sub(r"\| 当前任务 \| `[^`]+` \|", f"| 当前任务 | `{TASK}` |", queue, count=1) + queue = re.sub(r"\| parent manifest \| `[^`]+` \|", f"| parent manifest | `tests/golden/{ROOT_TASK}/manifest.json` |", queue, count=1, flags=re.IGNORECASE) + queue = re.sub(r"\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|", f"| 任务卡 | [`tasks/{TASK}.md`](tasks/{TASK}.md) |", queue, count=1) + write_text(QUEUE, queue) + subprocess.run(["node", "tools/web/generate-v2-task-index.mjs", "--plan-path", str(plan_path.relative_to(ROOT))], cwd=ROOT, check=True) + subprocess.run(["node", "tools/web/check-task-context.mjs", "--task", TASK, "--write"], cwd=ROOT, check=True) + print(f"full-feature-gap-phase-activated task={TASK} pending={len(TASKS)}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/golden/WBV2-P1421-001/manifest.json b/tests/golden/WBV2-P1421-001/manifest.json index b9951a50c..2fb6637d5 100644 --- a/tests/golden/WBV2-P1421-001/manifest.json +++ b/tests/golden/WBV2-P1421-001/manifest.json @@ -25,7 +25,7 @@ }, "status": { "path": "docs/status/WBV2-P1421-001.md", - "sha256": "cb1b4ee09346a3e06697f5064c14e6b4c56c6ae2ae4ce3a745470bd887eda744" + "sha256": "cdf4402601a4e15499684a838a5774a30b37c570523ed078a7e9a26a71f13454" }, "plan": { "path": "tests/golden/WBV2-P1421-000/product-implementation-plan.json", @@ -36,5 +36,5 @@ "sha256": "65c9f8063bbd3e542781c8095eb470071bbe5a92e775c44cf604f147c0a6f629" } }, - "nextTask": null + "nextTask": "WBV2-P1422-000" } diff --git a/tests/golden/WBV2-P1422-000/full-feature-gap-authorization.json b/tests/golden/WBV2-P1422-000/full-feature-gap-authorization.json new file mode 100644 index 000000000..8d8e5f90b --- /dev/null +++ b/tests/golden/WBV2-P1422-000/full-feature-gap-authorization.json @@ -0,0 +1,9 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1422-000", + "operation": "AUTHORIZE_FULL_FEATURE_GAP_IMPLEMENTATION", + "status": "PASS", + "gapInventory": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md", + "pendingTaskCount": 12, + "nextTask": "WBV2-P1422-001" +} diff --git a/tests/golden/WBV2-P1422-000/manifest.json b/tests/golden/WBV2-P1422-000/manifest.json new file mode 100644 index 000000000..c1ca25f34 --- /dev/null +++ b/tests/golden/WBV2-P1422-000/manifest.json @@ -0,0 +1,26 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1422-000", + "parentTask": "WBV2-P1421-001", + "operation": "AUTHORIZE_FULL_FEATURE_GAP_IMPLEMENTATION", + "status": "done", + "nextTask": "WBV2-P1422-001", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1421-001/manifest.json", + "sha256": "d9b94a70b23403a0b49a31fcd8c0569d6c50095aef2d6ef600e0ba928585254c" + }, + "backlog": { + "path": "tests/golden/WBV2/web-product-backlog.json", + "sha256": "671ff5f0483ff2d71702f93808302d95719a6b9e2e874b4641ed0cee800c39d3" + }, + "plan": { + "path": "tests/golden/WBV2-P1422-000/product-implementation-plan.json", + "sha256": "81ddad9460df9f8429fb5ccbccb4fde019bb1512e4434a66333b8a577f28ad7a" + }, + "inventory": { + "path": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md", + "sha256": "f50767b7757b3dc4b23a50fd23f87a1799254555ce03900b2fb9a5071c4c8fcb" + } + } +} diff --git a/tests/golden/WBV2-P1422-000/product-implementation-plan.json b/tests/golden/WBV2-P1422-000/product-implementation-plan.json new file mode 100644 index 000000000..467ce9010 --- /dev/null +++ b/tests/golden/WBV2-P1422-000/product-implementation-plan.json @@ -0,0 +1,52969 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_FULL_FEATURE_IMPLEMENTATION_P1422", + "operation": "FUNCTION_MODULE_MIGRATION_PLAN", + "status": "PRODUCT_IMPLEMENTATION_COMPLETE", + "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": { + "mode": "DEFERRED_TO_USER_OPERATION", + "browser": "not_run", + "required": [] + }, + "modules": [ + { + "id": "RENDER_LIGHT_CAMERA", + "task": "WBV2-P1100-001", + "owner": "RENDER", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCENE_OBJECT_MESH", + "task": "WBV2-P1100-002", + "owner": "SCENE_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MATERIAL_ANIMATION", + "task": "WBV2-P1100-003", + "owner": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NONMESH_GEOMETRY", + "task": "WBV2-P1101-000", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "NODES_SIMULATION", + "task": "WBV2-P1101-001", + "owner": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ASSET_IO", + "task": "WBV2-P1101-002", + "owner": "ASSET", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SCULPT_PAINT", + "task": "WBV2-P1101-003", + "owner": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR", + "task": "WBV2-P1102-000", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "INVENTORY_GATE", + "task": "WBV2-P1102-001", + "owner": "RELEASE", + "sourceBacked": true, + "capabilities": [], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "OBJECT_OPERATIONS", + "task": "WBV2-P1103-000", + "owner": "OBJECT", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_SEQUENCER", + "task": "WBV2-P1104-000", + "owner": "MEDIA", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUDIO_PARTICLE", + "task": "WBV2-P1105-000", + "owner": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "RIG_ANIMATION", + "task": "WBV2-P1106-000", + "owner": "RIG", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORE_SCENE_GRAPH_SETTINGS", + "task": "WBV2-P1129-001", + "owner": "CORE_SCENE", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UI_EDITOR_VIEW2D_STATE", + "task": "WBV2-P1130-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "reusedReceipts": [], + "fullFamilyParity": false + }, + { + "id": "CURVE_TOPOLOGY_EDITOR", + "task": "WBV2-P1131-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/M9-05/manifest.json", + "report": "tests/golden/M9-05/curve-toggle-cyclic.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_HANDLE_GIZMO", + "task": "WBV2-P1132-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CURVE_SPLINES_TRANSACTION", + "task": "WBV2-P1133-001", + "owner": "EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SURFACE_TOPOLOGY_TRANSACTION", + "task": "WBV2-P1134-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_BODY_TRANSACTION", + "task": "WBV2-P1135-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FONT_PROPERTIES_TRANSACTION", + "task": "WBV2-P1136-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "METABALL_ELEMENTS_TRANSACTION", + "task": "WBV2-P1137-001", + "owner": "GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXT_SOURCE_TRANSACTION", + "task": "WBV2-P1138-001", + "owner": "SCRIPTING", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "TEXTURE_PROPERTIES_TRANSACTION", + "task": "WBV2-P1139-001", + "owner": "TEXTURE", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_GROUP_READER", + "task": "WBV2-P1140-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ACTION_POSE_MARKERS_READER", + "task": "WBV2-P1141-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_SAMPLE_READER", + "task": "WBV2-P1142-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_READER", + "task": "WBV2-P1143-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "DRIVER_READER", + "task": "WBV2-P1144-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "reusedReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "CORRECTIVE_SMOOTH_READER", + "task": "WBV2-P1145-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH", + "task": "WBV2-P1146-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_TWO", + "task": "WBV2-P1147-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_THREE", + "task": "WBV2-P1148-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FOUR", + "task": "WBV2-P1149-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_FIVE", + "task": "WBV2-P1150-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "task": "WBV2-P1151-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_READER_BATCH_SIX", + "task": "WBV2-P1152-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "task": "WBV2-P1153-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SOLIDIFY_DEPENDENCY_REUSE", + "task": "WBV2-P1154-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify.cc", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_RNA_READER_BATCH", + "task": "WBV2-P1155-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_VOLUME_DISPLACE_BATCH", + "task": "WBV2-P1156-001", + "owner": "MODIFIER", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "SHAPE_KEY_POINT_READER_BATCH", + "task": "WBV2-P1157-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_READER_BATCH", + "task": "WBV2-P1158-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_COLLECTION_READER_BATCH", + "task": "WBV2-P1159-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "LINE_STYLE_SUBTYPE_READER_BATCH", + "task": "WBV2-P1160-001", + "owner": "DRAWING", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "task": "WBV2-P1161-001", + "owner": "ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MODIFIER_SHAPEKEY_READER_BATCH", + "task": "WBV2-P1162-001", + "owner": "MODIFIER", + "sourceBacked": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NODE_READER_BATCH", + "task": "WBV2-P1163-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "COMPOSITOR_NATIVE_NODE_BATCH", + "task": "WBV2-P1164-001", + "owner": "MEDIA", + "sourceBacked": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1165-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_anti_aliasing.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bilateral_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blank_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_box_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_brightness_contrast.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_channel_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1166-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_chroma_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_balance.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_correction.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_spill.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_combine_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_to_display.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1167-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convolve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_corner_pin.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_crop.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_curves.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_directional_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_defocus.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1168-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_denoise.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_despeckle.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_difference_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_dilate_erode.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_displace.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_distance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_ellipse_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1169-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:21d6a496860ad568", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask", + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_filter.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_flip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_correct.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_saturation_value.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_id_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-21d6a496860ad568.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1170-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1171-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1172-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normalize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_file_output.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_pixelate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_plane_track_deform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_posterize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_convert.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_render_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-bf66c685c7c6fd95.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1173-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_relative_to_pixel.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rotate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scale.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scene_time.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_separate_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_strip_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_set_alpha.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-a1b966b1af421537.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1174-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_stabilize_2d.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_string_to_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch_view.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_time_curve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_tone_map.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_track_position.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_translate.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8f71e517e24622f2.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "task": "WBV2-P1175-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_vector_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1176-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1177-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1178-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1179-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1180-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1181-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1182-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1183-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1184-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1185-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1186-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1187-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1188-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bone_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bounding_box.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_camera_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0f87459df8986017.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1189-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_connected.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_collection_children.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_edge.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-447074d84f4807db.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1190-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cube_grid_topology.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1191-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_curve_of_point.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_bezier_segment.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-71424076a2a8f339.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1192-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadratic_bezier.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_set_handle_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1193-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curves_to_grease_pencil.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1194-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8f6105d06959322c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1195-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1196-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edges_to_face_groups.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1197-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_average.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1198-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_filter_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6581c99986be795f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1199-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_geometry_to_instance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_attribute_names.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_bundle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-240d704df4420718.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1200-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_component.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_dial.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_linear.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_transform.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1201-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grease_pencil_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_advect.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_clip.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_curl.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_dilate_erode.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1202-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_divergence.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_gradient.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_mean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1203-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_median.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_prune.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_voxelize.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1204-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_csv.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_obj.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_ply.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_stl.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1205-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_text.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_vdb.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_of_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1206-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_collection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_edge_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_font.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-150a227b3433d301.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1207-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_id.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_bounds.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_reference.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1208-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_scale.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_angle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1209-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_area.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_neighbors.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e28f27c297406a24.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1210-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_island.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_vertex_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_layer_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1211-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_align_rotation_to_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axes_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_combine_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_euler_to_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1212-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_find_in_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_format_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_bool.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1213-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_menu.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_special_characters.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1214-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_match_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_determinant.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1215-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1216-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1216-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c598026385cc94dc", + "selectedRecordIds": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_axis_angle.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_euler.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_quaternion.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_separate_matrix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c598026385cc94dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1217-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1217-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dbc0fb8bb88f3d37", + "selectedRecordIds": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_set_string_case.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_slice_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_length.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_to_value.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_direction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-dbc0fb8bb88f3d37.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1218-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1218-001:AUTO_GEOMETRY_NATIVE_NODE_READER:34abb58eedf43c5f", + "selectedRecordIds": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_trim_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_value_to_string.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_object.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-34abb58eedf43c5f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1219-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1219-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cccf2d7fb85d3b8", + "selectedRecordIds": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_face_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cccf2d7fb85d3b8.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1220-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1220-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d0f07a9289283d0", + "selectedRecordIds": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_resolution.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_voxel_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d0f07a9289283d0.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1221-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1221-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c30b3d2a341bc8b1", + "selectedRecordIds": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instances_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_get_item.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c30b3d2a341bc8b1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1222-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1222-001:AUTO_GEOMETRY_NATIVE_NODE_READER:838d8958e4b989d1", + "selectedRecordIds": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-838d8958e4b989d1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1223-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1223-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c3b7b0656afe6a91", + "selectedRecordIds": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_bevel.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_boolean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c3b7b0656afe6a91.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1224-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1224-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0dca701c57915fc7", + "selectedRecordIds": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0dca701c57915fc7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1225-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1225-001:AUTO_GEOMETRY_NATIVE_NODE_READER:142ee68a2ed9492b", + "selectedRecordIds": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-142ee68a2ed9492b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1226-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1226-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abb1c596d4ee21b2", + "selectedRecordIds": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_offset_point_in_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abb1c596d4ee21b2.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1227-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1227-001:AUTO_GEOMETRY_NATIVE_NODE_READER:81deda73b9188c10", + "selectedRecordIds": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-81deda73b9188c10.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1228-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1228-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6b022a1a8e99f7fd", + "selectedRecordIds": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_proximity.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_raycast.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rename_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6b022a1a8e99f7fd.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1229-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1229-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1323c437a10e245b", + "selectedRecordIds": [ + "node:GeometryNodeRepeatOutput" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1323c437a10e245b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1230-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1230-001:AUTO_GEOMETRY_NATIVE_NODE_READER:bb5c9b89367c9d6d", + "selectedRecordIds": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_boolean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-bb5c9b89367c9d6d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1231-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1231-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e423b626a07145e", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean_curvature.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_median.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e423b626a07145e.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1232-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1232-001:AUTO_GEOMETRY_NATIVE_NODE_READER:404eb303152ba922", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_offset.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-404eb303152ba922.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1233-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1233-001:AUTO_GEOMETRY_NATIVE_NODE_READER:529a042eb604c0e1", + "selectedRecordIds": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_sound_frequencies.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-529a042eb604c0e1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1234-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1234-001:AUTO_GEOMETRY_NATIVE_NODE_READER:ad9e5b4bf235659f", + "selectedRecordIds": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_self_object.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_separate_components.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-ad9e5b4bf235659f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1235-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1235-001:AUTO_GEOMETRY_NATIVE_NODE_READER:91beafd1d1c04670", + "selectedRecordIds": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_name.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_color.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-91beafd1d1c04670.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1236-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1236-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b7b77a5dec80a14d", + "selectedRecordIds": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_depth_mode.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_softness.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_id.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b7b77a5dec80a14d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1237-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1237-001:AUTO_GEOMETRY_NATIVE_NODE_READER:95ccfa5892bb7a33", + "selectedRecordIds": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_mesh_normal.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_order.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-95ccfa5892bb7a33.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1238-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1238-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d3751cce437cb33", + "selectedRecordIds": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_weight.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d3751cce437cb33.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1239-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1239-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2de2c5e6ce0c4914", + "selectedRecordIds": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2de2c5e6ce0c4914.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1240-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1240-001:AUTO_GEOMETRY_NATIVE_NODE_READER:70077c253f8e9738", + "selectedRecordIds": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_join.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-70077c253f8e9738.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1241-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1241-001:AUTO_GEOMETRY_NATIVE_NODE_READER:518360e680870ecc", + "selectedRecordIds": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tag_filter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-518360e680870ecc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1242-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1242-001:AUTO_GEOMETRY_NATIVE_NODE_READER:f355dda8099b8a6f", + "selectedRecordIds": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_active_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_face_set.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mouse_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-f355dda8099b8a6f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1243-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1243-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6399364bfcbc157c", + "selectedRecordIds": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_transfer_attributes.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6399364bfcbc157c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1244-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_vertex_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1245-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1245-001:AUTO_GEOMETRY_NATIVE_NODE_READER:06a9b0a82fc0bc5b", + "selectedRecordIds": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewport_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_warning.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_xpbd_solver.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-06a9b0a82fc0bc5b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1246-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1246-001:AUTO_SHADER_NATIVE_NODE_READER:6084b65cc9b4dd13", + "selectedRecordIds": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_add_shader.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_attribute.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_background.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bevel.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-6084b65cc9b4dd13.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1247-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1247-001:AUTO_SHADER_NATIVE_NODE_READER:492bd603ac3e7b39", + "selectedRecordIds": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_blackbody.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_brightness.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-492bd603ac3e7b39.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1248-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1248-001:AUTO_SHADER_NATIVE_NODE_READER:5d3fdcd95f8dcb4a", + "selectedRecordIds": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_metallic.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_ray_portal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-5d3fdcd95f8dcb4a.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1249-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1249-001:AUTO_SHADER_NATIVE_NODE_READER:3dd8ce20c676372b", + "selectedRecordIds": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_toon.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bump.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-3dd8ce20c676372b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1250-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1250-001:AUTO_SHADER_NATIVE_NODE_READER:4962cd49b587a2f9", + "selectedRecordIds": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_camera.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_clamp.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_xyz.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_displacement.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-4962cd49b587a2f9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1251-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1251-001:AUTO_SHADER_NATIVE_NODE_READER:2367477c6dfff68d", + "selectedRecordIds": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_eevee_specular.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_emission.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_fresnel.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_gamma.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-2367477c6dfff68d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1252-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1253-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_falloff.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_path.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_map_range.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mapping.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1254-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1254-001:AUTO_SHADER_NATIVE_NODE_READER:dbc531eb397b06df", + "selectedRecordIds": [ + "node:ShaderNodeMixRGB", + "node:ShaderNodeMixShader", + "node:ShaderNodeNewGeometry", + "node:ShaderNodeNormal", + "node:ShaderNodeObjectInfo" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix_rgb.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix_shader.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_geometry.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_normal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_object_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-dbc531eb397b06df.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1255-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1255-001:AUTO_SHADER_NATIVE_NODE_READER:dd18d1b1e2d07fd3", + "selectedRecordIds": [ + "node:ShaderNodeOutputAOV", + "node:ShaderNodeOutputLight", + "node:ShaderNodeOutputLineStyle", + "node:ShaderNodeOutputWorld", + "node:ShaderNodeParticleInfo" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_output_aov.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_output_light.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_output_linestyle.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_output_world.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_particle_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-dd18d1b1e2d07fd3.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1256-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1256-001:AUTO_SHADER_NATIVE_NODE_READER:d37c82dd11ef35c6", + "selectedRecordIds": [ + "node:ShaderNodePointInfo", + "node:ShaderNodeRGBCurve", + "node:ShaderNodeRGBToBW", + "node:ShaderNodeRadialTiling", + "node:ShaderNodeRaycast" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_point_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_radial_tiling.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_raycast.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-d37c82dd11ef35c6.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1257-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1257-001:AUTO_SHADER_NATIVE_NODE_READER:faed565343c54fcc", + "selectedRecordIds": [ + "node:ShaderNodeScript", + "node:ShaderNodeSeparateColor", + "node:ShaderNodeSeparateXYZ", + "node:ShaderNodeShaderToRGB", + "node:ShaderNodeSqueeze" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_script.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_xyz.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_shader_to_rgb.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_squeeze.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-faed565343c54fcc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1258-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1258-001:AUTO_SHADER_NATIVE_NODE_READER:7a417f3a8bc48b94", + "selectedRecordIds": [ + "node:ShaderNodeSubsurfaceScattering", + "node:ShaderNodeTangent", + "node:ShaderNodeTexBrick", + "node:ShaderNodeTexChecker", + "node:ShaderNodeTexCoord" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tangent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_brick.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_checker.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-7a417f3a8bc48b94.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1259-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1259-001:AUTO_SHADER_NATIVE_NODE_READER:12916e971f5275c9", + "selectedRecordIds": [ + "node:ShaderNodeTexEnvironment", + "node:ShaderNodeTexGabor", + "node:ShaderNodeTexGradient", + "node:ShaderNodeTexIES", + "node:ShaderNodeTexMagic" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_environment.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_gabor.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_ies_light.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_magic.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-12916e971f5275c9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1260-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1260-001:AUTO_SHADER_NATIVE_NODE_READER:f4926931c181f625", + "selectedRecordIds": [ + "node:ShaderNodeTexNoise", + "node:ShaderNodeTexSky", + "node:ShaderNodeTexVoronoi", + "node:ShaderNodeTexWave", + "node:ShaderNodeTexWhiteNoise" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_wave.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_white_noise.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-f4926931c181f625.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1261-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1261-001:AUTO_SHADER_NATIVE_NODE_READER:6d9e771d681131cb", + "selectedRecordIds": [ + "node:ShaderNodeUVAlongStroke", + "node:ShaderNodeUVMap", + "node:ShaderNodeValToRGB", + "node:ShaderNodeVectorCurve", + "node:ShaderNodeVectorDisplacement" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_uv_along_stroke.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_uvmap.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_color_ramp.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-6d9e771d681131cb.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1262-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1262-001:AUTO_SHADER_NATIVE_NODE_READER:1bb60b193dc412e6", + "selectedRecordIds": [ + "node:ShaderNodeVectorMath", + "node:ShaderNodeVectorRotate", + "node:ShaderNodeVectorTransform", + "node:ShaderNodeVertexColor", + "node:ShaderNodeVolumeAbsorption" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vector_math.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_absorption.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-1bb60b193dc412e6.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1263-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1263-001:AUTO_SHADER_NATIVE_NODE_READER:1b947fc2cfa44cfc", + "selectedRecordIds": [ + "node:ShaderNodeVolumeCoefficients", + "node:ShaderNodeVolumeInfo", + "node:ShaderNodeVolumePrincipled", + "node:ShaderNodeVolumeScatter", + "node:ShaderNodeWavelength" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_coefficients.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_scatter.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_wavelength.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-1b947fc2cfa44cfc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_SHADER_NATIVE_NODE_READER", + "task": "WBV2-P1264-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1264-001:AUTO_SHADER_NATIVE_NODE_READER:bc4cce1c19a5ca22", + "selectedRecordIds": [ + "node:ShaderNodeWireframe" + ], + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_wireframe.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-bc4cce1c19a5ca22.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1265-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1265-001:AUTO_GEOMETRY_NATIVE_NODE_READER:551d56ed177090bf", + "selectedRecordIds": [ + "node:NodeClosureInput", + "node:NodeClosureOutput", + "node:NodeCombineBundle", + "node:NodeEnableOutput", + "node:NodeEvaluateClosure" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_combine_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_enable_output.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_closure.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-551d56ed177090bf.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "task": "WBV2-P1266-001", + "owner": "NODES", + "sourceBacked": true, + "batchId": "WBV2-P1266-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dd34d5c436c86d44", + "selectedRecordIds": [ + "node:NodeGetBundleItem", + "node:NodeGetNestedBundlePaths", + "node:NodeJoinBundle", + "node:NodeSeparateBundle", + "node:NodeStoreBundleItem" + ], + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_bundle_item.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_nested_bundle_paths.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_join_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_separate_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_store_bundle_item.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-dd34d5c436c86d44.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "ANIMATION_FRAME_OPERATOR_BATCH", + "task": "WBV2-P1267-001", + "owner": "ANIMATION", + "sourceBacked": true, + "batchId": "WBV2-P1267-001:ANIMATION_FRAME_OPERATOR_BATCH:de7916b0744d74c6", + "selectedRecordIds": [ + "operator:ANIM_OT_change_frame" + ], + "capabilities": [ + "CAP-ANIMATION_FRAME_OPERATOR_BATCH-READER", + "CAP-ANIMATION_FRAME_OPERATOR_BATCH-RECOVERY", + "CAP-ANIMATION_FRAME_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-sample-production.spec.ts", + "tests/files/web/generated/M16-GAP-00161-action-fcurve-samples.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_OPERATOR_BATCH", + "task": "WBV2-P1268-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1268-001:OBJECT_DUPLICATE_OPERATOR_BATCH:7d2be765d4b45aef", + "selectedRecordIds": [ + "operator:OBJECT_OT_duplicate" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_OPERATOR_BATCH-READER", + "CAP-OBJECT_DUPLICATE_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_OPERATOR_BATCH", + "task": "WBV2-P1269-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1269-001:OBJECT_DELETE_OPERATOR_BATCH:07b557a0d42ec2f1", + "selectedRecordIds": [ + "operator:OBJECT_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_OPERATOR_BATCH-READER", + "CAP-OBJECT_DELETE_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_VISIBILITY_OPERATOR_BATCH", + "task": "WBV2-P1270-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1270-001:OBJECT_VISIBILITY_OPERATOR_BATCH:4256b7cd408959f9", + "selectedRecordIds": [ + "operator:OBJECT_OT_hide_view_set" + ], + "capabilities": [ + "CAP-OBJECT_VISIBILITY_OPERATOR_BATCH-READER", + "CAP-OBJECT_VISIBILITY_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_VISIBILITY_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-visibility-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_COLLECTION_CREATE_OPERATOR_BATCH", + "task": "WBV2-P1271-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1271-001:OBJECT_COLLECTION_CREATE_OPERATOR_BATCH:30c00e81f46ca5c3", + "selectedRecordIds": [ + "operator:OBJECT_OT_collection_add" + ], + "capabilities": [ + "CAP-OBJECT_COLLECTION_CREATE_OPERATOR_BATCH-READER", + "CAP-OBJECT_COLLECTION_CREATE_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_COLLECTION_CREATE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-collection-create-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_PARENT_OPERATOR_BATCH", + "task": "WBV2-P1272-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1272-001:OBJECT_PARENT_OPERATOR_BATCH:362256be314bcbe6", + "selectedRecordIds": [ + "operator:OBJECT_OT_parent_set" + ], + "capabilities": [ + "CAP-OBJECT_PARENT_OPERATOR_BATCH-READER", + "CAP-OBJECT_PARENT_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_PRIMITIVE_CUBE_OPERATOR_BATCH", + "task": "WBV2-P1273-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1273-001:MESH_PRIMITIVE_CUBE_OPERATOR_BATCH:451cdcaa70551f8f", + "selectedRecordIds": [ + "operator:MESH_OT_primitive_cube_add" + ], + "capabilities": [ + "CAP-MESH_PRIMITIVE_CUBE_OPERATOR_BATCH-READER", + "CAP-MESH_PRIMITIVE_CUBE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_PRIMITIVE_CUBE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-primitive-cube-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_MOVE_COLLECTION_OPERATOR_BATCH", + "task": "WBV2-P1274-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1274-001:OBJECT_MOVE_COLLECTION_OPERATOR_BATCH:c60f51c2f088361e", + "selectedRecordIds": [ + "operator:OBJECT_OT_move_to_collection" + ], + "capabilities": [ + "CAP-OBJECT_MOVE_COLLECTION_OPERATOR_BATCH-READER", + "CAP-OBJECT_MOVE_COLLECTION_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_MOVE_COLLECTION_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-move-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P24-001-OBJECT_OPERATIONS.MOVE_COLLECTION.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH", + "task": "WBV2-P1275-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1275-001:OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH:e4871b703871cd02", + "selectedRecordIds": [ + "operator:OBJECT_OT_hide_view_clear" + ], + "capabilities": [ + "CAP-OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH-READER", + "CAP-OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-visibility-clear-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH", + "task": "WBV2-P1276-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1276-001:OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH:755c29f7c83e7e61", + "selectedRecordIds": [ + "operator:OBJECT_OT_transform_apply" + ], + "capabilities": [ + "CAP-OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH-READER", + "CAP-OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-apply-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_BEVEL_OPERATOR_BATCH", + "task": "WBV2-P1277-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1277-001:MESH_BEVEL_OPERATOR_BATCH:ff54da8bdac6a382", + "selectedRecordIds": [ + "operator:MESH_OT_bevel" + ], + "capabilities": [ + "CAP-MESH_BEVEL_OPERATOR_BATCH-READER", + "CAP-MESH_BEVEL_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_BEVEL_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_INSET_OPERATOR_BATCH", + "task": "WBV2-P1278-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1278-001:MESH_INSET_OPERATOR_BATCH:152b6ff293359f2b", + "selectedRecordIds": [ + "operator:MESH_OT_inset" + ], + "capabilities": [ + "CAP-MESH_INSET_OPERATOR_BATCH-READER", + "CAP-MESH_INSET_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_INSET_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_LOOPCUT_OPERATOR_BATCH", + "task": "WBV2-P1279-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1279-001:MESH_LOOPCUT_OPERATOR_BATCH:dd29399cd0368e44", + "selectedRecordIds": [ + "operator:MESH_OT_loopcut" + ], + "capabilities": [ + "CAP-MESH_LOOPCUT_OPERATOR_BATCH-READER", + "CAP-MESH_LOOPCUT_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_LOOPCUT_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_OPERATOR_BATCH", + "task": "WBV2-P1280-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1280-001:MESH_EXTRUDE_OPERATOR_BATCH:f4172e6b8ddbcf8b", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_region" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_OPERATOR_BATCH-READER", + "CAP-MESH_EXTRUDE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_OPERATOR_BATCH", + "task": "WBV2-P1281-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1281-001:MESH_DISSOLVE_OPERATOR_BATCH:5c5a52ee6203548e", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_edges" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_OPERATOR_BATCH-READER", + "CAP-MESH_DISSOLVE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_MERGE_OPERATOR_BATCH", + "task": "WBV2-P1282-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1282-001:MESH_MERGE_OPERATOR_BATCH:e84ca557ac7a12d7", + "selectedRecordIds": [ + "operator:MESH_OT_merge" + ], + "capabilities": [ + "CAP-MESH_MERGE_OPERATOR_BATCH-READER", + "CAP-MESH_MERGE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_MERGE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_LOCATION_CLEAR_OPERATOR_BATCH", + "task": "WBV2-P1283-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1283-001:OBJECT_LOCATION_CLEAR_OPERATOR_BATCH:84dba9367fb529a7", + "selectedRecordIds": [ + "operator:OBJECT_OT_location_clear" + ], + "capabilities": [ + "CAP-OBJECT_LOCATION_CLEAR_OPERATOR_BATCH-READER", + "CAP-OBJECT_LOCATION_CLEAR_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_LOCATION_CLEAR_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_ROTATION_CLEAR_OPERATOR_BATCH", + "task": "WBV2-P1284-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1284-001:OBJECT_ROTATION_CLEAR_OPERATOR_BATCH:3db1b4e696cc9048", + "selectedRecordIds": [ + "operator:OBJECT_OT_rotation_clear" + ], + "capabilities": [ + "CAP-OBJECT_ROTATION_CLEAR_OPERATOR_BATCH-READER", + "CAP-OBJECT_ROTATION_CLEAR_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_ROTATION_CLEAR_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_SCALE_CLEAR_OPERATOR_BATCH", + "task": "WBV2-P1285-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1285-001:OBJECT_SCALE_CLEAR_OPERATOR_BATCH:32d55f0234d5f6c5", + "selectedRecordIds": [ + "operator:OBJECT_OT_scale_clear" + ], + "capabilities": [ + "CAP-OBJECT_SCALE_CLEAR_OPERATOR_BATCH-READER", + "CAP-OBJECT_SCALE_CLEAR_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_SCALE_CLEAR_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_JOIN_OPERATOR_BATCH", + "task": "WBV2-P1286-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1286-001:OBJECT_JOIN_OPERATOR_BATCH:de8fe23bd410e593", + "selectedRecordIds": [ + "operator:OBJECT_OT_join" + ], + "capabilities": [ + "CAP-OBJECT_JOIN_OPERATOR_BATCH-READER", + "CAP-OBJECT_JOIN_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_JOIN_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-object-operations-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH", + "task": "WBV2-P1287-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1287-001:OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH:2f9e62b0f20b4109", + "selectedRecordIds": [ + "operator:OBJECT_OT_material_slot_add" + ], + "capabilities": [ + "CAP-OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH-READER", + "CAP-OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/render/render_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-material-slot-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DECIMATE_OPERATOR_BATCH", + "task": "WBV2-P1288-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1288-001:MESH_DECIMATE_OPERATOR_BATCH:874ad3bb4b2d4cd0", + "selectedRecordIds": [ + "operator:MESH_OT_decimate" + ], + "capabilities": [ + "CAP-MESH_DECIMATE_OPERATOR_BATCH-READER", + "CAP-MESH_DECIMATE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_DECIMATE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-parameter-production.spec.ts", + "tests/files/web/generated/WBV2-P4-001-MODIFIER.DECLARED_SLICES.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH", + "task": "WBV2-P1289-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1289-001:OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH:ab7b239f4e11124b", + "selectedRecordIds": [ + "operator:OBJECT_OT_material_slot_remove" + ], + "capabilities": [ + "CAP-OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH-READER", + "CAP-OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/render/render_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-material-slot-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH", + "task": "WBV2-P1290-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1290-001:OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH:5c7845576845cc50", + "selectedRecordIds": [ + "operator:OBJECT_OT_material_slot_assign" + ], + "capabilities": [ + "CAP-OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH-READER", + "CAP-OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/render/render_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-material-slot-assign-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "UV_UNWRAP_OPERATOR_BATCH", + "task": "WBV2-P1291-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1291-001:UV_UNWRAP_OPERATOR_BATCH:8111928c04bd086d", + "selectedRecordIds": [ + "operator:UV_OT_unwrap" + ], + "capabilities": [ + "CAP-UV_UNWRAP_OPERATOR_BATCH-READER", + "CAP-UV_UNWRAP_OPERATOR_BATCH-RECOVERY", + "CAP-UV_UNWRAP_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/uvedit/uvedit_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-uv-unwrap-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1292-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1292-001:OBJECT_DUPLICATE_MACRO_BATCH:811c939e205ecafd", + "selectedRecordIds": [ + "operator-macro:ACTION_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_action/action_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1293-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1293-001:OBJECT_DUPLICATE_MACRO_BATCH:0923f8086c8283b9", + "selectedRecordIds": [ + "operator-macro:ARMATURE_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1294-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1294-001:OBJECT_DUPLICATE_MACRO_BATCH:4e6ddb1c1659686d", + "selectedRecordIds": [ + "operator-macro:CURVES_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curves/intern/curves_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1295-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1295-001:OBJECT_DUPLICATE_MACRO_BATCH:e7a5080501642d57", + "selectedRecordIds": [ + "operator-macro:CURVE_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1296-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1296-001:OBJECT_DUPLICATE_MACRO_BATCH:2cf09e5b7806c522", + "selectedRecordIds": [ + "operator-macro:GRAPH_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_graph/graph_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1297-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1297-001:OBJECT_DUPLICATE_MACRO_BATCH:61f3c99d1c08013f", + "selectedRecordIds": [ + "operator-macro:GREASE_PENCIL_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1298-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1298-001:OBJECT_DUPLICATE_MACRO_BATCH:b2b5010de365a6fd", + "selectedRecordIds": [ + "operator-macro:MASK_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1299-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1299-001:OBJECT_DUPLICATE_MACRO_BATCH:900d15a3fd089534", + "selectedRecordIds": [ + "operator-macro:MBALL_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/metaball/mball_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1300-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1300-001:OBJECT_DUPLICATE_MACRO_BATCH:f7038997b9b55fd8", + "selectedRecordIds": [ + "operator-macro:MESH_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1301-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1301-001:OBJECT_DUPLICATE_MACRO_BATCH:ca1f3895eae4eeae", + "selectedRecordIds": [ + "operator-macro:NLA_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_nla/nla_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1302-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1302-001:OBJECT_DUPLICATE_MACRO_BATCH:e45d34ebeb76cc3e", + "selectedRecordIds": [ + "operator-macro:NODE_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1303-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1303-001:OBJECT_DUPLICATE_MACRO_BATCH:48ae9eb65d4c3123", + "selectedRecordIds": [ + "operator-macro:NODE_OT_duplicate_move_keep_inputs" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1304-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1304-001:OBJECT_DUPLICATE_MACRO_BATCH:416ae585863b18b0", + "selectedRecordIds": [ + "operator-macro:NODE_OT_duplicate_move_linked" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1305-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1305-001:OBJECT_DUPLICATE_MACRO_BATCH:504373c48738bf0d", + "selectedRecordIds": [ + "operator-macro:OBJECT_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1306-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1306-001:OBJECT_DUPLICATE_MACRO_BATCH:b1f87ff7cb3f84cd", + "selectedRecordIds": [ + "operator-macro:OBJECT_OT_duplicate_move_linked" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1307-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1307-001:OBJECT_DUPLICATE_MACRO_BATCH:59c11b73f6c393b5", + "selectedRecordIds": [ + "operator-macro:POINTCLOUD_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/pointcloud/intern/operators.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1308-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1308-001:OBJECT_DUPLICATE_MACRO_BATCH:ab6a0658305de0cc", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1309-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1309-001:OBJECT_DUPLICATE_MACRO_BATCH:29f998fff01771fa", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_duplicate_move_linked" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1310-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1310-001:OBJECT_DUPLICATE_MACRO_BATCH:080c07ec31371925", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_preview_duplicate_move" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DUPLICATE_MACRO_BATCH", + "task": "WBV2-P1311-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1311-001:OBJECT_DUPLICATE_MACRO_BATCH:26e874efa0152e2c", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_preview_duplicate_move_linked" + ], + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1312-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1312-001:OBJECT_DELETE_MACRO_BATCH:266367c3120af19f", + "selectedRecordIds": [ + "operator-macro:NODE_OT_delete_copy_reconnect" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1313-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1313-001:OBJECT_DELETE_MACRO_BATCH:ffc87aeab4ca8657", + "selectedRecordIds": [ + "operator:ACTION_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_action/action_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1314-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1314-001:OBJECT_DELETE_MACRO_BATCH:290fc45a1dd07df5", + "selectedRecordIds": [ + "operator:ANIM_OT_channels_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_channels_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1315-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1315-001:OBJECT_DELETE_MACRO_BATCH:beca8d72a79a20a3", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1316-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1316-001:OBJECT_DELETE_MACRO_BATCH:66d7693e521bbf7b", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_button" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1317-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1317-001:OBJECT_DELETE_MACRO_BATCH:aa21ad30b4211c49", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_by_name" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1318-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1318-001:OBJECT_DELETE_MACRO_BATCH:59a16f5773002c24", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_v3d" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1319-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1319-001:OBJECT_DELETE_MACRO_BATCH:62e35464233255a4", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_vse" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1320-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1320-001:OBJECT_DELETE_MACRO_BATCH:3dc748624bf180d7", + "selectedRecordIds": [ + "operator:ARMATURE_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1321-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1321-001:OBJECT_DELETE_MACRO_BATCH:e6f7639baf491f4d", + "selectedRecordIds": [ + "operator:ASSET_OT_catalog_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/asset/intern/asset_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1322-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1322-001:OBJECT_DELETE_MACRO_BATCH:f31405fceb00c7a7", + "selectedRecordIds": [ + "operator:BRUSH_OT_asset_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/sculpt_paint/paint_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1323-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1323-001:OBJECT_DELETE_MACRO_BATCH:209753308893d52a", + "selectedRecordIds": [ + "operator:CLIP_OT_delete_marker" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1324-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1324-001:OBJECT_DELETE_MACRO_BATCH:b8fade257b34994a", + "selectedRecordIds": [ + "operator:CLIP_OT_delete_track" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1325-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1325-001:OBJECT_DELETE_MACRO_BATCH:707e82ac5c21f6c3", + "selectedRecordIds": [ + "operator:CLIP_OT_graph_delete_curve" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1326-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1326-001:OBJECT_DELETE_MACRO_BATCH:b437fad9579b5a17", + "selectedRecordIds": [ + "operator:CLIP_OT_graph_delete_knot" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1327-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1327-001:OBJECT_DELETE_MACRO_BATCH:fd3cb8da3866d1b6", + "selectedRecordIds": [ + "operator:CLIP_OT_keyframe_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1328-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1328-001:OBJECT_DELETE_MACRO_BATCH:1ea75a3223caaca4", + "selectedRecordIds": [ + "operator:CONSOLE_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_console/space_console.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1329-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1329-001:OBJECT_DELETE_MACRO_BATCH:48cbbba4745aacfb", + "selectedRecordIds": [ + "operator:CONSTRAINT_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1330-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1330-001:OBJECT_DELETE_MACRO_BATCH:f3db5bbfe0b7ecbd", + "selectedRecordIds": [ + "operator:CURVES_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curves/intern/curves_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1331-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1331-001:OBJECT_DELETE_MACRO_BATCH:b2bf1ed53edddf62", + "selectedRecordIds": [ + "operator:CURVE_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1332-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1332-001:OBJECT_DELETE_MACRO_BATCH:cae72da15f82a67a", + "selectedRecordIds": [ + "operator:FILE_OT_bookmark_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_file/space_file.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1333-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1333-001:OBJECT_DELETE_MACRO_BATCH:8aa9ba5e78fc43c9", + "selectedRecordIds": [ + "operator:FILE_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_file/space_file.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1334-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1334-001:OBJECT_DELETE_MACRO_BATCH:c78158291ec665a8", + "selectedRecordIds": [ + "operator:FONT_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1335-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1335-001:OBJECT_DELETE_MACRO_BATCH:ec864424ffc659fd", + "selectedRecordIds": [ + "operator:GPENCIL_OT_annotation_active_frame_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/gpencil_legacy/gpencil_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1336-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1336-001:OBJECT_DELETE_MACRO_BATCH:2eee7fcefc7dcc14", + "selectedRecordIds": [ + "operator:GRAPH_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_graph/graph_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1337-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1337-001:OBJECT_DELETE_MACRO_BATCH:ccc1e9d8ed3c4954", + "selectedRecordIds": [ + "operator:GRAPH_OT_driver_delete_invalid" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_graph/graph_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1338-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1338-001:OBJECT_DELETE_MACRO_BATCH:ef176984e43319fc", + "selectedRecordIds": [ + "operator:GRAPH_OT_fmodifier_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_graph/graph_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1339-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1339-001:OBJECT_DELETE_MACRO_BATCH:5d0774ca778f5ad4", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_active_frame_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1340-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1340-001:OBJECT_DELETE_MACRO_BATCH:8ba52365eef76487", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1341-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1341-001:OBJECT_DELETE_MACRO_BATCH:8fc79b26bd0d5694", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_delete_breakdown" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1342-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1342-001:OBJECT_DELETE_MACRO_BATCH:78ddf544eb4d6df3", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_delete_frame" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1343-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1343-001:OBJECT_DELETE_MACRO_BATCH:e835c9fb99ff260b", + "selectedRecordIds": [ + "operator:INFO_OT_report_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_info/space_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1344-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1344-001:OBJECT_DELETE_MACRO_BATCH:1e84276bc178e89e", + "selectedRecordIds": [ + "operator:MARKER_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_markers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1345-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1345-001:OBJECT_DELETE_MACRO_BATCH:21824a30cf73822f", + "selectedRecordIds": [ + "operator:MASK_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1346-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1346-001:OBJECT_DELETE_MACRO_BATCH:51c6038df857be73", + "selectedRecordIds": [ + "operator:MBALL_OT_delete_metaelems" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/metaball/mball_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1347-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1347-001:OBJECT_DELETE_MACRO_BATCH:160eb42931ab4cb9", + "selectedRecordIds": [ + "operator:MESH_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1348-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1348-001:OBJECT_DELETE_MACRO_BATCH:30939d7ebb7aef1e", + "selectedRecordIds": [ + "operator:MESH_OT_delete_edgeloop" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1349-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1349-001:OBJECT_DELETE_MACRO_BATCH:d3ebfcd44987d033", + "selectedRecordIds": [ + "operator:MESH_OT_delete_loose" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1350-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1350-001:OBJECT_DELETE_MACRO_BATCH:cb1053d26cafd659", + "selectedRecordIds": [ + "operator:MESH_OT_polybuild_delete_at_cursor" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1351-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1351-001:OBJECT_DELETE_MACRO_BATCH:4d3e5ad86af478ad", + "selectedRecordIds": [ + "operator:NLA_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_nla/nla_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1352-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1352-001:OBJECT_DELETE_MACRO_BATCH:c4c76a25367bc8a0", + "selectedRecordIds": [ + "operator:NLA_OT_tracks_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_nla/nla_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1353-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1353-001:OBJECT_DELETE_MACRO_BATCH:6259c20cbf6abe09", + "selectedRecordIds": [ + "operator:NODE_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1354-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1354-001:OBJECT_DELETE_MACRO_BATCH:595ee7ff4fe3957a", + "selectedRecordIds": [ + "operator:NODE_OT_delete_reconnect" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1355-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1355-001:OBJECT_DELETE_MACRO_BATCH:0a25ac0a68c3df08", + "selectedRecordIds": [ + "operator:OBJECT_OT_multires_higher_levels_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1356-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1356-001:OBJECT_DELETE_MACRO_BATCH:58d1e68d18fa7298", + "selectedRecordIds": [ + "operator:OBJECT_OT_vertex_weight_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1357-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1357-001:OBJECT_DELETE_MACRO_BATCH:319b632d890ad5b8", + "selectedRecordIds": [ + "operator:OUTLINER_OT_collection_hierarchy_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_outliner/outliner_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1358-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1358-001:OBJECT_DELETE_MACRO_BATCH:8eea095aaa160fe0", + "selectedRecordIds": [ + "operator:OUTLINER_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_outliner/outliner_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1359-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1359-001:OBJECT_DELETE_MACRO_BATCH:908ab62518cec5da", + "selectedRecordIds": [ + "operator:OUTLINER_OT_drivers_delete_selected" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_outliner/outliner_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1360-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1360-001:OBJECT_DELETE_MACRO_BATCH:7bc967b84721925c", + "selectedRecordIds": [ + "operator:OUTLINER_OT_id_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_outliner/outliner_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1361-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1361-001:OBJECT_DELETE_MACRO_BATCH:c7e7ef2c01712236", + "selectedRecordIds": [ + "operator:PAINTCURVE_OT_delete_point" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/sculpt_paint/paint_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1362-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1362-001:OBJECT_DELETE_MACRO_BATCH:fa9f28b4ef15542b", + "selectedRecordIds": [ + "operator:PALETTE_OT_color_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/sculpt_paint/paint_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1363-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1363-001:OBJECT_DELETE_MACRO_BATCH:fa927874e02d6a86", + "selectedRecordIds": [ + "operator:PARTICLE_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/physics/physics_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1364-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1364-001:OBJECT_DELETE_MACRO_BATCH:045288d2c691a502", + "selectedRecordIds": [ + "operator:POINTCLOUD_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/pointcloud/intern/operators.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1365-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1365-001:OBJECT_DELETE_MACRO_BATCH:1d404190e2359326", + "selectedRecordIds": [ + "operator:SCENE_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/scene/scene_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1366-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1366-001:OBJECT_DELETE_MACRO_BATCH:33e239df6953f6be", + "selectedRecordIds": [ + "operator:SCREEN_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/screen/screen_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1367-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1367-001:OBJECT_DELETE_MACRO_BATCH:03b04f041e841582", + "selectedRecordIds": [ + "operator:SEQUENCER_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1368-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1368-001:OBJECT_DELETE_MACRO_BATCH:c4a082a5c144969b", + "selectedRecordIds": [ + "operator:SEQUENCER_OT_retiming_key_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1369-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1369-001:OBJECT_DELETE_MACRO_BATCH:7996b0c83f4d0b2c", + "selectedRecordIds": [ + "operator:SEQUENCER_OT_text_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1370-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1370-001:OBJECT_DELETE_MACRO_BATCH:6e92825d5e16d565", + "selectedRecordIds": [ + "operator:TEXT_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_text/space_text.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1371-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1371-001:OBJECT_DELETE_MACRO_BATCH:5eecba0f0cd1d45e", + "selectedRecordIds": [ + "operator:TRANSFORM_OT_delete_orientation" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/transform/transform_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1372-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1372-001:OBJECT_DELETE_MACRO_BATCH:95dbea0c5998184a", + "selectedRecordIds": [ + "operator:UI_OT_view_item_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/interface/interface_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1373-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1373-001:OBJECT_DELETE_MACRO_BATCH:8816424e5aaf5621", + "selectedRecordIds": [ + "operator:WORKSPACE_OT_delete" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/screen/workspace_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_DELETE_MACRO_BATCH", + "task": "WBV2-P1374-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1374-001:OBJECT_DELETE_MACRO_BATCH:6a6a6def269e362e", + "selectedRecordIds": [ + "operator:WORKSPACE_OT_delete_all_others" + ], + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/screen/workspace_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_VISIBILITY_MACRO_BATCH", + "task": "WBV2-P1375-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1375-001:OBJECT_VISIBILITY_MACRO_BATCH:bdd1647034295380", + "selectedRecordIds": [ + "operator:MASK_OT_hide_view_clear" + ], + "capabilities": [ + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-READER", + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-visibility-clear-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_VISIBILITY_MACRO_BATCH", + "task": "WBV2-P1376-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1376-001:OBJECT_VISIBILITY_MACRO_BATCH:6d311893dd3a298c", + "selectedRecordIds": [ + "operator:MASK_OT_hide_view_set" + ], + "capabilities": [ + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-READER", + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-visibility-clear-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_SCALE_CLEAR_MACRO_BATCH", + "task": "WBV2-P1377-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1377-001:OBJECT_SCALE_CLEAR_MACRO_BATCH:21ee71209f57696a", + "selectedRecordIds": [ + "operator:POSE_OT_scale_clear" + ], + "capabilities": [ + "CAP-OBJECT_SCALE_CLEAR_MACRO_BATCH-READER", + "CAP-OBJECT_SCALE_CLEAR_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_SCALE_CLEAR_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_TRANSFORM_APPLY_MACRO_BATCH", + "task": "WBV2-P1378-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1378-001:OBJECT_TRANSFORM_APPLY_MACRO_BATCH:2b4f92dbb7cd4491", + "selectedRecordIds": [ + "operator:OBJECT_OT_visual_transform_apply" + ], + "capabilities": [ + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-READER", + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-apply-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_TRANSFORM_APPLY_MACRO_BATCH", + "task": "WBV2-P1379-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1379-001:OBJECT_TRANSFORM_APPLY_MACRO_BATCH:bfe7daa60be2d712", + "selectedRecordIds": [ + "operator:POSE_OT_visual_transform_apply" + ], + "capabilities": [ + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-READER", + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-apply-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_MOVE_COLLECTION_MACRO_BATCH", + "task": "WBV2-P1380-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1380-001:OBJECT_MOVE_COLLECTION_MACRO_BATCH:77f44b047d1a88c1", + "selectedRecordIds": [ + "operator:ARMATURE_OT_move_to_collection" + ], + "capabilities": [ + "CAP-OBJECT_MOVE_COLLECTION_MACRO_BATCH-READER", + "CAP-OBJECT_MOVE_COLLECTION_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_MOVE_COLLECTION_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-move-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P24-001-OBJECT_OPERATIONS.MOVE_COLLECTION.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_PARENT_MACRO_BATCH", + "task": "WBV2-P1381-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1381-001:OBJECT_PARENT_MACRO_BATCH:ec5938153f1e588a", + "selectedRecordIds": [ + "operator:ARMATURE_OT_parent_set" + ], + "capabilities": [ + "CAP-OBJECT_PARENT_MACRO_BATCH-READER", + "CAP-OBJECT_PARENT_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_PARENT_MACRO_BATCH", + "task": "WBV2-P1382-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1382-001:OBJECT_PARENT_MACRO_BATCH:0447b9fb7a8b8660", + "selectedRecordIds": [ + "operator:MASK_OT_parent_set" + ], + "capabilities": [ + "CAP-OBJECT_PARENT_MACRO_BATCH-READER", + "CAP-OBJECT_PARENT_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_PARENT_MACRO_BATCH", + "task": "WBV2-P1383-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1383-001:OBJECT_PARENT_MACRO_BATCH:69a30bf3585d78b1", + "selectedRecordIds": [ + "operator:NODE_OT_parent_set" + ], + "capabilities": [ + "CAP-OBJECT_PARENT_MACRO_BATCH-READER", + "CAP-OBJECT_PARENT_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "OBJECT_PARENT_MACRO_BATCH", + "task": "WBV2-P1384-001", + "owner": "OBJECT", + "sourceBacked": true, + "batchId": "WBV2-P1384-001:OBJECT_PARENT_MACRO_BATCH:2f567b446f4dbed0", + "selectedRecordIds": [ + "operator:OBJECT_OT_vertex_parent_set" + ], + "capabilities": [ + "CAP-OBJECT_PARENT_MACRO_BATCH-READER", + "CAP-OBJECT_PARENT_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_PRIMITIVE_CUBE_MACRO_BATCH", + "task": "WBV2-P1385-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1385-001:MESH_PRIMITIVE_CUBE_MACRO_BATCH:d09d80f7c1b52bfe", + "selectedRecordIds": [ + "operator:MESH_OT_primitive_cube_add_gizmo" + ], + "capabilities": [ + "CAP-MESH_PRIMITIVE_CUBE_MACRO_BATCH-READER", + "CAP-MESH_PRIMITIVE_CUBE_MACRO_BATCH-RECOVERY", + "CAP-MESH_PRIMITIVE_CUBE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-primitive-cube-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1386-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1386-001:MESH_EXTRUDE_MACRO_BATCH:5d88ca9ee68a105c", + "selectedRecordIds": [ + "operator-macro:ARMATURE_OT_extrude_forked" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1387-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1387-001:MESH_EXTRUDE_MACRO_BATCH:68ffe5ba3508a8e3", + "selectedRecordIds": [ + "operator-macro:ARMATURE_OT_extrude_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1388-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1388-001:MESH_EXTRUDE_MACRO_BATCH:82fe86cad6cb37a8", + "selectedRecordIds": [ + "operator-macro:CURVES_OT_extrude_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curves/intern/curves_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1389-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1389-001:MESH_EXTRUDE_MACRO_BATCH:4de5a8969932e8e9", + "selectedRecordIds": [ + "operator-macro:CURVE_OT_extrude_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1390-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1390-001:MESH_EXTRUDE_MACRO_BATCH:12bc92236398200b", + "selectedRecordIds": [ + "operator-macro:GREASE_PENCIL_OT_extrude_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1391-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1391-001:MESH_EXTRUDE_MACRO_BATCH:5f067119b196acc9", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_context_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1392-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1392-001:MESH_EXTRUDE_MACRO_BATCH:9b2db02d89b0195b", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_edges_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1393-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1393-001:MESH_EXTRUDE_MACRO_BATCH:f900ba338f1dc4c1", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_faces_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1394-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1394-001:MESH_EXTRUDE_MACRO_BATCH:4b7b98d81ce69e0d", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_manifold" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1395-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1395-001:MESH_EXTRUDE_MACRO_BATCH:d49f6c73e8a1bc83", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_region_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1396-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1396-001:MESH_EXTRUDE_MACRO_BATCH:5260939325059c04", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_region_shrink_fatten" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1397-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1397-001:MESH_EXTRUDE_MACRO_BATCH:a92a2cc72e827244", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_vertices_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1398-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1398-001:MESH_EXTRUDE_MACRO_BATCH:21ea2b18ae7fed33", + "selectedRecordIds": [ + "operator-macro:MESH_OT_polybuild_extrude_at_cursor_move" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1399-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1399-001:MESH_EXTRUDE_MACRO_BATCH:ed1ff092325a7818", + "selectedRecordIds": [ + "operator:MESH_OT_dupli_extrude_cursor" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1400-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1400-001:MESH_EXTRUDE_MACRO_BATCH:101a68d06b531b4a", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_context" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1401-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1401-001:MESH_EXTRUDE_MACRO_BATCH:faeadd8684fee3e3", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_edges_indiv" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1402-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1402-001:MESH_EXTRUDE_MACRO_BATCH:be2ad677cb5157e7", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_faces_indiv" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1403-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1403-001:MESH_EXTRUDE_MACRO_BATCH:bd238b4a7e125cc5", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_repeat" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_EXTRUDE_MACRO_BATCH", + "task": "WBV2-P1404-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1404-001:MESH_EXTRUDE_MACRO_BATCH:a581546d0ff3dc35", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_verts_indiv" + ], + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_LOOPCUT_MACRO_BATCH", + "task": "WBV2-P1405-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1405-001:MESH_LOOPCUT_MACRO_BATCH:361c56cb78cfa6f7", + "selectedRecordIds": [ + "operator-macro:MESH_OT_loopcut_slide" + ], + "capabilities": [ + "CAP-MESH_LOOPCUT_MACRO_BATCH-READER", + "CAP-MESH_LOOPCUT_MACRO_BATCH-RECOVERY", + "CAP-MESH_LOOPCUT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_MACRO_BATCH", + "task": "WBV2-P1406-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1406-001:MESH_DISSOLVE_MACRO_BATCH:8b7fa667c8c517b0", + "selectedRecordIds": [ + "operator:ARMATURE_OT_dissolve" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_MACRO_BATCH", + "task": "WBV2-P1407-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1407-001:MESH_DISSOLVE_MACRO_BATCH:9daaf10e3afe5523", + "selectedRecordIds": [ + "operator:CURVE_OT_dissolve_verts" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_MACRO_BATCH", + "task": "WBV2-P1408-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1408-001:MESH_DISSOLVE_MACRO_BATCH:017824f266ac2393", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_dissolve" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_MACRO_BATCH", + "task": "WBV2-P1409-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1409-001:MESH_DISSOLVE_MACRO_BATCH:485d8cb2ab41f10b", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_degenerate" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_MACRO_BATCH", + "task": "WBV2-P1410-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1410-001:MESH_DISSOLVE_MACRO_BATCH:ae9148bee3425973", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_faces" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_MACRO_BATCH", + "task": "WBV2-P1411-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1411-001:MESH_DISSOLVE_MACRO_BATCH:b5bf0587bcb6cd5c", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_limited" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_MACRO_BATCH", + "task": "WBV2-P1412-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1412-001:MESH_DISSOLVE_MACRO_BATCH:6f8dcbe6ddf044ef", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_mode" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_MACRO_BATCH", + "task": "WBV2-P1413-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1413-001:MESH_DISSOLVE_MACRO_BATCH:cdec8905043147bc", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_verts" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_DISSOLVE_MACRO_BATCH", + "task": "WBV2-P1414-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1414-001:MESH_DISSOLVE_MACRO_BATCH:63f53955183b00ce", + "selectedRecordIds": [ + "operator:MESH_OT_polybuild_dissolve_at_cursor" + ], + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_MERGE_MACRO_BATCH", + "task": "WBV2-P1415-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1415-001:MESH_MERGE_MACRO_BATCH:f34f40626ea8b27c", + "selectedRecordIds": [ + "operator:ANIM_OT_merge_animation" + ], + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_MERGE_MACRO_BATCH", + "task": "WBV2-P1416-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1416-001:MESH_MERGE_MACRO_BATCH:51c37d6fb5bfe2cc", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_layer_merge" + ], + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_MERGE_MACRO_BATCH", + "task": "WBV2-P1417-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1417-001:MESH_MERGE_MACRO_BATCH:1f85aa65f8ded787", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_stroke_merge_by_distance" + ], + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_MERGE_MACRO_BATCH", + "task": "WBV2-P1418-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1418-001:MESH_MERGE_MACRO_BATCH:2b75cafbbb8ed0e8", + "selectedRecordIds": [ + "operator:MESH_OT_merge_normals" + ], + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + }, + { + "id": "MESH_MERGE_MACRO_BATCH", + "task": "WBV2-P1419-001", + "owner": "MESH", + "sourceBacked": true, + "batchId": "WBV2-P1419-001:MESH_MERGE_MACRO_BATCH:4ad92687badfa0da", + "selectedRecordIds": [ + "operator:SCREEN_OT_edge_merge" + ], + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/screen/screen_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "fullFamilyParity": false + } + ], + "tasks": [ + { + "id": "WBV2-P1096-000", + "phase": "1096", + "title": "supersede_generic_continuation_queue", + "kind": "bridge", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1095-003" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "bridge", + "gate": "QUEUE", + "card": "docs/tasks/WBV2-P1096-000.md", + "behavior": "Replace the generic continuation queue with a finite module execution plan without claiming capability parity.", + "outputs": [ + "bridge manifest", + "status" + ], + "acceptance": [ + "no parity claim", + "inventory preserved", + "module plan hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-000", + "phase": "1100", + "title": "reorganize_module_execution_plan", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1096-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-000.md", + "behavior": "Reuse completed source-backed work and activate finite module-level implementation and verification.", + "outputs": [ + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "completed receipts reused", + "generic continuation excluded", + "one module active", + "inventory preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1100-001", + "phase": "1100", + "title": "verify_render_light_camera_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1100-000" + ], + "parityId": "RENDER_LIGHT_CAMERA", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-render_light_camera", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-001.md", + "behavior": "Complete the RENDER_LIGHT_CAMERA module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_LIGHT_CAMERA", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-LIGHT-TYPE", + "CAP-RENDER-LIGHT-AREA-SHAPE", + "CAP-RENDER-LIGHT-CONTRIBUTION-FACTORS", + "CAP-RENDER-LIGHT-SHADOW-CONTROLS", + "CAP-RENDER-LIGHT-CASCADE-CONTROLS", + "CAP-RENDER-LIGHT-AREA-SIZE-Z", + "CAP-RENDER-LIGHT-CLIP-START", + "CAP-RENDER-WORLD-LIGHTING-CONTROLS", + "CAP-RENDER-WORLD-PROBE-CONTROLS", + "CAP-RENDER-WORLD-ENVIRONMENT-STRENGTH", + "CAP-RENDER-CAMERA-DOF-FOCUS-OBJECT", + "CAP-RENDER-CAMERA-PANORAMA" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P595-002/manifest.json", + "report": "tests/golden/WBV2-P595-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P596-002/manifest.json", + "report": "tests/golden/WBV2-P596-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P597-002/manifest.json", + "report": "tests/golden/WBV2-P597-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P598-002/manifest.json", + "report": "tests/golden/WBV2-P598-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P599-002/manifest.json", + "report": "tests/golden/WBV2-P599-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P600-002/manifest.json", + "report": "tests/golden/WBV2-P600-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P601-002/manifest.json", + "report": "tests/golden/WBV2-P601-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P602-002/manifest.json", + "report": "tests/golden/WBV2-P602-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P603-002/manifest.json", + "report": "tests/golden/WBV2-P603-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P604-002/manifest.json", + "report": "tests/golden/WBV2-P604-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P605-002/manifest.json", + "report": "tests/golden/WBV2-P605-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P606-002/manifest.json", + "report": "tests/golden/WBV2-P606-002/implementation-report.json" + } + ], + "positive": [ + "setLightProperties", + "setWorldProperties", + "setCameraProperties", + "camera panorama", + "world environment", + "light shadow/cascade" + ], + "negative": [ + "invalid enum", + "invalid numeric bounds", + "near/far conflict", + "unknown target", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:lighting-field-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-lighting-fields-production.spec.ts tests/e2e/lighting-field-roundtrip.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-002", + "phase": "1100", + "title": "verify_scene_object_mesh_module", + "kind": "module", + "owner": "SCENE_MESH", + "dependsOn": [ + "WBV2-P1100-001" + ], + "parityId": "SCENE_OBJECT_MESH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-scene_object_mesh", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-002.md", + "behavior": "Complete the SCENE_OBJECT_MESH module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCENE_OBJECT_MESH", + "sourceBacked": true, + "capabilities": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-CORE-SCENE-OBJECT", + "CAP-OBJECT-MOVE-COLLECTION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "report": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P24-002/manifest.json", + "report": "tests/golden/WBV2-P24-002/object-move-receipt-report.json" + } + ], + "positive": [ + "mesh topology", + "visibility", + "transform", + "collection membership" + ], + "negative": [ + "invalid selection", + "stale revision", + "linked data" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts tests/e2e/wbv2-scene-object-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1100-003", + "phase": "1100", + "title": "verify_material_animation_module", + "kind": "module", + "owner": "MATERIAL_ANIMATION", + "dependsOn": [ + "WBV2-P1100-002" + ], + "parityId": "MATERIAL_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-material_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1100-003.md", + "behavior": "Complete the MATERIAL_ANIMATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MATERIAL_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-MATERIAL-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json" + } + ], + "positive": [ + "principled material", + "image node", + "keyframe", + "FCurve" + ], + "negative": [ + "unsupported graph", + "stale revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-animation-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-000", + "phase": "1101", + "title": "verify_nonmesh_geometry_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1100-003" + ], + "parityId": "NONMESH_GEOMETRY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nonmesh_geometry", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-000.md", + "behavior": "Complete the NONMESH_GEOMETRY module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NONMESH_GEOMETRY", + "sourceBacked": true, + "capabilities": [ + "CAP-VIEWPORT-NONMESH", + "CAP-NATIVE-DATABLOCK" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "curve", + "surface", + "font", + "volume", + "metaball", + "grease pencil" + ], + "negative": [ + "unsupported data", + "resource missing", + "malformed geometry" + ], + "recovery": [ + "save/reopen", + "resource disposal" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-viewport-nonmesh-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-001", + "phase": "1101", + "title": "verify_nodes_simulation_module", + "kind": "module", + "owner": "NODES_SIMULATION", + "dependsOn": [ + "WBV2-P1101-000" + ], + "parityId": "NODES_SIMULATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_simulation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-001.md", + "behavior": "Complete the NODES_SIMULATION module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_SIMULATION", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES", + "CAP-SIMULATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted node graph", + "physics manifest", + "stable hash" + ], + "negative": [ + "unsupported node", + "budget exceeded", + "stale revision" + ], + "recovery": [ + "save/reopen", + "cache disposal" + ], + "commands": [ + "npm --prefix web run test:geometry-node-main-reader", + "npm --prefix web run test:physics-main-reader" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-002", + "phase": "1101", + "title": "verify_asset_io_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1101-001" + ], + "parityId": "ASSET_IO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-asset_io", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-002.md", + "behavior": "Complete the ASSET_IO module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ASSET_IO", + "sourceBacked": true, + "capabilities": [ + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-ASSET-CATALOG-MUTATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "report": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json" + } + ], + "positive": [ + "append", + "link", + "override", + "reload", + "asset catalog v2" + ], + "negative": [ + "missing source", + "ownership violation", + "hash drift", + "collision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "IndexedDB restart" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-v2", + "npm --prefix web run test:asset-catalog-migration", + "npm --prefix web run test:asset-catalog-negatives", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-link-override-production.spec.ts tests/e2e/wbv2-asset-catalog-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1101-003", + "phase": "1101", + "title": "verify_sculpt_paint_module", + "kind": "module", + "owner": "SCULPT_PAINT", + "dependsOn": [ + "WBV2-P1101-002" + ], + "parityId": "SCULPT_PAINT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-sculpt_paint", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1101-003.md", + "behavior": "Complete the SCULPT_PAINT module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCULPT_PAINT", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-ATTRIBUTES", + "CAP-SCULPT-PAINT" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P16-002/manifest.json", + "report": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json" + } + ], + "positive": [ + "vertex colors", + "vertex weights", + "bounded sculpt stroke" + ], + "negative": [ + "mirror unverified", + "invalid patch", + "unsupported brush" + ], + "recovery": [ + "undo", + "redo", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:paint-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-paint-attributes-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-000", + "phase": "1102", + "title": "implement_ui_editor_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1101-003" + ], + "parityId": "UI_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-000.md", + "behavior": "Complete the UI_EDITOR module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-UI-EDITOR" + ], + "sourcePaths": [ + "web/protocol/editor-workflow.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "editor context", + "workspace", + "area/region" + ], + "negative": [ + "unsupported editor", + "invalid context" + ], + "recovery": [ + "worker restart", + "save/reopen" + ], + "commands": [ + "npm --prefix web run test:editor-main-reader", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-workflow-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1102-001", + "phase": "1102", + "title": "close_module_execution_gate", + "kind": "module", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P1102-000" + ], + "parityId": "INVENTORY_GATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-inventory_gate", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1102-001.md", + "behavior": "Complete the INVENTORY_GATE module through its shared Blender Main primitives and aggregate case matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "INVENTORY_GATE", + "sourceBacked": true, + "capabilities": [], + "sourcePaths": [ + "tests/golden/WBV2-P0-002/parity-map.json", + "tests/golden/WBV2-P1100-000/module-execution-plan.json" + ], + "reuseReceipts": [], + "positive": [ + "aggregate module receipts", + "catalog hash" + ], + "negative": [ + "missing receipt", + "hash drift", + "false completion" + ], + "recovery": [ + "re-run affected module only" + ], + "commands": [ + "node tools/web/check-wbv2-module-execution.mjs", + "npm --prefix web run build" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1103-000", + "phase": "1103", + "title": "aggregate_object_operations_module", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1102-001" + ], + "parityId": "OBJECT_OPERATIONS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_operations", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1103-000.md", + "behavior": "Aggregate the existing source-backed Object Main operations into one module and revalidate the Chromium operator matrix.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "OBJECT_OPERATIONS", + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT-DUPLICATE", + "CAP-OBJECT-CREATE", + "CAP-OBJECT-PARENT", + "CAP-OBJECT-COLLECTION", + "CAP-OBJECT-RENAME", + "CAP-OBJECT-DELETE", + "CAP-OBJECT-TRANSFORM" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P17-002/manifest.json", + "report": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P18-002/manifest.json", + "report": "tests/golden/WBV2-P18-002/object-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P19-002/manifest.json", + "report": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P20-002/manifest.json", + "report": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P21-002/manifest.json", + "report": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P22-002/manifest.json", + "report": "tests/golden/WBV2-P22-002/object-delete-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P23-002/manifest.json", + "report": "tests/golden/WBV2-P23-002/object-transform-receipt-report.json" + } + ], + "positive": [ + "duplicate", + "create", + "parent", + "collection", + "rename", + "delete", + "transform apply" + ], + "negative": [ + "unknown object", + "invalid parent cycle", + "malformed transform" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts tests/e2e/wbv2-object-create-production.spec.ts tests/e2e/wbv2-object-parent-production.spec.ts tests/e2e/wbv2-collection-create-production.spec.ts tests/e2e/wbv2-object-rename-production.spec.ts tests/e2e/wbv2-object-delete-production.spec.ts tests/e2e/wbv2-object-transform-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1104-000", + "phase": "1104", + "title": "verify_compositor_sequencer_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1103-000" + ], + "parityId": "COMPOSITOR_SEQUENCER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_sequencer", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1104-000.md", + "behavior": "Verify the source-backed compositor and sequencer module through golden, unsupported-gate and media recovery cases.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main or compositor mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "COMPOSITOR_SEQUENCER", + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR-NODE-GRAPH", + "CAP-COMPOSITOR-UNSUPPORTED-GATE", + "CAP-SEQUENCER-MEDIA-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/compositor.ts", + "web/protocol/sequencer.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P29-003/manifest.json", + "report": "tests/golden/WBV2-P29-003/implementation-report.json" + } + ], + "positive": [ + "compositor node graph", + "sequencer still-image timeline", + "media cache contract" + ], + "negative": [ + "unsupported compositor node", + "invalid sequencer strip", + "stale media revision" + ], + "recovery": [ + "worker restart", + "save/reopen", + "media cache replay", + "movie codec blocked without READY receipt" + ], + "commands": [ + "npm --prefix web run test:compositor-node-golden", + "npm --prefix web run test:compositor-unsupported-gate", + "npm --prefix web run test:sequencer-main-reader", + "node --test web/tests/unit/sequencer-media-cache.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-021 sequencer|real Blender 5.2 sequencer\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1105-000", + "phase": "1105", + "title": "verify_audio_particle_module", + "kind": "module", + "owner": "AUDIO_PARTICLE", + "dependsOn": [ + "WBV2-P1104-000" + ], + "parityId": "AUDIO_PARTICLE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-audio_particle", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1105-000.md", + "behavior": "Verify Sound, Speaker and ParticleSettings mutations against authoritative Blender Main with explicit build capability gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven or a typed build capability blocker is recorded", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "AUDIO_PARTICLE", + "sourceBacked": true, + "capabilities": [ + "CAP-SOUND-PROPERTIES", + "CAP-SPEAKER-PROPERTIES", + "CAP-PARTICLE-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/protocol/io-media-commands.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P33-001/manifest.json", + "report": "tests/golden/WBV2-P33-001/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P33-002/manifest.json", + "report": "tests/golden/WBV2-P33-002/implementation-report.json" + } + ], + "positive": [ + "Sound properties", + "Speaker properties", + "ParticleSettings properties" + ], + "negative": [ + "missing Main datablock", + "unsupported build feature", + "out-of-range property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker restart" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-audio-particle-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1106-000", + "phase": "1106", + "title": "verify_rig_animation_module", + "kind": "module", + "owner": "RIG", + "dependsOn": [ + "WBV2-P1105-000" + ], + "parityId": "RIG_ANIMATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-rig_animation", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1106-000.md", + "behavior": "Verify armature pose, constraints and NLA animation through the existing Blender Main primitives.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RIG_ANIMATION", + "sourceBacked": true, + "capabilities": [ + "CAP-RIG-POSE", + "CAP-CONSTRAINTS", + "CAP-NLA-ANIMATION" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "report": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "armature pose", + "constraint edit", + "NLA stack" + ], + "negative": [ + "missing bone", + "invalid constraint influence", + "stale NLA revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-rig-pose-production.spec.ts", + "npm --prefix web run test:nla-operator", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1107-000", + "phase": "1107", + "title": "verify_modifier_system_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1106-000" + ], + "parityId": "MODIFIER_SYSTEM", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_system", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1107-000.md", + "behavior": "Verify modifier stack visibility and bounded parameter mutation through authoritative Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SYSTEM", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER-STATE-MUTATION", + "CAP-MODIFIER-PARAMETER-EDIT", + "CAP-MODIFIER-STACK-READER" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/modifier-graph.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P9-002/manifest.json", + "report": "tests/golden/WBV2-P9-002/modifier-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P11-002/manifest.json", + "report": "tests/golden/WBV2-P11-002/modifier-parameter-receipt-report.json" + } + ], + "positive": [ + "modifier visibility toggle", + "bounded DECIMATE parameter mutation", + "modifier stack evaluation reader" + ], + "negative": [ + "unknown modifier UUID", + "stale mesh revision", + "out-of-range parameter" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts tests/e2e/wbv2-modifier-parameter-production.spec.ts", + "npm --prefix web run test:modifier-goldens", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1108-000", + "phase": "1108", + "title": "verify_nodes_graph_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1107-000" + ], + "parityId": "NODES_GRAPH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-nodes_graph", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1108-000.md", + "behavior": "Verify Geometry Nodes graph identity, allowlisted evaluation, field budgets and unsupported graph retention.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive graph reader/evaluation evidence is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "NODES_GRAPH", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-GRAPH", + "CAP-GEOMETRY-NODES-ALLOWLIST", + "CAP-GEOMETRY-NODES-FIELD-BUDGET" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/depsgraph.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "report": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "allowlisted graph identity", + "Blender depsgraph geometry evaluation", + "field materialization with exact domain cardinality" + ], + "negative": [ + "unsupported node graph", + "field budget overflow", + "stale or invalid graph command" + ], + "recovery": [ + "save/reopen", + "worker restart", + "graph retention after rejected command", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:geometry-node-evaluator-golden", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1109-000", + "phase": "1109", + "title": "verify_io_format_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1108-000" + ], + "parityId": "IO_FORMAT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-io_format", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1109-000.md", + "behavior": "Verify format capability routing, runtime receipts, recovery and fail-closed file UI gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive format routing/readiness evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "IO_FORMAT", + "sourceBacked": true, + "capabilities": [ + "CAP-IO-FORMAT-CAPABILITY-MATRIX", + "CAP-IO-FORMAT-RUNTIME-RECEIPTS", + "CAP-IO-FORMAT-RECOVERY", + "CAP-IO-FORMAT-UI-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/asset-library-io.ts", + "web/protocol/io-format-capability-matrix.ts", + "web/protocol/io-format-receipt-binding.ts", + "web/protocol/io-format-runtime-receipt.ts", + "web/protocol/io-format-recovery.ts", + "web/protocol/io-format-ui-gate.ts", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "GLB export readiness", + "format runtime receipt inventory", + "declared .blend import route" + ], + "negative": [ + "unverified format route", + "cancelled or OOM operation", + "unsupported file extension" + ], + "recovery": [ + "worker restart", + "small operation recovery", + "deterministic receipt replay", + "fail-closed UI route" + ], + "commands": [ + "node tools/web/check-io-format-receipt-bindings.mjs", + "node tools/web/check-io-format-runtime-receipts.mjs", + "node tools/web/check-io-format-recovery.mjs", + "node tools/web/check-io-format-ui-gate.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/io-format-recovery.spec.ts tests/e2e/io-format-ui-gate.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1110-000", + "phase": "1110", + "title": "verify_render_pipeline_module", + "kind": "module", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P1109-000" + ], + "parityId": "RENDER_PIPELINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-render_pipeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1110-000.md", + "behavior": "Verify render backend routing, explicit resource budgets and Blender reference comparison in Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive render/reference evidence is proven", + "negative and recovery cases are proven", + "Chromium and deterministic render receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "RENDER_PIPELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-RENDER-BACKEND-ROUTING", + "CAP-RENDER-RESOURCE-BUDGET", + "CAP-RENDER-REFERENCE-COMPARISON" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/render-routing.ts", + "web/protocol/render-budget.ts", + "web/protocol/render-capabilities.ts", + "web/protocol/render-image-comparison.ts", + "web/protocol/server-render-job.ts", + "web/app/src/three-adapter/render-routing.ts", + "web/app/src/three-adapter/render-image-comparison.ts", + "web/app/src/workers/viewport-render.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "bounded local backend routing", + "reference render metrics", + "resource budget acceptance" + ], + "negative": [ + "unknown or unavailable backend", + "aggregate texture/light budget overflow", + "wrong composition reference" + ], + "recovery": [ + "retain previous texture set", + "offscreen renderer parity", + "worker restart", + "deterministic second render" + ], + "commands": [ + "npm --prefix web run test:render-resource-budget", + "npm --prefix web run test:render-routing", + "npm --prefix web run test:render-reference", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1111-000", + "phase": "1111", + "title": "verify_scripting_security_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1110-000" + ], + "parityId": "SCRIPTING_SECURITY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-scripting_security", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1111-000.md", + "behavior": "Verify script source Main reader, deny-by-default permission policy and sandbox isolation/recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader and policy evidence is proven", + "negative and recovery cases are proven", + "Chromium sandbox receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SCRIPTING_SECURITY", + "sourceBacked": true, + "capabilities": [ + "CAP-SCRIPT-MAIN-READER", + "CAP-SCRIPT-PERMISSION-POLICY", + "CAP-SCRIPT-SANDBOX-ISOLATION", + "CAP-SCRIPT-SANDBOX-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/scripting-platform.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/script-permission-policy-test.worker.ts", + "web/app/src/workers/script-sandbox-isolation-test.worker.ts", + "web/app/src/workers/script-sandbox-recovery-test.worker.ts", + "web/app/src/testing/script-sandbox-recovery.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "script source inventory reader", + "explicit READ_MAIN permission", + "new-generation recovery audit" + ], + "negative": [ + "autorun denied by default", + "undeclared permission", + "sandbox crash/timeout/late result" + ], + "recovery": [ + "worker restart", + "sandbox generation rollover", + "continuous audit chain", + "deterministic second run" + ], + "commands": [ + "npm --prefix web run test:script-main-reader", + "npm --prefix web run test:scripting-isolation", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/script-permission-policy.spec.ts tests/e2e/script-sandbox-isolation.spec.ts tests/e2e/script-sandbox-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1112-000", + "phase": "1112", + "title": "verify_animation_timeline_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1111-000" + ], + "parityId": "ANIMATION_TIMELINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-animation_timeline", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1112-000.md", + "behavior": "Verify frame evaluation and NLA time mapping through the production Worker and Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive frame/NLA evaluation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic evaluation receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ANIMATION_TIMELINE", + "sourceBacked": true, + "capabilities": [ + "CAP-FRAME-EVALUATION", + "CAP-NLA-TIME-MAPPING", + "CAP-ANIMATION-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nla.ts", + "web/protocol/depsgraph.ts", + "web/protocol/scene-ir.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "frame 1/5/10 evaluation", + "NLA track and strip mapping", + "Blender depsgraph animation result" + ], + "negative": [ + "stale NLA revision", + "invalid strip topology", + "unsupported animation domain" + ], + "recovery": [ + "save/reopen", + "worker restart", + "deterministic repeated evaluation", + "preserve rejected stack" + ], + "commands": [ + "npm --prefix web run test:frame-evaluation", + "node tools/web/check-nla-evaluation-golden.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/nla-evaluation-golden.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1113-000", + "phase": "1113", + "title": "verify_shader_material_module", + "kind": "module", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P1112-000" + ], + "parityId": "SHADER_MATERIAL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shader_material", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1113-000.md", + "behavior": "Verify bounded Shader graph compilation, stable compile keys and fail-closed pipeline recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Shader Main compilation is proven", + "negative and recovery cases are proven", + "Chromium and deterministic compile receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHADER_MATERIAL", + "sourceBacked": true, + "capabilities": [ + "CAP-SHADER-GRAPH-COMPILER", + "CAP-SHADER-COMPILE-KEY", + "CAP-SHADER-FAIL-CLOSED-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/shader-graph.ts", + "web/protocol/shader-graph-commands.ts", + "web/protocol/shader-compiler.ts", + "web/protocol/render-capabilities.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "Principled/Image/Normal/Math graph compile", + "stable compile key", + "real Main shader material path" + ], + "negative": [ + "unknown shader node", + "graph cycle or duplicate link", + "unsupported renderer backend" + ], + "recovery": [ + "retain previous material after compile failure", + "worker restart", + "deterministic repeated compile", + "save/reopen material graph" + ], + "commands": [ + "npm --prefix web run test:shader-compile", + "npm --prefix web run test:shader-pipeline", + "npm --prefix web run test:shader-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1114-000", + "phase": "1114", + "title": "verify_grease_pencil_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1113-000" + ], + "parityId": "GREASE_PENCIL", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1114-000.md", + "behavior": "Verify Grease Pencil layer/frame Main mutations, stable identity validation and roundtrip recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Grease Pencil Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-LAYER-FRAME", + "CAP-GREASE-PENCIL-STROKE-READER", + "CAP-GREASE-PENCIL-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/protocol/grease-pencil.ts", + "web/protocol/grease-pencil-reorder.ts", + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "create and reorder layer", + "insert and move frame", + "stable Grease Pencil drawing reader" + ], + "negative": [ + "forged drawing identity", + "occupied frame target", + "stale layer/frame revision" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic layer/frame replay" + ], + "commands": [ + "npm --prefix web run test:grease-pencil-reorder", + "npm --prefix web run test:grease-pencil", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1115-000", + "phase": "1115", + "title": "verify_curve_surface_editing_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1114-000" + ], + "parityId": "CURVE_SURFACE_EDITING", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_surface_editing", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1115-000.md", + "behavior": "Verify Curve topology/handle edits, Surface topology and non-mesh/font roundtrip through Blender Main.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive non-mesh Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SURFACE_EDITING", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-HANDLES", + "CAP-SURFACE-TOPOLOGY", + "CAP-NONMESH-FONT-ROUNDTRIP" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/web-engine.ts", + "web/protocol/nonmesh-geometry-commands.ts", + "web/protocol/curve-topology-editor.ts", + "web/protocol/non-mesh.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json" + } + ], + "positive": [ + "Curve control point and handle edit", + "Curve cyclic/topology operator", + "Surface and Font property mutation" + ], + "negative": [ + "invalid curve selection/domain", + "occupied or stale frame/topology target", + "malformed non-mesh property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic multispline replay" + ], + "commands": [ + "npm --prefix web run test:curve-topology-operator", + "npm --prefix web run test:nonmesh-roundtrip", + "npm --prefix web run test:nonmesh-desktop-golden", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1116-000", + "phase": "1116", + "title": "verify_storage_recovery_module", + "kind": "module", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1115-000" + ], + "parityId": "STORAGE_RECOVERY", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-storage_recovery", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1116-000.md", + "behavior": "Verify IndexedDB catalog migration/restart and OPFS asset preview deduplication, quarantine and reference GC.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive storage commit/recovery evidence is proven", + "negative and quarantine cases are proven", + "Chromium restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "STORAGE_RECOVERY", + "sourceBacked": true, + "capabilities": [ + "CAP-INDEXEDDB-CATALOG-MIGRATION", + "CAP-OPFS-PREVIEW-COMMIT", + "CAP-OPFS-QUARANTINE-GC" + ], + "sourcePaths": [ + "web/protocol/storage.ts", + "web/protocol/storage-budget.ts", + "web/protocol/save-transaction.ts", + "web/protocol/recent-projects.ts", + "web/protocol/asset-preview.ts", + "web/protocol/asset-preview-decode.ts", + "web/app/src/storage/asset-catalog-indexeddb.ts", + "web/app/src/storage/asset-preview-opfs-commit.ts", + "web/app/src/storage/asset-preview-quarantine.ts", + "web/app/src/storage/asset-preview-reference-gc.ts", + "web/app/src/storage/opfs-files.ts", + "web/app/src/storage/migrations.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "v1 to v2 catalog migration", + "page/Worker restart identity", + "content-addressed preview deduplication" + ], + "negative": [ + "partial catalog migration", + "corrupt preview quarantine", + "cross-project or non-final reference GC" + ], + "recovery": [ + "IndexedDB restart", + "OPFS commit replay", + "quarantine cleanup", + "deterministic reference reclamation" + ], + "commands": [ + "npm --prefix web run test:asset-catalog-restart", + "npm --prefix web run test:asset-preview-dedup", + "npm --prefix web run test:asset-preview-quarantine", + "npm --prefix web run test:asset-preview-reference-gc", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1117-000", + "phase": "1117", + "title": "verify_simulation_cache_module", + "kind": "module", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1116-000" + ], + "parityId": "SIMULATION_CACHE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-simulation_cache", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1117-000.md", + "behavior": "Verify simulation cache identity, physics-family payload integrity, lifecycle recovery and deterministic LRU pruning.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive cache identity/lifecycle evidence is proven", + "negative integrity and budget cases are proven", + "Chromium restart and quarantine receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SIMULATION_CACHE", + "sourceBacked": true, + "capabilities": [ + "CAP-SIMULATION-CACHE-IDENTITY", + "CAP-PHYSICS-CACHE-INTEGRITY", + "CAP-SIMULATION-CACHE-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/simulation-cache.ts", + "web/protocol/physics-simulation.ts", + "web/protocol/physics-cache-playback.ts", + "web/protocol/storage.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "report": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json" + } + ], + "positive": [ + "graph/source/revision cache identity", + "all physics-family frame hashes", + "verified playback lifecycle" + ], + "negative": [ + "source or payload hash drift", + "revision/range mismatch", + "cache byte/frame budget overflow" + ], + "recovery": [ + "cancel and cleanup", + "LRU prune with protected playback", + "corruption quarantine", + "worker restart" + ], + "commands": [ + "npm --prefix web run test:simulation-cache-identity", + "npm --prefix web run test:simulation-cache-lifecycle", + "npm --prefix web run test:physics-cache-family", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1118-000", + "phase": "1118", + "title": "verify_ui_input_interaction_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1117-000" + ], + "parityId": "UI_INPUT_INTERACTION", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-ui_input_interaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1118-000.md", + "behavior": "Verify keyboard-only user actions, input mutex, IME/pointer state and responsive editor interaction under deployment CSP.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive keyboard Main mutation and save are proven", + "negative mutex/input cases are proven", + "Chromium accessibility and responsive receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_INPUT_INTERACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-KEYBOARD-USER-ACTIONS", + "CAP-INPUT-MODAL-STATE", + "CAP-IME-SHORTCUT-GUARD", + "CAP-RESPONSIVE-CSP-UI" + ], + "sourcePaths": [ + "web/app/index.html", + "web/app/src/app/App.tsx", + "web/app/src/app/app-shell.css", + "web/app/src/workers/web-engine.worker.ts", + "web/protocol/user-action-state.ts", + "web/protocol/project-action-mutex.ts", + "web/protocol/ime-composition.ts", + "web/protocol/input-modal.ts", + "web/protocol/pointer-contract.ts", + "web/protocol/worker-fault.ts", + "web/tests/unit/user-action-state.test.mjs", + "web/tests/unit/project-action-mutex.test.mjs", + "web/tests/unit/ime-composition.test.mjs", + "web/tests/unit/input-modal.test.mjs", + "web/tests/unit/pointer-contract.test.mjs" + ], + "reuseReceipts": [], + "positive": [ + "keyboard-only Add Cube Main mutation", + "keyboard save/reopen and GLB export", + "responsive controls at desktop/mobile viewports" + ], + "negative": [ + "concurrent project action mutex", + "IME shortcut suppression", + "pointer cancel/touch modal cleanup" + ], + "recovery": [ + "worker restart", + "save interruption recovery", + "responsive layout preservation", + "deterministic repeated keyboard loop" + ], + "commands": [ + "node --test web/tests/unit/user-action-state.test.mjs web/tests/unit/project-action-mutex.test.mjs web/tests/unit/ime-composition.test.mjs web/tests/unit/input-modal.test.mjs web/tests/unit/pointer-contract.test.mjs", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/user-action-state.spec.ts tests/e2e/project-action-mutex.spec.ts tests/e2e/keyboard-accessibility.spec.ts tests/e2e/responsive-layout.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1119-000", + "phase": "1119", + "title": "verify_library_workflow_module", + "kind": "module", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1118-000" + ], + "parityId": "LIBRARY_WORKFLOW", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-library_workflow", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1119-000.md", + "behavior": "Verify append, link, override and reload library flows through authoritative Main with path and dependency safety gates.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive library Main mutation is proven", + "negative and recovery cases are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LIBRARY_WORKFLOW", + "sourceBacked": true, + "capabilities": [ + "CAP-LIBRARY-APPEND", + "CAP-LIBRARY-LINK", + "CAP-LIBRARY-OVERRIDE", + "CAP-LIBRARY-RELOAD-SAFETY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/library-main-append.ts", + "web/protocol/library-linked-mutation.ts", + "web/protocol/library-linked-reload.ts", + "web/protocol/library-linked-missing.ts", + "web/protocol/library-override-writer.ts", + "web/protocol/library-override-freshness.ts", + "web/protocol/library-negative-cases.ts", + "web/protocol/library-operation-identity.ts", + "web/protocol/library-source-origin.ts", + "web/protocol/asset-path.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "report": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json" + }, + { + "manifest": "tests/golden/WBV2-P9-003/manifest.json", + "report": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json" + } + ], + "positive": [ + "append object into Main", + "linked read-only object", + "local override and reload identity" + ], + "negative": [ + "missing library source", + "dependency/cross-library cycle", + "unsafe path or ownership mutation" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic library replay" + ], + "commands": [ + "npm --prefix web run test:library-main-append", + "npm --prefix web run test:library-link-chromium", + "npm --prefix web run test:library-override-chromium", + "npm --prefix web run test:library-negative-cases", + "npm --prefix web run test:library-path-security", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1120-000", + "phase": "1120", + "title": "verify_volume_nanovdb_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1119-000" + ], + "parityId": "VOLUME_NANOVDB", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-volume_nanovdb", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1120-000.md", + "behavior": "Verify NanoVDB manifest, paged feedback, OPFS commit/restart and production viewport volume roundtrip.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive volume resource and viewport evidence is proven", + "negative and recovery cases are proven", + "Chromium OPFS/restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "VOLUME_NANOVDB", + "sourceBacked": true, + "capabilities": [ + "CAP-NANOVDB-MANIFEST", + "CAP-NANOVDB-PAGED-FEEDBACK", + "CAP-NANOVDB-OPFS-RESTART", + "CAP-NANOVDB-VIEWPORT-ROUNDTRIP" + ], + "sourcePaths": [ + "web/protocol/volume-vdb.ts", + "web/protocol/nanovdb-page-feedback.ts", + "web/protocol/nanovdb-device-recovery.ts", + "web/protocol/storage.ts", + "web/app/src/volume/nanovdb-opfs.ts", + "web/app/src/volume/nanovdb-stream.ts", + "web/app/src/volume/nanovdb-viewport.ts", + "web/app/src/volume/nanovdb-float32.ts", + "web/app/src/render/nanovdb-volume-renderer.ts", + "web/app/src/workers/vdb-opfs-test.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "validated NanoVDB bundle manifest", + "content-addressed OPFS commit", + "main/offscreen production viewport volume" + ], + "negative": [ + "manifest/chunk hash mismatch", + "stale source binding", + "WebGPU/resource availability block" + ], + "recovery": [ + "OPFS Worker restart", + "paged feedback resume", + "quota/device loss cleanup", + "deterministic volume save/reopen" + ], + "commands": [ + "npm --prefix web run test:vdb-availability", + "npm --prefix web run test:vdb-native", + "npm --prefix web run test:nanovdb-page-feedback", + "npm --prefix web run test:nanovdb-opfs-restart", + "npm --prefix web run test:nanovdb-volume-roundtrip", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1121-000", + "phase": "1121", + "title": "verify_paint_stroke_module", + "kind": "module", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P1120-000" + ], + "parityId": "PAINT_STROKE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-paint_stroke", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1121-000.md", + "behavior": "Verify paint pointer sessions, depth visibility and PBVH capability gates through the production Worker.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive paint Main transaction is proven", + "negative and recovery cases are proven", + "Chromium pointer/GPU receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "PAINT_STROKE", + "sourceBacked": true, + "capabilities": [ + "CAP-PAINT-POINTER-SESSION", + "CAP-PAINT-DEPTH-VISIBILITY", + "CAP-PAINT-PBVH-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/sculpt.ts", + "web/protocol/paint.ts", + "web/protocol/paint-stroke-session.ts", + "web/protocol/paint-depth-visibility.ts", + "web/protocol/paint-pbvh-capability.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/three-adapter/paint-depth-visibility.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "ordered paint pointer chunks", + "main/offscreen depth visibility", + "PBVH inventory capability query" + ], + "negative": [ + "stale/discontinuous pointer chunks", + "forged or over-budget depth samples", + "missing PBVH WASM entrypoint" + ], + "recovery": [ + "pointer cancel without Main mutation", + "undo step after paint commit", + "worker restart", + "deterministic capability replay" + ], + "commands": [ + "npm --prefix web run test:paint-stroke-session", + "npm --prefix web run test:paint-depth-visibility", + "npm --prefix web run test:paint-pbvh-capability", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1122-000", + "phase": "1122", + "title": "verify_engine_runtime_module", + "kind": "module", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1121-000" + ], + "parityId": "ENGINE_RUNTIME", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-engine_runtime", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1122-000.md", + "behavior": "Verify WebEngine variant manifest/selection, compiled WASM Main ABI and Worker crash recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive compiled WASM Main lifecycle is proven", + "negative variant/hash cases are proven", + "Chromium Worker restart receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ENGINE_RUNTIME", + "sourceBacked": true, + "capabilities": [ + "CAP-ENGINE-VARIANT-MANIFEST", + "CAP-ENGINE-WASM-MAIN-ABI", + "CAP-WORKER-CRASH-RECOVERY" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.h", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/CMakeLists.txt", + "web/protocol/engine-variant.ts", + "web/protocol/worker-fault.ts", + "web/protocol/save-transaction.ts", + "web/app/src/engine-client/engine-variant-bootstrap.ts", + "web/app/src/engine-client/browser-engine-variant-session.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/workers/storage.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "single/pthread manifest binding", + "compiled WASM Main open/save lifecycle", + "engine and storage Worker recovery" + ], + "negative": [ + "malformed variant/resource declaration", + "mixed-version/hash mismatch", + "pthread unavailable fallback" + ], + "recovery": [ + "single-thread fallback", + "Worker crash restart", + "operation-log restore", + "deterministic repeated startup" + ], + "commands": [ + "npm --prefix web run test:engine-manifest-v2", + "npm --prefix web run test:engine-variant-selection", + "npm --prefix web run test:engine-variant-fallback", + "npm --prefix web run test:engine-variant-install", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-native-engine-production.spec.ts tests/e2e/worker-crash-recovery.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1123-000", + "phase": "1123", + "title": "repair_glb_roundtrip_dependency_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1122-000" + ], + "parityId": "GLB_ROUNDTRIP_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-glb_roundtrip_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1123-000.md", + "behavior": "Repair the standalone GLB checker dependency chain and verify mesh/non-mesh Blender roundtrip plus Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive GLB and non-mesh roundtrip are proven", + "negative and recovery cases are proven", + "Chromium save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GLB_ROUNDTRIP_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GLB-MESH-ROUNDTRIP", + "CAP-GLB-NONMESH-ROUNDTRIP", + "CAP-GLB-CHROMIUM-RECOVERY" + ], + "sourcePaths": [ + "tools/web/check-glb-blender-roundtrip.mjs", + "tools/web/check-nonmesh-glb-blender-roundtrip.mjs", + "tools/web/blender-check-glb-roundtrip.py", + "web/protocol/glb-export.ts", + "web/protocol/glb-import.ts", + "web/protocol/nonmesh-export.ts", + "web/protocol/nonmesh-binary.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx" + ], + "reuseReceipts": [], + "positive": [ + "mesh/material/skin/animation GLB roundtrip", + "Curve/Surface/Font/Metaball non-mesh mapping", + "desktop GLB Main persistence in Chromium" + ], + "negative": [ + "sparse or oversized GLB", + "external URI/extension rejection", + "non-mesh export loss gate" + ], + "recovery": [ + "cancel without publishing output", + "Worker restart", + "OPFS quota retains old asset", + "deterministic Blender roundtrip" + ], + "commands": [ + "npm --prefix web run test:glb-blender-roundtrip", + "npm --prefix web run test:nonmesh-glb-blender-roundtrip", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/glb-negative-cases.spec.ts tests/e2e/glb-recovery.spec.ts tests/e2e/glb-main-persistence.spec.ts", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1124-000", + "phase": "1124", + "title": "record_historical_hash_drift_module", + "kind": "module", + "owner": "PROVENANCE", + "dependsOn": [ + "WBV2-P1123-000" + ], + "parityId": "HISTORICAL_HASH_DRIFT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-historical_hash_drift", + "gate": "EVIDENCE", + "card": "docs/tasks/WBV2-P1124-000.md", + "behavior": "Record legacy M12 artifact hash drift without re-signing historical manifests or changing the immutable inventory.", + "outputs": [ + "drift report", + "module receipt", + "manifest", + "status" + ], + "acceptance": [ + "original and observed hashes are recorded", + "provenance remains BLOCKED_SOURCE_LOST where bytes cannot be restored", + "historical manifests and inventory remain unchanged", + "deterministic drift evidence is reproducible", + "no full-family parity claim" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "HISTORICAL_HASH_DRIFT", + "sourceBacked": true, + "capabilities": [ + "CAP-HISTORICAL-HASH-AUDIT", + "CAP-PROVENANCE-SOURCE-LOST-GATE" + ], + "sourcePaths": [ + "tools/web/check-m12-manifest-drift.mjs", + "tests/golden/corrective/rehydration/M12-manifest-sha-drift.json", + "tests/golden/WBV2-P0-002/parity-map.json" + ], + "reuseReceipts": [], + "positive": [ + "84 drift entries captured", + "43 affected artifact paths indexed", + "immutable inventory binding preserved" + ], + "negative": [ + "missing original bytes", + "attempted historical re-signing", + "inventory mutation" + ], + "recovery": [ + "deterministic report rerun", + "source cache can restore original bytes later", + "new capability manifests reference drift evidence only" + ], + "commands": [ + "node tools/web/check-m12-manifest-drift.mjs --write", + "node tools/web/check-m12-manifest-drift.mjs", + "node tools/web/check-wbv2-module-execution.mjs" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1125-000", + "phase": "1125", + "title": "repair_geometry_nodes_allowlist_module", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1124-000" + ], + "parityId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-geometry_nodes_allowlist_repair", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1125-000.md", + "behavior": "Persist Geometry Nodes graph overrides in Web-safe Main storage and align allowlist assertions with real materialization behavior.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "supported graph Main materialization is proven", + "unsupported graph remains rejected without mutation", + "save/reopen graph retention is exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GEOMETRY_NODES_ALLOWLIST_REPAIR", + "sourceBacked": true, + "capabilities": [ + "CAP-GEOMETRY-NODES-MAIN-PERSISTENCE", + "CAP-GEOMETRY-NODES-ALLOWLIST-CONSISTENCY", + "CAP-GEOMETRY-NODES-SAVE-REOPEN" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/geometry-nodes.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/web-engine.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/geometry-node-allowlist.spec.ts", + "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [], + "positive": [ + "allowlisted graph materializes into Main", + "Scene IDProperty graph override persists", + "save/reopen retains graph identity/hash" + ], + "negative": [ + "unsupported simulation node", + "invalid graph schema", + "missing node/link endpoint" + ], + "recovery": [ + "rejected graph leaves baseline unchanged", + "undo/redo graph override", + "save/reopen", + "deterministic second run" + ], + "commands": [ + "cmake --build build_web_blender6 --target web_engine -- -j8", + "npm --prefix web run test:geometry-node-allowlist", + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "npm --prefix web run test:geometry-node-field-budget", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1126-000", + "phase": "1126", + "title": "verify_grease_pencil_viewport_module", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1125-000" + ], + "parityId": "GREASE_PENCIL_VIEWPORT", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-grease_pencil_viewport", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1126-000.md", + "behavior": "Verify Grease Pencil 2D/3D selection and marquee integration on both viewport backends using an isolated Chromium port.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "2D and 3D selection revisions converge", + "main-thread and Offscreen marquee are exact", + "stale/foreign selection cases remain fail-closed", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_VIEWPORT", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE-PENCIL-SELECTION-REVISION", + "CAP-GREASE-PENCIL-MARQUEE-MAIN", + "CAP-GREASE-PENCIL-MARQUEE-OFFSCREEN" + ], + "sourcePaths": [ + "web/protocol/grease-pencil-selection.ts", + "web/protocol/grease-pencil-marquee.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/grease-pencil.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/app/src/workers/viewport-render.worker.ts" + ], + "reuseReceipts": [], + "positive": [ + "2D canvas selection revision", + "main-thread 3D marquee selection", + "OffscreenCanvas 3D marquee selection" + ], + "negative": [ + "stale selection revision", + "foreign drawing identity", + "duplicate or forged point candidate" + ], + "recovery": [ + "selection convergence across backends", + "worker viewport restart", + "deterministic repeated marquee", + "preserve Main revision" + ], + "commands": [ + "WEB_TEST_PORT=5331 npm --prefix web run test:e2e -- --workers=1 tests/e2e/grease-pencil-selection.spec.ts tests/e2e/grease-pencil-marquee.spec.ts", + "node --test web/tests/unit/grease-pencil-selection.test.mjs web/tests/unit/grease-pencil-marquee.test.mjs", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1127-000", + "phase": "1127", + "title": "verify_tracking_mask_module", + "kind": "module", + "owner": "TRACKING", + "dependsOn": [ + "WBV2-P1126-000" + ], + "parityId": "TRACKING_MASK", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-tracking_mask", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1127-000.md", + "behavior": "Verify Mask reader, editable point raycast/marquee and tracking capability gates through Chromium.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Mask reader and interaction evidence is proven", + "negative solve/resource cases are proven", + "Chromium stable IDs and recovery receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TRACKING_MASK", + "sourceBacked": true, + "capabilities": [ + "CAP-MASK-MAIN-READER", + "CAP-MASK-POINT-RAYCAST", + "CAP-TRACKING-SOLVE-GATE" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/tracking-mask.ts", + "web/protocol/scene-ir.ts", + "web/app/src/tracking/MaskSelection.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/smoke.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Mask layers and splines reader", + "editable Mask point raycast", + "N-022 tracking marker/mask gate" + ], + "negative": [ + "foreign mask point identity", + "missing resource binding", + "camera solve unavailable" + ], + "recovery": [ + "main/offscreen marquee parity", + "worker restart", + "deterministic stable IDs", + "preserve source Main on blocked solve" + ], + "commands": [ + "npm --prefix web run test:mask-main-reader", + "WEB_TEST_PORT=5340 npm --prefix web run test:e2e -- --workers=1 tests/e2e/smoke.spec.ts -g \"N-022 tracking|real Blender 5.2 Mask\"", + "npm --prefix web run typecheck" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1128-000", + "phase": "1128", + "title": "verify_ffmpeg_movie_codec_module", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1127-000" + ], + "parityId": "SEQUENCER_MOVIE_CODEC", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "module-sequencer_movie_codec", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1128-000.md", + "behavior": "Use a local ffmpeg.wasm Worker fallback for movie probing and proxy-frame extraction when Chromium HTML media decoding is unavailable.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and core-resource hashes are bound", + "positive MP4 probe and RGBA frame are proven", + "corrupt and source-identity cases are rejected", + "AbortSignal cancellation leaves no live Worker", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SEQUENCER_MOVIE_CODEC", + "sourceBacked": true, + "capabilities": [ + "CAP-FFMPEG-WASM-MOVIE-PROBE", + "CAP-FFMPEG-WASM-PROXY-FRAME", + "CAP-MOVIE-CODEC-RECOVERY" + ], + "sourcePaths": [ + "web/package.json", + "web/package-lock.json", + "web/protocol/sequencer.ts", + "web/app/src/sequencer/SequencerCodecProbe.ts", + "web/app/src/sequencer/FFmpegMovieProbe.ts", + "web/app/src/sequencer/ffmpeg-movie-probe.worker.ts", + "web/app/src/sequencer/SequencerMediaProxyCache.ts", + "web/app/src/vendor/ffmpeg/ffmpeg-core.js", + "web/app/src/vendor/ffmpeg/ffmpeg-core.wasm", + "web/app/public/vendor/ffmpeg/ffmpeg-core.js", + "web/app/public/vendor/ffmpeg/ffmpeg-core.wasm", + "third_party/ffmpeg.wasm/package.json", + "third_party/ffmpeg.wasm/README.md", + "web/tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "browser decode fallback to ffmpeg.wasm", + "16x16 MP4 metadata probe", + "8x8 RGBA proxy frame extraction" + ], + "negative": [ + "corrupt movie payload", + "source SHA mismatch", + "ffmpeg runtime unavailable" + ], + "recovery": [ + "AbortSignal cancellation", + "Worker termination after response", + "cache manifest identity binding", + "deterministic repeated probe" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5342 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ffmpeg-movie-probe-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1129-000", + "phase": "1129", + "title": "authorize_scene_settings_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1128-000" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1129", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-000.md", + "behavior": "Authorize one source-backed Core Scene Graph settings module after the terminal P1128 module epoch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1128 evidence remains hash-bound", + "existing receipts are reused", + "inventory remains immutable", + "one source-backed module is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ] + }, + { + "id": "WBV2-P1129-001", + "phase": "1129", + "title": "verify_scene_settings_module", + "kind": "module", + "owner": "CORE_SCENE", + "dependsOn": [ + "WBV2-P1129-000" + ], + "parityId": "CORE_SCENE_GRAPH_SETTINGS", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-core_scene_graph_settings", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1129-001.md", + "behavior": "Verify the existing Blender Main scene compositor, performance and sampling setting transactions as one aggregate module.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutations are proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen receipts are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORE_SCENE_GRAPH_SETTINGS", + "sourceBacked": true, + "capabilities": [ + "CAP-SCENE-COMPOSITOR-SETTINGS", + "CAP-SCENE-PERFORMANCE-SETTINGS", + "CAP-SCENE-SAMPLING-SETTINGS" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P65-002/manifest.json", + "report": "tests/golden/WBV2-P65-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P66-002/manifest.json", + "report": "tests/golden/WBV2-P66-002/implementation-report.json" + }, + { + "manifest": "tests/golden/WBV2-P67-002/manifest.json", + "report": "tests/golden/WBV2-P67-002/implementation-report.json" + } + ], + "positive": [ + "compositor device/precision mutation", + "performance thread/persistence mutation", + "sampling filter/dither mutation" + ], + "negative": [ + "invalid sampling range", + "unknown scene target", + "malformed property set" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic scene settings snapshot" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5344 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-scene-settings-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1130-000", + "phase": "1130", + "title": "authorize_editor_view2d_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1129-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1130", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-000.md", + "behavior": "Authorize one source-backed UI editor View2D reader/protocol module after the P1129 scene settings module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1129 evidence remains hash-bound", + "P1102 editor workflow source remains unchanged", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1130-001", + "phase": "1130", + "title": "verify_editor_view2d_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1130-000" + ], + "parityId": "UI_EDITOR_VIEW2D_STATE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-ui_editor_view2d_state", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1130-001.md", + "behavior": "Preserve Blender Graph/Dope Sheet View2D cur and mask state through the Web editor protocol without changing the existing editor workflow parser.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive reader state is proven", + "negative no-publish and recovery are proven", + "Chromium and save/reopen compatibility are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "UI_EDITOR_VIEW2D_STATE", + "sourceBacked": true, + "capabilities": [ + "CAP-EDITOR-VIEW2D-CUR", + "CAP-EDITOR-VIEW2D-MASK", + "CAP-EDITOR-VIEW2D-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/editor-view2d.ts", + "web/app/src/workers/editor-view2d-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "reuseReceipts": [], + "positive": [ + "Graph main-region View2D cur retention", + "Graph main-region pixel mask retention", + "reader/protocol exact state" + ], + "negative": [ + "inverted View2D bounds", + "malformed mask range", + "missing View2D payload" + ], + "recovery": [ + "immutable base editor workflow", + "worker termination", + "deterministic repeated parse", + "save/reopen reader compatibility" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5346 npm --prefix web run test:e2e -- --workers=1 tests/e2e/ui-editor-view2d-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1131-000", + "phase": "1131", + "title": "authorize_curve_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1130-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1131", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-000.md", + "behavior": "Authorize one source-backed Curve topology editor module after the P1130 View2D module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1130 evidence remains hash-bound", + "Curve topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1131-001", + "phase": "1131", + "title": "verify_curve_topology_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1131-000" + ], + "parityId": "CURVE_TOPOLOGY_EDITOR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_topology_editor", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1131-001.md", + "behavior": "Verify the Blender Curve TOGGLE_CYCLIC topology transaction through the existing Main, protocol, Worker and frontend path.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_TOPOLOGY_EDITOR", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-TOPOLOGY-TOGGLE-CYCLIC", + "CAP-CURVE-TOPOLOGY-GATE", + "CAP-CURVE-TOPOLOGY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/curve-topology-editor.ts", + "web/app/src/workers/curve-topology-contract-test.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/curve-topology-contract.spec.ts", + "web/tests/e2e/curve-topology-operator.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "TOGGLE_CYCLIC Main mutation", + "operator gate exposes only verified capability", + "save/reopen preserves cyclic spline state" + ], + "negative": [ + "unknown curve operator", + "stale revision claim", + "selection and payload budget overflow" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic contract parse" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5347 npm --prefix web run test:e2e -- --workers=1 tests/e2e/curve-topology-contract.spec.ts tests/e2e/curve-topology-operator.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1132-000", + "phase": "1132", + "title": "authorize_curve_handle_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1131-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1132", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-000.md", + "behavior": "Authorize one source-backed Curve handle gizmo module after the P1131 topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1131 evidence remains hash-bound", + "Curve handle source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1132-001", + "phase": "1132", + "title": "verify_curve_handle_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1132-000" + ], + "parityId": "CURVE_HANDLE_GIZMO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_handle_gizmo", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1132-001.md", + "behavior": "Verify Curve handle position edits through Blender Main, protocol, Worker, renderer preview and frontend gizmo.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_HANDLE_GIZMO", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-HANDLE-MAIN", + "CAP-CURVE-HANDLE-GIZMO-PREVIEW", + "CAP-CURVE-HANDLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/nonmesh-interaction.ts", + "web/app/src/workers/nonmesh-interaction-test.worker.ts", + "web/app/src/app/App.tsx", + "web/app/src/three-adapter/nonmesh.ts", + "web/app/src/three-adapter/viewport.ts", + "web/app/src/three-adapter/offscreen-viewport.ts", + "web/tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Curve handle position Main mutation", + "local handle gizmo preview", + "save/reopen preserves handle state" + ], + "negative": [ + "invalid handle identity", + "stale base revision", + "malformed handle position" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic preview" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5348 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-handle-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1133-000", + "phase": "1133", + "title": "authorize_curve_splines_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1132-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1133", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-000.md", + "behavior": "Authorize one source-backed Curve spline transaction module after the P1132 handle module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1132 evidence remains hash-bound", + "Curve spline source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1133-001", + "phase": "1133", + "title": "verify_curve_splines_module", + "kind": "module", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1133-000" + ], + "parityId": "CURVE_SPLINES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-curve_splines_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1133-001.md", + "behavior": "Verify complete Curve spline replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CURVE_SPLINES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-CURVE-SPLINES-MAIN", + "CAP-CURVE-SPLINES-RECOVERY", + "CAP-CURVE-SPLINES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "complete Curve spline Main transaction", + "POLY/BEZIER descriptor retention", + "save/reopen preserves spline state" + ], + "negative": [ + "invalid spline offsets", + "stale base revision", + "mismatched handle payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic binary-geometry transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5349 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-curve-splines-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1134-000", + "phase": "1134", + "title": "authorize_surface_topology_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1133-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1134", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-000.md", + "behavior": "Authorize one source-backed Surface topology transaction module after the P1133 Curve spline module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1133 evidence remains hash-bound", + "Surface topology source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1134-001", + "phase": "1134", + "title": "verify_surface_topology_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1134-000" + ], + "parityId": "SURFACE_TOPOLOGY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-surface_topology_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1134-001.md", + "behavior": "Verify Surface NURBS topology replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SURFACE_TOPOLOGY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-SURFACE-TOPOLOGY-MAIN", + "CAP-SURFACE-NURBS-BOUNDS", + "CAP-SURFACE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Surface topology Main transaction", + "NURBS dimensions and weights retention", + "save/reopen preserves surface state" + ], + "negative": [ + "invalid surface dimensions", + "stale base revision", + "control grid budget mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "deterministic surface transaction" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5350 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-surface-topology-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1135-000", + "phase": "1135", + "title": "authorize_font_body_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1134-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1135", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-000.md", + "behavior": "Authorize one source-backed Font body transaction module after the P1134 Surface topology module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1134 evidence remains hash-bound", + "Font body source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1135-001", + "phase": "1135", + "title": "verify_font_body_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1135-000" + ], + "parityId": "FONT_BODY_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_body_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1135-001.md", + "behavior": "Verify Font body replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_BODY_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-BODY-MAIN", + "CAP-FONT-BODY-RECOVERY", + "CAP-FONT-BODY-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-body-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font body Main mutation", + "UTF-8 text retention", + "save/reopen preserves text" + ], + "negative": [ + "unknown Font data ID", + "body byte budget overflow", + "malformed body payload" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic text state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5351 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-body-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1136-000", + "phase": "1136", + "title": "authorize_font_properties_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1135-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1136", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-000.md", + "behavior": "Authorize one source-backed Font properties transaction module after the P1135 Font body module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1135 evidence remains hash-bound", + "Font property source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1136-001", + "phase": "1136", + "title": "verify_font_properties_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1136-000" + ], + "parityId": "FONT_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-font_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1136-001.md", + "behavior": "Verify Font property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FONT_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-FONT-PROPERTIES-MAIN", + "CAP-FONT-PROPERTIES-RECOVERY", + "CAP-FONT-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Font property Main mutation", + "bounded alignment/extrude fields", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Font data ID", + "invalid alignment enum", + "out-of-range numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5352 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-font-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1137-000", + "phase": "1137", + "title": "authorize_metaball_elements_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1136-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1137", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-000.md", + "behavior": "Authorize one source-backed Metaball element transaction module after the P1136 Font properties module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1136 evidence remains hash-bound", + "Metaball element source and protocol are present", + "inventory remains immutable", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1137-001", + "phase": "1137", + "title": "verify_metaball_elements_module", + "kind": "module", + "owner": "GEOMETRY", + "dependsOn": [ + "WBV2-P1137-000" + ], + "parityId": "METABALL_ELEMENTS_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-metaball_elements_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1137-001.md", + "behavior": "Verify Metaball element replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "METABALL_ELEMENTS_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-METABALL-ELEMENTS-MAIN", + "CAP-METABALL-ELEMENTS-RECOVERY", + "CAP-METABALL-ELEMENTS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1101-000/manifest.json", + "report": "tests/golden/WBV2-P1101-000/module-receipt.json" + } + ], + "positive": [ + "Metaball element Main mutation", + "bounded position/radius/scale retention", + "save/reopen preserves elements" + ], + "negative": [ + "unknown Metaball data ID", + "invalid radius", + "element count topology mismatch" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic element state" + ], + "commands": [ + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-metaball-elements-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1138-000", + "phase": "1138", + "title": "authorize_text_source_module", + "kind": "enabling", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1137-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1138", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-000.md", + "behavior": "Authorize a source-backed Text datablock mutation after the P1137 Metaball module.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1137 evidence remains hash-bound", + "ID_TXT is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1138-001", + "phase": "1138", + "title": "verify_text_source_module", + "kind": "module", + "owner": "SCRIPTING", + "dependsOn": [ + "WBV2-P1138-000" + ], + "parityId": "TEXT_SOURCE_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-text_source_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1138-001.md", + "behavior": "Verify Text source replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXT_SOURCE_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXT-SOURCE-MAIN", + "CAP-TEXT-SOURCE-RECOVERY", + "CAP-TEXT-SOURCE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-text-source-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1137-001/manifest.json", + "report": "tests/golden/WBV2-P1137-001/module-receipt.json" + } + ], + "positive": [ + "Text source Main mutation", + "ID_TXT registration in WITH_WEB", + "save/reopen preserves source" + ], + "negative": [ + "unknown Text data ID", + "source over 1 MiB", + "linked/read-only Text" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic source state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-text-source-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1139-000", + "phase": "1139", + "title": "authorize_texture_properties_module", + "kind": "enabling", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1138-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1139", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-000.md", + "behavior": "Authorize a source-backed Texture property mutation module after P1138 Text.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1138 evidence remains hash-bound", + "ID_TE is registered for WITH_WEB", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1139-001", + "phase": "1139", + "title": "verify_texture_properties_module", + "kind": "module", + "owner": "TEXTURE", + "dependsOn": [ + "WBV2-P1139-000" + ], + "parityId": "TEXTURE_PROPERTIES_TRANSACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-texture_properties_transaction", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1139-001.md", + "behavior": "Verify Texture property replacement through Blender Main, protocol, Worker and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main mutation is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "TEXTURE_PROPERTIES_TRANSACTION", + "sourceBacked": true, + "capabilities": [ + "CAP-TEXTURE-PROPERTIES-MAIN", + "CAP-TEXTURE-PROPERTIES-RECOVERY", + "CAP-TEXTURE-PROPERTIES-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/blenkernel/intern/idtype.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", + "web/protocol/web-engine.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/app/App.tsx", + "web/tests/e2e/wbv2-texture-properties-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1138-001/manifest.json", + "report": "tests/golden/WBV2-P1138-001/module-receipt.json" + } + ], + "positive": [ + "Texture property Main mutation", + "ID_TE registration in WITH_WEB", + "save/reopen preserves properties" + ], + "negative": [ + "unknown Texture data ID", + "noise depth outside Blender bounds", + "non-finite numeric property" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "Worker termination and deterministic property state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5353 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-texture-properties-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1140-000", + "phase": "1140", + "title": "authorize_action_group_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1139-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1140", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-000.md", + "behavior": "Authorize a source-backed ActionGroup reader and recovery module after P1139 Texture.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1139 evidence remains hash-bound", + "ActionGroup has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1140-001", + "phase": "1140", + "title": "verify_action_group_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-000" + ], + "parityId": "ACTION_GROUP_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_group_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1140-001.md", + "behavior": "Verify ActionGroup metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_GROUP_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-GROUP-READER", + "CAP-ACTION-GROUP-RECOVERY", + "CAP-ACTION-GROUP-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-group-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1112-000/manifest.json", + "report": "tests/golden/WBV2-P1112-000/module-receipt.json" + } + ], + "positive": [ + "ActionGroup Main reader exposes group and expanded metadata", + "three grouped location F-Curves remain grouped", + "save/reopen preserves group metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "unsupported group payload is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic group state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5356 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-group-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1141-000", + "phase": "1141", + "title": "authorize_action_pose_markers_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1140-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1141", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-000.md", + "behavior": "Authorize a source-backed ActionPoseMarkers reader and recovery module after P1140.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1140 evidence remains hash-bound", + "ActionPoseMarkers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1141-001", + "phase": "1141", + "title": "verify_action_pose_markers_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-000" + ], + "parityId": "ACTION_POSE_MARKERS_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-action_pose_markers_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1141-001.md", + "behavior": "Verify ActionPoseMarkers metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "ACTION_POSE_MARKERS_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-ACTION-POSE-MARKERS-READER", + "CAP-ACTION-POSE-MARKERS-RECOVERY", + "CAP-ACTION-POSE-MARKERS-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-action-pose-markers-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1140-001/manifest.json", + "report": "tests/golden/WBV2-P1140-001/module-receipt.json" + } + ], + "positive": [ + "ActionPoseMarkers Main reader exposes marker names and frames", + "three Blender pose markers remain ordered", + "save/reopen preserves marker metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing animation target is fail-closed", + "non-finite marker frame is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic marker state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5359 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-action-pose-markers-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1142-000", + "phase": "1142", + "title": "authorize_fcurve_sample_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1141-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1142", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-000.md", + "behavior": "Authorize a source-backed FCurveSample reader and recovery module after P1141.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1141 evidence remains hash-bound", + "FCurveSample has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1142-001", + "phase": "1142", + "title": "verify_fcurve_sample_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-000" + ], + "parityId": "FCURVE_SAMPLE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_sample_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1142-001.md", + "behavior": "Verify FCurveSample data through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_SAMPLE_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-SAMPLE-READER", + "CAP-FCURVE-SAMPLE-RECOVERY", + "CAP-FCURVE-SAMPLE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-sample-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1141-001/manifest.json", + "report": "tests/golden/WBV2-P1141-001/module-receipt.json" + } + ], + "positive": [ + "FCurveSample Main reader exposes sampled source and values", + "four native FPoint samples remain ordered", + "save/reopen preserves sampled data" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing sampled payload is fail-closed", + "non-finite sampled value is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic sampled state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5365 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-sample-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1143-000", + "phase": "1143", + "title": "authorize_fcurve_modifier_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1142-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1143", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-000.md", + "behavior": "Authorize a source-backed FCurve modifier reader and recovery module after P1142.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1142 evidence remains hash-bound", + "FCurveModifiers has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1143-001", + "phase": "1143", + "title": "verify_fcurve_modifier_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-000" + ], + "parityId": "FCURVE_MODIFIER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1143-001.md", + "behavior": "Verify FCurve modifier metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE-MODIFIER-READER", + "CAP-FCURVE-MODIFIER-RECOVERY", + "CAP-FCURVE-MODIFIER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1142-001/manifest.json", + "report": "tests/golden/WBV2-P1142-001/module-receipt.json" + } + ], + "positive": [ + "FCurveModifiers Main reader exposes native modifier stack", + "FModifierCycles preserves type/name/flags/influence", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing modifier payload is fail-closed", + "unsupported modifier type is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic modifier state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5368 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1144-000", + "phase": "1144", + "title": "authorize_driver_reader_module", + "kind": "enabling", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1143-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1144", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-000.md", + "behavior": "Authorize a source-backed Driver reader and recovery module after P1143.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "P1143 evidence remains hash-bound", + "Driver has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1144-001", + "phase": "1144", + "title": "verify_driver_reader_module", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1144-000" + ], + "parityId": "DRIVER_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-driver_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1144-001.md", + "behavior": "Verify Driver metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "DRIVER_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-DRIVER-READER", + "CAP-DRIVER-RECOVERY", + "CAP-DRIVER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/protocol/scene-ir.ts", + "web/app/src/workers/web-engine.worker.ts", + "web/app/src/engine-client/WebEngineClient.ts", + "web/tests/e2e/wbv2-driver-reader-production.spec.ts", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1143-001/manifest.json", + "report": "tests/golden/WBV2-P1143-001/module-receipt.json" + } + ], + "positive": [ + "AnimData driver list is read from Blender Main", + "Driver preserves scripted expression and variables", + "save/reopen preserves driver metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "missing driver target is fail-closed", + "non-finite driver influence is not synthesized" + ], + "recovery": [ + "undo", + "redo", + "save/reopen", + "worker termination and deterministic driver state" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-driver-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1145-000", + "phase": "1145", + "title": "authorize_corrective_smooth_reader_module", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1144-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1145", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-000.md", + "behavior": "Authorize a source-backed Corrective Smooth reader/recovery module after the Driver reader.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "Corrective Smooth has explicit Blender source mapping", + "inventory remains source-derived", + "one source-backed module is active" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1145-001", + "phase": "1145", + "title": "verify_corrective_smooth_reader_module", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1145-000" + ], + "parityId": "CORRECTIVE_SMOOTH_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-corrective_smooth_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1145-001.md", + "behavior": "Verify Corrective Smooth modifier type and RNA metadata through Blender Main reader, protocol and Chromium recovery.", + "outputs": [ + "module receipt", + "negative matrix", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "positive Main reader is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact", + "full-family parity remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "CORRECTIVE_SMOOTH_READER", + "sourceBacked": true, + "capabilities": [ + "CAP-CORRECTIVE-SMOOTH-READER", + "CAP-CORRECTIVE-SMOOTH-RECOVERY", + "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts", + "tests/files/web/modifier_corrective_smooth_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "Corrective Smooth type is read from Blender Main", + "RNA metadata is preserved", + "save/reopen preserves modifier metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported modifier data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts" + ], + "fullFamilyParity": false + } + }, + { + "id": "WBV2-P1146-000", + "phase": "1146", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1145-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1146", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1146-001", + "phase": "1146", + "title": "verify modifier reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1146-000" + ], + "parityId": "MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1146-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH-READER", + "CAP-MODIFIER_READER_BATCH-RECOVERY", + "CAP-MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts", + "tests/files/web/modifier_reader_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_datatransfer type is read from Blender Main", + "MOD_dynamicpaint type is read from Blender Main", + "MOD_explode type is read from Blender Main", + "MOD_fluid type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_datatransfer", + "modifier-source:MOD_dynamicpaint", + "modifier-source:MOD_explode", + "modifier-source:MOD_fluid", + "rna-struct:DataTransferModifier", + "rna-struct:DynamicPaintModifier", + "rna-struct:ExplodeModifier", + "rna-struct:FluidModifier", + "rna-struct:FluidDomainSettings" + ] + } + }, + { + "id": "WBV2-P1147-000", + "phase": "1147", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1146-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1147", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1147-001", + "phase": "1147", + "title": "verify modifier reader batch two", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1147-000" + ], + "parityId": "MODIFIER_READER_BATCH_TWO", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_two", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1147-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_TWO batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_TWO", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_TWO-READER", + "CAP-MODIFIER_READER_BATCH_TWO-RECOVERY", + "CAP-MODIFIER_READER_BATCH_TWO-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_two_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_laplaciandeform type is read from Blender Main", + "MOD_laplaciansmooth type is read from Blender Main", + "MOD_mask type is read from Blender Main", + "MOD_mesh_to_volume type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_laplaciandeform", + "modifier-source:MOD_laplaciansmooth", + "modifier-source:MOD_mask", + "modifier-source:MOD_shrinkwrap", + "rna-struct:LaplacianDeformModifier", + "rna-struct:LaplacianSmoothModifier", + "rna-struct:MaskModifier", + "rna-struct:ShrinkwrapModifier" + ] + } + }, + { + "id": "WBV2-P1148-000", + "phase": "1148", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1147-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1148", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1148-001", + "phase": "1148", + "title": "verify modifier reader batch three", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1148-000" + ], + "parityId": "MODIFIER_READER_BATCH_THREE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_three", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1148-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_THREE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_THREE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_THREE-READER", + "CAP-MODIFIER_READER_BATCH_THREE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_THREE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_three_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_remesh type is read from Blender Main", + "MOD_skin type is read from Blender Main", + "MOD_weighted_normal type is read from Blender Main", + "MOD_warp type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1148-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_three_scene.blend WBV2_BATCH_TYPES='[\"REMESH\",\"SKIN\",\"WEIGHTED_NORMAL\",\"WARP\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_remesh\",\"modifier-source:MOD_skin\",\"modifier-source:MOD_weighted_normal\",\"modifier-source:MOD_warp\",\"rna-struct:RemeshModifier\",\"rna-struct:SkinModifier\",\"rna-struct:WeightedNormalModifier\",\"rna-struct:WarpModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_remesh", + "modifier-source:MOD_skin", + "modifier-source:MOD_weighted_normal", + "modifier-source:MOD_warp", + "rna-struct:RemeshModifier", + "rna-struct:SkinModifier", + "rna-struct:WeightedNormalModifier", + "rna-struct:WarpModifier" + ] + } + }, + { + "id": "WBV2-P1149-000", + "phase": "1149", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1148-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1149", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1149-001", + "phase": "1149", + "title": "verify modifier reader batch four", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1149-000" + ], + "parityId": "MODIFIER_READER_BATCH_FOUR", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_four", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1149-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FOUR batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FOUR", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FOUR-READER", + "CAP-MODIFIER_READER_BATCH_FOUR-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FOUR-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvproject.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_uvwarp.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_normal_edit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_to_mesh.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_four_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_uvproject type is read from Blender Main", + "MOD_uvwarp type is read from Blender Main", + "MOD_volume_displace type is read from Blender Main", + "MOD_volume_to_mesh type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1149-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_four_scene.blend WBV2_BATCH_TYPES='[\"UV_PROJECT\",\"UV_WARP\",\"NORMAL_EDIT\",\"VOLUME_TO_MESH\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_uvproject\",\"modifier-source:MOD_uvwarp\",\"modifier-source:MOD_normal_edit\",\"modifier-source:MOD_volume_to_mesh\",\"rna-struct:UVProjectModifier\",\"rna-struct:UVWarpModifier\",\"rna-struct:NormalEditModifier\",\"rna-struct:VolumeToMeshModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1149-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_uvproject", + "modifier-source:MOD_uvwarp", + "modifier-source:MOD_normal_edit", + "modifier-source:MOD_volume_to_mesh", + "rna-struct:UVProjectModifier", + "rna-struct:UVWarpModifier", + "rna-struct:NormalEditModifier", + "rna-struct:VolumeToMeshModifier" + ] + } + }, + { + "id": "WBV2-P1150-000", + "phase": "1150", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1149-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1150", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1150-001", + "phase": "1150", + "title": "verify modifier reader batch five", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1150-000" + ], + "parityId": "MODIFIER_READER_BATCH_FIVE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_five", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1150-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_FIVE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_FIVE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_FIVE-READER", + "CAP-MODIFIER_READER_BATCH_FIVE-RECOVERY", + "CAP-MODIFIER_READER_BATCH_FIVE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshsequencecache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_multires.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_ocean.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_reader_batch_five_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_meshcache type is read from Blender Main", + "MOD_meshsequencecache type is read from Blender Main", + "MOD_multires type is read from Blender Main", + "MOD_ocean type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1150-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_five_scene.blend WBV2_BATCH_TYPES='[\"MESH_CACHE\",\"MESH_SEQUENCE_CACHE\",\"MULTIRES\",\"OCEAN\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_meshcache\",\"modifier-source:MOD_meshsequencecache\",\"modifier-source:MOD_multires\",\"modifier-source:MOD_ocean\",\"rna-struct:MeshCacheModifier\",\"rna-struct:MeshSequenceCacheModifier\",\"rna-struct:MultiresModifier\",\"rna-struct:OceanModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_meshcache", + "modifier-source:MOD_meshsequencecache", + "modifier-source:MOD_multires", + "modifier-source:MOD_ocean", + "rna-struct:MeshCacheModifier", + "rna-struct:MeshSequenceCacheModifier", + "rna-struct:MultiresModifier", + "rna-struct:OceanModifier" + ] + } + }, + { + "id": "WBV2-P1151-000", + "phase": "1151", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1150-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1151", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1151-001", + "phase": "1151", + "title": "verify Grease Pencil modifier reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1151-000" + ], + "parityId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-grease_pencil_modifier_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1151-001.md", + "behavior": "Verify the GREASE_PENCIL_MODIFIER_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "GREASE_PENCIL_MODIFIER_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-READER", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-RECOVERY", + "CAP-GREASE_PENCIL_MODIFIER_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_armature.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_build.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_color.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_dash.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_envelope.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_hook.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_lattice.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_length.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_mirror.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_multiply.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_noise.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_offset.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_opacity.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_outline.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_shrinkwrap.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_simplify.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_smooth.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_subdiv.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_texture.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_thickness.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_time.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_tint.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_angle.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_weight_proximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_grease_pencil_armature type is read from Blender Main", + "MOD_grease_pencil_array type is read from Blender Main", + "MOD_grease_pencil_build type is read from Blender Main", + "MOD_grease_pencil_color type is read from Blender Main", + "MOD_grease_pencil_dash type is read from Blender Main", + "MOD_grease_pencil_envelope type is read from Blender Main", + "MOD_grease_pencil_hook type is read from Blender Main", + "MOD_grease_pencil_lattice type is read from Blender Main", + "MOD_grease_pencil_length type is read from Blender Main", + "MOD_grease_pencil_mirror type is read from Blender Main", + "MOD_grease_pencil_multiply type is read from Blender Main", + "MOD_grease_pencil_noise type is read from Blender Main", + "MOD_grease_pencil_offset type is read from Blender Main", + "MOD_grease_pencil_opacity type is read from Blender Main", + "MOD_grease_pencil_outline type is read from Blender Main", + "MOD_grease_pencil_shrinkwrap type is read from Blender Main", + "MOD_grease_pencil_simplify type is read from Blender Main", + "MOD_grease_pencil_smooth type is read from Blender Main", + "MOD_grease_pencil_subdiv type is read from Blender Main", + "MOD_grease_pencil_texture type is read from Blender Main", + "MOD_grease_pencil_thickness type is read from Blender Main", + "MOD_grease_pencil_time type is read from Blender Main", + "MOD_grease_pencil_tint type is read from Blender Main", + "MOD_grease_pencil_weight_angle type is read from Blender Main", + "MOD_grease_pencil_weight_proximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1151-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_grease_pencil_scene.blend WBV2_BATCH_TYPES='[\"GREASE_PENCIL_ARMATURE\",\"GREASE_PENCIL_ARRAY\",\"GREASE_PENCIL_BUILD\",\"GREASE_PENCIL_COLOR\",\"GREASE_PENCIL_DASH\",\"GREASE_PENCIL_ENVELOPE\",\"GREASE_PENCIL_HOOK\",\"GREASE_PENCIL_LATTICE\",\"GREASE_PENCIL_LENGTH\",\"GREASE_PENCIL_MIRROR\",\"GREASE_PENCIL_MULTIPLY\",\"GREASE_PENCIL_NOISE\",\"GREASE_PENCIL_OFFSET\",\"GREASE_PENCIL_OPACITY\",\"GREASE_PENCIL_OUTLINE\",\"GREASE_PENCIL_SHRINKWRAP\",\"GREASE_PENCIL_SIMPLIFY\",\"GREASE_PENCIL_SMOOTH\",\"GREASE_PENCIL_SUBDIV\",\"GREASE_PENCIL_TEXTURE\",\"GREASE_PENCIL_THICKNESS\",\"GREASE_PENCIL_TIME\",\"GREASE_PENCIL_TINT\",\"GREASE_PENCIL_VERTEX_WEIGHT_ANGLE\",\"GREASE_PENCIL_VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_grease_pencil_armature\",\"modifier-source:MOD_grease_pencil_array\",\"modifier-source:MOD_grease_pencil_build\",\"modifier-source:MOD_grease_pencil_color\",\"modifier-source:MOD_grease_pencil_dash\",\"modifier-source:MOD_grease_pencil_envelope\",\"modifier-source:MOD_grease_pencil_hook\",\"modifier-source:MOD_grease_pencil_lattice\",\"modifier-source:MOD_grease_pencil_length\",\"modifier-source:MOD_grease_pencil_mirror\",\"modifier-source:MOD_grease_pencil_multiply\",\"modifier-source:MOD_grease_pencil_noise\",\"modifier-source:MOD_grease_pencil_offset\",\"modifier-source:MOD_grease_pencil_opacity\",\"modifier-source:MOD_grease_pencil_outline\",\"modifier-source:MOD_grease_pencil_shrinkwrap\",\"modifier-source:MOD_grease_pencil_simplify\",\"modifier-source:MOD_grease_pencil_smooth\",\"modifier-source:MOD_grease_pencil_subdiv\",\"modifier-source:MOD_grease_pencil_texture\",\"modifier-source:MOD_grease_pencil_thickness\",\"modifier-source:MOD_grease_pencil_time\",\"modifier-source:MOD_grease_pencil_tint\",\"modifier-source:MOD_grease_pencil_weight_angle\",\"modifier-source:MOD_grease_pencil_weight_proximity\",\"rna-struct:GreasePencilArmatureModifier\",\"rna-struct:GreasePencilArrayModifier\",\"rna-struct:GreasePencilBuildModifier\",\"rna-struct:GreasePencilColorModifier\",\"rna-struct:GreasePencilEnvelopeModifier\",\"rna-struct:GreasePencilHookModifier\",\"rna-struct:GreasePencilLatticeModifier\",\"rna-struct:GreasePencilLengthModifier\",\"rna-struct:GreasePencilMirrorModifier\",\"rna-struct:GreasePencilMultiplyModifier\",\"rna-struct:GreasePencilNoiseModifier\",\"rna-struct:GreasePencilOffsetModifier\",\"rna-struct:GreasePencilOpacityModifier\",\"rna-struct:GreasePencilOutlineModifier\",\"rna-struct:GreasePencilShrinkwrapModifier\",\"rna-struct:GreasePencilSimplifyModifier\",\"rna-struct:GreasePencilSmoothModifier\",\"rna-struct:GreasePencilSubdivModifier\",\"rna-struct:GreasePencilTextureModifier\",\"rna-struct:GreasePencilTimeModifier\",\"rna-struct:GreasePencilTintModifier\",\"rna-struct:GreasePencilWeightAngleModifier\",\"rna-struct:GreasePencilWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_armature", + "modifier-source:MOD_grease_pencil_array", + "modifier-source:MOD_grease_pencil_build", + "modifier-source:MOD_grease_pencil_color", + "modifier-source:MOD_grease_pencil_dash", + "modifier-source:MOD_grease_pencil_envelope", + "modifier-source:MOD_grease_pencil_hook", + "modifier-source:MOD_grease_pencil_lattice", + "modifier-source:MOD_grease_pencil_length", + "modifier-source:MOD_grease_pencil_mirror", + "modifier-source:MOD_grease_pencil_multiply", + "modifier-source:MOD_grease_pencil_noise", + "modifier-source:MOD_grease_pencil_offset", + "modifier-source:MOD_grease_pencil_opacity", + "modifier-source:MOD_grease_pencil_outline", + "modifier-source:MOD_grease_pencil_shrinkwrap", + "modifier-source:MOD_grease_pencil_simplify", + "modifier-source:MOD_grease_pencil_smooth", + "modifier-source:MOD_grease_pencil_subdiv", + "modifier-source:MOD_grease_pencil_texture", + "modifier-source:MOD_grease_pencil_thickness", + "modifier-source:MOD_grease_pencil_time", + "modifier-source:MOD_grease_pencil_tint", + "modifier-source:MOD_grease_pencil_weight_angle", + "modifier-source:MOD_grease_pencil_weight_proximity", + "rna-struct:GreasePencilArmatureModifier", + "rna-struct:GreasePencilArrayModifier", + "rna-struct:GreasePencilBuildModifier", + "rna-struct:GreasePencilColorModifier", + "rna-struct:GreasePencilEnvelopeModifier", + "rna-struct:GreasePencilHookModifier", + "rna-struct:GreasePencilLatticeModifier", + "rna-struct:GreasePencilLengthModifier", + "rna-struct:GreasePencilMirrorModifier", + "rna-struct:GreasePencilMultiplyModifier", + "rna-struct:GreasePencilNoiseModifier", + "rna-struct:GreasePencilOffsetModifier", + "rna-struct:GreasePencilOpacityModifier", + "rna-struct:GreasePencilOutlineModifier", + "rna-struct:GreasePencilShrinkwrapModifier", + "rna-struct:GreasePencilSimplifyModifier", + "rna-struct:GreasePencilSmoothModifier", + "rna-struct:GreasePencilSubdivModifier", + "rna-struct:GreasePencilTextureModifier", + "rna-struct:GreasePencilTimeModifier", + "rna-struct:GreasePencilTintModifier", + "rna-struct:GreasePencilWeightAngleModifier", + "rna-struct:GreasePencilWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1152-000", + "phase": "1152", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1151-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1152", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1152-001", + "phase": "1152", + "title": "verify modifier reader batch six", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1152-000" + ], + "parityId": "MODIFIER_READER_BATCH_SIX", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_reader_batch_six", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1152-001.md", + "behavior": "Verify the MODIFIER_READER_BATCH_SIX batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_READER_BATCH_SIX", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_READER_BATCH_SIX-READER", + "CAP-MODIFIER_READER_BATCH_SIX-RECOVERY", + "CAP-MODIFIER_READER_BATCH_SIX-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_mesh_to_volume.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_particleinstance.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_surface.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgmix.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgproximity.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend", + "tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend", + "tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend", + "tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend", + "tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend", + "tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "positive": [ + "MOD_mesh_to_volume type is read from Blender Main", + "MOD_particleinstance type is read from Blender Main", + "MOD_surface type is read from Blender Main", + "MOD_weightvgedit type is read from Blender Main", + "MOD_weightvgmix type is read from Blender Main", + "MOD_weightvgproximity type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1152-001 WBV2_BATCH_FIXTURES='[\"tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend\",\"tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend\",\"tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend\",\"tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend\",\"tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend\",\"tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend\"]' WBV2_BATCH_TYPES='[\"MESH_TO_VOLUME\",\"PARTICLE_INSTANCE\",\"SURFACE\",\"VERTEX_WEIGHT_EDIT\",\"VERTEX_WEIGHT_MIX\",\"VERTEX_WEIGHT_PROXIMITY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_mesh_to_volume\",\"modifier-source:MOD_particleinstance\",\"modifier-source:MOD_surface\",\"modifier-source:MOD_weightvgedit\",\"modifier-source:MOD_weightvgmix\",\"modifier-source:MOD_weightvgproximity\",\"rna-struct:MeshToVolumeModifier\",\"rna-struct:ParticleInstanceModifier\",\"rna-struct:SurfaceModifier\",\"rna-struct:VertexWeightEditModifier\",\"rna-struct:VertexWeightMixModifier\",\"rna-struct:VertexWeightProximityModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_mesh_to_volume", + "modifier-source:MOD_particleinstance", + "modifier-source:MOD_surface", + "modifier-source:MOD_weightvgedit", + "modifier-source:MOD_weightvgmix", + "modifier-source:MOD_weightvgproximity", + "rna-struct:MeshToVolumeModifier", + "rna-struct:ParticleInstanceModifier", + "rna-struct:SurfaceModifier", + "rna-struct:VertexWeightEditModifier", + "rna-struct:VertexWeightMixModifier", + "rna-struct:VertexWeightProximityModifier" + ] + } + }, + { + "id": "WBV2-P1153-000", + "phase": "1153", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1152-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1153", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1153-001", + "phase": "1153", + "title": "reuse verified modifier receipts for shared source utilities", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1153-000" + ], + "parityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_source_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1153-001.md", + "behavior": "Verify the MODIFIER_SOURCE_DEPENDENCY_REUSE batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-READER", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-RECOVERY", + "CAP-MODIFIER_SOURCE_DEPENDENCY_REUSE-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json", + "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json", + "tools/web/reuse-wbv2-source-dependencies.mjs" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1150-001/manifest.json", + "report": "tests/golden/WBV2-P1150-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1151-001/manifest.json", + "report": "tests/golden/WBV2-P1151-001/module-receipt.json" + }, + { + "manifest": "tests/golden/WBV2-P1152-001/manifest.json", + "report": "tests/golden/WBV2-P1152-001/module-receipt.json" + } + ], + "dependencyReuse": [ + { + "unitId": "modifier-source:MOD_grease_pencil_util", + "representativeUnitId": "modifier-source:MOD_grease_pencil_array", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", + "marker": "MOD_grease_pencil_util.hh", + "productionEvidence": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_mdd", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_mdd_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_pc2", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_read_pc2_times", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_meshcache_util", + "representativeUnitId": "modifier-source:MOD_meshcache", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", + "marker": "MOD_meshcache_util.hh", + "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json" + }, + { + "unitId": "modifier-source:MOD_weightvg_util", + "representativeUnitId": "modifier-source:MOD_weightvgedit", + "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", + "marker": "MOD_weightvg_util.hh", + "productionEvidence": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json" + } + ], + "positive": [ + "MOD_grease_pencil_util type is read from Blender Main", + "MOD_meshcache_mdd type is read from Blender Main", + "MOD_meshcache_pc2 type is read from Blender Main", + "MOD_meshcache_util type is read from Blender Main", + "MOD_weightvg_util type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "node tools/web/reuse-wbv2-source-dependencies.mjs --task WBV2-P1153-001 --write" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_grease_pencil_util", + "modifier-source:MOD_meshcache_mdd", + "modifier-source:MOD_meshcache_pc2", + "modifier-source:MOD_meshcache_util", + "modifier-source:MOD_weightvg_util" + ] + } + }, + { + "id": "WBV2-P1154-000", + "phase": "1154", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1153-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1154", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1154-001", + "phase": "1154", + "title": "verify solidify split helper sources", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1154-000" + ], + "parityId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_solidify_dependency_reuse", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1154-001.md", + "behavior": "Verify the MODIFIER_SOLIDIFY_HELPER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_SOLIDIFY_HELPER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-READER", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-RECOVERY", + "CAP-MODIFIER_SOLIDIFY_HELPER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc", + "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_generate_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" + } + ], + "positive": [ + "MOD_solidify_extrude type is read from Blender Main", + "MOD_solidify_nonmanifold type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1154-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/modifier_generate_scene.blend WBV2_BATCH_TYPES='[\"SOLIDIFY\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_solidify_extrude\",\"modifier-source:MOD_solidify_nonmanifold\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_solidify_extrude", + "modifier-source:MOD_solidify_nonmanifold" + ] + } + }, + { + "id": "WBV2-P1155-000", + "phase": "1155", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1154-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1155", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1155-001", + "phase": "1155", + "title": "verify modifier RNA reader batch", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1155-000" + ], + "parityId": "MODIFIER_RNA_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_rna_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1155-001.md", + "behavior": "Verify the MODIFIER_RNA_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_RNA_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_RNA_READER_BATCH-READER", + "CAP-MODIFIER_RNA_READER_BATCH-RECOVERY", + "CAP-MODIFIER_RNA_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/modifier_grease_pencil_scene.blend", + "tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend", + "tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_lineart type is read from Blender Main", + "MOD_particlesystem type is read from Blender Main", + "MOD_decimate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1155-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURES='[\"tests/files/web/modifier_grease_pencil_scene.blend\",\"tests/files/web/generated/M16-GAP-00088-modifier-PARTICLE_SYSTEM.blend\",\"tests/files/web/generated/M16-GAP-00041-modifier-DECIMATE.blend\"]' WBV2_BATCH_TYPES='[\"LINEART\",\"PARTICLE_SYSTEM\",\"DECIMATE\"]' WBV2_BATCH_UNITS='[\"rna-struct:GreasePencilLineartModifier\",\"rna-struct:ParticleSystemModifier\",\"rna-struct:DecimateModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1155-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "rna-struct:GreasePencilLineartModifier", + "rna-struct:ParticleSystemModifier", + "rna-struct:DecimateModifier" + ] + } + }, + { + "id": "WBV2-P1156-000", + "phase": "1156", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1155-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1156", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1156-001", + "phase": "1156", + "title": "verify volume displace modifier reader", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1156-000" + ], + "parityId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_volume_displace_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1156-001.md", + "behavior": "Verify the MODIFIER_VOLUME_DISPLACE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "MODIFIER_VOLUME_DISPLACE_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-READER", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-RECOVERY", + "CAP-MODIFIER_VOLUME_DISPLACE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_volume_displace.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts", + "tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_volume_displace type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1156-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00106-modifier-VOLUME_DISPLACE.blend WBV2_BATCH_TYPES='[\"VOLUME_DISPLACE\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_volume_displace\",\"rna-struct:VolumeDisplaceModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1156-001/modifier-reader-batch-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_volume_displace", + "rna-struct:VolumeDisplaceModifier" + ] + } + }, + { + "id": "WBV2-P1157-000", + "phase": "1157", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1156-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1157", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1157-001", + "phase": "1157", + "title": "verify shape key point reader", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1157-000" + ], + "parityId": "SHAPE_KEY_POINT_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-shape_key_point_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1157-001.md", + "behavior": "Verify the SHAPE_KEY_POINT_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "SHAPE_KEY_POINT_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-SHAPE_KEY_POINT_READER_BATCH-READER", + "CAP-SHAPE_KEY_POINT_READER_BATCH-RECOVERY", + "CAP-SHAPE_KEY_POINT_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1157-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1157-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:ShapeKeyPoint\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1157-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:ShapeKeyPoint" + ] + } + }, + { + "id": "WBV2-P1158-000", + "phase": "1158", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1157-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1158", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1158-001", + "phase": "1158", + "title": "verify line style reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1158-000" + ], + "parityId": "LINE_STYLE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1158-001.md", + "behavior": "Verify the LINE_STYLE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_READER_BATCH-READER", + "CAP-LINE_STYLE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1158-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1158-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00008-datablock-FreestyleLineStyle.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FreestyleLineStyle\",\"rna-struct:LineStyleModifier\",\"rna-struct:LineStyleAlphaModifier\",\"rna-struct:LineStyleColorModifier\",\"rna-struct:LineStyleGeometryModifier\",\"rna-struct:LineStyleThicknessModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1158-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:FreestyleLineStyle", + "rna-struct:LineStyleModifier", + "rna-struct:LineStyleAlphaModifier", + "rna-struct:LineStyleColorModifier", + "rna-struct:LineStyleGeometryModifier", + "rna-struct:LineStyleThicknessModifier" + ] + } + }, + { + "id": "WBV2-P1159-000", + "phase": "1159", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1158-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1159", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1159-001", + "phase": "1159", + "title": "verify line style collection reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1159-000" + ], + "parityId": "LINE_STYLE_COLLECTION_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_collection_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1159-001.md", + "behavior": "Verify the LINE_STYLE_COLLECTION_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_COLLECTION_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-READER", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_COLLECTION_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_main_api.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_modifier_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1159-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1159-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_modifier_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:BlendDataLineStyles\",\"rna-struct:LineStyleColorModifiers\",\"rna-struct:LineStyleAlphaModifiers\",\"rna-struct:LineStyleThicknessModifiers\",\"rna-struct:LineStyleGeometryModifiers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1159-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:BlendDataLineStyles", + "rna-struct:LineStyleColorModifiers", + "rna-struct:LineStyleAlphaModifiers", + "rna-struct:LineStyleThicknessModifiers", + "rna-struct:LineStyleGeometryModifiers" + ] + } + }, + { + "id": "WBV2-P1160-000", + "phase": "1160", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1159-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1160", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1160-001", + "phase": "1160", + "title": "verify line style modifier subtype reader batch", + "kind": "module", + "owner": "DRAWING", + "dependsOn": [ + "WBV2-P1160-000" + ], + "parityId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-line_style_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1160-001.md", + "behavior": "Verify the LINE_STYLE_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "LINE_STYLE_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-READER", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-LINE_STYLE_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_linestyle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-line-style-reader-production.spec.ts", + "tests/files/web/line_style_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1160-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1160-001/line-style-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/line_style_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:LineStyleAlphaModifier_AlongStroke\",\"rna-struct:LineStyleAlphaModifier_CreaseAngle\",\"rna-struct:LineStyleAlphaModifier_Curvature_3D\",\"rna-struct:LineStyleAlphaModifier_DistanceFromCamera\",\"rna-struct:LineStyleAlphaModifier_DistanceFromObject\",\"rna-struct:LineStyleAlphaModifier_Material\",\"rna-struct:LineStyleAlphaModifier_Noise\",\"rna-struct:LineStyleAlphaModifier_Tangent\",\"rna-struct:LineStyleColorModifier_AlongStroke\",\"rna-struct:LineStyleColorModifier_CreaseAngle\",\"rna-struct:LineStyleColorModifier_Curvature_3D\",\"rna-struct:LineStyleColorModifier_DistanceFromCamera\",\"rna-struct:LineStyleColorModifier_DistanceFromObject\",\"rna-struct:LineStyleColorModifier_Material\",\"rna-struct:LineStyleColorModifier_Noise\",\"rna-struct:LineStyleColorModifier_Tangent\",\"rna-struct:LineStyleGeometryModifier_2DOffset\",\"rna-struct:LineStyleGeometryModifier_2DTransform\",\"rna-struct:LineStyleGeometryModifier_BackboneStretcher\",\"rna-struct:LineStyleGeometryModifier_BezierCurve\",\"rna-struct:LineStyleGeometryModifier_Blueprint\",\"rna-struct:LineStyleGeometryModifier_GuidingLines\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise1D\",\"rna-struct:LineStyleGeometryModifier_PerlinNoise2D\",\"rna-struct:LineStyleGeometryModifier_Polygonalization\",\"rna-struct:LineStyleGeometryModifier_Sampling\",\"rna-struct:LineStyleGeometryModifier_Simplification\",\"rna-struct:LineStyleGeometryModifier_SinusDisplacement\",\"rna-struct:LineStyleGeometryModifier_SpatialNoise\",\"rna-struct:LineStyleGeometryModifier_TipRemover\",\"rna-struct:LineStyleThicknessModifier_AlongStroke\",\"rna-struct:LineStyleThicknessModifier_Calligraphy\",\"rna-struct:LineStyleThicknessModifier_CreaseAngle\",\"rna-struct:LineStyleThicknessModifier_Curvature_3D\",\"rna-struct:LineStyleThicknessModifier_DistanceFromCamera\",\"rna-struct:LineStyleThicknessModifier_DistanceFromObject\",\"rna-struct:LineStyleThicknessModifier_Material\",\"rna-struct:LineStyleThicknessModifier_Noise\",\"rna-struct:LineStyleThicknessModifier_Tangent\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-line-style-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1160-001/line-style-reader-production.json" + ], + "coverageBindings": [ + "rna-struct:LineStyleAlphaModifier_AlongStroke", + "rna-struct:LineStyleAlphaModifier_CreaseAngle", + "rna-struct:LineStyleAlphaModifier_Curvature_3D", + "rna-struct:LineStyleAlphaModifier_DistanceFromCamera", + "rna-struct:LineStyleAlphaModifier_DistanceFromObject", + "rna-struct:LineStyleAlphaModifier_Material", + "rna-struct:LineStyleAlphaModifier_Noise", + "rna-struct:LineStyleAlphaModifier_Tangent", + "rna-struct:LineStyleColorModifier_AlongStroke", + "rna-struct:LineStyleColorModifier_CreaseAngle", + "rna-struct:LineStyleColorModifier_Curvature_3D", + "rna-struct:LineStyleColorModifier_DistanceFromCamera", + "rna-struct:LineStyleColorModifier_DistanceFromObject", + "rna-struct:LineStyleColorModifier_Material", + "rna-struct:LineStyleColorModifier_Noise", + "rna-struct:LineStyleColorModifier_Tangent", + "rna-struct:LineStyleGeometryModifier_2DOffset", + "rna-struct:LineStyleGeometryModifier_2DTransform", + "rna-struct:LineStyleGeometryModifier_BackboneStretcher", + "rna-struct:LineStyleGeometryModifier_BezierCurve", + "rna-struct:LineStyleGeometryModifier_Blueprint", + "rna-struct:LineStyleGeometryModifier_GuidingLines", + "rna-struct:LineStyleGeometryModifier_PerlinNoise1D", + "rna-struct:LineStyleGeometryModifier_PerlinNoise2D", + "rna-struct:LineStyleGeometryModifier_Polygonalization", + "rna-struct:LineStyleGeometryModifier_Sampling", + "rna-struct:LineStyleGeometryModifier_Simplification", + "rna-struct:LineStyleGeometryModifier_SinusDisplacement", + "rna-struct:LineStyleGeometryModifier_SpatialNoise", + "rna-struct:LineStyleGeometryModifier_TipRemover", + "rna-struct:LineStyleThicknessModifier_AlongStroke", + "rna-struct:LineStyleThicknessModifier_Calligraphy", + "rna-struct:LineStyleThicknessModifier_CreaseAngle", + "rna-struct:LineStyleThicknessModifier_Curvature_3D", + "rna-struct:LineStyleThicknessModifier_DistanceFromCamera", + "rna-struct:LineStyleThicknessModifier_DistanceFromObject", + "rna-struct:LineStyleThicknessModifier_Material", + "rna-struct:LineStyleThicknessModifier_Noise", + "rna-struct:LineStyleThicknessModifier_Tangent" + ] + } + }, + { + "id": "WBV2-P1161-000", + "phase": "1161", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1160-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1161", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1161-001", + "phase": "1161", + "title": "verify FCurve modifier subtype reader batch", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1161-000" + ], + "parityId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-fcurve_modifier_subtype_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1161-001.md", + "behavior": "Verify the FCURVE_MODIFIER_SUBTYPE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "module": { + "moduleId": "FCURVE_MODIFIER_SUBTYPE_READER_BATCH", + "sourceBacked": true, + "capabilities": [ + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-READER", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-RECOVERY", + "CAP-FCURVE_MODIFIER_SUBTYPE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/makesrna/intern/rna_fcurve.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-modifier-production.spec.ts", + "tests/files/web/fcurve_modifier_subtype_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1161-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1161-001/fcurve-modifier-production.json WBV2_BATCH_FIXTURE=tests/files/web/fcurve_modifier_subtype_batch_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"rna-struct:FModifierEnvelope\",\"rna-struct:FModifierGenerator\",\"rna-struct:FModifierLimits\",\"rna-struct:FModifierNoise\",\"rna-struct:FModifierSmooth\",\"rna-struct:FModifierStepped\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-modifier-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1161-001/fcurve-modifier-production.json" + ], + "coverageBindings": [ + "rna-struct:FModifierEnvelope", + "rna-struct:FModifierGenerator", + "rna-struct:FModifierLimits", + "rna-struct:FModifierNoise", + "rna-struct:FModifierSmooth", + "rna-struct:FModifierStepped" + ] + } + }, + { + "id": "WBV2-P1162-000", + "phase": "1162", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1161-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1162", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1162-001", + "phase": "1162", + "title": "verify shape key modifier reader dependency", + "kind": "module", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P1162-000" + ], + "parityId": "MODIFIER_SHAPEKEY_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-modifier_shapekey_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1162-001.md", + "behavior": "Verify the MODIFIER_SHAPEKEY_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "module": { + "moduleId": "MODIFIER_SHAPEKEY_READER_BATCH", + "batchId": "WBV2-P1162-001:MODIFIER_SHAPEKEY_READER_BATCH:f7a317a63fdee0cb", + "selectedRecordIds": [ + "modifier-source:MOD_shapekey" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-READER", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-RECOVERY", + "CAP-MODIFIER_SHAPEKEY_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/modifiers/intern/MOD_shapekey.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-shape-key-reader-production.spec.ts", + "tests/files/web/rigged_shape_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MOD_shapekey type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1162-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1162-001/shape-key-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/rigged_shape_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_shapekey\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-shape-key-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1162-001/shape-key-reader-production.json" + ], + "coverageBindings": [ + "modifier-source:MOD_shapekey" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1163-000", + "phase": "1163", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1162-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1163", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1163-001", + "phase": "1163", + "title": "verify compositor node reader batch", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1163-000" + ], + "parityId": "COMPOSITOR_NODE_READER_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_node_reader_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1163-001.md", + "behavior": "Verify the COMPOSITOR_NODE_READER_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "module": { + "moduleId": "COMPOSITOR_NODE_READER_BATCH", + "batchId": "WBV2-P1163-001:COMPOSITOR_NODE_READER_BATCH:6e59dc4f2b686518", + "selectedRecordIds": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NODE_READER_BATCH-READER", + "CAP-COMPOSITOR_NODE_READER_BATCH-RECOVERY", + "CAP-COMPOSITOR_NODE_READER_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_glare.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1163-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1163-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeGlare\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeGlare\",\"node:CompositorNodeViewer\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1163-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeGlare", + "node:CompositorNodeViewer" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1164-000", + "phase": "1164", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1163-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1164", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1164-001", + "phase": "1164", + "title": "verify native compositor transform blur alpha reader", + "kind": "module", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P1164-000" + ], + "parityId": "COMPOSITOR_NATIVE_NODE_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-compositor_native_node_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1164-001.md", + "behavior": "Verify the COMPOSITOR_NATIVE_NODE_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "module": { + "moduleId": "COMPOSITOR_NATIVE_NODE_BATCH", + "batchId": "WBV2-P1164-001:COMPOSITOR_NATIVE_NODE_BATCH:91a76e1ee4077587", + "selectedRecordIds": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-READER", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-RECOVERY", + "CAP-COMPOSITOR_NATIVE_NODE_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_transform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_over.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/compositor_node_batch_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeTransform type is read from Blender Main", + "CompositorNodeBlur type is read from Blender Main", + "CompositorNodeAlphaOver type is read from Blender Main", + "CompositorNodeViewer type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1164-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1164-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/compositor_node_batch_scene.blend WBV2_BATCH_TYPES='[\"CompositorNodeTransform\",\"CompositorNodeBlur\",\"CompositorNodeAlphaOver\",\"VIEWER\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeTransform\",\"node:CompositorNodeBlur\",\"node:CompositorNodeAlphaOver\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1164-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeTransform", + "node:CompositorNodeBlur", + "node:CompositorNodeAlphaOver" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1165-000", + "phase": "1165", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1164-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1165", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1165-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1165-001", + "phase": "1165", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1165-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1165-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1165-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:f0276fdfa1169691", + "selectedRecordIds": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_anti_aliasing.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bilateral_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_blank_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_bokeh_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_box_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_brightness_contrast.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_channel_key.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeAntiAliasing type is read from Blender Main", + "CompositorNodeBilateralblur type is read from Blender Main", + "CompositorNodeBlankImage type is read from Blender Main", + "CompositorNodeBokehBlur type is read from Blender Main", + "CompositorNodeBokehImage type is read from Blender Main", + "CompositorNodeBoxMask type is read from Blender Main", + "CompositorNodeBrightContrast type is read from Blender Main", + "CompositorNodeChannelMatte type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1165-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1165-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-f0276fdfa1169691.blend WBV2_BATCH_TYPES='[\"CompositorNodeAntiAliasing\",\"CompositorNodeBilateralblur\",\"CompositorNodeBlankImage\",\"CompositorNodeBokehBlur\",\"CompositorNodeBokehImage\",\"CompositorNodeBoxMask\",\"CompositorNodeBrightContrast\",\"CompositorNodeChannelMatte\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeAntiAliasing\",\"node:CompositorNodeBilateralblur\",\"node:CompositorNodeBlankImage\",\"node:CompositorNodeBokehBlur\",\"node:CompositorNodeBokehImage\",\"node:CompositorNodeBoxMask\",\"node:CompositorNodeBrightContrast\",\"node:CompositorNodeChannelMatte\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1165-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeAntiAliasing", + "node:CompositorNodeBilateralblur", + "node:CompositorNodeBlankImage", + "node:CompositorNodeBokehBlur", + "node:CompositorNodeBokehImage", + "node:CompositorNodeBoxMask", + "node:CompositorNodeBrightContrast", + "node:CompositorNodeChannelMatte" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1166-000", + "phase": "1166", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1165-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1166", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1166-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1166-001", + "phase": "1166", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1166-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1166-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1166-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:5b79ae1d2da8300c", + "selectedRecordIds": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_chroma_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_balance.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_correction.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_color_spill.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_combine_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_color_space.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convert_to_display.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeChromaMatte type is read from Blender Main", + "CompositorNodeColorBalance type is read from Blender Main", + "CompositorNodeColorCorrection type is read from Blender Main", + "CompositorNodeColorMatte type is read from Blender Main", + "CompositorNodeColorSpill type is read from Blender Main", + "CompositorNodeCombineColor type is read from Blender Main", + "CompositorNodeConvertColorSpace type is read from Blender Main", + "CompositorNodeConvertToDisplay type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1166-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1166-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-5b79ae1d2da8300c.blend WBV2_BATCH_TYPES='[\"CompositorNodeChromaMatte\",\"CompositorNodeColorBalance\",\"CompositorNodeColorCorrection\",\"CompositorNodeColorMatte\",\"CompositorNodeColorSpill\",\"CompositorNodeCombineColor\",\"CompositorNodeConvertColorSpace\",\"CompositorNodeConvertToDisplay\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeChromaMatte\",\"node:CompositorNodeColorBalance\",\"node:CompositorNodeColorCorrection\",\"node:CompositorNodeColorMatte\",\"node:CompositorNodeColorSpill\",\"node:CompositorNodeCombineColor\",\"node:CompositorNodeConvertColorSpace\",\"node:CompositorNodeConvertToDisplay\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1166-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeChromaMatte", + "node:CompositorNodeColorBalance", + "node:CompositorNodeColorCorrection", + "node:CompositorNodeColorMatte", + "node:CompositorNodeColorSpill", + "node:CompositorNodeCombineColor", + "node:CompositorNodeConvertColorSpace", + "node:CompositorNodeConvertToDisplay" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1167-000", + "phase": "1167", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1166-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1167", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1167-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1167-001", + "phase": "1167", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1167-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1167-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1167-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:6c1d64f20df459f4", + "selectedRecordIds": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_convolve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_corner_pin.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_crop.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_curves.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_directional_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_defocus.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeConvolve type is read from Blender Main", + "CompositorNodeCornerPin type is read from Blender Main", + "CompositorNodeCrop type is read from Blender Main", + "CompositorNodeCryptomatte type is read from Blender Main", + "CompositorNodeCryptomatteV2 type is read from Blender Main", + "CompositorNodeCurveRGB type is read from Blender Main", + "CompositorNodeDBlur type is read from Blender Main", + "CompositorNodeDefocus type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1167-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1167-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-6c1d64f20df459f4.blend WBV2_BATCH_TYPES='[\"CompositorNodeConvolve\",\"CompositorNodeCornerPin\",\"CompositorNodeCrop\",\"CompositorNodeCryptomatte\",\"CompositorNodeCryptomatteV2\",\"CompositorNodeCurveRGB\",\"CompositorNodeDBlur\",\"CompositorNodeDefocus\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeConvolve\",\"node:CompositorNodeCornerPin\",\"node:CompositorNodeCrop\",\"node:CompositorNodeCryptomatte\",\"node:CompositorNodeCryptomatteV2\",\"node:CompositorNodeCurveRGB\",\"node:CompositorNodeDBlur\",\"node:CompositorNodeDefocus\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1167-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeConvolve", + "node:CompositorNodeCornerPin", + "node:CompositorNodeCrop", + "node:CompositorNodeCryptomatte", + "node:CompositorNodeCryptomatteV2", + "node:CompositorNodeCurveRGB", + "node:CompositorNodeDBlur", + "node:CompositorNodeDefocus" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1168-000", + "phase": "1168", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1167-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1168", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1168-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1168-001", + "phase": "1168", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1168-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1168-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1168-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:56e154dff1afd9ba", + "selectedRecordIds": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_denoise.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_despeckle.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_difference_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_dilate_erode.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_displace.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_distance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_double_edge_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_ellipse_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeDenoise type is read from Blender Main", + "CompositorNodeDespeckle type is read from Blender Main", + "CompositorNodeDiffMatte type is read from Blender Main", + "CompositorNodeDilateErode type is read from Blender Main", + "CompositorNodeDisplace type is read from Blender Main", + "CompositorNodeDistanceMatte type is read from Blender Main", + "CompositorNodeDoubleEdgeMask type is read from Blender Main", + "CompositorNodeEllipseMask type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1168-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1168-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-56e154dff1afd9ba.blend WBV2_BATCH_TYPES='[\"CompositorNodeDenoise\",\"CompositorNodeDespeckle\",\"CompositorNodeDiffMatte\",\"CompositorNodeDilateErode\",\"CompositorNodeDisplace\",\"CompositorNodeDistanceMatte\",\"CompositorNodeDoubleEdgeMask\",\"CompositorNodeEllipseMask\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeDenoise\",\"node:CompositorNodeDespeckle\",\"node:CompositorNodeDiffMatte\",\"node:CompositorNodeDilateErode\",\"node:CompositorNodeDisplace\",\"node:CompositorNodeDistanceMatte\",\"node:CompositorNodeDoubleEdgeMask\",\"node:CompositorNodeEllipseMask\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1168-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeDenoise", + "node:CompositorNodeDespeckle", + "node:CompositorNodeDiffMatte", + "node:CompositorNodeDilateErode", + "node:CompositorNodeDisplace", + "node:CompositorNodeDistanceMatte", + "node:CompositorNodeDoubleEdgeMask", + "node:CompositorNodeEllipseMask" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1169-000", + "phase": "1169", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1168-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1169", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1169-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1169-001", + "phase": "1169", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1169-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1169-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:cd9ae59d0f9640d1", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1169-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:cd9ae59d0f9640d1", + "selectedRecordIds": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_filter.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_flip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_correct.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_hue_saturation_value.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_id_mask.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-cd9ae59d0f9640d1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeFilter type is read from Blender Main", + "CompositorNodeFlip type is read from Blender Main", + "CompositorNodeHueCorrect type is read from Blender Main", + "CompositorNodeHueSat type is read from Blender Main", + "CompositorNodeIDMask type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1169-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1169-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-cd9ae59d0f9640d1.blend WBV2_BATCH_TYPES='[\"CompositorNodeFilter\",\"CompositorNodeFlip\",\"CompositorNodeHueCorrect\",\"CompositorNodeHueSat\",\"CompositorNodeIDMask\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeFilter\",\"node:CompositorNodeFlip\",\"node:CompositorNodeHueCorrect\",\"node:CompositorNodeHueSat\",\"node:CompositorNodeIDMask\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1169-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeFilter", + "node:CompositorNodeFlip", + "node:CompositorNodeHueCorrect", + "node:CompositorNodeHueSat", + "node:CompositorNodeIDMask" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1170-000", + "phase": "1170", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1169-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1170", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1170-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1170-001", + "phase": "1170", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1170-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1170-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1170-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8ee7e86684d23363", + "selectedRecordIds": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_coordinates.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_image_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_inpaint.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_keying_screen.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_kuwahara.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_lens_distortion.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeImage type is read from Blender Main", + "CompositorNodeImageCoordinates type is read from Blender Main", + "CompositorNodeImageInfo type is read from Blender Main", + "CompositorNodeInpaint type is read from Blender Main", + "CompositorNodeKeying type is read from Blender Main", + "CompositorNodeKeyingScreen type is read from Blender Main", + "CompositorNodeKuwahara type is read from Blender Main", + "CompositorNodeLensdist type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1170-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1170-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8ee7e86684d23363.blend WBV2_BATCH_TYPES='[\"CompositorNodeImage\",\"CompositorNodeImageCoordinates\",\"CompositorNodeImageInfo\",\"CompositorNodeInpaint\",\"CompositorNodeKeying\",\"CompositorNodeKeyingScreen\",\"CompositorNodeKuwahara\",\"CompositorNodeLensdist\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeImage\",\"node:CompositorNodeImageCoordinates\",\"node:CompositorNodeImageInfo\",\"node:CompositorNodeInpaint\",\"node:CompositorNodeKeying\",\"node:CompositorNodeKeyingScreen\",\"node:CompositorNodeKuwahara\",\"node:CompositorNodeLensdist\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1170-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeImage", + "node:CompositorNodeImageCoordinates", + "node:CompositorNodeImageInfo", + "node:CompositorNodeInpaint", + "node:CompositorNodeKeying", + "node:CompositorNodeKeyingScreen", + "node:CompositorNodeKuwahara", + "node:CompositorNodeLensdist" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1171-000", + "phase": "1171", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1170-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1171", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1171-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1171-001", + "phase": "1171", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1171-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1171-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1171-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:c7c1993f19c6c688", + "selectedRecordIds": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_levels.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_luminance_key.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_map_uv.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_mask_to_sdf.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_clip.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_movie_distortion.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeLevels type is read from Blender Main", + "CompositorNodeLumaMatte type is read from Blender Main", + "CompositorNodeMapUV type is read from Blender Main", + "CompositorNodeMask type is read from Blender Main", + "CompositorNodeMaskToSDF type is read from Blender Main", + "CompositorNodeMovieClip type is read from Blender Main", + "CompositorNodeMovieDistortion type is read from Blender Main", + "CompositorNodeNormal type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1171-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1171-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-c7c1993f19c6c688.blend WBV2_BATCH_TYPES='[\"CompositorNodeLevels\",\"CompositorNodeLumaMatte\",\"CompositorNodeMapUV\",\"CompositorNodeMask\",\"CompositorNodeMaskToSDF\",\"CompositorNodeMovieClip\",\"CompositorNodeMovieDistortion\",\"CompositorNodeNormal\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeLevels\",\"node:CompositorNodeLumaMatte\",\"node:CompositorNodeMapUV\",\"node:CompositorNodeMask\",\"node:CompositorNodeMaskToSDF\",\"node:CompositorNodeMovieClip\",\"node:CompositorNodeMovieDistortion\",\"node:CompositorNodeNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1171-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeLevels", + "node:CompositorNodeLumaMatte", + "node:CompositorNodeMapUV", + "node:CompositorNodeMask", + "node:CompositorNodeMaskToSDF", + "node:CompositorNodeMovieClip", + "node:CompositorNodeMovieDistortion", + "node:CompositorNodeNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1172-000", + "phase": "1172", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1171-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1172", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1172-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1172-001", + "phase": "1172", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1172-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1172-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1172-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:bf66c685c7c6fd95", + "selectedRecordIds": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_normalize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_file_output.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_pixelate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_plane_track_deform.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_posterize.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_alpha_convert.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_render_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-bf66c685c7c6fd95.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeNormalize type is read from Blender Main", + "CompositorNodeOutputFile type is read from Blender Main", + "CompositorNodePixelate type is read from Blender Main", + "CompositorNodePlaneTrackDeform type is read from Blender Main", + "CompositorNodePosterize type is read from Blender Main", + "CompositorNodePremulKey type is read from Blender Main", + "CompositorNodeRGBToBW type is read from Blender Main", + "CompositorNodeRLayers type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1172-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1172-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-bf66c685c7c6fd95.blend WBV2_BATCH_TYPES='[\"CompositorNodeNormalize\",\"CompositorNodeOutputFile\",\"CompositorNodePixelate\",\"CompositorNodePlaneTrackDeform\",\"CompositorNodePosterize\",\"CompositorNodePremulKey\",\"CompositorNodeRGBToBW\",\"CompositorNodeRLayers\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeNormalize\",\"node:CompositorNodeOutputFile\",\"node:CompositorNodePixelate\",\"node:CompositorNodePlaneTrackDeform\",\"node:CompositorNodePosterize\",\"node:CompositorNodePremulKey\",\"node:CompositorNodeRGBToBW\",\"node:CompositorNodeRLayers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1172-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeNormalize", + "node:CompositorNodeOutputFile", + "node:CompositorNodePixelate", + "node:CompositorNodePlaneTrackDeform", + "node:CompositorNodePosterize", + "node:CompositorNodePremulKey", + "node:CompositorNodeRGBToBW", + "node:CompositorNodeRLayers" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1173-000", + "phase": "1173", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1172-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1173", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1173-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1173-001", + "phase": "1173", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1173-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1173-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1173-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:a1b966b1af421537", + "selectedRecordIds": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_relative_to_pixel.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_rotate.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scale.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_scene_time.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_separate_color.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_strip_info.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_set_alpha.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-a1b966b1af421537.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeRelativeToPixel type is read from Blender Main", + "CompositorNodeRotate type is read from Blender Main", + "CompositorNodeScale type is read from Blender Main", + "CompositorNodeSceneTime type is read from Blender Main", + "CompositorNodeSeparateColor type is read from Blender Main", + "CompositorNodeSequencerStripInfo type is read from Blender Main", + "CompositorNodeSetAlpha type is read from Blender Main", + "CompositorNodeSplit type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1173-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1173-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-a1b966b1af421537.blend WBV2_BATCH_TYPES='[\"CompositorNodeRelativeToPixel\",\"CompositorNodeRotate\",\"CompositorNodeScale\",\"CompositorNodeSceneTime\",\"CompositorNodeSeparateColor\",\"CompositorNodeSequencerStripInfo\",\"CompositorNodeSetAlpha\",\"CompositorNodeSplit\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeRelativeToPixel\",\"node:CompositorNodeRotate\",\"node:CompositorNodeScale\",\"node:CompositorNodeSceneTime\",\"node:CompositorNodeSeparateColor\",\"node:CompositorNodeSequencerStripInfo\",\"node:CompositorNodeSetAlpha\",\"node:CompositorNodeSplit\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1173-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeRelativeToPixel", + "node:CompositorNodeRotate", + "node:CompositorNodeScale", + "node:CompositorNodeSceneTime", + "node:CompositorNodeSeparateColor", + "node:CompositorNodeSequencerStripInfo", + "node:CompositorNodeSetAlpha", + "node:CompositorNodeSplit" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1174-000", + "phase": "1174", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1173-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1174", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1174-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1174-001", + "phase": "1174", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1174-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1174-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1174-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:8f71e517e24622f2", + "selectedRecordIds": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_stabilize_2d.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_string_to_image.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_switch_view.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_time_curve.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_tone_map.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_track_position.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_translate.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-8f71e517e24622f2.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeStabilize type is read from Blender Main", + "CompositorNodeStringToImage type is read from Blender Main", + "CompositorNodeSwitch type is read from Blender Main", + "CompositorNodeSwitchView type is read from Blender Main", + "CompositorNodeTime type is read from Blender Main", + "CompositorNodeTonemap type is read from Blender Main", + "CompositorNodeTrackPos type is read from Blender Main", + "CompositorNodeTranslate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1174-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1174-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-8f71e517e24622f2.blend WBV2_BATCH_TYPES='[\"CompositorNodeStabilize\",\"CompositorNodeStringToImage\",\"CompositorNodeSwitch\",\"CompositorNodeSwitchView\",\"CompositorNodeTime\",\"CompositorNodeTonemap\",\"CompositorNodeTrackPos\",\"CompositorNodeTranslate\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeStabilize\",\"node:CompositorNodeStringToImage\",\"node:CompositorNodeSwitch\",\"node:CompositorNodeSwitchView\",\"node:CompositorNodeTime\",\"node:CompositorNodeTonemap\",\"node:CompositorNodeTrackPos\",\"node:CompositorNodeTranslate\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1174-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeStabilize", + "node:CompositorNodeStringToImage", + "node:CompositorNodeSwitch", + "node:CompositorNodeSwitchView", + "node:CompositorNodeTime", + "node:CompositorNodeTonemap", + "node:CompositorNodeTrackPos", + "node:CompositorNodeTranslate" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1175-000", + "phase": "1175", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1174-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1175", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1175-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1175-001", + "phase": "1175", + "title": "verify auto-generated native compositor reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1175-000" + ], + "parityId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_compositor_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1175-001.md", + "behavior": "Verify the AUTO_COMPOSITOR_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "module": { + "moduleId": "AUTO_COMPOSITOR_NATIVE_NODE_READER", + "batchId": "WBV2-P1175-001:AUTO_COMPOSITOR_NATIVE_NODE_READER:4c3e128e97498ba4", + "selectedRecordIds": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-READER", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_COMPOSITOR_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_vector_blur.cc", + "blender-5.2.0/source/blender/nodes/composite/nodes/node_composite_depth_combine.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/compositor-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CompositorNodeVecBlur type is read from Blender Main", + "CompositorNodeZcombine type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1175-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1175-001/compositor-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-compositor-4c3e128e97498ba4.blend WBV2_BATCH_TYPES='[\"CompositorNodeVecBlur\",\"CompositorNodeZcombine\"]' WBV2_BATCH_UNITS='[\"node:CompositorNodeVecBlur\",\"node:CompositorNodeZcombine\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/compositor-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1175-001/compositor-main-reader-production.json" + ], + "coverageBindings": [ + "node:CompositorNodeVecBlur", + "node:CompositorNodeZcombine" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1176-000", + "phase": "1176", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1175-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1176", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1176-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1176-001", + "phase": "1176", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1176-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1176-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1176-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1176-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1176-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1176-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1177-000", + "phase": "1177", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1176-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1177", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1177-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1177-001", + "phase": "1177", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1177-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1177-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1177-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1177-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1177-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1177-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1178-000", + "phase": "1178", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1177-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1178", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1178-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1178-001", + "phase": "1178", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1178-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1178-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1178-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1178-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1178-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1178-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1179-000", + "phase": "1179", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1178-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1179", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1179-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1179-001", + "phase": "1179", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1179-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1179-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1179-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1179-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1179-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1179-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1180-000", + "phase": "1180", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1179-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1180", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1180-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1180-001", + "phase": "1180", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1180-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1180-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1180-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1180-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1180-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1180-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1181-000", + "phase": "1181", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1180-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1181", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1181-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1181-001", + "phase": "1181", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1181-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1181-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1181-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1181-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1181-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1181-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1182-000", + "phase": "1182", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1181-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1182", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1182-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1182-001", + "phase": "1182", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1182-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1182-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1182-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1182-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1182-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1182-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1183-000", + "phase": "1183", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1182-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1183", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1183-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1183-001", + "phase": "1183", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1183-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1183-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1183-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1183-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1183-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1183-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1184-000", + "phase": "1184", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1183-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1184", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1184-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1184-001", + "phase": "1184", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1184-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1184-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1184-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1184-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1184-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1184-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1185-000", + "phase": "1185", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1184-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1185", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1185-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1185-001", + "phase": "1185", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1185-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1185-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1185-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1185-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1185-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1185-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1186-000", + "phase": "1186", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1185-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1186", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1186-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1186-001", + "phase": "1186", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1186-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1186-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1186-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1186-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1186-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1186-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1187-000", + "phase": "1187", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1186-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1187", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1187-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1187-001", + "phase": "1187", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1187-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1187-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1187-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1344290dd2cb9042", + "selectedRecordIds": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_accumulate_field.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_domain_size.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bake.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_blur_attribute.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeAccumulateField type is read from Blender Main", + "GeometryNodeAttributeDomainSize type is read from Blender Main", + "GeometryNodeAttributeStatistic type is read from Blender Main", + "GeometryNodeBake type is read from Blender Main", + "GeometryNodeBlurAttribute type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1187-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1187-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1344290dd2cb9042.blend WBV2_BATCH_TYPES='[\"GeometryNodeAccumulateField\",\"GeometryNodeAttributeDomainSize\",\"GeometryNodeAttributeStatistic\",\"GeometryNodeBake\",\"GeometryNodeBlurAttribute\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeAccumulateField\",\"node:GeometryNodeAttributeDomainSize\",\"node:GeometryNodeAttributeStatistic\",\"node:GeometryNodeBake\",\"node:GeometryNodeBlurAttribute\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1187-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeAccumulateField", + "node:GeometryNodeAttributeDomainSize", + "node:GeometryNodeAttributeStatistic", + "node:GeometryNodeBake", + "node:GeometryNodeBlurAttribute" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1188-000", + "phase": "1188", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1187-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1188", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1188-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1188-001", + "phase": "1188", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1188-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1188-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1188-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0f87459df8986017", + "selectedRecordIds": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bone_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_bounding_box.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_camera_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_attribute_capture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0f87459df8986017.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeBoneInfo type is read from Blender Main", + "GeometryNodeBoundBox type is read from Blender Main", + "GeometryNodeCameraInfo type is read from Blender Main", + "GeometryNodeCaptureAttribute type is read from Blender Main", + "GeometryNodeClosureToList type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1188-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1188-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0f87459df8986017.blend WBV2_BATCH_TYPES='[\"GeometryNodeBoneInfo\",\"GeometryNodeBoundBox\",\"GeometryNodeCameraInfo\",\"GeometryNodeCaptureAttribute\",\"GeometryNodeClosureToList\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeBoneInfo\",\"node:GeometryNodeBoundBox\",\"node:GeometryNodeCameraInfo\",\"node:GeometryNodeCaptureAttribute\",\"node:GeometryNodeClosureToList\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1188-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeBoneInfo", + "node:GeometryNodeBoundBox", + "node:GeometryNodeCameraInfo", + "node:GeometryNodeCaptureAttribute", + "node:GeometryNodeClosureToList" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1189-000", + "phase": "1189", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1188-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1189", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1189-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1189-001", + "phase": "1189", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1189-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1189-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1189-001:AUTO_GEOMETRY_NATIVE_NODE_READER:447074d84f4807db", + "selectedRecordIds": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_connected.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cluster_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_collection_children.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_edge.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-447074d84f4807db.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeClusterByConnected type is read from Blender Main", + "GeometryNodeClusterByDistance type is read from Blender Main", + "GeometryNodeCollectionChildren type is read from Blender Main", + "GeometryNodeConvexHull type is read from Blender Main", + "GeometryNodeCornersOfEdge type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1189-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1189-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-447074d84f4807db.blend WBV2_BATCH_TYPES='[\"GeometryNodeClusterByConnected\",\"GeometryNodeClusterByDistance\",\"GeometryNodeCollectionChildren\",\"GeometryNodeConvexHull\",\"GeometryNodeCornersOfEdge\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeClusterByConnected\",\"node:GeometryNodeClusterByDistance\",\"node:GeometryNodeCollectionChildren\",\"node:GeometryNodeConvexHull\",\"node:GeometryNodeCornersOfEdge\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1189-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeClusterByConnected", + "node:GeometryNodeClusterByDistance", + "node:GeometryNodeCollectionChildren", + "node:GeometryNodeConvexHull", + "node:GeometryNodeCornersOfEdge" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1190-000", + "phase": "1190", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1189-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1190", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1190-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1190-001", + "phase": "1190", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1190-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1190-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1190-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b123b8cea34de98b", + "selectedRecordIds": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_corners_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_cube_grid_topology.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_arc.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_endpoint_selection.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeCornersOfFace type is read from Blender Main", + "GeometryNodeCornersOfVertex type is read from Blender Main", + "GeometryNodeCubeGridTopology type is read from Blender Main", + "GeometryNodeCurveArc type is read from Blender Main", + "GeometryNodeCurveEndpointSelection type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1190-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1190-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b123b8cea34de98b.blend WBV2_BATCH_TYPES='[\"GeometryNodeCornersOfFace\",\"GeometryNodeCornersOfVertex\",\"GeometryNodeCubeGridTopology\",\"GeometryNodeCurveArc\",\"GeometryNodeCurveEndpointSelection\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCornersOfFace\",\"node:GeometryNodeCornersOfVertex\",\"node:GeometryNodeCubeGridTopology\",\"node:GeometryNodeCurveArc\",\"node:GeometryNodeCurveEndpointSelection\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1190-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCornersOfFace", + "node:GeometryNodeCornersOfVertex", + "node:GeometryNodeCubeGridTopology", + "node:GeometryNodeCurveArc", + "node:GeometryNodeCurveEndpointSelection" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1191-000", + "phase": "1191", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1190-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1191", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1191-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1191-001", + "phase": "1191", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1191-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1191-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1191-001:AUTO_GEOMETRY_NATIVE_NODE_READER:71424076a2a8f339", + "selectedRecordIds": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_curve_of_point.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_bezier_segment.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-71424076a2a8f339.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeCurveHandleTypeSelection type is read from Blender Main", + "GeometryNodeCurveLength type is read from Blender Main", + "GeometryNodeCurveOfPoint type is read from Blender Main", + "GeometryNodeCurvePrimitiveBezierSegment type is read from Blender Main", + "GeometryNodeCurvePrimitiveCircle type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1191-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1191-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-71424076a2a8f339.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurveHandleTypeSelection\",\"GeometryNodeCurveLength\",\"GeometryNodeCurveOfPoint\",\"GeometryNodeCurvePrimitiveBezierSegment\",\"GeometryNodeCurvePrimitiveCircle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurveHandleTypeSelection\",\"node:GeometryNodeCurveLength\",\"node:GeometryNodeCurveOfPoint\",\"node:GeometryNodeCurvePrimitiveBezierSegment\",\"node:GeometryNodeCurvePrimitiveCircle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1191-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurveHandleTypeSelection", + "node:GeometryNodeCurveLength", + "node:GeometryNodeCurveOfPoint", + "node:GeometryNodeCurvePrimitiveBezierSegment", + "node:GeometryNodeCurvePrimitiveCircle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1192-000", + "phase": "1192", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1191-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1192", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1192-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1192-001", + "phase": "1192", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1192-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1192-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1192-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c206ba8fc6cf75d5", + "selectedRecordIds": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadratic_bezier.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_set_handle_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeCurvePrimitiveLine type is read from Blender Main", + "GeometryNodeCurvePrimitiveQuadrilateral type is read from Blender Main", + "GeometryNodeCurveQuadraticBezier type is read from Blender Main", + "GeometryNodeCurveSetHandles type is read from Blender Main", + "GeometryNodeCurveSpiral type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1192-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1192-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c206ba8fc6cf75d5.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurvePrimitiveLine\",\"GeometryNodeCurvePrimitiveQuadrilateral\",\"GeometryNodeCurveQuadraticBezier\",\"GeometryNodeCurveSetHandles\",\"GeometryNodeCurveSpiral\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurvePrimitiveLine\",\"node:GeometryNodeCurvePrimitiveQuadrilateral\",\"node:GeometryNodeCurveQuadraticBezier\",\"node:GeometryNodeCurveSetHandles\",\"node:GeometryNodeCurveSpiral\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1192-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurvePrimitiveLine", + "node:GeometryNodeCurvePrimitiveQuadrilateral", + "node:GeometryNodeCurveQuadraticBezier", + "node:GeometryNodeCurveSetHandles", + "node:GeometryNodeCurveSpiral" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1193-000", + "phase": "1193", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1192-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1193", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1193-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1193-001", + "phase": "1193", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1193-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1193-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1193-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2ae9d67e9fb6b5f9", + "selectedRecordIds": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_type.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_primitive_star.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curves_to_grease_pencil.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeCurveSplineType type is read from Blender Main", + "GeometryNodeCurveStar type is read from Blender Main", + "GeometryNodeCurveToMesh type is read from Blender Main", + "GeometryNodeCurveToPoints type is read from Blender Main", + "GeometryNodeCurvesToGreasePencil type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1193-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1193-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2ae9d67e9fb6b5f9.blend WBV2_BATCH_TYPES='[\"GeometryNodeCurveSplineType\",\"GeometryNodeCurveStar\",\"GeometryNodeCurveToMesh\",\"GeometryNodeCurveToPoints\",\"GeometryNodeCurvesToGreasePencil\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeCurveSplineType\",\"node:GeometryNodeCurveStar\",\"node:GeometryNodeCurveToMesh\",\"node:GeometryNodeCurveToPoints\",\"node:GeometryNodeCurvesToGreasePencil\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1193-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeCurveSplineType", + "node:GeometryNodeCurveStar", + "node:GeometryNodeCurveToMesh", + "node:GeometryNodeCurveToPoints", + "node:GeometryNodeCurvesToGreasePencil" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1194-000", + "phase": "1194", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1193-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1194", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1194-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1194-001", + "phase": "1194", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1194-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1194-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1194-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8f6105d06959322c", + "selectedRecordIds": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_in_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8f6105d06959322c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeDeformCurvesOnSurface type is read from Blender Main", + "GeometryNodeDeleteGeometry type is read from Blender Main", + "GeometryNodeDistributePointsInGrid type is read from Blender Main", + "GeometryNodeDistributePointsInVolume type is read from Blender Main", + "GeometryNodeDistributePointsOnFaces type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1194-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1194-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8f6105d06959322c.blend WBV2_BATCH_TYPES='[\"GeometryNodeDeformCurvesOnSurface\",\"GeometryNodeDeleteGeometry\",\"GeometryNodeDistributePointsInGrid\",\"GeometryNodeDistributePointsInVolume\",\"GeometryNodeDistributePointsOnFaces\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeDeformCurvesOnSurface\",\"node:GeometryNodeDeleteGeometry\",\"node:GeometryNodeDistributePointsInGrid\",\"node:GeometryNodeDistributePointsInVolume\",\"node:GeometryNodeDistributePointsOnFaces\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1194-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeDeformCurvesOnSurface", + "node:GeometryNodeDeleteGeometry", + "node:GeometryNodeDistributePointsInGrid", + "node:GeometryNodeDistributePointsInVolume", + "node:GeometryNodeDistributePointsOnFaces" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1195-000", + "phase": "1195", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1194-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1195", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1195-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1195-001", + "phase": "1195", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1195-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1195-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1195-001:AUTO_GEOMETRY_NATIVE_NODE_READER:35aea559d5d0f343", + "selectedRecordIds": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_paths_to_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_corner.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeDualMesh type is read from Blender Main", + "GeometryNodeDuplicateElements type is read from Blender Main", + "GeometryNodeEdgePathsToCurves type is read from Blender Main", + "GeometryNodeEdgePathsToSelection type is read from Blender Main", + "GeometryNodeEdgesOfCorner type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1195-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1195-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-35aea559d5d0f343.blend WBV2_BATCH_TYPES='[\"GeometryNodeDualMesh\",\"GeometryNodeDuplicateElements\",\"GeometryNodeEdgePathsToCurves\",\"GeometryNodeEdgePathsToSelection\",\"GeometryNodeEdgesOfCorner\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeDualMesh\",\"node:GeometryNodeDuplicateElements\",\"node:GeometryNodeEdgePathsToCurves\",\"node:GeometryNodeEdgePathsToSelection\",\"node:GeometryNodeEdgesOfCorner\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1195-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeDualMesh", + "node:GeometryNodeDuplicateElements", + "node:GeometryNodeEdgePathsToCurves", + "node:GeometryNodeEdgePathsToSelection", + "node:GeometryNodeEdgesOfCorner" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1196-000", + "phase": "1196", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1195-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1196", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1196-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1196-001", + "phase": "1196", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1196-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1196-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1196-001:AUTO_GEOMETRY_NATIVE_NODE_READER:96303bc7f7c8d232", + "selectedRecordIds": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_edges_of_vertex.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edges_to_face_groups.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_face_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_at_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeEdgesOfVertex type is read from Blender Main", + "GeometryNodeEdgesToFaceGroups type is read from Blender Main", + "GeometryNodeExtrudeMesh type is read from Blender Main", + "GeometryNodeFaceOfCorner type is read from Blender Main", + "GeometryNodeFieldAtIndex type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1196-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1196-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-96303bc7f7c8d232.blend WBV2_BATCH_TYPES='[\"GeometryNodeEdgesOfVertex\",\"GeometryNodeEdgesToFaceGroups\",\"GeometryNodeExtrudeMesh\",\"GeometryNodeFaceOfCorner\",\"GeometryNodeFieldAtIndex\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeEdgesOfVertex\",\"node:GeometryNodeEdgesToFaceGroups\",\"node:GeometryNodeExtrudeMesh\",\"node:GeometryNodeFaceOfCorner\",\"node:GeometryNodeFieldAtIndex\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1196-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeEdgesOfVertex", + "node:GeometryNodeEdgesToFaceGroups", + "node:GeometryNodeExtrudeMesh", + "node:GeometryNodeFaceOfCorner", + "node:GeometryNodeFieldAtIndex" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1197-000", + "phase": "1197", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1196-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1197", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1197-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1197-001", + "phase": "1197", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1197-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1197-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1197-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e53a3a8ffb6f8a7", + "selectedRecordIds": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_average.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_min_and_max.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_on_domain.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_to_list.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeFieldAverage type is read from Blender Main", + "GeometryNodeFieldMinAndMax type is read from Blender Main", + "GeometryNodeFieldOnDomain type is read from Blender Main", + "GeometryNodeFieldToGrid type is read from Blender Main", + "GeometryNodeFieldToList type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1197-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1197-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-4e53a3a8ffb6f8a7.blend WBV2_BATCH_TYPES='[\"GeometryNodeFieldAverage\",\"GeometryNodeFieldMinAndMax\",\"GeometryNodeFieldOnDomain\",\"GeometryNodeFieldToGrid\",\"GeometryNodeFieldToList\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeFieldAverage\",\"node:GeometryNodeFieldMinAndMax\",\"node:GeometryNodeFieldOnDomain\",\"node:GeometryNodeFieldToGrid\",\"node:GeometryNodeFieldToList\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1197-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeFieldAverage", + "node:GeometryNodeFieldMinAndMax", + "node:GeometryNodeFieldOnDomain", + "node:GeometryNodeFieldToGrid", + "node:GeometryNodeFieldToList" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1198-000", + "phase": "1198", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1197-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1198", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1198-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1198-001", + "phase": "1198", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1198-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1198-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1198-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6581c99986be795f", + "selectedRecordIds": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_field_variance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_filter_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_flip_faces.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6581c99986be795f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeFieldVariance type is read from Blender Main", + "GeometryNodeFillCurve type is read from Blender Main", + "GeometryNodeFilletCurve type is read from Blender Main", + "GeometryNodeFilterList type is read from Blender Main", + "GeometryNodeFlipFaces type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1198-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1198-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6581c99986be795f.blend WBV2_BATCH_TYPES='[\"GeometryNodeFieldVariance\",\"GeometryNodeFillCurve\",\"GeometryNodeFilletCurve\",\"GeometryNodeFilterList\",\"GeometryNodeFlipFaces\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeFieldVariance\",\"node:GeometryNodeFillCurve\",\"node:GeometryNodeFilletCurve\",\"node:GeometryNodeFilterList\",\"node:GeometryNodeFlipFaces\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1198-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeFieldVariance", + "node:GeometryNodeFillCurve", + "node:GeometryNodeFilletCurve", + "node:GeometryNodeFilterList", + "node:GeometryNodeFlipFaces" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1199-000", + "phase": "1199", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1198-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1199", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1199-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1199-001", + "phase": "1199", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1199-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1199-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1199-001:AUTO_GEOMETRY_NATIVE_NODE_READER:240d704df4420718", + "selectedRecordIds": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_foreach_geometry_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_geometry_to_instance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_attribute_names.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_bundle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-240d704df4420718.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeForeachGeometryElementInput type is read from Blender Main", + "GeometryNodeForeachGeometryElementOutput type is read from Blender Main", + "GeometryNodeGeometryToInstance type is read from Blender Main", + "GeometryNodeGetAttributeNames type is read from Blender Main", + "GeometryNodeGetGeometryBundle type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1199-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1199-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-240d704df4420718.blend WBV2_BATCH_TYPES='[\"GeometryNodeForeachGeometryElementInput\",\"GeometryNodeForeachGeometryElementOutput\",\"GeometryNodeGeometryToInstance\",\"GeometryNodeGetAttributeNames\",\"GeometryNodeGetGeometryBundle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeForeachGeometryElementInput\",\"node:GeometryNodeForeachGeometryElementOutput\",\"node:GeometryNodeGeometryToInstance\",\"node:GeometryNodeGetAttributeNames\",\"node:GeometryNodeGetGeometryBundle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1199-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeForeachGeometryElementInput", + "node:GeometryNodeForeachGeometryElementOutput", + "node:GeometryNodeGeometryToInstance", + "node:GeometryNodeGetAttributeNames", + "node:GeometryNodeGetGeometryBundle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1200-000", + "phase": "1200", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1199-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1200", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1200-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1200-001", + "phase": "1200", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1200-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1200-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1200-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2657bc0520c4b632", + "selectedRecordIds": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_geometry_component.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_dial.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_linear.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_gizmo_transform.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeGetGeometryComponent type is read from Blender Main", + "GeometryNodeGetNamedGrid type is read from Blender Main", + "GeometryNodeGizmoDial type is read from Blender Main", + "GeometryNodeGizmoLinear type is read from Blender Main", + "GeometryNodeGizmoTransform type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1200-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1200-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2657bc0520c4b632.blend WBV2_BATCH_TYPES='[\"GeometryNodeGetGeometryComponent\",\"GeometryNodeGetNamedGrid\",\"GeometryNodeGizmoDial\",\"GeometryNodeGizmoLinear\",\"GeometryNodeGizmoTransform\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGetGeometryComponent\",\"node:GeometryNodeGetNamedGrid\",\"node:GeometryNodeGizmoDial\",\"node:GeometryNodeGizmoLinear\",\"node:GeometryNodeGizmoTransform\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1200-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGetGeometryComponent", + "node:GeometryNodeGetNamedGrid", + "node:GeometryNodeGizmoDial", + "node:GeometryNodeGizmoLinear", + "node:GeometryNodeGizmoTransform" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1201-000", + "phase": "1201", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1200-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1201", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1201-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1201-001", + "phase": "1201", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1201-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1201-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1201-001:AUTO_GEOMETRY_NATIVE_NODE_READER:163fbe66b349eb14", + "selectedRecordIds": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grease_pencil_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_advect.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_clip.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_curl.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_dilate_erode.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeGreasePencilToCurves type is read from Blender Main", + "GeometryNodeGridAdvect type is read from Blender Main", + "GeometryNodeGridClip type is read from Blender Main", + "GeometryNodeGridCurl type is read from Blender Main", + "GeometryNodeGridDilateAndErode type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1201-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1201-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-163fbe66b349eb14.blend WBV2_BATCH_TYPES='[\"GeometryNodeGreasePencilToCurves\",\"GeometryNodeGridAdvect\",\"GeometryNodeGridClip\",\"GeometryNodeGridCurl\",\"GeometryNodeGridDilateAndErode\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGreasePencilToCurves\",\"node:GeometryNodeGridAdvect\",\"node:GeometryNodeGridClip\",\"node:GeometryNodeGridCurl\",\"node:GeometryNodeGridDilateAndErode\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1201-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGreasePencilToCurves", + "node:GeometryNodeGridAdvect", + "node:GeometryNodeGridClip", + "node:GeometryNodeGridCurl", + "node:GeometryNodeGridDilateAndErode" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1202-000", + "phase": "1202", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1201-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1202", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1202-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1202-001", + "phase": "1202", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1202-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1202-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1202-001:AUTO_GEOMETRY_NATIVE_NODE_READER:5aa18e58ddffee84", + "selectedRecordIds": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_divergence.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_gradient.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_info.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_mean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeGridDivergence type is read from Blender Main", + "GeometryNodeGridGradient type is read from Blender Main", + "GeometryNodeGridInfo type is read from Blender Main", + "GeometryNodeGridLaplacian type is read from Blender Main", + "GeometryNodeGridMean type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1202-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1202-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-5aa18e58ddffee84.blend WBV2_BATCH_TYPES='[\"GeometryNodeGridDivergence\",\"GeometryNodeGridGradient\",\"GeometryNodeGridInfo\",\"GeometryNodeGridLaplacian\",\"GeometryNodeGridMean\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGridDivergence\",\"node:GeometryNodeGridGradient\",\"node:GeometryNodeGridInfo\",\"node:GeometryNodeGridLaplacian\",\"node:GeometryNodeGridMean\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1202-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGridDivergence", + "node:GeometryNodeGridGradient", + "node:GeometryNodeGridInfo", + "node:GeometryNodeGridLaplacian", + "node:GeometryNodeGridMean" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1203-000", + "phase": "1203", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1202-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1203", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1203-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1203-001", + "phase": "1203", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1203-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1203-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1203-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6897ad7bf98e7228", + "selectedRecordIds": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_median.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_prune.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_grid_voxelize.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeGridMedian type is read from Blender Main", + "GeometryNodeGridPrune type is read from Blender Main", + "GeometryNodeGridToMesh type is read from Blender Main", + "GeometryNodeGridToPoints type is read from Blender Main", + "GeometryNodeGridVoxelize type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1203-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1203-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6897ad7bf98e7228.blend WBV2_BATCH_TYPES='[\"GeometryNodeGridMedian\",\"GeometryNodeGridPrune\",\"GeometryNodeGridToMesh\",\"GeometryNodeGridToPoints\",\"GeometryNodeGridVoxelize\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeGridMedian\",\"node:GeometryNodeGridPrune\",\"node:GeometryNodeGridToMesh\",\"node:GeometryNodeGridToPoints\",\"node:GeometryNodeGridVoxelize\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1203-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeGridMedian", + "node:GeometryNodeGridPrune", + "node:GeometryNodeGridToMesh", + "node:GeometryNodeGridToPoints", + "node:GeometryNodeGridVoxelize" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1204-000", + "phase": "1204", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1203-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1204", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1204-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1204-001", + "phase": "1204", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1204-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1204-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1204-001:AUTO_GEOMETRY_NATIVE_NODE_READER:cee66fd20924b9e5", + "selectedRecordIds": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image_texture.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_csv.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_obj.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_ply.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_stl.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeImageTexture type is read from Blender Main", + "GeometryNodeImportCSV type is read from Blender Main", + "GeometryNodeImportOBJ type is read from Blender Main", + "GeometryNodeImportPLY type is read from Blender Main", + "GeometryNodeImportSTL type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1204-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1204-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-cee66fd20924b9e5.blend WBV2_BATCH_TYPES='[\"GeometryNodeImageTexture\",\"GeometryNodeImportCSV\",\"GeometryNodeImportOBJ\",\"GeometryNodeImportPLY\",\"GeometryNodeImportSTL\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeImageTexture\",\"node:GeometryNodeImportCSV\",\"node:GeometryNodeImportOBJ\",\"node:GeometryNodeImportPLY\",\"node:GeometryNodeImportSTL\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1204-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeImageTexture", + "node:GeometryNodeImportCSV", + "node:GeometryNodeImportOBJ", + "node:GeometryNodeImportPLY", + "node:GeometryNodeImportSTL" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1205-000", + "phase": "1205", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1204-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1205", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1205-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1205-001", + "phase": "1205", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1205-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1205-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1205-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e55a1c8c151fc9dc", + "selectedRecordIds": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_text.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_import_vdb.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_of_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeImportText type is read from Blender Main", + "GeometryNodeImportVDB type is read from Blender Main", + "GeometryNodeIndexOfNearest type is read from Blender Main", + "GeometryNodeIndexSwitch type is read from Blender Main", + "GeometryNodeInputActiveCamera type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1205-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1205-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e55a1c8c151fc9dc.blend WBV2_BATCH_TYPES='[\"GeometryNodeImportText\",\"GeometryNodeImportVDB\",\"GeometryNodeIndexOfNearest\",\"GeometryNodeIndexSwitch\",\"GeometryNodeInputActiveCamera\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeImportText\",\"node:GeometryNodeImportVDB\",\"node:GeometryNodeIndexOfNearest\",\"node:GeometryNodeIndexSwitch\",\"node:GeometryNodeInputActiveCamera\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1205-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeImportText", + "node:GeometryNodeImportVDB", + "node:GeometryNodeIndexOfNearest", + "node:GeometryNodeIndexSwitch", + "node:GeometryNodeInputActiveCamera" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1206-000", + "phase": "1206", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1205-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1206", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1206-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1206-001", + "phase": "1206", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1206-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1206-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1206-001:AUTO_GEOMETRY_NATIVE_NODE_READER:150a227b3433d301", + "selectedRecordIds": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_collection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_edge_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_font.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-150a227b3433d301.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputCollection type is read from Blender Main", + "GeometryNodeInputCurveHandlePositions type is read from Blender Main", + "GeometryNodeInputCurveTilt type is read from Blender Main", + "GeometryNodeInputEdgeSmooth type is read from Blender Main", + "GeometryNodeInputFont type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1206-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1206-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-150a227b3433d301.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputCollection\",\"GeometryNodeInputCurveHandlePositions\",\"GeometryNodeInputCurveTilt\",\"GeometryNodeInputEdgeSmooth\",\"GeometryNodeInputFont\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputCollection\",\"node:GeometryNodeInputCurveHandlePositions\",\"node:GeometryNodeInputCurveTilt\",\"node:GeometryNodeInputEdgeSmooth\",\"node:GeometryNodeInputFont\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1206-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputCollection", + "node:GeometryNodeInputCurveHandlePositions", + "node:GeometryNodeInputCurveTilt", + "node:GeometryNodeInputEdgeSmooth", + "node:GeometryNodeInputFont" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1207-000", + "phase": "1207", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1206-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1207", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1207-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1207-001", + "phase": "1207", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1207-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1207-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1207-001:AUTO_GEOMETRY_NATIVE_NODE_READER:32a41ae9caf449dc", + "selectedRecordIds": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_id.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_image.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_bounds.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_reference.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputID type is read from Blender Main", + "GeometryNodeInputImage type is read from Blender Main", + "GeometryNodeInputIndex type is read from Blender Main", + "GeometryNodeInputInstanceBounds type is read from Blender Main", + "GeometryNodeInputInstanceReference type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1207-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1207-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-32a41ae9caf449dc.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputID\",\"GeometryNodeInputImage\",\"GeometryNodeInputIndex\",\"GeometryNodeInputInstanceBounds\",\"GeometryNodeInputInstanceReference\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputID\",\"node:GeometryNodeInputImage\",\"node:GeometryNodeInputIndex\",\"node:GeometryNodeInputInstanceBounds\",\"node:GeometryNodeInputInstanceReference\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1207-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputID", + "node:GeometryNodeInputImage", + "node:GeometryNodeInputIndex", + "node:GeometryNodeInputInstanceBounds", + "node:GeometryNodeInputInstanceReference" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1208-000", + "phase": "1208", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1207-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1208", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1208-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1208-001", + "phase": "1208", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1208-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1208-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1208-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e4c0acdab580fad4", + "selectedRecordIds": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_scale.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_angle.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputInstanceRotation type is read from Blender Main", + "GeometryNodeInputInstanceScale type is read from Blender Main", + "GeometryNodeInputMaterial type is read from Blender Main", + "GeometryNodeInputMaterialIndex type is read from Blender Main", + "GeometryNodeInputMeshEdgeAngle type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1208-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1208-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e4c0acdab580fad4.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputInstanceRotation\",\"GeometryNodeInputInstanceScale\",\"GeometryNodeInputMaterial\",\"GeometryNodeInputMaterialIndex\",\"GeometryNodeInputMeshEdgeAngle\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputInstanceRotation\",\"node:GeometryNodeInputInstanceScale\",\"node:GeometryNodeInputMaterial\",\"node:GeometryNodeInputMaterialIndex\",\"node:GeometryNodeInputMeshEdgeAngle\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1208-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputInstanceRotation", + "node:GeometryNodeInputInstanceScale", + "node:GeometryNodeInputMaterial", + "node:GeometryNodeInputMaterialIndex", + "node:GeometryNodeInputMeshEdgeAngle" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1209-000", + "phase": "1209", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1208-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1209", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1209-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1209-001", + "phase": "1209", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1209-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1209-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1209-001:AUTO_GEOMETRY_NATIVE_NODE_READER:e28f27c297406a24", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_edge_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_area.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_is_planar.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_face_neighbors.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-e28f27c297406a24.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputMeshEdgeNeighbors type is read from Blender Main", + "GeometryNodeInputMeshEdgeVertices type is read from Blender Main", + "GeometryNodeInputMeshFaceArea type is read from Blender Main", + "GeometryNodeInputMeshFaceIsPlanar type is read from Blender Main", + "GeometryNodeInputMeshFaceNeighbors type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1209-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1209-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-e28f27c297406a24.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputMeshEdgeNeighbors\",\"GeometryNodeInputMeshEdgeVertices\",\"GeometryNodeInputMeshFaceArea\",\"GeometryNodeInputMeshFaceIsPlanar\",\"GeometryNodeInputMeshFaceNeighbors\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputMeshEdgeNeighbors\",\"node:GeometryNodeInputMeshEdgeVertices\",\"node:GeometryNodeInputMeshFaceArea\",\"node:GeometryNodeInputMeshFaceIsPlanar\",\"node:GeometryNodeInputMeshFaceNeighbors\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1209-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputMeshEdgeNeighbors", + "node:GeometryNodeInputMeshEdgeVertices", + "node:GeometryNodeInputMeshFaceArea", + "node:GeometryNodeInputMeshFaceIsPlanar", + "node:GeometryNodeInputMeshFaceNeighbors" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1210-000", + "phase": "1210", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1209-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1210", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1210-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1210-001", + "phase": "1210", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1210-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1210-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1210-001:AUTO_GEOMETRY_NATIVE_NODE_READER:94bb44cb6fb6c1c0", + "selectedRecordIds": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_island.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_mesh_vertex_neighbors.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_named_layer_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputMeshIsland type is read from Blender Main", + "GeometryNodeInputMeshVertexNeighbors type is read from Blender Main", + "GeometryNodeInputNamedAttribute type is read from Blender Main", + "GeometryNodeInputNamedLayerSelection type is read from Blender Main", + "GeometryNodeInputNormal type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1210-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1210-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-94bb44cb6fb6c1c0.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputMeshIsland\",\"GeometryNodeInputMeshVertexNeighbors\",\"GeometryNodeInputNamedAttribute\",\"GeometryNodeInputNamedLayerSelection\",\"GeometryNodeInputNormal\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputMeshIsland\",\"node:GeometryNodeInputMeshVertexNeighbors\",\"node:GeometryNodeInputNamedAttribute\",\"node:GeometryNodeInputNamedLayerSelection\",\"node:GeometryNodeInputNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1210-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputMeshIsland", + "node:GeometryNodeInputMeshVertexNeighbors", + "node:GeometryNodeInputNamedAttribute", + "node:GeometryNodeInputNamedLayerSelection", + "node:GeometryNodeInputNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1211-000", + "phase": "1211", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1210-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1211", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1211-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1211-001", + "phase": "1211", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1211-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1211-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1211-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abc1ee2d37430201", + "selectedRecordIds": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_align_rotation_to_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axes_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_axis_angle_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_combine_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_euler_to_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeAlignRotationToVector type is read from Blender Main", + "FunctionNodeAxesToRotation type is read from Blender Main", + "FunctionNodeAxisAngleToRotation type is read from Blender Main", + "FunctionNodeCombineMatrix type is read from Blender Main", + "FunctionNodeEulerToRotation type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1211-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1211-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-abc1ee2d37430201.blend WBV2_BATCH_TYPES='[\"FunctionNodeAlignRotationToVector\",\"FunctionNodeAxesToRotation\",\"FunctionNodeAxisAngleToRotation\",\"FunctionNodeCombineMatrix\",\"FunctionNodeEulerToRotation\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeAlignRotationToVector\",\"node:FunctionNodeAxesToRotation\",\"node:FunctionNodeAxisAngleToRotation\",\"node:FunctionNodeCombineMatrix\",\"node:FunctionNodeEulerToRotation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1211-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeAlignRotationToVector", + "node:FunctionNodeAxesToRotation", + "node:FunctionNodeAxisAngleToRotation", + "node:FunctionNodeCombineMatrix", + "node:FunctionNodeEulerToRotation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1212-000", + "phase": "1212", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1211-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1212", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1212-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1212-001", + "phase": "1212", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1212-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1212-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1212-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cfb811ea55c672e", + "selectedRecordIds": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_find_in_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_format_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_bool.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_int_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeFindInString type is read from Blender Main", + "FunctionNodeFormatString type is read from Blender Main", + "FunctionNodeInputBool type is read from Blender Main", + "FunctionNodeInputInt type is read from Blender Main", + "FunctionNodeInputIntVector type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1212-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1212-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-3cfb811ea55c672e.blend WBV2_BATCH_TYPES='[\"FunctionNodeFindInString\",\"FunctionNodeFormatString\",\"FunctionNodeInputBool\",\"FunctionNodeInputInt\",\"FunctionNodeInputIntVector\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeFindInString\",\"node:FunctionNodeFormatString\",\"node:FunctionNodeInputBool\",\"node:FunctionNodeInputInt\",\"node:FunctionNodeInputIntVector\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1212-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeFindInString", + "node:FunctionNodeFormatString", + "node:FunctionNodeInputBool", + "node:FunctionNodeInputInt", + "node:FunctionNodeInputIntVector" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1213-000", + "phase": "1213", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1212-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1213", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1213-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1213-001", + "phase": "1213", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1213-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1213-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1213-001:AUTO_GEOMETRY_NATIVE_NODE_READER:88ba8e6e3716dd8d", + "selectedRecordIds": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_menu.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_special_characters.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_input_vector.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeInputMenu type is read from Blender Main", + "FunctionNodeInputRotation type is read from Blender Main", + "FunctionNodeInputSpecialCharacters type is read from Blender Main", + "FunctionNodeInputString type is read from Blender Main", + "FunctionNodeInputVector type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1213-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1213-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-88ba8e6e3716dd8d.blend WBV2_BATCH_TYPES='[\"FunctionNodeInputMenu\",\"FunctionNodeInputRotation\",\"FunctionNodeInputSpecialCharacters\",\"FunctionNodeInputString\",\"FunctionNodeInputVector\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeInputMenu\",\"node:FunctionNodeInputRotation\",\"node:FunctionNodeInputSpecialCharacters\",\"node:FunctionNodeInputString\",\"node:FunctionNodeInputVector\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1213-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeInputMenu", + "node:FunctionNodeInputRotation", + "node:FunctionNodeInputSpecialCharacters", + "node:FunctionNodeInputString", + "node:FunctionNodeInputVector" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1214-000", + "phase": "1214", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1213-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1214", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1214-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1214-001", + "phase": "1214", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1214-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1214-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1214-001:AUTO_GEOMETRY_NATIVE_NODE_READER:7d31b4b0866780ae", + "selectedRecordIds": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_invert_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_match_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_determinant.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_matrix_multiply.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeInvertMatrix type is read from Blender Main", + "FunctionNodeInvertRotation type is read from Blender Main", + "FunctionNodeMatchString type is read from Blender Main", + "FunctionNodeMatrixDeterminant type is read from Blender Main", + "FunctionNodeMatrixMultiply type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1214-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1214-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-7d31b4b0866780ae.blend WBV2_BATCH_TYPES='[\"FunctionNodeInvertMatrix\",\"FunctionNodeInvertRotation\",\"FunctionNodeMatchString\",\"FunctionNodeMatrixDeterminant\",\"FunctionNodeMatrixMultiply\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeInvertMatrix\",\"node:FunctionNodeInvertRotation\",\"node:FunctionNodeMatchString\",\"node:FunctionNodeMatrixDeterminant\",\"node:FunctionNodeMatrixMultiply\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1214-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeInvertMatrix", + "node:FunctionNodeInvertRotation", + "node:FunctionNodeMatchString", + "node:FunctionNodeMatrixDeterminant", + "node:FunctionNodeMatrixMultiply" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1215-000", + "phase": "1215", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1214-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1215", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1215-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1215-001", + "phase": "1215", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1215-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1215-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1215-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0a8d3bb55b10e188", + "selectedRecordIds": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_project_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_quaternion_to_rotation.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_replace_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_reverse_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_rotation.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeProjectPoint type is read from Blender Main", + "FunctionNodeQuaternionToRotation type is read from Blender Main", + "FunctionNodeReplaceString type is read from Blender Main", + "FunctionNodeReverseString type is read from Blender Main", + "FunctionNodeRotateRotation type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1215-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1215-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0a8d3bb55b10e188.blend WBV2_BATCH_TYPES='[\"FunctionNodeProjectPoint\",\"FunctionNodeQuaternionToRotation\",\"FunctionNodeReplaceString\",\"FunctionNodeReverseString\",\"FunctionNodeRotateRotation\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeProjectPoint\",\"node:FunctionNodeQuaternionToRotation\",\"node:FunctionNodeReplaceString\",\"node:FunctionNodeReverseString\",\"node:FunctionNodeRotateRotation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1215-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeProjectPoint", + "node:FunctionNodeQuaternionToRotation", + "node:FunctionNodeReplaceString", + "node:FunctionNodeReverseString", + "node:FunctionNodeRotateRotation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1216-000", + "phase": "1216", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1215-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1216", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1216-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1216-001", + "phase": "1216", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1216-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1216-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1216-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c598026385cc94dc", + "selectedRecordIds": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1216-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c598026385cc94dc", + "selectedRecordIds": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotate_vector.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_axis_angle.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_euler.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_rotation_to_quaternion.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_separate_matrix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c598026385cc94dc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeRotateVector type is read from Blender Main", + "FunctionNodeRotationToAxisAngle type is read from Blender Main", + "FunctionNodeRotationToEuler type is read from Blender Main", + "FunctionNodeRotationToQuaternion type is read from Blender Main", + "FunctionNodeSeparateMatrix type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1216-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1216-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c598026385cc94dc.blend WBV2_BATCH_TYPES='[\"FunctionNodeRotateVector\",\"FunctionNodeRotationToAxisAngle\",\"FunctionNodeRotationToEuler\",\"FunctionNodeRotationToQuaternion\",\"FunctionNodeSeparateMatrix\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeRotateVector\",\"node:FunctionNodeRotationToAxisAngle\",\"node:FunctionNodeRotationToEuler\",\"node:FunctionNodeRotationToQuaternion\",\"node:FunctionNodeSeparateMatrix\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1216-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeRotateVector", + "node:FunctionNodeRotationToAxisAngle", + "node:FunctionNodeRotationToEuler", + "node:FunctionNodeRotationToQuaternion", + "node:FunctionNodeSeparateMatrix" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1217-000", + "phase": "1217", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1216-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1217", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1217-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1217-001", + "phase": "1217", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1217-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1217-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1217-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dbc0fb8bb88f3d37", + "selectedRecordIds": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1217-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dbc0fb8bb88f3d37", + "selectedRecordIds": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_set_string_case.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_slice_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_length.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_string_to_value.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_direction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-dbc0fb8bb88f3d37.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeSetStringCase type is read from Blender Main", + "FunctionNodeSliceString type is read from Blender Main", + "FunctionNodeStringLength type is read from Blender Main", + "FunctionNodeStringToValue type is read from Blender Main", + "FunctionNodeTransformDirection type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1217-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1217-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-dbc0fb8bb88f3d37.blend WBV2_BATCH_TYPES='[\"FunctionNodeSetStringCase\",\"FunctionNodeSliceString\",\"FunctionNodeStringLength\",\"FunctionNodeStringToValue\",\"FunctionNodeTransformDirection\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeSetStringCase\",\"node:FunctionNodeSliceString\",\"node:FunctionNodeStringLength\",\"node:FunctionNodeStringToValue\",\"node:FunctionNodeTransformDirection\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1217-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeSetStringCase", + "node:FunctionNodeSliceString", + "node:FunctionNodeStringLength", + "node:FunctionNodeStringToValue", + "node:FunctionNodeTransformDirection" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1218-000", + "phase": "1218", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1217-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1218", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1218-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1218-001", + "phase": "1218", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1218-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1218-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1218-001:AUTO_GEOMETRY_NATIVE_NODE_READER:34abb58eedf43c5f", + "selectedRecordIds": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1218-001:AUTO_GEOMETRY_NATIVE_NODE_READER:34abb58eedf43c5f", + "selectedRecordIds": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transform_point.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_transpose_matrix.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_trim_string.cc", + "blender-5.2.0/source/blender/nodes/function/nodes/node_fn_value_to_string.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_object.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-34abb58eedf43c5f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FunctionNodeTransformPoint type is read from Blender Main", + "FunctionNodeTransposeMatrix type is read from Blender Main", + "FunctionNodeTrimString type is read from Blender Main", + "FunctionNodeValueToString type is read from Blender Main", + "GeometryNodeInputObject type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1218-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1218-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-34abb58eedf43c5f.blend WBV2_BATCH_TYPES='[\"FunctionNodeTransformPoint\",\"FunctionNodeTransposeMatrix\",\"FunctionNodeTrimString\",\"FunctionNodeValueToString\",\"GeometryNodeInputObject\"]' WBV2_BATCH_UNITS='[\"node:FunctionNodeTransformPoint\",\"node:FunctionNodeTransposeMatrix\",\"node:FunctionNodeTrimString\",\"node:FunctionNodeValueToString\",\"node:GeometryNodeInputObject\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1218-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:FunctionNodeTransformPoint", + "node:FunctionNodeTransposeMatrix", + "node:FunctionNodeTrimString", + "node:FunctionNodeValueToString", + "node:GeometryNodeInputObject" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1219-000", + "phase": "1219", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1218-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1219", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1219-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1219-001", + "phase": "1219", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1219-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1219-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1219-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cccf2d7fb85d3b8", + "selectedRecordIds": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1219-001:AUTO_GEOMETRY_NATIVE_NODE_READER:3cccf2d7fb85d3b8", + "selectedRecordIds": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_scene_time.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_face_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_shortest_edge_paths.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-3cccf2d7fb85d3b8.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputPosition type is read from Blender Main", + "GeometryNodeInputRadius type is read from Blender Main", + "GeometryNodeInputSceneTime type is read from Blender Main", + "GeometryNodeInputShadeSmooth type is read from Blender Main", + "GeometryNodeInputShortestEdgePaths type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1219-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1219-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-3cccf2d7fb85d3b8.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputPosition\",\"GeometryNodeInputRadius\",\"GeometryNodeInputSceneTime\",\"GeometryNodeInputShadeSmooth\",\"GeometryNodeInputShortestEdgePaths\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputPosition\",\"node:GeometryNodeInputRadius\",\"node:GeometryNodeInputSceneTime\",\"node:GeometryNodeInputShadeSmooth\",\"node:GeometryNodeInputShortestEdgePaths\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1219-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputPosition", + "node:GeometryNodeInputRadius", + "node:GeometryNodeInputSceneTime", + "node:GeometryNodeInputShadeSmooth", + "node:GeometryNodeInputShortestEdgePaths" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1220-000", + "phase": "1220", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1219-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1220", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1220-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1220-001", + "phase": "1220", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1220-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1220-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1220-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d0f07a9289283d0", + "selectedRecordIds": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1220-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d0f07a9289283d0", + "selectedRecordIds": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_resolution.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_voxel_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d0f07a9289283d0.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInputSplineCyclic type is read from Blender Main", + "GeometryNodeInputSplineResolution type is read from Blender Main", + "GeometryNodeInputTangent type is read from Blender Main", + "GeometryNodeInputVoxelIndex type is read from Blender Main", + "GeometryNodeInstanceOnPoints type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1220-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1220-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8d0f07a9289283d0.blend WBV2_BATCH_TYPES='[\"GeometryNodeInputSplineCyclic\",\"GeometryNodeInputSplineResolution\",\"GeometryNodeInputTangent\",\"GeometryNodeInputVoxelIndex\",\"GeometryNodeInstanceOnPoints\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInputSplineCyclic\",\"node:GeometryNodeInputSplineResolution\",\"node:GeometryNodeInputTangent\",\"node:GeometryNodeInputVoxelIndex\",\"node:GeometryNodeInstanceOnPoints\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1220-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInputSplineCyclic", + "node:GeometryNodeInputSplineResolution", + "node:GeometryNodeInputTangent", + "node:GeometryNodeInputVoxelIndex", + "node:GeometryNodeInstanceOnPoints" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1221-000", + "phase": "1221", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1220-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1221", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1221-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1221-001", + "phase": "1221", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1221-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1221-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1221-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c30b3d2a341bc8b1", + "selectedRecordIds": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1221-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c30b3d2a341bc8b1", + "selectedRecordIds": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_instances_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_interpolate_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_is_viewport.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_get_item.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c30b3d2a341bc8b1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeInstanceTransform type is read from Blender Main", + "GeometryNodeInstancesToPoints type is read from Blender Main", + "GeometryNodeInterpolateCurves type is read from Blender Main", + "GeometryNodeIsViewport type is read from Blender Main", + "GeometryNodeListGetItem type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1221-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1221-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c30b3d2a341bc8b1.blend WBV2_BATCH_TYPES='[\"GeometryNodeInstanceTransform\",\"GeometryNodeInstancesToPoints\",\"GeometryNodeInterpolateCurves\",\"GeometryNodeIsViewport\",\"GeometryNodeListGetItem\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeInstanceTransform\",\"node:GeometryNodeInstancesToPoints\",\"node:GeometryNodeInterpolateCurves\",\"node:GeometryNodeIsViewport\",\"node:GeometryNodeListGetItem\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1221-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeInstanceTransform", + "node:GeometryNodeInstancesToPoints", + "node:GeometryNodeInterpolateCurves", + "node:GeometryNodeIsViewport", + "node:GeometryNodeListGetItem" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1222-000", + "phase": "1222", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1221-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1222", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1222-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1222-001", + "phase": "1222", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1222-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1222-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1222-001:AUTO_GEOMETRY_NATIVE_NODE_READER:838d8958e4b989d1", + "selectedRecordIds": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1222-001:AUTO_GEOMETRY_NATIVE_NODE_READER:838d8958e4b989d1", + "selectedRecordIds": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_list_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_menu_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_by_distance.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-838d8958e4b989d1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeListLength type is read from Blender Main", + "GeometryNodeMaterialSelection type is read from Blender Main", + "GeometryNodeMenuSwitch type is read from Blender Main", + "GeometryNodeMergeByDistance type is read from Blender Main", + "GeometryNodeMergeLayers type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1222-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1222-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-838d8958e4b989d1.blend WBV2_BATCH_TYPES='[\"GeometryNodeListLength\",\"GeometryNodeMaterialSelection\",\"GeometryNodeMenuSwitch\",\"GeometryNodeMergeByDistance\",\"GeometryNodeMergeLayers\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeListLength\",\"node:GeometryNodeMaterialSelection\",\"node:GeometryNodeMenuSwitch\",\"node:GeometryNodeMergeByDistance\",\"node:GeometryNodeMergeLayers\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1222-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeListLength", + "node:GeometryNodeMaterialSelection", + "node:GeometryNodeMenuSwitch", + "node:GeometryNodeMergeByDistance", + "node:GeometryNodeMergeLayers" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1223-000", + "phase": "1223", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1222-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1223", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1223-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1223-001", + "phase": "1223", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1223-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1223-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1223-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c3b7b0656afe6a91", + "selectedRecordIds": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1223-001:AUTO_GEOMETRY_NATIVE_NODE_READER:c3b7b0656afe6a91", + "selectedRecordIds": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_merge_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_bevel.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_boolean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-c3b7b0656afe6a91.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeMergePoints type is read from Blender Main", + "GeometryNodeMeshBevel type is read from Blender Main", + "GeometryNodeMeshBoolean type is read from Blender Main", + "GeometryNodeMeshCircle type is read from Blender Main", + "GeometryNodeMeshCone type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1223-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1223-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-c3b7b0656afe6a91.blend WBV2_BATCH_TYPES='[\"GeometryNodeMergePoints\",\"GeometryNodeMeshBevel\",\"GeometryNodeMeshBoolean\",\"GeometryNodeMeshCircle\",\"GeometryNodeMeshCone\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMergePoints\",\"node:GeometryNodeMeshBevel\",\"node:GeometryNodeMeshBoolean\",\"node:GeometryNodeMeshCircle\",\"node:GeometryNodeMeshCone\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1223-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMergePoints", + "node:GeometryNodeMeshBevel", + "node:GeometryNodeMeshBoolean", + "node:GeometryNodeMeshCircle", + "node:GeometryNodeMeshCone" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1224-000", + "phase": "1224", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1223-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1224", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1224-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1224-001", + "phase": "1224", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1224-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1224-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1224-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0dca701c57915fc7", + "selectedRecordIds": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1224-001:AUTO_GEOMETRY_NATIVE_NODE_READER:0dca701c57915fc7", + "selectedRecordIds": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-0dca701c57915fc7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeMeshCube type is read from Blender Main", + "GeometryNodeMeshCylinder type is read from Blender Main", + "GeometryNodeMeshFaceSetBoundaries type is read from Blender Main", + "GeometryNodeMeshGrid type is read from Blender Main", + "GeometryNodeMeshIcoSphere type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1224-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1224-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-0dca701c57915fc7.blend WBV2_BATCH_TYPES='[\"GeometryNodeMeshCube\",\"GeometryNodeMeshCylinder\",\"GeometryNodeMeshFaceSetBoundaries\",\"GeometryNodeMeshGrid\",\"GeometryNodeMeshIcoSphere\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMeshCube\",\"node:GeometryNodeMeshCylinder\",\"node:GeometryNodeMeshFaceSetBoundaries\",\"node:GeometryNodeMeshGrid\",\"node:GeometryNodeMeshIcoSphere\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1224-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMeshCube", + "node:GeometryNodeMeshCylinder", + "node:GeometryNodeMeshFaceSetBoundaries", + "node:GeometryNodeMeshGrid", + "node:GeometryNodeMeshIcoSphere" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1225-000", + "phase": "1225", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1224-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1225", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1225-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1225-001", + "phase": "1225", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1225-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1225-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1225-001:AUTO_GEOMETRY_NATIVE_NODE_READER:142ee68a2ed9492b", + "selectedRecordIds": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1225-001:AUTO_GEOMETRY_NATIVE_NODE_READER:142ee68a2ed9492b", + "selectedRecordIds": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_line.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_density_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_points.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_sdf_grid.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-142ee68a2ed9492b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeMeshLine type is read from Blender Main", + "GeometryNodeMeshToCurve type is read from Blender Main", + "GeometryNodeMeshToDensityGrid type is read from Blender Main", + "GeometryNodeMeshToPoints type is read from Blender Main", + "GeometryNodeMeshToSDFGrid type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1225-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1225-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-142ee68a2ed9492b.blend WBV2_BATCH_TYPES='[\"GeometryNodeMeshLine\",\"GeometryNodeMeshToCurve\",\"GeometryNodeMeshToDensityGrid\",\"GeometryNodeMeshToPoints\",\"GeometryNodeMeshToSDFGrid\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMeshLine\",\"node:GeometryNodeMeshToCurve\",\"node:GeometryNodeMeshToDensityGrid\",\"node:GeometryNodeMeshToPoints\",\"node:GeometryNodeMeshToSDFGrid\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1225-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMeshLine", + "node:GeometryNodeMeshToCurve", + "node:GeometryNodeMeshToDensityGrid", + "node:GeometryNodeMeshToPoints", + "node:GeometryNodeMeshToSDFGrid" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1226-000", + "phase": "1226", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1225-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1226", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1226-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1226-001", + "phase": "1226", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1226-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1226-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1226-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abb1c596d4ee21b2", + "selectedRecordIds": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1226-001:AUTO_GEOMETRY_NATIVE_NODE_READER:abb1c596d4ee21b2", + "selectedRecordIds": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_to_volume.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_offset_corner_in_face.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_offset_point_in_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-abb1c596d4ee21b2.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeMeshToVolume type is read from Blender Main", + "GeometryNodeMeshUVSphere type is read from Blender Main", + "GeometryNodeOffsetCornerInFace type is read from Blender Main", + "GeometryNodeOffsetPointInCurve type is read from Blender Main", + "GeometryNodePoints type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1226-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1226-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-abb1c596d4ee21b2.blend WBV2_BATCH_TYPES='[\"GeometryNodeMeshToVolume\",\"GeometryNodeMeshUVSphere\",\"GeometryNodeOffsetCornerInFace\",\"GeometryNodeOffsetPointInCurve\",\"GeometryNodePoints\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeMeshToVolume\",\"node:GeometryNodeMeshUVSphere\",\"node:GeometryNodeOffsetCornerInFace\",\"node:GeometryNodeOffsetPointInCurve\",\"node:GeometryNodePoints\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1226-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeMeshToVolume", + "node:GeometryNodeMeshUVSphere", + "node:GeometryNodeOffsetCornerInFace", + "node:GeometryNodeOffsetPointInCurve", + "node:GeometryNodePoints" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1227-000", + "phase": "1227", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1226-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1227", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1227-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1227-001", + "phase": "1227", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1227-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1227-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1227-001:AUTO_GEOMETRY_NATIVE_NODE_READER:81deda73b9188c10", + "selectedRecordIds": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1227-001:AUTO_GEOMETRY_NATIVE_NODE_READER:81deda73b9188c10", + "selectedRecordIds": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_sdf_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_vertices.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-81deda73b9188c10.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodePointsOfCurve type is read from Blender Main", + "GeometryNodePointsToCurves type is read from Blender Main", + "GeometryNodePointsToSDFGrid type is read from Blender Main", + "GeometryNodePointsToVertices type is read from Blender Main", + "GeometryNodePointsToVolume type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1227-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1227-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-81deda73b9188c10.blend WBV2_BATCH_TYPES='[\"GeometryNodePointsOfCurve\",\"GeometryNodePointsToCurves\",\"GeometryNodePointsToSDFGrid\",\"GeometryNodePointsToVertices\",\"GeometryNodePointsToVolume\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodePointsOfCurve\",\"node:GeometryNodePointsToCurves\",\"node:GeometryNodePointsToSDFGrid\",\"node:GeometryNodePointsToVertices\",\"node:GeometryNodePointsToVolume\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1227-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodePointsOfCurve", + "node:GeometryNodePointsToCurves", + "node:GeometryNodePointsToSDFGrid", + "node:GeometryNodePointsToVertices", + "node:GeometryNodePointsToVolume" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1228-000", + "phase": "1228", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1227-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1228", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1228-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1228-001", + "phase": "1228", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1228-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1228-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1228-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6b022a1a8e99f7fd", + "selectedRecordIds": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1228-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6b022a1a8e99f7fd", + "selectedRecordIds": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_proximity.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_raycast.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_remove_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rename_attribute.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6b022a1a8e99f7fd.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeProximity type is read from Blender Main", + "GeometryNodeRaycast type is read from Blender Main", + "GeometryNodeRemoveAttribute type is read from Blender Main", + "GeometryNodeRenameAttribute type is read from Blender Main", + "GeometryNodeRepeatInput type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1228-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1228-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6b022a1a8e99f7fd.blend WBV2_BATCH_TYPES='[\"GeometryNodeProximity\",\"GeometryNodeRaycast\",\"GeometryNodeRemoveAttribute\",\"GeometryNodeRenameAttribute\",\"GeometryNodeRepeatInput\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeProximity\",\"node:GeometryNodeRaycast\",\"node:GeometryNodeRemoveAttribute\",\"node:GeometryNodeRenameAttribute\",\"node:GeometryNodeRepeatInput\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1228-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeProximity", + "node:GeometryNodeRaycast", + "node:GeometryNodeRemoveAttribute", + "node:GeometryNodeRenameAttribute", + "node:GeometryNodeRepeatInput" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1229-000", + "phase": "1229", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1228-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1229", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1229-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1229-001", + "phase": "1229", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1229-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1229-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1229-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1323c437a10e245b", + "selectedRecordIds": [ + "node:GeometryNodeRepeatOutput" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1229-001:AUTO_GEOMETRY_NATIVE_NODE_READER:1323c437a10e245b", + "selectedRecordIds": [ + "node:GeometryNodeRepeatOutput" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_repeat.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-1323c437a10e245b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeRepeatOutput type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1229-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1229-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-1323c437a10e245b.blend WBV2_BATCH_TYPES='[\"GeometryNodeRepeatOutput\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeRepeatOutput\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1229-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeRepeatOutput" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1230-000", + "phase": "1230", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1229-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1230", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1230-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1230-001", + "phase": "1230", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1230-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1230-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1230-001:AUTO_GEOMETRY_NATIVE_NODE_READER:bb5c9b89367c9d6d", + "selectedRecordIds": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1230-001:AUTO_GEOMETRY_NATIVE_NODE_READER:bb5c9b89367c9d6d", + "selectedRecordIds": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_material_replace.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_boolean.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-bb5c9b89367c9d6d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeReplaceMaterial type is read from Blender Main", + "GeometryNodeResampleCurve type is read from Blender Main", + "GeometryNodeReverseCurve type is read from Blender Main", + "GeometryNodeRotateInstances type is read from Blender Main", + "GeometryNodeSDFGridBoolean type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1230-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1230-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-bb5c9b89367c9d6d.blend WBV2_BATCH_TYPES='[\"GeometryNodeReplaceMaterial\",\"GeometryNodeResampleCurve\",\"GeometryNodeReverseCurve\",\"GeometryNodeRotateInstances\",\"GeometryNodeSDFGridBoolean\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeReplaceMaterial\",\"node:GeometryNodeResampleCurve\",\"node:GeometryNodeReverseCurve\",\"node:GeometryNodeRotateInstances\",\"node:GeometryNodeSDFGridBoolean\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1230-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeReplaceMaterial", + "node:GeometryNodeResampleCurve", + "node:GeometryNodeReverseCurve", + "node:GeometryNodeRotateInstances", + "node:GeometryNodeSDFGridBoolean" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1231-000", + "phase": "1231", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1230-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1231", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1231-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1231-001", + "phase": "1231", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1231-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1231-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1231-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e423b626a07145e", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1231-001:AUTO_GEOMETRY_NATIVE_NODE_READER:4e423b626a07145e", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_fillet.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_laplacian.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_mean_curvature.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_median.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-4e423b626a07145e.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSDFGridFillet type is read from Blender Main", + "GeometryNodeSDFGridLaplacian type is read from Blender Main", + "GeometryNodeSDFGridMean type is read from Blender Main", + "GeometryNodeSDFGridMeanCurvature type is read from Blender Main", + "GeometryNodeSDFGridMedian type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1231-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1231-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-4e423b626a07145e.blend WBV2_BATCH_TYPES='[\"GeometryNodeSDFGridFillet\",\"GeometryNodeSDFGridLaplacian\",\"GeometryNodeSDFGridMean\",\"GeometryNodeSDFGridMeanCurvature\",\"GeometryNodeSDFGridMedian\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSDFGridFillet\",\"node:GeometryNodeSDFGridLaplacian\",\"node:GeometryNodeSDFGridMean\",\"node:GeometryNodeSDFGridMeanCurvature\",\"node:GeometryNodeSDFGridMedian\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1231-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSDFGridFillet", + "node:GeometryNodeSDFGridLaplacian", + "node:GeometryNodeSDFGridMean", + "node:GeometryNodeSDFGridMeanCurvature", + "node:GeometryNodeSDFGridMedian" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1232-000", + "phase": "1232", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1231-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1232", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1232-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1232-001", + "phase": "1232", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1232-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1232-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1232-001:AUTO_GEOMETRY_NATIVE_NODE_READER:404eb303152ba922", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1232-001:AUTO_GEOMETRY_NATIVE_NODE_READER:404eb303152ba922", + "selectedRecordIds": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sdf_grid_offset.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_grid_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-404eb303152ba922.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSDFGridOffset type is read from Blender Main", + "GeometryNodeSampleCurve type is read from Blender Main", + "GeometryNodeSampleGrid type is read from Blender Main", + "GeometryNodeSampleGridIndex type is read from Blender Main", + "GeometryNodeSampleIndex type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1232-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1232-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-404eb303152ba922.blend WBV2_BATCH_TYPES='[\"GeometryNodeSDFGridOffset\",\"GeometryNodeSampleCurve\",\"GeometryNodeSampleGrid\",\"GeometryNodeSampleGridIndex\",\"GeometryNodeSampleIndex\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSDFGridOffset\",\"node:GeometryNodeSampleCurve\",\"node:GeometryNodeSampleGrid\",\"node:GeometryNodeSampleGridIndex\",\"node:GeometryNodeSampleIndex\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1232-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSDFGridOffset", + "node:GeometryNodeSampleCurve", + "node:GeometryNodeSampleGrid", + "node:GeometryNodeSampleGridIndex", + "node:GeometryNodeSampleIndex" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1233-000", + "phase": "1233", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1232-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1233", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1233-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1233-001", + "phase": "1233", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1233-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1233-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1233-001:AUTO_GEOMETRY_NATIVE_NODE_READER:529a042eb604c0e1", + "selectedRecordIds": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1233-001:AUTO_GEOMETRY_NATIVE_NODE_READER:529a042eb604c0e1", + "selectedRecordIds": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_sound_frequencies.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sample_uv_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-529a042eb604c0e1.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSampleNearest type is read from Blender Main", + "GeometryNodeSampleNearestSurface type is read from Blender Main", + "GeometryNodeSampleSoundFrequencies type is read from Blender Main", + "GeometryNodeSampleUVSurface type is read from Blender Main", + "GeometryNodeScaleElements type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1233-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1233-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-529a042eb604c0e1.blend WBV2_BATCH_TYPES='[\"GeometryNodeSampleNearest\",\"GeometryNodeSampleNearestSurface\",\"GeometryNodeSampleSoundFrequencies\",\"GeometryNodeSampleUVSurface\",\"GeometryNodeScaleElements\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSampleNearest\",\"node:GeometryNodeSampleNearestSurface\",\"node:GeometryNodeSampleSoundFrequencies\",\"node:GeometryNodeSampleUVSurface\",\"node:GeometryNodeScaleElements\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1233-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSampleNearest", + "node:GeometryNodeSampleNearestSurface", + "node:GeometryNodeSampleSoundFrequencies", + "node:GeometryNodeSampleUVSurface", + "node:GeometryNodeScaleElements" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1234-000", + "phase": "1234", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1233-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1234", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1234-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1234-001", + "phase": "1234", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1234-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1234-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1234-001:AUTO_GEOMETRY_NATIVE_NODE_READER:ad9e5b4bf235659f", + "selectedRecordIds": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1234-001:AUTO_GEOMETRY_NATIVE_NODE_READER:ad9e5b4bf235659f", + "selectedRecordIds": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_scale_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_self_object.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_separate_components.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_normal.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-ad9e5b4bf235659f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeScaleInstances type is read from Blender Main", + "GeometryNodeSelfObject type is read from Blender Main", + "GeometryNodeSeparateComponents type is read from Blender Main", + "GeometryNodeSetCurveHandlePositions type is read from Blender Main", + "GeometryNodeSetCurveNormal type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1234-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1234-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-ad9e5b4bf235659f.blend WBV2_BATCH_TYPES='[\"GeometryNodeScaleInstances\",\"GeometryNodeSelfObject\",\"GeometryNodeSeparateComponents\",\"GeometryNodeSetCurveHandlePositions\",\"GeometryNodeSetCurveNormal\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeScaleInstances\",\"node:GeometryNodeSelfObject\",\"node:GeometryNodeSeparateComponents\",\"node:GeometryNodeSetCurveHandlePositions\",\"node:GeometryNodeSetCurveNormal\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1234-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeScaleInstances", + "node:GeometryNodeSelfObject", + "node:GeometryNodeSeparateComponents", + "node:GeometryNodeSetCurveHandlePositions", + "node:GeometryNodeSetCurveNormal" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1235-000", + "phase": "1235", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1234-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1235", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1235-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1235-001", + "phase": "1235", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1235-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1235-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1235-001:AUTO_GEOMETRY_NATIVE_NODE_READER:91beafd1d1c04670", + "selectedRecordIds": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1235-001:AUTO_GEOMETRY_NATIVE_NODE_READER:91beafd1d1c04670", + "selectedRecordIds": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_curve_tilt.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_geometry_name.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_color.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-91beafd1d1c04670.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSetCurveRadius type is read from Blender Main", + "GeometryNodeSetCurveTilt type is read from Blender Main", + "GeometryNodeSetGeometryBundle type is read from Blender Main", + "GeometryNodeSetGeometryName type is read from Blender Main", + "GeometryNodeSetGreasePencilColor type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1235-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1235-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-91beafd1d1c04670.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetCurveRadius\",\"GeometryNodeSetCurveTilt\",\"GeometryNodeSetGeometryBundle\",\"GeometryNodeSetGeometryName\",\"GeometryNodeSetGreasePencilColor\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetCurveRadius\",\"node:GeometryNodeSetCurveTilt\",\"node:GeometryNodeSetGeometryBundle\",\"node:GeometryNodeSetGeometryName\",\"node:GeometryNodeSetGreasePencilColor\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1235-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetCurveRadius", + "node:GeometryNodeSetCurveTilt", + "node:GeometryNodeSetGeometryBundle", + "node:GeometryNodeSetGeometryName", + "node:GeometryNodeSetGreasePencilColor" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1236-000", + "phase": "1236", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1235-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1236", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1236-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1236-001", + "phase": "1236", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1236-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1236-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1236-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b7b77a5dec80a14d", + "selectedRecordIds": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1236-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b7b77a5dec80a14d", + "selectedRecordIds": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_depth_mode.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grease_pencil_softness.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_grid_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_id.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b7b77a5dec80a14d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSetGreasePencilDepth type is read from Blender Main", + "GeometryNodeSetGreasePencilSoftness type is read from Blender Main", + "GeometryNodeSetGridBackground type is read from Blender Main", + "GeometryNodeSetGridTransform type is read from Blender Main", + "GeometryNodeSetID type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1236-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1236-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b7b77a5dec80a14d.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetGreasePencilDepth\",\"GeometryNodeSetGreasePencilSoftness\",\"GeometryNodeSetGridBackground\",\"GeometryNodeSetGridTransform\",\"GeometryNodeSetID\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetGreasePencilDepth\",\"node:GeometryNodeSetGreasePencilSoftness\",\"node:GeometryNodeSetGridBackground\",\"node:GeometryNodeSetGridTransform\",\"node:GeometryNodeSetID\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1236-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetGreasePencilDepth", + "node:GeometryNodeSetGreasePencilSoftness", + "node:GeometryNodeSetGridBackground", + "node:GeometryNodeSetGridTransform", + "node:GeometryNodeSetID" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1237-000", + "phase": "1237", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1236-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1237", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1237-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1237-001", + "phase": "1237", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1237-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1237-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1237-001:AUTO_GEOMETRY_NATIVE_NODE_READER:95ccfa5892bb7a33", + "selectedRecordIds": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1237-001:AUTO_GEOMETRY_NATIVE_NODE_READER:95ccfa5892bb7a33", + "selectedRecordIds": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_instance_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_material_index.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_mesh_normal.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_order.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-95ccfa5892bb7a33.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSetInstanceTransform type is read from Blender Main", + "GeometryNodeSetMaterial type is read from Blender Main", + "GeometryNodeSetMaterialIndex type is read from Blender Main", + "GeometryNodeSetMeshNormal type is read from Blender Main", + "GeometryNodeSetNURBSOrder type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1237-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1237-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-95ccfa5892bb7a33.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetInstanceTransform\",\"GeometryNodeSetMaterial\",\"GeometryNodeSetMaterialIndex\",\"GeometryNodeSetMeshNormal\",\"GeometryNodeSetNURBSOrder\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetInstanceTransform\",\"node:GeometryNodeSetMaterial\",\"node:GeometryNodeSetMaterialIndex\",\"node:GeometryNodeSetMeshNormal\",\"node:GeometryNodeSetNURBSOrder\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1237-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetInstanceTransform", + "node:GeometryNodeSetMaterial", + "node:GeometryNodeSetMaterialIndex", + "node:GeometryNodeSetMeshNormal", + "node:GeometryNodeSetNURBSOrder" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1238-000", + "phase": "1238", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1237-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1238", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1238-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1238-001", + "phase": "1238", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1238-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1238-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1238-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d3751cce437cb33", + "selectedRecordIds": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1238-001:AUTO_GEOMETRY_NATIVE_NODE_READER:8d3751cce437cb33", + "selectedRecordIds": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_nurbs_weight.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_point_radius.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_shade_smooth.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_cyclic.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_set_spline_resolution.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-8d3751cce437cb33.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSetNURBSWeight type is read from Blender Main", + "GeometryNodeSetPointRadius type is read from Blender Main", + "GeometryNodeSetShadeSmooth type is read from Blender Main", + "GeometryNodeSetSplineCyclic type is read from Blender Main", + "GeometryNodeSetSplineResolution type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1238-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1238-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-8d3751cce437cb33.blend WBV2_BATCH_TYPES='[\"GeometryNodeSetNURBSWeight\",\"GeometryNodeSetPointRadius\",\"GeometryNodeSetShadeSmooth\",\"GeometryNodeSetSplineCyclic\",\"GeometryNodeSetSplineResolution\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSetNURBSWeight\",\"node:GeometryNodeSetPointRadius\",\"node:GeometryNodeSetShadeSmooth\",\"node:GeometryNodeSetSplineCyclic\",\"node:GeometryNodeSetSplineResolution\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1238-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSetNURBSWeight", + "node:GeometryNodeSetPointRadius", + "node:GeometryNodeSetShadeSmooth", + "node:GeometryNodeSetSplineCyclic", + "node:GeometryNodeSetSplineResolution" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1239-000", + "phase": "1239", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1238-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1239", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1239-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1239-001", + "phase": "1239", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1239-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1239-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1239-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2de2c5e6ce0c4914", + "selectedRecordIds": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1239-001:AUTO_GEOMETRY_NATIVE_NODE_READER:2de2c5e6ce0c4914", + "selectedRecordIds": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_elements.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_sort_list.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_edge_split.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-2de2c5e6ce0c4914.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSortElements type is read from Blender Main", + "GeometryNodeSortList type is read from Blender Main", + "GeometryNodeSplineLength type is read from Blender Main", + "GeometryNodeSplineParameter type is read from Blender Main", + "GeometryNodeSplitEdges type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1239-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1239-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-2de2c5e6ce0c4914.blend WBV2_BATCH_TYPES='[\"GeometryNodeSortElements\",\"GeometryNodeSortList\",\"GeometryNodeSplineLength\",\"GeometryNodeSplineParameter\",\"GeometryNodeSplitEdges\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSortElements\",\"node:GeometryNodeSortList\",\"node:GeometryNodeSplineLength\",\"node:GeometryNodeSplineParameter\",\"node:GeometryNodeSplitEdges\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1239-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSortElements", + "node:GeometryNodeSortList", + "node:GeometryNodeSplineLength", + "node:GeometryNodeSplineParameter", + "node:GeometryNodeSplitEdges" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1240-000", + "phase": "1240", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1239-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1240", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1240-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1240-001", + "phase": "1240", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1240-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1240-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1240-001:AUTO_GEOMETRY_NATIVE_NODE_READER:70077c253f8e9738", + "selectedRecordIds": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1240-001:AUTO_GEOMETRY_NATIVE_NODE_READER:70077c253f8e9738", + "selectedRecordIds": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_store_named_grid.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_join.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_subdivide.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-70077c253f8e9738.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSplitToInstances type is read from Blender Main", + "GeometryNodeStoreNamedGrid type is read from Blender Main", + "GeometryNodeStringJoin type is read from Blender Main", + "GeometryNodeStringToCurves type is read from Blender Main", + "GeometryNodeSubdivideCurve type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1240-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1240-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-70077c253f8e9738.blend WBV2_BATCH_TYPES='[\"GeometryNodeSplitToInstances\",\"GeometryNodeStoreNamedGrid\",\"GeometryNodeStringJoin\",\"GeometryNodeStringToCurves\",\"GeometryNodeSubdivideCurve\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSplitToInstances\",\"node:GeometryNodeStoreNamedGrid\",\"node:GeometryNodeStringJoin\",\"node:GeometryNodeStringToCurves\",\"node:GeometryNodeSubdivideCurve\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1240-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSplitToInstances", + "node:GeometryNodeStoreNamedGrid", + "node:GeometryNodeStringJoin", + "node:GeometryNodeStringToCurves", + "node:GeometryNodeSubdivideCurve" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1241-000", + "phase": "1241", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1240-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1241", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1241-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1241-001", + "phase": "1241", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1241-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1241-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1241-001:AUTO_GEOMETRY_NATIVE_NODE_READER:518360e680870ecc", + "selectedRecordIds": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1241-001:AUTO_GEOMETRY_NATIVE_NODE_READER:518360e680870ecc", + "selectedRecordIds": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_switch.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tag_filter.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_3d_cursor.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-518360e680870ecc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeSubdivideMesh type is read from Blender Main", + "GeometryNodeSubdivisionSurface type is read from Blender Main", + "GeometryNodeSwitch type is read from Blender Main", + "GeometryNodeTagFilter type is read from Blender Main", + "GeometryNodeTool3DCursor type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1241-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1241-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-518360e680870ecc.blend WBV2_BATCH_TYPES='[\"GeometryNodeSubdivideMesh\",\"GeometryNodeSubdivisionSurface\",\"GeometryNodeSwitch\",\"GeometryNodeTagFilter\",\"GeometryNodeTool3DCursor\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeSubdivideMesh\",\"node:GeometryNodeSubdivisionSurface\",\"node:GeometryNodeSwitch\",\"node:GeometryNodeTagFilter\",\"node:GeometryNodeTool3DCursor\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1241-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeSubdivideMesh", + "node:GeometryNodeSubdivisionSurface", + "node:GeometryNodeSwitch", + "node:GeometryNodeTagFilter", + "node:GeometryNodeTool3DCursor" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1242-000", + "phase": "1242", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1241-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1242", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1242-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1242-001", + "phase": "1242", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1242-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1242-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1242-001:AUTO_GEOMETRY_NATIVE_NODE_READER:f355dda8099b8a6f", + "selectedRecordIds": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1242-001:AUTO_GEOMETRY_NATIVE_NODE_READER:f355dda8099b8a6f", + "selectedRecordIds": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_active_element.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_face_set.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mouse_position.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_face_set.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-f355dda8099b8a6f.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeToolActiveElement type is read from Blender Main", + "GeometryNodeToolFaceSet type is read from Blender Main", + "GeometryNodeToolMousePosition type is read from Blender Main", + "GeometryNodeToolSelection type is read from Blender Main", + "GeometryNodeToolSetFaceSet type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1242-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1242-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-f355dda8099b8a6f.blend WBV2_BATCH_TYPES='[\"GeometryNodeToolActiveElement\",\"GeometryNodeToolFaceSet\",\"GeometryNodeToolMousePosition\",\"GeometryNodeToolSelection\",\"GeometryNodeToolSetFaceSet\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeToolActiveElement\",\"node:GeometryNodeToolFaceSet\",\"node:GeometryNodeToolMousePosition\",\"node:GeometryNodeToolSelection\",\"node:GeometryNodeToolSetFaceSet\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1242-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeToolActiveElement", + "node:GeometryNodeToolFaceSet", + "node:GeometryNodeToolMousePosition", + "node:GeometryNodeToolSelection", + "node:GeometryNodeToolSetFaceSet" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1243-000", + "phase": "1243", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1242-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1243", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1243-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1243-001", + "phase": "1243", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1243-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1243-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1243-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6399364bfcbc157c", + "selectedRecordIds": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1243-001:AUTO_GEOMETRY_NATIVE_NODE_READER:6399364bfcbc157c", + "selectedRecordIds": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_tool_set_selection.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_transfer_attributes.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_triangulate.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-6399364bfcbc157c.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeToolSetSelection type is read from Blender Main", + "GeometryNodeTransferAttributes type is read from Blender Main", + "GeometryNodeTranslateInstances type is read from Blender Main", + "GeometryNodeTriangulate type is read from Blender Main", + "GeometryNodeTrimCurve type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1243-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1243-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-6399364bfcbc157c.blend WBV2_BATCH_TYPES='[\"GeometryNodeToolSetSelection\",\"GeometryNodeTransferAttributes\",\"GeometryNodeTranslateInstances\",\"GeometryNodeTriangulate\",\"GeometryNodeTrimCurve\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeToolSetSelection\",\"node:GeometryNodeTransferAttributes\",\"node:GeometryNodeTranslateInstances\",\"node:GeometryNodeTriangulate\",\"node:GeometryNodeTrimCurve\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1243-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeToolSetSelection", + "node:GeometryNodeTransferAttributes", + "node:GeometryNodeTranslateInstances", + "node:GeometryNodeTriangulate", + "node:GeometryNodeTrimCurve" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1244-000", + "phase": "1244", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1243-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1244", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1244-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1244-001", + "phase": "1244", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1244-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1244-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1244-001:AUTO_GEOMETRY_NATIVE_NODE_READER:b2e40edae0bea18d", + "selectedRecordIds": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_pack_islands.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_tangent.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_uv_unwrap.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_mesh_topology_vertex_of_corner.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewer.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeUVPackIslands type is read from Blender Main", + "GeometryNodeUVTangent type is read from Blender Main", + "GeometryNodeUVUnwrap type is read from Blender Main", + "GeometryNodeVertexOfCorner type is read from Blender Main", + "GeometryNodeViewer type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1244-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1244-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-b2e40edae0bea18d.blend WBV2_BATCH_TYPES='[\"GeometryNodeUVPackIslands\",\"GeometryNodeUVTangent\",\"GeometryNodeUVUnwrap\",\"GeometryNodeVertexOfCorner\",\"GeometryNodeViewer\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeUVPackIslands\",\"node:GeometryNodeUVTangent\",\"node:GeometryNodeUVUnwrap\",\"node:GeometryNodeVertexOfCorner\",\"node:GeometryNodeViewer\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1244-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeUVPackIslands", + "node:GeometryNodeUVTangent", + "node:GeometryNodeUVUnwrap", + "node:GeometryNodeVertexOfCorner", + "node:GeometryNodeViewer" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1245-000", + "phase": "1245", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1244-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1245", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1245-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1245-001", + "phase": "1245", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1245-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1245-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1245-001:AUTO_GEOMETRY_NATIVE_NODE_READER:06a9b0a82fc0bc5b", + "selectedRecordIds": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1245-001:AUTO_GEOMETRY_NATIVE_NODE_READER:06a9b0a82fc0bc5b", + "selectedRecordIds": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_viewport_transform.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_cube.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_warning.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_xpbd_solver.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-06a9b0a82fc0bc5b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GeometryNodeViewportTransform type is read from Blender Main", + "GeometryNodeVolumeCube type is read from Blender Main", + "GeometryNodeVolumeToMesh type is read from Blender Main", + "GeometryNodeWarning type is read from Blender Main", + "GeometryNodeXPBDSolver type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1245-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1245-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-06a9b0a82fc0bc5b.blend WBV2_BATCH_TYPES='[\"GeometryNodeViewportTransform\",\"GeometryNodeVolumeCube\",\"GeometryNodeVolumeToMesh\",\"GeometryNodeWarning\",\"GeometryNodeXPBDSolver\"]' WBV2_BATCH_UNITS='[\"node:GeometryNodeViewportTransform\",\"node:GeometryNodeVolumeCube\",\"node:GeometryNodeVolumeToMesh\",\"node:GeometryNodeWarning\",\"node:GeometryNodeXPBDSolver\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1245-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:GeometryNodeViewportTransform", + "node:GeometryNodeVolumeCube", + "node:GeometryNodeVolumeToMesh", + "node:GeometryNodeWarning", + "node:GeometryNodeXPBDSolver" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1246-000", + "phase": "1246", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1245-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1246", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1246-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1246-001", + "phase": "1246", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1246-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1246-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1246-001:AUTO_SHADER_NATIVE_NODE_READER:6084b65cc9b4dd13", + "selectedRecordIds": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1246-001:AUTO_SHADER_NATIVE_NODE_READER:6084b65cc9b4dd13", + "selectedRecordIds": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_add_shader.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_ambient_occlusion.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_attribute.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_background.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bevel.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-6084b65cc9b4dd13.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeAddShader type is read from Blender Main", + "ShaderNodeAmbientOcclusion type is read from Blender Main", + "ShaderNodeAttribute type is read from Blender Main", + "ShaderNodeBackground type is read from Blender Main", + "ShaderNodeBevel type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1246-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1246-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-6084b65cc9b4dd13.blend WBV2_BATCH_TYPES='[\"ShaderNodeAddShader\",\"ShaderNodeAmbientOcclusion\",\"ShaderNodeAttribute\",\"ShaderNodeBackground\",\"ShaderNodeBevel\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeAddShader\",\"node:ShaderNodeAmbientOcclusion\",\"node:ShaderNodeAttribute\",\"node:ShaderNodeBackground\",\"node:ShaderNodeBevel\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 web/tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1246-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeAddShader", + "node:ShaderNodeAmbientOcclusion", + "node:ShaderNodeAttribute", + "node:ShaderNodeBackground", + "node:ShaderNodeBevel" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1247-000", + "phase": "1247", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1246-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1247", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1247-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1247-001", + "phase": "1247", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1247-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1247-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1247-001:AUTO_SHADER_NATIVE_NODE_READER:492bd603ac3e7b39", + "selectedRecordIds": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1247-001:AUTO_SHADER_NATIVE_NODE_READER:492bd603ac3e7b39", + "selectedRecordIds": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_blackbody.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_brightness.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_glass.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-492bd603ac3e7b39.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeBlackbody type is read from Blender Main", + "ShaderNodeBrightContrast type is read from Blender Main", + "ShaderNodeBsdfAnisotropic type is read from Blender Main", + "ShaderNodeBsdfDiffuse type is read from Blender Main", + "ShaderNodeBsdfGlass type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1247-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1247-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-492bd603ac3e7b39.blend WBV2_BATCH_TYPES='[\"ShaderNodeBlackbody\",\"ShaderNodeBrightContrast\",\"ShaderNodeBsdfAnisotropic\",\"ShaderNodeBsdfDiffuse\",\"ShaderNodeBsdfGlass\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeBlackbody\",\"node:ShaderNodeBrightContrast\",\"node:ShaderNodeBsdfAnisotropic\",\"node:ShaderNodeBsdfDiffuse\",\"node:ShaderNodeBsdfGlass\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1247-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeBlackbody", + "node:ShaderNodeBrightContrast", + "node:ShaderNodeBsdfAnisotropic", + "node:ShaderNodeBsdfDiffuse", + "node:ShaderNodeBsdfGlass" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1248-000", + "phase": "1248", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1247-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1248", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1248-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1248-001", + "phase": "1248", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1248-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1248-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1248-001:AUTO_SHADER_NATIVE_NODE_READER:5d3fdcd95f8dcb4a", + "selectedRecordIds": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1248-001:AUTO_SHADER_NATIVE_NODE_READER:5d3fdcd95f8dcb4a", + "selectedRecordIds": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_hair_principled.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_metallic.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_ray_portal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_refraction.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-5d3fdcd95f8dcb4a.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeBsdfHair type is read from Blender Main", + "ShaderNodeBsdfHairPrincipled type is read from Blender Main", + "ShaderNodeBsdfMetallic type is read from Blender Main", + "ShaderNodeBsdfRayPortal type is read from Blender Main", + "ShaderNodeBsdfRefraction type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1248-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1248-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-5d3fdcd95f8dcb4a.blend WBV2_BATCH_TYPES='[\"ShaderNodeBsdfHair\",\"ShaderNodeBsdfHairPrincipled\",\"ShaderNodeBsdfMetallic\",\"ShaderNodeBsdfRayPortal\",\"ShaderNodeBsdfRefraction\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeBsdfHair\",\"node:ShaderNodeBsdfHairPrincipled\",\"node:ShaderNodeBsdfMetallic\",\"node:ShaderNodeBsdfRayPortal\",\"node:ShaderNodeBsdfRefraction\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1248-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeBsdfHair", + "node:ShaderNodeBsdfHairPrincipled", + "node:ShaderNodeBsdfMetallic", + "node:ShaderNodeBsdfRayPortal", + "node:ShaderNodeBsdfRefraction" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1249-000", + "phase": "1249", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1248-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1249", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1249-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1249-001", + "phase": "1249", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1249-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1249-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1249-001:AUTO_SHADER_NATIVE_NODE_READER:3dd8ce20c676372b", + "selectedRecordIds": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1249-001:AUTO_SHADER_NATIVE_NODE_READER:3dd8ce20c676372b", + "selectedRecordIds": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_sheen.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_toon.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_bump.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-3dd8ce20c676372b.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeBsdfSheen type is read from Blender Main", + "ShaderNodeBsdfToon type is read from Blender Main", + "ShaderNodeBsdfTranslucent type is read from Blender Main", + "ShaderNodeBsdfTransparent type is read from Blender Main", + "ShaderNodeBump type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1249-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1249-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-3dd8ce20c676372b.blend WBV2_BATCH_TYPES='[\"ShaderNodeBsdfSheen\",\"ShaderNodeBsdfToon\",\"ShaderNodeBsdfTranslucent\",\"ShaderNodeBsdfTransparent\",\"ShaderNodeBump\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeBsdfSheen\",\"node:ShaderNodeBsdfToon\",\"node:ShaderNodeBsdfTranslucent\",\"node:ShaderNodeBsdfTransparent\",\"node:ShaderNodeBump\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1249-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeBsdfSheen", + "node:ShaderNodeBsdfToon", + "node:ShaderNodeBsdfTranslucent", + "node:ShaderNodeBsdfTransparent", + "node:ShaderNodeBump" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1250-000", + "phase": "1250", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1249-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1250", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1250-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1250-001", + "phase": "1250", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1250-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1250-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1250-001:AUTO_SHADER_NATIVE_NODE_READER:4962cd49b587a2f9", + "selectedRecordIds": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1250-001:AUTO_SHADER_NATIVE_NODE_READER:4962cd49b587a2f9", + "selectedRecordIds": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_camera.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_clamp.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_xyz.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_displacement.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-4962cd49b587a2f9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeCameraData type is read from Blender Main", + "ShaderNodeClamp type is read from Blender Main", + "ShaderNodeCombineColor type is read from Blender Main", + "ShaderNodeCombineXYZ type is read from Blender Main", + "ShaderNodeDisplacement type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1250-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1250-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-4962cd49b587a2f9.blend WBV2_BATCH_TYPES='[\"ShaderNodeCameraData\",\"ShaderNodeClamp\",\"ShaderNodeCombineColor\",\"ShaderNodeCombineXYZ\",\"ShaderNodeDisplacement\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeCameraData\",\"node:ShaderNodeClamp\",\"node:ShaderNodeCombineColor\",\"node:ShaderNodeCombineXYZ\",\"node:ShaderNodeDisplacement\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1250-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeCameraData", + "node:ShaderNodeClamp", + "node:ShaderNodeCombineColor", + "node:ShaderNodeCombineXYZ", + "node:ShaderNodeDisplacement" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1251-000", + "phase": "1251", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1250-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1251", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1251-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1251-001", + "phase": "1251", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1251-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1251-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1251-001:AUTO_SHADER_NATIVE_NODE_READER:2367477c6dfff68d", + "selectedRecordIds": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1251-001:AUTO_SHADER_NATIVE_NODE_READER:2367477c6dfff68d", + "selectedRecordIds": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_eevee_specular.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_emission.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_fresnel.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_gamma.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-2367477c6dfff68d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeEeveeSpecular type is read from Blender Main", + "ShaderNodeEmission type is read from Blender Main", + "ShaderNodeFloatCurve type is read from Blender Main", + "ShaderNodeFresnel type is read from Blender Main", + "ShaderNodeGamma type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1251-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1251-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-2367477c6dfff68d.blend WBV2_BATCH_TYPES='[\"ShaderNodeEeveeSpecular\",\"ShaderNodeEmission\",\"ShaderNodeFloatCurve\",\"ShaderNodeFresnel\",\"ShaderNodeGamma\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeEeveeSpecular\",\"node:ShaderNodeEmission\",\"node:ShaderNodeFloatCurve\",\"node:ShaderNodeFresnel\",\"node:ShaderNodeGamma\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1251-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeEeveeSpecular", + "node:ShaderNodeEmission", + "node:ShaderNodeFloatCurve", + "node:ShaderNodeFresnel", + "node:ShaderNodeGamma" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1252-000", + "phase": "1252", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1251-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1252", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1252-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1252-001", + "phase": "1252", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1252-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1252-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1252-001:AUTO_SHADER_NATIVE_NODE_READER:f8e029f92dbfd33d", + "selectedRecordIds": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hair_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_holdout.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_hueSatVal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_invert.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_layer_weight.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeHairInfo type is read from Blender Main", + "ShaderNodeHoldout type is read from Blender Main", + "ShaderNodeHueSaturation type is read from Blender Main", + "ShaderNodeInvert type is read from Blender Main", + "ShaderNodeLayerWeight type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1252-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1252-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-f8e029f92dbfd33d.blend WBV2_BATCH_TYPES='[\"ShaderNodeHairInfo\",\"ShaderNodeHoldout\",\"ShaderNodeHueSaturation\",\"ShaderNodeInvert\",\"ShaderNodeLayerWeight\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeHairInfo\",\"node:ShaderNodeHoldout\",\"node:ShaderNodeHueSaturation\",\"node:ShaderNodeInvert\",\"node:ShaderNodeLayerWeight\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1252-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeHairInfo", + "node:ShaderNodeHoldout", + "node:ShaderNodeHueSaturation", + "node:ShaderNodeInvert", + "node:ShaderNodeLayerWeight" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1253-000", + "phase": "1253", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1252-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1253", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1253-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1253-001", + "phase": "1253", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1253-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1253-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1253-001:AUTO_SHADER_NATIVE_NODE_READER:c56bc2ebdfa34be7", + "selectedRecordIds": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_falloff.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_light_path.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_map_range.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mapping.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeLightFalloff type is read from Blender Main", + "ShaderNodeLightPath type is read from Blender Main", + "ShaderNodeMapRange type is read from Blender Main", + "ShaderNodeMapping type is read from Blender Main", + "ShaderNodeMix type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1253-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1253-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-c56bc2ebdfa34be7.blend WBV2_BATCH_TYPES='[\"ShaderNodeLightFalloff\",\"ShaderNodeLightPath\",\"ShaderNodeMapRange\",\"ShaderNodeMapping\",\"ShaderNodeMix\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeLightFalloff\",\"node:ShaderNodeLightPath\",\"node:ShaderNodeMapRange\",\"node:ShaderNodeMapping\",\"node:ShaderNodeMix\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1253-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeLightFalloff", + "node:ShaderNodeLightPath", + "node:ShaderNodeMapRange", + "node:ShaderNodeMapping", + "node:ShaderNodeMix" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1254-000", + "phase": "1254", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1253-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1254", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1254-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1254-001", + "phase": "1254", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1254-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1254-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1254-001:AUTO_SHADER_NATIVE_NODE_READER:dbc531eb397b06df", + "selectedRecordIds": [ + "node:ShaderNodeMixRGB", + "node:ShaderNodeMixShader", + "node:ShaderNodeNewGeometry", + "node:ShaderNodeNormal", + "node:ShaderNodeObjectInfo" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1254-001:AUTO_SHADER_NATIVE_NODE_READER:dbc531eb397b06df", + "selectedRecordIds": [ + "node:ShaderNodeMixRGB", + "node:ShaderNodeMixShader", + "node:ShaderNodeNewGeometry", + "node:ShaderNodeNormal", + "node:ShaderNodeObjectInfo" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix_rgb.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_mix_shader.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_geometry.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_normal.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_object_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-dbc531eb397b06df.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeMixRGB type is read from Blender Main", + "ShaderNodeMixShader type is read from Blender Main", + "ShaderNodeNewGeometry type is read from Blender Main", + "ShaderNodeNormal type is read from Blender Main", + "ShaderNodeObjectInfo type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1254-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1254-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-dbc531eb397b06df.blend WBV2_BATCH_TYPES='[\"ShaderNodeMixRGB\",\"ShaderNodeMixShader\",\"ShaderNodeNewGeometry\",\"ShaderNodeNormal\",\"ShaderNodeObjectInfo\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeMixRGB\",\"node:ShaderNodeMixShader\",\"node:ShaderNodeNewGeometry\",\"node:ShaderNodeNormal\",\"node:ShaderNodeObjectInfo\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1254-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeMixRGB", + "node:ShaderNodeMixShader", + "node:ShaderNodeNewGeometry", + "node:ShaderNodeNormal", + "node:ShaderNodeObjectInfo" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1255-000", + "phase": "1255", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1254-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1255", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1255-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1255-001", + "phase": "1255", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1255-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1255-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1255-001:AUTO_SHADER_NATIVE_NODE_READER:dd18d1b1e2d07fd3", + "selectedRecordIds": [ + "node:ShaderNodeOutputAOV", + "node:ShaderNodeOutputLight", + "node:ShaderNodeOutputLineStyle", + "node:ShaderNodeOutputWorld", + "node:ShaderNodeParticleInfo" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1255-001:AUTO_SHADER_NATIVE_NODE_READER:dd18d1b1e2d07fd3", + "selectedRecordIds": [ + "node:ShaderNodeOutputAOV", + "node:ShaderNodeOutputLight", + "node:ShaderNodeOutputLineStyle", + "node:ShaderNodeOutputWorld", + "node:ShaderNodeParticleInfo" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_output_aov.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_output_light.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_output_linestyle.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_output_world.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_particle_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-dd18d1b1e2d07fd3.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeOutputAOV type is read from Blender Main", + "ShaderNodeOutputLight type is read from Blender Main", + "ShaderNodeOutputLineStyle type is read from Blender Main", + "ShaderNodeOutputWorld type is read from Blender Main", + "ShaderNodeParticleInfo type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1255-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1255-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-dd18d1b1e2d07fd3.blend WBV2_BATCH_TYPES='[\"ShaderNodeOutputAOV\",\"ShaderNodeOutputLight\",\"ShaderNodeOutputLineStyle\",\"ShaderNodeOutputWorld\",\"ShaderNodeParticleInfo\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeOutputAOV\",\"node:ShaderNodeOutputLight\",\"node:ShaderNodeOutputLineStyle\",\"node:ShaderNodeOutputWorld\",\"node:ShaderNodeParticleInfo\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1255-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeOutputAOV", + "node:ShaderNodeOutputLight", + "node:ShaderNodeOutputLineStyle", + "node:ShaderNodeOutputWorld", + "node:ShaderNodeParticleInfo" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1256-000", + "phase": "1256", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1255-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1256", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1256-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1256-001", + "phase": "1256", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1256-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1256-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1256-001:AUTO_SHADER_NATIVE_NODE_READER:d37c82dd11ef35c6", + "selectedRecordIds": [ + "node:ShaderNodePointInfo", + "node:ShaderNodeRGBCurve", + "node:ShaderNodeRGBToBW", + "node:ShaderNodeRadialTiling", + "node:ShaderNodeRaycast" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1256-001:AUTO_SHADER_NATIVE_NODE_READER:d37c82dd11ef35c6", + "selectedRecordIds": [ + "node:ShaderNodePointInfo", + "node:ShaderNodeRGBCurve", + "node:ShaderNodeRGBToBW", + "node:ShaderNodeRadialTiling", + "node:ShaderNodeRaycast" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_point_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_rgb_to_bw.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_radial_tiling.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_raycast.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-d37c82dd11ef35c6.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodePointInfo type is read from Blender Main", + "ShaderNodeRGBCurve type is read from Blender Main", + "ShaderNodeRGBToBW type is read from Blender Main", + "ShaderNodeRadialTiling type is read from Blender Main", + "ShaderNodeRaycast type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1256-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1256-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-d37c82dd11ef35c6.blend WBV2_BATCH_TYPES='[\"ShaderNodePointInfo\",\"ShaderNodeRGBCurve\",\"ShaderNodeRGBToBW\",\"ShaderNodeRadialTiling\",\"ShaderNodeRaycast\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodePointInfo\",\"node:ShaderNodeRGBCurve\",\"node:ShaderNodeRGBToBW\",\"node:ShaderNodeRadialTiling\",\"node:ShaderNodeRaycast\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1256-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodePointInfo", + "node:ShaderNodeRGBCurve", + "node:ShaderNodeRGBToBW", + "node:ShaderNodeRadialTiling", + "node:ShaderNodeRaycast" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1257-000", + "phase": "1257", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1256-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1257", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1257-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1257-001", + "phase": "1257", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1257-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1257-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1257-001:AUTO_SHADER_NATIVE_NODE_READER:faed565343c54fcc", + "selectedRecordIds": [ + "node:ShaderNodeScript", + "node:ShaderNodeSeparateColor", + "node:ShaderNodeSeparateXYZ", + "node:ShaderNodeShaderToRGB", + "node:ShaderNodeSqueeze" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1257-001:AUTO_SHADER_NATIVE_NODE_READER:faed565343c54fcc", + "selectedRecordIds": [ + "node:ShaderNodeScript", + "node:ShaderNodeSeparateColor", + "node:ShaderNodeSeparateXYZ", + "node:ShaderNodeShaderToRGB", + "node:ShaderNodeSqueeze" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_script.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_sepcomb_xyz.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_shader_to_rgb.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_squeeze.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-faed565343c54fcc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeScript type is read from Blender Main", + "ShaderNodeSeparateColor type is read from Blender Main", + "ShaderNodeSeparateXYZ type is read from Blender Main", + "ShaderNodeShaderToRGB type is read from Blender Main", + "ShaderNodeSqueeze type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1257-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1257-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-faed565343c54fcc.blend WBV2_BATCH_TYPES='[\"ShaderNodeScript\",\"ShaderNodeSeparateColor\",\"ShaderNodeSeparateXYZ\",\"ShaderNodeShaderToRGB\",\"ShaderNodeSqueeze\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeScript\",\"node:ShaderNodeSeparateColor\",\"node:ShaderNodeSeparateXYZ\",\"node:ShaderNodeShaderToRGB\",\"node:ShaderNodeSqueeze\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1257-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeScript", + "node:ShaderNodeSeparateColor", + "node:ShaderNodeSeparateXYZ", + "node:ShaderNodeShaderToRGB", + "node:ShaderNodeSqueeze" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1258-000", + "phase": "1258", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1257-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1258", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1258-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1258-001", + "phase": "1258", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1258-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1258-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1258-001:AUTO_SHADER_NATIVE_NODE_READER:7a417f3a8bc48b94", + "selectedRecordIds": [ + "node:ShaderNodeSubsurfaceScattering", + "node:ShaderNodeTangent", + "node:ShaderNodeTexBrick", + "node:ShaderNodeTexChecker", + "node:ShaderNodeTexCoord" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1258-001:AUTO_SHADER_NATIVE_NODE_READER:7a417f3a8bc48b94", + "selectedRecordIds": [ + "node:ShaderNodeSubsurfaceScattering", + "node:ShaderNodeTangent", + "node:ShaderNodeTexBrick", + "node:ShaderNodeTexChecker", + "node:ShaderNodeTexCoord" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_subsurface_scattering.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tangent.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_brick.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_checker.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_coord.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-7a417f3a8bc48b94.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeSubsurfaceScattering type is read from Blender Main", + "ShaderNodeTangent type is read from Blender Main", + "ShaderNodeTexBrick type is read from Blender Main", + "ShaderNodeTexChecker type is read from Blender Main", + "ShaderNodeTexCoord type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1258-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1258-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-7a417f3a8bc48b94.blend WBV2_BATCH_TYPES='[\"ShaderNodeSubsurfaceScattering\",\"ShaderNodeTangent\",\"ShaderNodeTexBrick\",\"ShaderNodeTexChecker\",\"ShaderNodeTexCoord\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeSubsurfaceScattering\",\"node:ShaderNodeTangent\",\"node:ShaderNodeTexBrick\",\"node:ShaderNodeTexChecker\",\"node:ShaderNodeTexCoord\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1258-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeSubsurfaceScattering", + "node:ShaderNodeTangent", + "node:ShaderNodeTexBrick", + "node:ShaderNodeTexChecker", + "node:ShaderNodeTexCoord" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1259-000", + "phase": "1259", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1258-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1259", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1259-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1259-001", + "phase": "1259", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1259-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1259-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1259-001:AUTO_SHADER_NATIVE_NODE_READER:12916e971f5275c9", + "selectedRecordIds": [ + "node:ShaderNodeTexEnvironment", + "node:ShaderNodeTexGabor", + "node:ShaderNodeTexGradient", + "node:ShaderNodeTexIES", + "node:ShaderNodeTexMagic" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1259-001:AUTO_SHADER_NATIVE_NODE_READER:12916e971f5275c9", + "selectedRecordIds": [ + "node:ShaderNodeTexEnvironment", + "node:ShaderNodeTexGabor", + "node:ShaderNodeTexGradient", + "node:ShaderNodeTexIES", + "node:ShaderNodeTexMagic" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_environment.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_gabor.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_ies_light.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_magic.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-12916e971f5275c9.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeTexEnvironment type is read from Blender Main", + "ShaderNodeTexGabor type is read from Blender Main", + "ShaderNodeTexGradient type is read from Blender Main", + "ShaderNodeTexIES type is read from Blender Main", + "ShaderNodeTexMagic type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1259-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1259-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-12916e971f5275c9.blend WBV2_BATCH_TYPES='[\"ShaderNodeTexEnvironment\",\"ShaderNodeTexGabor\",\"ShaderNodeTexGradient\",\"ShaderNodeTexIES\",\"ShaderNodeTexMagic\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeTexEnvironment\",\"node:ShaderNodeTexGabor\",\"node:ShaderNodeTexGradient\",\"node:ShaderNodeTexIES\",\"node:ShaderNodeTexMagic\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1259-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeTexEnvironment", + "node:ShaderNodeTexGabor", + "node:ShaderNodeTexGradient", + "node:ShaderNodeTexIES", + "node:ShaderNodeTexMagic" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1260-000", + "phase": "1260", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1259-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1260", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1260-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1260-001", + "phase": "1260", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1260-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1260-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1260-001:AUTO_SHADER_NATIVE_NODE_READER:f4926931c181f625", + "selectedRecordIds": [ + "node:ShaderNodeTexNoise", + "node:ShaderNodeTexSky", + "node:ShaderNodeTexVoronoi", + "node:ShaderNodeTexWave", + "node:ShaderNodeTexWhiteNoise" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1260-001:AUTO_SHADER_NATIVE_NODE_READER:f4926931c181f625", + "selectedRecordIds": [ + "node:ShaderNodeTexNoise", + "node:ShaderNodeTexSky", + "node:ShaderNodeTexVoronoi", + "node:ShaderNodeTexWave", + "node:ShaderNodeTexWhiteNoise" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_sky.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_wave.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_tex_white_noise.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-f4926931c181f625.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeTexNoise type is read from Blender Main", + "ShaderNodeTexSky type is read from Blender Main", + "ShaderNodeTexVoronoi type is read from Blender Main", + "ShaderNodeTexWave type is read from Blender Main", + "ShaderNodeTexWhiteNoise type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1260-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1260-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-f4926931c181f625.blend WBV2_BATCH_TYPES='[\"ShaderNodeTexNoise\",\"ShaderNodeTexSky\",\"ShaderNodeTexVoronoi\",\"ShaderNodeTexWave\",\"ShaderNodeTexWhiteNoise\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeTexNoise\",\"node:ShaderNodeTexSky\",\"node:ShaderNodeTexVoronoi\",\"node:ShaderNodeTexWave\",\"node:ShaderNodeTexWhiteNoise\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1260-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeTexNoise", + "node:ShaderNodeTexSky", + "node:ShaderNodeTexVoronoi", + "node:ShaderNodeTexWave", + "node:ShaderNodeTexWhiteNoise" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1261-000", + "phase": "1261", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1260-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1261", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1261-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1261-001", + "phase": "1261", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1261-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1261-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1261-001:AUTO_SHADER_NATIVE_NODE_READER:6d9e771d681131cb", + "selectedRecordIds": [ + "node:ShaderNodeUVAlongStroke", + "node:ShaderNodeUVMap", + "node:ShaderNodeValToRGB", + "node:ShaderNodeVectorCurve", + "node:ShaderNodeVectorDisplacement" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1261-001:AUTO_SHADER_NATIVE_NODE_READER:6d9e771d681131cb", + "selectedRecordIds": [ + "node:ShaderNodeUVAlongStroke", + "node:ShaderNodeUVMap", + "node:ShaderNodeValToRGB", + "node:ShaderNodeVectorCurve", + "node:ShaderNodeVectorDisplacement" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_uv_along_stroke.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_uvmap.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_color_ramp.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_curves.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vector_displacement.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-6d9e771d681131cb.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeUVAlongStroke type is read from Blender Main", + "ShaderNodeUVMap type is read from Blender Main", + "ShaderNodeValToRGB type is read from Blender Main", + "ShaderNodeVectorCurve type is read from Blender Main", + "ShaderNodeVectorDisplacement type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1261-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1261-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-6d9e771d681131cb.blend WBV2_BATCH_TYPES='[\"ShaderNodeUVAlongStroke\",\"ShaderNodeUVMap\",\"ShaderNodeValToRGB\",\"ShaderNodeVectorCurve\",\"ShaderNodeVectorDisplacement\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeUVAlongStroke\",\"node:ShaderNodeUVMap\",\"node:ShaderNodeValToRGB\",\"node:ShaderNodeVectorCurve\",\"node:ShaderNodeVectorDisplacement\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1261-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeUVAlongStroke", + "node:ShaderNodeUVMap", + "node:ShaderNodeValToRGB", + "node:ShaderNodeVectorCurve", + "node:ShaderNodeVectorDisplacement" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1262-000", + "phase": "1262", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1261-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1262", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1262-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1262-001", + "phase": "1262", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1262-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1262-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1262-001:AUTO_SHADER_NATIVE_NODE_READER:1bb60b193dc412e6", + "selectedRecordIds": [ + "node:ShaderNodeVectorMath", + "node:ShaderNodeVectorRotate", + "node:ShaderNodeVectorTransform", + "node:ShaderNodeVertexColor", + "node:ShaderNodeVolumeAbsorption" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1262-001:AUTO_SHADER_NATIVE_NODE_READER:1bb60b193dc412e6", + "selectedRecordIds": [ + "node:ShaderNodeVectorMath", + "node:ShaderNodeVectorRotate", + "node:ShaderNodeVectorTransform", + "node:ShaderNodeVertexColor", + "node:ShaderNodeVolumeAbsorption" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vector_math.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vector_transform.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_vertex_color.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_absorption.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-1bb60b193dc412e6.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeVectorMath type is read from Blender Main", + "ShaderNodeVectorRotate type is read from Blender Main", + "ShaderNodeVectorTransform type is read from Blender Main", + "ShaderNodeVertexColor type is read from Blender Main", + "ShaderNodeVolumeAbsorption type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1262-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1262-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-1bb60b193dc412e6.blend WBV2_BATCH_TYPES='[\"ShaderNodeVectorMath\",\"ShaderNodeVectorRotate\",\"ShaderNodeVectorTransform\",\"ShaderNodeVertexColor\",\"ShaderNodeVolumeAbsorption\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeVectorMath\",\"node:ShaderNodeVectorRotate\",\"node:ShaderNodeVectorTransform\",\"node:ShaderNodeVertexColor\",\"node:ShaderNodeVolumeAbsorption\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1262-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeVectorMath", + "node:ShaderNodeVectorRotate", + "node:ShaderNodeVectorTransform", + "node:ShaderNodeVertexColor", + "node:ShaderNodeVolumeAbsorption" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1263-000", + "phase": "1263", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1262-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1263", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1263-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1263-001", + "phase": "1263", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1263-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1263-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1263-001:AUTO_SHADER_NATIVE_NODE_READER:1b947fc2cfa44cfc", + "selectedRecordIds": [ + "node:ShaderNodeVolumeCoefficients", + "node:ShaderNodeVolumeInfo", + "node:ShaderNodeVolumePrincipled", + "node:ShaderNodeVolumeScatter", + "node:ShaderNodeWavelength" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1263-001:AUTO_SHADER_NATIVE_NODE_READER:1b947fc2cfa44cfc", + "selectedRecordIds": [ + "node:ShaderNodeVolumeCoefficients", + "node:ShaderNodeVolumeInfo", + "node:ShaderNodeVolumePrincipled", + "node:ShaderNodeVolumeScatter", + "node:ShaderNodeWavelength" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_coefficients.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_info.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_volume_scatter.cc", + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_wavelength.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-1b947fc2cfa44cfc.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeVolumeCoefficients type is read from Blender Main", + "ShaderNodeVolumeInfo type is read from Blender Main", + "ShaderNodeVolumePrincipled type is read from Blender Main", + "ShaderNodeVolumeScatter type is read from Blender Main", + "ShaderNodeWavelength type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1263-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1263-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-1b947fc2cfa44cfc.blend WBV2_BATCH_TYPES='[\"ShaderNodeVolumeCoefficients\",\"ShaderNodeVolumeInfo\",\"ShaderNodeVolumePrincipled\",\"ShaderNodeVolumeScatter\",\"ShaderNodeWavelength\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeVolumeCoefficients\",\"node:ShaderNodeVolumeInfo\",\"node:ShaderNodeVolumePrincipled\",\"node:ShaderNodeVolumeScatter\",\"node:ShaderNodeWavelength\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1263-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeVolumeCoefficients", + "node:ShaderNodeVolumeInfo", + "node:ShaderNodeVolumePrincipled", + "node:ShaderNodeVolumeScatter", + "node:ShaderNodeWavelength" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1264-000", + "phase": "1264", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1263-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1264", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1264-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1264-001", + "phase": "1264", + "title": "verify auto-generated native shader node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1264-000" + ], + "parityId": "AUTO_SHADER_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_shader_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1264-001.md", + "behavior": "Verify the AUTO_SHADER_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1264-001:AUTO_SHADER_NATIVE_NODE_READER:bc4cce1c19a5ca22", + "selectedRecordIds": [ + "node:ShaderNodeWireframe" + ], + "module": { + "moduleId": "AUTO_SHADER_NATIVE_NODE_READER", + "batchId": "WBV2-P1264-001:AUTO_SHADER_NATIVE_NODE_READER:bc4cce1c19a5ca22", + "selectedRecordIds": [ + "node:ShaderNodeWireframe" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_SHADER_NATIVE_NODE_READER-READER", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_SHADER_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/shader/nodes/node_shader_wireframe.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/shader-main-reader-production.spec.ts", + "tests/files/web/generated/wbv2-shader-bc4cce1c19a5ca22.blend", + "web/app/src/vendor/blender/web_engine.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ShaderNodeWireframe type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1264-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1264-001/shader-main-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-shader-bc4cce1c19a5ca22.blend WBV2_BATCH_TYPES='[\"ShaderNodeWireframe\"]' WBV2_BATCH_UNITS='[\"node:ShaderNodeWireframe\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/shader-main-reader-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1264-001/shader-main-reader-production.json" + ], + "coverageBindings": [ + "node:ShaderNodeWireframe" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1265-000", + "phase": "1265", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1264-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1265", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1265-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1265-001", + "phase": "1265", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1265-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1265-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1265-001:AUTO_GEOMETRY_NATIVE_NODE_READER:551d56ed177090bf", + "selectedRecordIds": [ + "node:NodeClosureInput", + "node:NodeClosureOutput", + "node:NodeCombineBundle", + "node:NodeEnableOutput", + "node:NodeEvaluateClosure" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1265-001:AUTO_GEOMETRY_NATIVE_NODE_READER:551d56ed177090bf", + "selectedRecordIds": [ + "node:NodeClosureInput", + "node:NodeClosureOutput", + "node:NodeCombineBundle", + "node:NodeEnableOutput", + "node:NodeEvaluateClosure" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_closure.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_combine_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_enable_output.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_evaluate_closure.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-551d56ed177090bf.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NodeClosureInput type is read from Blender Main", + "NodeClosureOutput type is read from Blender Main", + "NodeCombineBundle type is read from Blender Main", + "NodeEnableOutput type is read from Blender Main", + "NodeEvaluateClosure type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1265-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1265-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-551d56ed177090bf.blend WBV2_BATCH_TYPES='[\"NodeClosureInput\",\"NodeClosureOutput\",\"NodeCombineBundle\",\"NodeEnableOutput\",\"NodeEvaluateClosure\"]' WBV2_BATCH_UNITS='[\"node:NodeClosureInput\",\"node:NodeClosureOutput\",\"node:NodeCombineBundle\",\"node:NodeEnableOutput\",\"node:NodeEvaluateClosure\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1265-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:NodeClosureInput", + "node:NodeClosureOutput", + "node:NodeCombineBundle", + "node:NodeEnableOutput", + "node:NodeEvaluateClosure" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1266-000", + "phase": "1266", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1265-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1266", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1266-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1266-001", + "phase": "1266", + "title": "verify auto-generated native geometry node reader batch", + "kind": "module", + "owner": "NODES", + "dependsOn": [ + "WBV2-P1266-000" + ], + "parityId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-auto_geometry_native_node_reader", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1266-001.md", + "behavior": "Verify the AUTO_GEOMETRY_NATIVE_NODE_READER batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1266-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dd34d5c436c86d44", + "selectedRecordIds": [ + "node:NodeGetBundleItem", + "node:NodeGetNestedBundlePaths", + "node:NodeJoinBundle", + "node:NodeSeparateBundle", + "node:NodeStoreBundleItem" + ], + "module": { + "moduleId": "AUTO_GEOMETRY_NATIVE_NODE_READER", + "batchId": "WBV2-P1266-001:AUTO_GEOMETRY_NATIVE_NODE_READER:dd34d5c436c86d44", + "selectedRecordIds": [ + "node:NodeGetBundleItem", + "node:NodeGetNestedBundlePaths", + "node:NodeJoinBundle", + "node:NodeSeparateBundle", + "node:NodeStoreBundleItem" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-READER", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-RECOVERY", + "CAP-AUTO_GEOMETRY_NATIVE_NODE_READER-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_bundle_item.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_get_nested_bundle_paths.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_join_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_separate_bundle.cc", + "blender-5.2.0/source/blender/nodes/geometry/nodes/node_geo_store_bundle_item.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/geometry-node-main-reader.spec.ts", + "tests/files/web/generated/wbv2-geometry-dd34d5c436c86d44.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NodeGetBundleItem type is read from Blender Main", + "NodeGetNestedBundlePaths type is read from Blender Main", + "NodeJoinBundle type is read from Blender Main", + "NodeSeparateBundle type is read from Blender Main", + "NodeStoreBundleItem type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1266-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1266-001/geometry-node-reader-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/wbv2-geometry-dd34d5c436c86d44.blend WBV2_BATCH_TYPES='[\"NodeGetBundleItem\",\"NodeGetNestedBundlePaths\",\"NodeJoinBundle\",\"NodeSeparateBundle\",\"NodeStoreBundleItem\"]' WBV2_BATCH_UNITS='[\"node:NodeGetBundleItem\",\"node:NodeGetNestedBundlePaths\",\"node:NodeJoinBundle\",\"node:NodeSeparateBundle\",\"node:NodeStoreBundleItem\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/geometry-node-main-reader.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1266-001/geometry-node-reader-production.json" + ], + "coverageBindings": [ + "node:NodeGetBundleItem", + "node:NodeGetNestedBundlePaths", + "node:NodeJoinBundle", + "node:NodeSeparateBundle", + "node:NodeStoreBundleItem" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1267-000", + "phase": "1267", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1266-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1267", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1267-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1267-001", + "phase": "1267", + "title": "verify animation frame operator through native Main", + "kind": "module", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P1267-000" + ], + "parityId": "ANIMATION_FRAME_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-animation_frame_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1267-001.md", + "behavior": "Verify the ANIMATION_FRAME_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1267-001:ANIMATION_FRAME_OPERATOR_BATCH:de7916b0744d74c6", + "selectedRecordIds": [ + "operator:ANIM_OT_change_frame" + ], + "module": { + "moduleId": "ANIMATION_FRAME_OPERATOR_BATCH", + "batchId": "WBV2-P1267-001:ANIMATION_FRAME_OPERATOR_BATCH:de7916b0744d74c6", + "selectedRecordIds": [ + "operator:ANIM_OT_change_frame" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-ANIMATION_FRAME_OPERATOR_BATCH-READER", + "CAP-ANIMATION_FRAME_OPERATOR_BATCH-RECOVERY", + "CAP-ANIMATION_FRAME_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-fcurve-sample-production.spec.ts", + "tests/files/web/generated/M16-GAP-00161-action-fcurve-samples.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ANIM_OT_change_frame type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1267-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1267-001/fcurve-sample-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/M16-GAP-00161-action-fcurve-samples.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ANIM_OT_change_frame\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-fcurve-sample-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1267-001/fcurve-sample-production.json" + ], + "coverageBindings": [ + "operator:ANIM_OT_change_frame" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1268-000", + "phase": "1268", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1267-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1268", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1268-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1268-001", + "phase": "1268", + "title": "verify object duplicate operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1268-000" + ], + "parityId": "OBJECT_DUPLICATE_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1268-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1268-001:OBJECT_DUPLICATE_OPERATOR_BATCH:7d2be765d4b45aef", + "selectedRecordIds": [ + "operator:OBJECT_OT_duplicate" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_OPERATOR_BATCH", + "batchId": "WBV2-P1268-001:OBJECT_DUPLICATE_OPERATOR_BATCH:7d2be765d4b45aef", + "selectedRecordIds": [ + "operator:OBJECT_OT_duplicate" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_OPERATOR_BATCH-READER", + "CAP-OBJECT_DUPLICATE_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_duplicate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1268-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1268-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_duplicate\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1268-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_duplicate" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1269-000", + "phase": "1269", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1268-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1269", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1269-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1269-001", + "phase": "1269", + "title": "verify object delete operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1269-000" + ], + "parityId": "OBJECT_DELETE_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1269-001.md", + "behavior": "Verify the OBJECT_DELETE_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1269-001:OBJECT_DELETE_OPERATOR_BATCH:07b557a0d42ec2f1", + "selectedRecordIds": [ + "operator:OBJECT_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_OPERATOR_BATCH", + "batchId": "WBV2-P1269-001:OBJECT_DELETE_OPERATOR_BATCH:07b557a0d42ec2f1", + "selectedRecordIds": [ + "operator:OBJECT_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_OPERATOR_BATCH-READER", + "CAP-OBJECT_DELETE_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1269-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1269-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1269-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1270-000", + "phase": "1270", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1269-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1270", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1270-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1270-001", + "phase": "1270", + "title": "verify object visibility operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1270-000" + ], + "parityId": "OBJECT_VISIBILITY_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_visibility_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1270-001.md", + "behavior": "Verify the OBJECT_VISIBILITY_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1270-001:OBJECT_VISIBILITY_OPERATOR_BATCH:4256b7cd408959f9", + "selectedRecordIds": [ + "operator:OBJECT_OT_hide_view_set" + ], + "module": { + "moduleId": "OBJECT_VISIBILITY_OPERATOR_BATCH", + "batchId": "WBV2-P1270-001:OBJECT_VISIBILITY_OPERATOR_BATCH:4256b7cd408959f9", + "selectedRecordIds": [ + "operator:OBJECT_OT_hide_view_set" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_VISIBILITY_OPERATOR_BATCH-READER", + "CAP-OBJECT_VISIBILITY_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_VISIBILITY_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-visibility-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_hide_view_set type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1270-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1270-001/object-visibility-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_hide_view_set\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-visibility-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1270-001/object-visibility-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_hide_view_set" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1271-000", + "phase": "1271", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1270-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1271", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1271-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1271-001", + "phase": "1271", + "title": "verify collection create operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1271-000" + ], + "parityId": "OBJECT_COLLECTION_CREATE_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_collection_create_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1271-001.md", + "behavior": "Verify the OBJECT_COLLECTION_CREATE_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1271-001:OBJECT_COLLECTION_CREATE_OPERATOR_BATCH:30c00e81f46ca5c3", + "selectedRecordIds": [ + "operator:OBJECT_OT_collection_add" + ], + "module": { + "moduleId": "OBJECT_COLLECTION_CREATE_OPERATOR_BATCH", + "batchId": "WBV2-P1271-001:OBJECT_COLLECTION_CREATE_OPERATOR_BATCH:30c00e81f46ca5c3", + "selectedRecordIds": [ + "operator:OBJECT_OT_collection_add" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_COLLECTION_CREATE_OPERATOR_BATCH-READER", + "CAP-OBJECT_COLLECTION_CREATE_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_COLLECTION_CREATE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-collection-create-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_collection_add type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1271-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1271-001/collection-create-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_collection_add\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-collection-create-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1271-001/collection-create-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_collection_add" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1272-000", + "phase": "1272", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1271-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1272", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1272-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1272-001", + "phase": "1272", + "title": "verify object parent operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1272-000" + ], + "parityId": "OBJECT_PARENT_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_parent_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1272-001.md", + "behavior": "Verify the OBJECT_PARENT_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1272-001:OBJECT_PARENT_OPERATOR_BATCH:362256be314bcbe6", + "selectedRecordIds": [ + "operator:OBJECT_OT_parent_set" + ], + "module": { + "moduleId": "OBJECT_PARENT_OPERATOR_BATCH", + "batchId": "WBV2-P1272-001:OBJECT_PARENT_OPERATOR_BATCH:362256be314bcbe6", + "selectedRecordIds": [ + "operator:OBJECT_OT_parent_set" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_PARENT_OPERATOR_BATCH-READER", + "CAP-OBJECT_PARENT_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_parent_set type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1272-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1272-001/object-parent-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_parent_set\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-parent-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1272-001/object-parent-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_parent_set" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1273-000", + "phase": "1273", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1272-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1273", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1273-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1273-001", + "phase": "1273", + "title": "verify primitive cube operator through native Main", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1273-000" + ], + "parityId": "MESH_PRIMITIVE_CUBE_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_primitive_cube_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1273-001.md", + "behavior": "Verify the MESH_PRIMITIVE_CUBE_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1273-001:MESH_PRIMITIVE_CUBE_OPERATOR_BATCH:451cdcaa70551f8f", + "selectedRecordIds": [ + "operator:MESH_OT_primitive_cube_add" + ], + "module": { + "moduleId": "MESH_PRIMITIVE_CUBE_OPERATOR_BATCH", + "batchId": "WBV2-P1273-001:MESH_PRIMITIVE_CUBE_OPERATOR_BATCH:451cdcaa70551f8f", + "selectedRecordIds": [ + "operator:MESH_OT_primitive_cube_add" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_PRIMITIVE_CUBE_OPERATOR_BATCH-READER", + "CAP-MESH_PRIMITIVE_CUBE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_PRIMITIVE_CUBE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-primitive-cube-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_primitive_cube_add type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1273-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1273-001/primitive-cube-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_primitive_cube_add\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-primitive-cube-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1273-001/primitive-cube-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_primitive_cube_add" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1274-000", + "phase": "1274", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1273-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1274", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1274-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1274-001", + "phase": "1274", + "title": "verify object move collection operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1274-000" + ], + "parityId": "OBJECT_MOVE_COLLECTION_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_move_collection_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1274-001.md", + "behavior": "Verify the OBJECT_MOVE_COLLECTION_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1274-001:OBJECT_MOVE_COLLECTION_OPERATOR_BATCH:c60f51c2f088361e", + "selectedRecordIds": [ + "operator:OBJECT_OT_move_to_collection" + ], + "module": { + "moduleId": "OBJECT_MOVE_COLLECTION_OPERATOR_BATCH", + "batchId": "WBV2-P1274-001:OBJECT_MOVE_COLLECTION_OPERATOR_BATCH:c60f51c2f088361e", + "selectedRecordIds": [ + "operator:OBJECT_OT_move_to_collection" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_MOVE_COLLECTION_OPERATOR_BATCH-READER", + "CAP-OBJECT_MOVE_COLLECTION_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_MOVE_COLLECTION_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-move-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P24-001-OBJECT_OPERATIONS.MOVE_COLLECTION.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_move_to_collection type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1274-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1274-001/object-move-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P24-001-OBJECT_OPERATIONS.MOVE_COLLECTION.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_move_to_collection\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-move-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1274-001/object-move-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_move_to_collection" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1275-000", + "phase": "1275", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1274-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1275", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1275-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1275-001", + "phase": "1275", + "title": "verify object visibility clear operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1275-000" + ], + "parityId": "OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_visibility_clear_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1275-001.md", + "behavior": "Verify the OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1275-001:OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH:e4871b703871cd02", + "selectedRecordIds": [ + "operator:OBJECT_OT_hide_view_clear" + ], + "module": { + "moduleId": "OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH", + "batchId": "WBV2-P1275-001:OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH:e4871b703871cd02", + "selectedRecordIds": [ + "operator:OBJECT_OT_hide_view_clear" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH-READER", + "CAP-OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_VISIBILITY_CLEAR_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-visibility-clear-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_hide_view_clear type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1275-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1275-001/object-visibility-clear-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_hide_view_clear\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-visibility-clear-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1275-001/object-visibility-clear-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_hide_view_clear" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1276-000", + "phase": "1276", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1275-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1276", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1276-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1276-001", + "phase": "1276", + "title": "verify object transform apply operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1276-000" + ], + "parityId": "OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_transform_apply_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1276-001.md", + "behavior": "Verify the OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1276-001:OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH:755c29f7c83e7e61", + "selectedRecordIds": [ + "operator:OBJECT_OT_transform_apply" + ], + "module": { + "moduleId": "OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH", + "batchId": "WBV2-P1276-001:OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH:755c29f7c83e7e61", + "selectedRecordIds": [ + "operator:OBJECT_OT_transform_apply" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH-READER", + "CAP-OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_TRANSFORM_APPLY_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-apply-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_transform_apply type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1276-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1276-001/object-transform-apply-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_transform_apply\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-transform-apply-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1276-001/object-transform-apply-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_transform_apply" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1277-000", + "phase": "1277", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1276-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1277", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1277-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1277-001", + "phase": "1277", + "title": "verify mesh bevel operator through native Main", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1277-000" + ], + "parityId": "MESH_BEVEL_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_bevel_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1277-001.md", + "behavior": "Verify the MESH_BEVEL_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1277-001:MESH_BEVEL_OPERATOR_BATCH:ff54da8bdac6a382", + "selectedRecordIds": [ + "operator:MESH_OT_bevel" + ], + "module": { + "moduleId": "MESH_BEVEL_OPERATOR_BATCH", + "batchId": "WBV2-P1277-001:MESH_BEVEL_OPERATOR_BATCH:ff54da8bdac6a382", + "selectedRecordIds": [ + "operator:MESH_OT_bevel" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_BEVEL_OPERATOR_BATCH-READER", + "CAP-MESH_BEVEL_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_BEVEL_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_bevel type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1277-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1277-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=BEVEL WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_bevel\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1277-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_bevel" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1278-000", + "phase": "1278", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1277-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1278", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1278-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1278-001", + "phase": "1278", + "title": "verify mesh inset operator through native Main", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1278-000" + ], + "parityId": "MESH_INSET_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_inset_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1278-001.md", + "behavior": "Verify the MESH_INSET_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1278-001:MESH_INSET_OPERATOR_BATCH:152b6ff293359f2b", + "selectedRecordIds": [ + "operator:MESH_OT_inset" + ], + "module": { + "moduleId": "MESH_INSET_OPERATOR_BATCH", + "batchId": "WBV2-P1278-001:MESH_INSET_OPERATOR_BATCH:152b6ff293359f2b", + "selectedRecordIds": [ + "operator:MESH_OT_inset" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_INSET_OPERATOR_BATCH-READER", + "CAP-MESH_INSET_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_INSET_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_inset type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1278-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1278-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=INSET WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_inset\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1278-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_inset" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1279-000", + "phase": "1279", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1278-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1279", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1279-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1279-001", + "phase": "1279", + "title": "verify mesh loop cut operator through native Main", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1279-000" + ], + "parityId": "MESH_LOOPCUT_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_loopcut_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1279-001.md", + "behavior": "Verify the MESH_LOOPCUT_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1279-001:MESH_LOOPCUT_OPERATOR_BATCH:dd29399cd0368e44", + "selectedRecordIds": [ + "operator:MESH_OT_loopcut" + ], + "module": { + "moduleId": "MESH_LOOPCUT_OPERATOR_BATCH", + "batchId": "WBV2-P1279-001:MESH_LOOPCUT_OPERATOR_BATCH:dd29399cd0368e44", + "selectedRecordIds": [ + "operator:MESH_OT_loopcut" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_LOOPCUT_OPERATOR_BATCH-READER", + "CAP-MESH_LOOPCUT_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_LOOPCUT_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_loopcut type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1279-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1279-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=LOOP_CUT WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_loopcut\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1279-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_loopcut" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1280-000", + "phase": "1280", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1279-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1280", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1280-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1280-001", + "phase": "1280", + "title": "verify mesh extrude operator through native Main", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1280-000" + ], + "parityId": "MESH_EXTRUDE_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1280-001.md", + "behavior": "Verify the MESH_EXTRUDE_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1280-001:MESH_EXTRUDE_OPERATOR_BATCH:f4172e6b8ddbcf8b", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_region" + ], + "module": { + "moduleId": "MESH_EXTRUDE_OPERATOR_BATCH", + "batchId": "WBV2-P1280-001:MESH_EXTRUDE_OPERATOR_BATCH:f4172e6b8ddbcf8b", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_region" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_OPERATOR_BATCH-READER", + "CAP-MESH_EXTRUDE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_region type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1280-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1280-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_extrude_region\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1280-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_extrude_region" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1281-000", + "phase": "1281", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1280-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1281", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1281-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1281-001", + "phase": "1281", + "title": "verify mesh dissolve operator through native Main", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1281-000" + ], + "parityId": "MESH_DISSOLVE_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1281-001.md", + "behavior": "Verify the MESH_DISSOLVE_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1281-001:MESH_DISSOLVE_OPERATOR_BATCH:5c5a52ee6203548e", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_edges" + ], + "module": { + "moduleId": "MESH_DISSOLVE_OPERATOR_BATCH", + "batchId": "WBV2-P1281-001:MESH_DISSOLVE_OPERATOR_BATCH:5c5a52ee6203548e", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_edges" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_OPERATOR_BATCH-READER", + "CAP-MESH_DISSOLVE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_dissolve_edges type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1281-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1281-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_dissolve_edges\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1281-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_dissolve_edges" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1282-000", + "phase": "1282", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1281-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1282", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1282-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1282-001", + "phase": "1282", + "title": "verify mesh merge operator through native Main", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1282-000" + ], + "parityId": "MESH_MERGE_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_merge_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1282-001.md", + "behavior": "Verify the MESH_MERGE_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1282-001:MESH_MERGE_OPERATOR_BATCH:e84ca557ac7a12d7", + "selectedRecordIds": [ + "operator:MESH_OT_merge" + ], + "module": { + "moduleId": "MESH_MERGE_OPERATOR_BATCH", + "batchId": "WBV2-P1282-001:MESH_MERGE_OPERATOR_BATCH:e84ca557ac7a12d7", + "selectedRecordIds": [ + "operator:MESH_OT_merge" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_MERGE_OPERATOR_BATCH-READER", + "CAP-MESH_MERGE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_MERGE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_merge type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1282-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1282-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=MERGE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_merge\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1282-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_merge" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1283-000", + "phase": "1283", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1282-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1283", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1283-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1283-001", + "phase": "1283", + "title": "verify object location clear operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1283-000" + ], + "parityId": "OBJECT_LOCATION_CLEAR_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_location_clear_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1283-001.md", + "behavior": "Verify the OBJECT_LOCATION_CLEAR_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1283-001:OBJECT_LOCATION_CLEAR_OPERATOR_BATCH:84dba9367fb529a7", + "selectedRecordIds": [ + "operator:OBJECT_OT_location_clear" + ], + "module": { + "moduleId": "OBJECT_LOCATION_CLEAR_OPERATOR_BATCH", + "batchId": "WBV2-P1283-001:OBJECT_LOCATION_CLEAR_OPERATOR_BATCH:84dba9367fb529a7", + "selectedRecordIds": [ + "operator:OBJECT_OT_location_clear" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_LOCATION_CLEAR_OPERATOR_BATCH-READER", + "CAP-OBJECT_LOCATION_CLEAR_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_LOCATION_CLEAR_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_location_clear type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1283-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1283-001/object-transform-clear-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_OPERATION=LOCATION WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_location_clear\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1283-001/object-transform-clear-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_location_clear" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1284-000", + "phase": "1284", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1283-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1284", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1284-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1284-001", + "phase": "1284", + "title": "verify object rotation clear operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1284-000" + ], + "parityId": "OBJECT_ROTATION_CLEAR_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_rotation_clear_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1284-001.md", + "behavior": "Verify the OBJECT_ROTATION_CLEAR_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1284-001:OBJECT_ROTATION_CLEAR_OPERATOR_BATCH:3db1b4e696cc9048", + "selectedRecordIds": [ + "operator:OBJECT_OT_rotation_clear" + ], + "module": { + "moduleId": "OBJECT_ROTATION_CLEAR_OPERATOR_BATCH", + "batchId": "WBV2-P1284-001:OBJECT_ROTATION_CLEAR_OPERATOR_BATCH:3db1b4e696cc9048", + "selectedRecordIds": [ + "operator:OBJECT_OT_rotation_clear" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_ROTATION_CLEAR_OPERATOR_BATCH-READER", + "CAP-OBJECT_ROTATION_CLEAR_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_ROTATION_CLEAR_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_rotation_clear type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1284-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1284-001/object-transform-clear-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_OPERATION=ROTATION WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_rotation_clear\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1284-001/object-transform-clear-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_rotation_clear" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1285-000", + "phase": "1285", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1284-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1285", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1285-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1285-001", + "phase": "1285", + "title": "verify object scale clear operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1285-000" + ], + "parityId": "OBJECT_SCALE_CLEAR_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_scale_clear_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1285-001.md", + "behavior": "Verify the OBJECT_SCALE_CLEAR_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1285-001:OBJECT_SCALE_CLEAR_OPERATOR_BATCH:32d55f0234d5f6c5", + "selectedRecordIds": [ + "operator:OBJECT_OT_scale_clear" + ], + "module": { + "moduleId": "OBJECT_SCALE_CLEAR_OPERATOR_BATCH", + "batchId": "WBV2-P1285-001:OBJECT_SCALE_CLEAR_OPERATOR_BATCH:32d55f0234d5f6c5", + "selectedRecordIds": [ + "operator:OBJECT_OT_scale_clear" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_SCALE_CLEAR_OPERATOR_BATCH-READER", + "CAP-OBJECT_SCALE_CLEAR_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_SCALE_CLEAR_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_scale_clear type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1285-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1285-001/object-transform-clear-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_OPERATION=SCALE WBV2_BATCH_CLEAR_MODE=SCALE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_scale_clear\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1285-001/object-transform-clear-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_scale_clear" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1286-000", + "phase": "1286", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1285-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1286", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1286-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1286-001", + "phase": "1286", + "title": "verify object join operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1286-000" + ], + "parityId": "OBJECT_JOIN_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_join_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1286-001.md", + "behavior": "Verify the OBJECT_JOIN_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1286-001:OBJECT_JOIN_OPERATOR_BATCH:de8fe23bd410e593", + "selectedRecordIds": [ + "operator:OBJECT_OT_join" + ], + "module": { + "moduleId": "OBJECT_JOIN_OPERATOR_BATCH", + "batchId": "WBV2-P1286-001:OBJECT_JOIN_OPERATOR_BATCH:de8fe23bd410e593", + "selectedRecordIds": [ + "operator:OBJECT_OT_join" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_JOIN_OPERATOR_BATCH-READER", + "CAP-OBJECT_JOIN_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_JOIN_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-object-operations-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_join type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1286-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1286-001/mesh-object-operations-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_OPERATION=JOIN WBV2_BATCH_CLEAR_MODE=JOIN WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_join\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-object-operations-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1286-001/mesh-object-operations-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_join" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1287-000", + "phase": "1287", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1286-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1287", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1287-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1287-001", + "phase": "1287", + "title": "verify material slot add operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1287-000" + ], + "parityId": "OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_material_slot_add_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1287-001.md", + "behavior": "Verify the OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1287-001:OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH:2f9e62b0f20b4109", + "selectedRecordIds": [ + "operator:OBJECT_OT_material_slot_add" + ], + "module": { + "moduleId": "OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH", + "batchId": "WBV2-P1287-001:OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH:2f9e62b0f20b4109", + "selectedRecordIds": [ + "operator:OBJECT_OT_material_slot_add" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH-READER", + "CAP-OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_MATERIAL_SLOT_ADD_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/render/render_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-material-slot-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_material_slot_add type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1287-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1287-001/material-slot-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_OPERATION=MATERIAL_SLOT_ADD WBV2_BATCH_CLEAR_MODE=MATERIAL_SLOT_ADD WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_material_slot_add\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-slot-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1287-001/material-slot-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_material_slot_add" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1288-000", + "phase": "1288", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1287-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1288", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1288-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1288-001", + "phase": "1288", + "title": "verify mesh decimate operator through native Main", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1288-000" + ], + "parityId": "MESH_DECIMATE_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_decimate_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1288-001.md", + "behavior": "Verify the MESH_DECIMATE_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1288-001:MESH_DECIMATE_OPERATOR_BATCH:874ad3bb4b2d4cd0", + "selectedRecordIds": [ + "operator:MESH_OT_decimate" + ], + "module": { + "moduleId": "MESH_DECIMATE_OPERATOR_BATCH", + "batchId": "WBV2-P1288-001:MESH_DECIMATE_OPERATOR_BATCH:874ad3bb4b2d4cd0", + "selectedRecordIds": [ + "operator:MESH_OT_decimate" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DECIMATE_OPERATOR_BATCH-READER", + "CAP-MESH_DECIMATE_OPERATOR_BATCH-RECOVERY", + "CAP-MESH_DECIMATE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-modifier-parameter-production.spec.ts", + "tests/files/web/generated/WBV2-P4-001-MODIFIER.DECLARED_SLICES.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_decimate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1288-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1288-001/modifier-parameter-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P4-001-MODIFIER.DECLARED_SLICES.blend WBV2_BATCH_OPERATION=DECIMATE WBV2_BATCH_CLEAR_MODE=DECIMATE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_decimate\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-parameter-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1288-001/modifier-parameter-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_decimate" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1289-000", + "phase": "1289", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1288-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1289", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1289-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1289-001", + "phase": "1289", + "title": "verify material slot remove operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1289-000" + ], + "parityId": "OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_material_slot_remove_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1289-001.md", + "behavior": "Verify the OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1289-001:OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH:ab7b239f4e11124b", + "selectedRecordIds": [ + "operator:OBJECT_OT_material_slot_remove" + ], + "module": { + "moduleId": "OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH", + "batchId": "WBV2-P1289-001:OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH:ab7b239f4e11124b", + "selectedRecordIds": [ + "operator:OBJECT_OT_material_slot_remove" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH-READER", + "CAP-OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_MATERIAL_SLOT_REMOVE_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/render/render_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-material-slot-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_material_slot_remove type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1289-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1289-001/material-slot-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_OPERATION=MATERIAL_SLOT_REMOVE WBV2_BATCH_CLEAR_MODE=MATERIAL_SLOT_REMOVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_material_slot_remove\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-slot-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1289-001/material-slot-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_material_slot_remove" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1290-000", + "phase": "1290", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1289-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1290", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1290-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1290-001", + "phase": "1290", + "title": "verify material slot assign operator through native Main", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1290-000" + ], + "parityId": "OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_material_slot_assign_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1290-001.md", + "behavior": "Verify the OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1290-001:OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH:5c7845576845cc50", + "selectedRecordIds": [ + "operator:OBJECT_OT_material_slot_assign" + ], + "module": { + "moduleId": "OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH", + "batchId": "WBV2-P1290-001:OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH:5c7845576845cc50", + "selectedRecordIds": [ + "operator:OBJECT_OT_material_slot_assign" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH-READER", + "CAP-OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH-RECOVERY", + "CAP-OBJECT_MATERIAL_SLOT_ASSIGN_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/render/render_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-material-slot-assign-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_material_slot_assign type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1290-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1290-001/material-slot-assign-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_OPERATION=MATERIAL_SLOT_ASSIGN WBV2_BATCH_CLEAR_MODE=MATERIAL_SLOT_ASSIGN WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_material_slot_assign\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-slot-assign-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1290-001/material-slot-assign-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_material_slot_assign" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1291-000", + "phase": "1291", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1290-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1291", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1291-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1291-001", + "phase": "1291", + "title": "verify UV unwrap operator through native Main", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1291-000" + ], + "parityId": "UV_UNWRAP_OPERATOR_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-uv_unwrap_operator_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1291-001.md", + "behavior": "Verify the UV_UNWRAP_OPERATOR_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1291-001:UV_UNWRAP_OPERATOR_BATCH:8111928c04bd086d", + "selectedRecordIds": [ + "operator:UV_OT_unwrap" + ], + "module": { + "moduleId": "UV_UNWRAP_OPERATOR_BATCH", + "batchId": "WBV2-P1291-001:UV_UNWRAP_OPERATOR_BATCH:8111928c04bd086d", + "selectedRecordIds": [ + "operator:UV_OT_unwrap" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-UV_UNWRAP_OPERATOR_BATCH-READER", + "CAP-UV_UNWRAP_OPERATOR_BATCH-RECOVERY", + "CAP-UV_UNWRAP_OPERATOR_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/uvedit/uvedit_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-uv-unwrap-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "UV_OT_unwrap type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1291-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1291-001/uv-unwrap-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend WBV2_BATCH_OPERATION=UV_UNWRAP WBV2_BATCH_CLEAR_MODE=UV_UNWRAP WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:UV_OT_unwrap\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-uv-unwrap-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1291-001/uv-unwrap-production.json" + ], + "coverageBindings": [ + "operator:UV_OT_unwrap" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1292-000", + "phase": "1292", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1291-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1292", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1292-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1292-001", + "phase": "1292", + "title": "verify ACTION_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1292-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1292-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1292-001:OBJECT_DUPLICATE_MACRO_BATCH:811c939e205ecafd", + "selectedRecordIds": [ + "operator-macro:ACTION_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1292-001:OBJECT_DUPLICATE_MACRO_BATCH:811c939e205ecafd", + "selectedRecordIds": [ + "operator-macro:ACTION_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_action/action_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ACTION_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1292-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1292-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:ACTION_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1292-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:ACTION_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1293-000", + "phase": "1293", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1292-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1293", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1293-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1293-001", + "phase": "1293", + "title": "verify ARMATURE_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1293-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1293-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1293-001:OBJECT_DUPLICATE_MACRO_BATCH:0923f8086c8283b9", + "selectedRecordIds": [ + "operator-macro:ARMATURE_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1293-001:OBJECT_DUPLICATE_MACRO_BATCH:0923f8086c8283b9", + "selectedRecordIds": [ + "operator-macro:ARMATURE_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ARMATURE_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1293-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1293-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:ARMATURE_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1293-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:ARMATURE_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1294-000", + "phase": "1294", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1293-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1294", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1294-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1294-001", + "phase": "1294", + "title": "verify CURVES_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1294-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1294-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1294-001:OBJECT_DUPLICATE_MACRO_BATCH:4e6ddb1c1659686d", + "selectedRecordIds": [ + "operator-macro:CURVES_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1294-001:OBJECT_DUPLICATE_MACRO_BATCH:4e6ddb1c1659686d", + "selectedRecordIds": [ + "operator-macro:CURVES_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curves/intern/curves_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CURVES_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1294-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1294-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:CURVES_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1294-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:CURVES_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1295-000", + "phase": "1295", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1294-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1295", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1295-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1295-001", + "phase": "1295", + "title": "verify CURVE_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1295-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1295-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1295-001:OBJECT_DUPLICATE_MACRO_BATCH:e7a5080501642d57", + "selectedRecordIds": [ + "operator-macro:CURVE_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1295-001:OBJECT_DUPLICATE_MACRO_BATCH:e7a5080501642d57", + "selectedRecordIds": [ + "operator-macro:CURVE_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CURVE_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1295-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1295-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:CURVE_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1295-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:CURVE_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1296-000", + "phase": "1296", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1295-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1296", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1296-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1296-001", + "phase": "1296", + "title": "verify GRAPH_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1296-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1296-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1296-001:OBJECT_DUPLICATE_MACRO_BATCH:2cf09e5b7806c522", + "selectedRecordIds": [ + "operator-macro:GRAPH_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1296-001:OBJECT_DUPLICATE_MACRO_BATCH:2cf09e5b7806c522", + "selectedRecordIds": [ + "operator-macro:GRAPH_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_graph/graph_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GRAPH_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1296-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1296-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:GRAPH_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1296-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:GRAPH_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1297-000", + "phase": "1297", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1296-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1297", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1297-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1297-001", + "phase": "1297", + "title": "verify GREASE_PENCIL_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1297-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1297-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1297-001:OBJECT_DUPLICATE_MACRO_BATCH:61f3c99d1c08013f", + "selectedRecordIds": [ + "operator-macro:GREASE_PENCIL_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1297-001:OBJECT_DUPLICATE_MACRO_BATCH:61f3c99d1c08013f", + "selectedRecordIds": [ + "operator-macro:GREASE_PENCIL_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GREASE_PENCIL_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1297-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1297-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:GREASE_PENCIL_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1297-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:GREASE_PENCIL_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1298-000", + "phase": "1298", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1297-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1298", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1298-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1298-001", + "phase": "1298", + "title": "verify MASK_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1298-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1298-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1298-001:OBJECT_DUPLICATE_MACRO_BATCH:b2b5010de365a6fd", + "selectedRecordIds": [ + "operator-macro:MASK_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1298-001:OBJECT_DUPLICATE_MACRO_BATCH:b2b5010de365a6fd", + "selectedRecordIds": [ + "operator-macro:MASK_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MASK_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1298-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1298-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MASK_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1298-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:MASK_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1299-000", + "phase": "1299", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1298-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1299", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1299-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1299-001", + "phase": "1299", + "title": "verify MBALL_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1299-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1299-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1299-001:OBJECT_DUPLICATE_MACRO_BATCH:900d15a3fd089534", + "selectedRecordIds": [ + "operator-macro:MBALL_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1299-001:OBJECT_DUPLICATE_MACRO_BATCH:900d15a3fd089534", + "selectedRecordIds": [ + "operator-macro:MBALL_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/metaball/mball_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MBALL_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1299-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1299-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MBALL_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1299-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:MBALL_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1300-000", + "phase": "1300", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1299-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1300", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1300-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1300-001", + "phase": "1300", + "title": "verify MESH_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1300-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1300-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1300-001:OBJECT_DUPLICATE_MACRO_BATCH:f7038997b9b55fd8", + "selectedRecordIds": [ + "operator-macro:MESH_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1300-001:OBJECT_DUPLICATE_MACRO_BATCH:f7038997b9b55fd8", + "selectedRecordIds": [ + "operator-macro:MESH_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1300-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1300-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1300-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1301-000", + "phase": "1301", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1300-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1301", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1301-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1301-001", + "phase": "1301", + "title": "verify NLA_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1301-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1301-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1301-001:OBJECT_DUPLICATE_MACRO_BATCH:ca1f3895eae4eeae", + "selectedRecordIds": [ + "operator-macro:NLA_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1301-001:OBJECT_DUPLICATE_MACRO_BATCH:ca1f3895eae4eeae", + "selectedRecordIds": [ + "operator-macro:NLA_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_nla/nla_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NLA_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1301-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1301-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:NLA_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1301-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:NLA_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1302-000", + "phase": "1302", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1301-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1302", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1302-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1302-001", + "phase": "1302", + "title": "verify NODE_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1302-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1302-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1302-001:OBJECT_DUPLICATE_MACRO_BATCH:e45d34ebeb76cc3e", + "selectedRecordIds": [ + "operator-macro:NODE_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1302-001:OBJECT_DUPLICATE_MACRO_BATCH:e45d34ebeb76cc3e", + "selectedRecordIds": [ + "operator-macro:NODE_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NODE_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1302-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1302-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:NODE_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1302-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:NODE_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1303-000", + "phase": "1303", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1302-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1303", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1303-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1303-001", + "phase": "1303", + "title": "verify NODE_OT_duplicate_move_keep_inputs through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1303-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1303-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1303-001:OBJECT_DUPLICATE_MACRO_BATCH:48ae9eb65d4c3123", + "selectedRecordIds": [ + "operator-macro:NODE_OT_duplicate_move_keep_inputs" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1303-001:OBJECT_DUPLICATE_MACRO_BATCH:48ae9eb65d4c3123", + "selectedRecordIds": [ + "operator-macro:NODE_OT_duplicate_move_keep_inputs" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NODE_OT_duplicate_move_keep_inputs type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1303-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1303-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:NODE_OT_duplicate_move_keep_inputs\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1303-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:NODE_OT_duplicate_move_keep_inputs" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1304-000", + "phase": "1304", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1303-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1304", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1304-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1304-001", + "phase": "1304", + "title": "verify NODE_OT_duplicate_move_linked through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1304-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1304-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1304-001:OBJECT_DUPLICATE_MACRO_BATCH:416ae585863b18b0", + "selectedRecordIds": [ + "operator-macro:NODE_OT_duplicate_move_linked" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1304-001:OBJECT_DUPLICATE_MACRO_BATCH:416ae585863b18b0", + "selectedRecordIds": [ + "operator-macro:NODE_OT_duplicate_move_linked" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NODE_OT_duplicate_move_linked type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1304-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1304-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:NODE_OT_duplicate_move_linked\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1304-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:NODE_OT_duplicate_move_linked" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1305-000", + "phase": "1305", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1304-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1305", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1305-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1305-001", + "phase": "1305", + "title": "verify OBJECT_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1305-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1305-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1305-001:OBJECT_DUPLICATE_MACRO_BATCH:504373c48738bf0d", + "selectedRecordIds": [ + "operator-macro:OBJECT_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1305-001:OBJECT_DUPLICATE_MACRO_BATCH:504373c48738bf0d", + "selectedRecordIds": [ + "operator-macro:OBJECT_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1305-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1305-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:OBJECT_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1305-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:OBJECT_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1306-000", + "phase": "1306", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1305-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1306", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1306-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1306-001", + "phase": "1306", + "title": "verify OBJECT_OT_duplicate_move_linked through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1306-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1306-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1306-001:OBJECT_DUPLICATE_MACRO_BATCH:b1f87ff7cb3f84cd", + "selectedRecordIds": [ + "operator-macro:OBJECT_OT_duplicate_move_linked" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1306-001:OBJECT_DUPLICATE_MACRO_BATCH:b1f87ff7cb3f84cd", + "selectedRecordIds": [ + "operator-macro:OBJECT_OT_duplicate_move_linked" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_duplicate_move_linked type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1306-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1306-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:OBJECT_OT_duplicate_move_linked\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1306-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:OBJECT_OT_duplicate_move_linked" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1307-000", + "phase": "1307", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1306-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1307", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1307-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1307-001", + "phase": "1307", + "title": "verify POINTCLOUD_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1307-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1307-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1307-001:OBJECT_DUPLICATE_MACRO_BATCH:59c11b73f6c393b5", + "selectedRecordIds": [ + "operator-macro:POINTCLOUD_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1307-001:OBJECT_DUPLICATE_MACRO_BATCH:59c11b73f6c393b5", + "selectedRecordIds": [ + "operator-macro:POINTCLOUD_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/pointcloud/intern/operators.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "POINTCLOUD_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1307-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1307-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:POINTCLOUD_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1307-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:POINTCLOUD_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1308-000", + "phase": "1308", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1307-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1308", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1308-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1308-001", + "phase": "1308", + "title": "verify SEQUENCER_OT_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1308-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1308-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1308-001:OBJECT_DUPLICATE_MACRO_BATCH:ab6a0658305de0cc", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1308-001:OBJECT_DUPLICATE_MACRO_BATCH:ab6a0658305de0cc", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SEQUENCER_OT_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1308-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1308-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:SEQUENCER_OT_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1308-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:SEQUENCER_OT_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1309-000", + "phase": "1309", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1308-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1309", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1309-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1309-001", + "phase": "1309", + "title": "verify SEQUENCER_OT_duplicate_move_linked through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1309-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1309-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1309-001:OBJECT_DUPLICATE_MACRO_BATCH:29f998fff01771fa", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_duplicate_move_linked" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1309-001:OBJECT_DUPLICATE_MACRO_BATCH:29f998fff01771fa", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_duplicate_move_linked" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SEQUENCER_OT_duplicate_move_linked type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1309-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1309-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:SEQUENCER_OT_duplicate_move_linked\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1309-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:SEQUENCER_OT_duplicate_move_linked" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1310-000", + "phase": "1310", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1309-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1310", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1310-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1310-001", + "phase": "1310", + "title": "verify SEQUENCER_OT_preview_duplicate_move through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1310-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1310-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1310-001:OBJECT_DUPLICATE_MACRO_BATCH:080c07ec31371925", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_preview_duplicate_move" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1310-001:OBJECT_DUPLICATE_MACRO_BATCH:080c07ec31371925", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_preview_duplicate_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SEQUENCER_OT_preview_duplicate_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1310-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1310-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:SEQUENCER_OT_preview_duplicate_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1310-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:SEQUENCER_OT_preview_duplicate_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1311-000", + "phase": "1311", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1310-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1311", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1311-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1311-001", + "phase": "1311", + "title": "verify SEQUENCER_OT_preview_duplicate_move_linked through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1311-000" + ], + "parityId": "OBJECT_DUPLICATE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_duplicate_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1311-001.md", + "behavior": "Verify the OBJECT_DUPLICATE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1311-001:OBJECT_DUPLICATE_MACRO_BATCH:26e874efa0152e2c", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_preview_duplicate_move_linked" + ], + "module": { + "moduleId": "OBJECT_DUPLICATE_MACRO_BATCH", + "batchId": "WBV2-P1311-001:OBJECT_DUPLICATE_MACRO_BATCH:26e874efa0152e2c", + "selectedRecordIds": [ + "operator-macro:SEQUENCER_OT_preview_duplicate_move_linked" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-READER", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DUPLICATE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-duplicate-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SEQUENCER_OT_preview_duplicate_move_linked type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1311-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1311-001/object-duplicate-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:SEQUENCER_OT_preview_duplicate_move_linked\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-duplicate-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1311-001/object-duplicate-production.json" + ], + "coverageBindings": [ + "operator-macro:SEQUENCER_OT_preview_duplicate_move_linked" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1312-000", + "phase": "1312", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1311-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1312", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1312-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1312-001", + "phase": "1312", + "title": "verify NODE_OT_delete_copy_reconnect through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1312-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1312-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1312-001:OBJECT_DELETE_MACRO_BATCH:266367c3120af19f", + "selectedRecordIds": [ + "operator-macro:NODE_OT_delete_copy_reconnect" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1312-001:OBJECT_DELETE_MACRO_BATCH:266367c3120af19f", + "selectedRecordIds": [ + "operator-macro:NODE_OT_delete_copy_reconnect" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NODE_OT_delete_copy_reconnect type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1312-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1312-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:NODE_OT_delete_copy_reconnect\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1312-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator-macro:NODE_OT_delete_copy_reconnect" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1313-000", + "phase": "1313", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1312-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1313", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1313-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1313-001", + "phase": "1313", + "title": "verify ACTION_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1313-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1313-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1313-001:OBJECT_DELETE_MACRO_BATCH:ffc87aeab4ca8657", + "selectedRecordIds": [ + "operator:ACTION_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1313-001:OBJECT_DELETE_MACRO_BATCH:ffc87aeab4ca8657", + "selectedRecordIds": [ + "operator:ACTION_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_action/action_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ACTION_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1313-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1313-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ACTION_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1313-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:ACTION_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1314-000", + "phase": "1314", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1313-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1314", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1314-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1314-001", + "phase": "1314", + "title": "verify ANIM_OT_channels_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1314-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1314-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1314-001:OBJECT_DELETE_MACRO_BATCH:290fc45a1dd07df5", + "selectedRecordIds": [ + "operator:ANIM_OT_channels_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1314-001:OBJECT_DELETE_MACRO_BATCH:290fc45a1dd07df5", + "selectedRecordIds": [ + "operator:ANIM_OT_channels_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_channels_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ANIM_OT_channels_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1314-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1314-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ANIM_OT_channels_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1314-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:ANIM_OT_channels_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1315-000", + "phase": "1315", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1314-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1315", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1315-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1315-001", + "phase": "1315", + "title": "verify ANIM_OT_keyframe_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1315-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1315-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1315-001:OBJECT_DELETE_MACRO_BATCH:beca8d72a79a20a3", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1315-001:OBJECT_DELETE_MACRO_BATCH:beca8d72a79a20a3", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ANIM_OT_keyframe_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1315-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1315-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ANIM_OT_keyframe_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1315-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:ANIM_OT_keyframe_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1316-000", + "phase": "1316", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1315-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1316", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1316-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1316-001", + "phase": "1316", + "title": "verify ANIM_OT_keyframe_delete_button through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1316-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1316-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1316-001:OBJECT_DELETE_MACRO_BATCH:66d7693e521bbf7b", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_button" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1316-001:OBJECT_DELETE_MACRO_BATCH:66d7693e521bbf7b", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_button" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ANIM_OT_keyframe_delete_button type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1316-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1316-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ANIM_OT_keyframe_delete_button\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1316-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:ANIM_OT_keyframe_delete_button" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1317-000", + "phase": "1317", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1316-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1317", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1317-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1317-001", + "phase": "1317", + "title": "verify ANIM_OT_keyframe_delete_by_name through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1317-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1317-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1317-001:OBJECT_DELETE_MACRO_BATCH:aa21ad30b4211c49", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_by_name" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1317-001:OBJECT_DELETE_MACRO_BATCH:aa21ad30b4211c49", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_by_name" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ANIM_OT_keyframe_delete_by_name type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1317-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1317-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ANIM_OT_keyframe_delete_by_name\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1317-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:ANIM_OT_keyframe_delete_by_name" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1318-000", + "phase": "1318", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1317-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1318", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1318-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1318-001", + "phase": "1318", + "title": "verify ANIM_OT_keyframe_delete_v3d through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1318-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1318-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1318-001:OBJECT_DELETE_MACRO_BATCH:59a16f5773002c24", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_v3d" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1318-001:OBJECT_DELETE_MACRO_BATCH:59a16f5773002c24", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_v3d" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ANIM_OT_keyframe_delete_v3d type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1318-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1318-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ANIM_OT_keyframe_delete_v3d\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1318-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:ANIM_OT_keyframe_delete_v3d" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1319-000", + "phase": "1319", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1318-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1319", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1319-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1319-001", + "phase": "1319", + "title": "verify ANIM_OT_keyframe_delete_vse through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1319-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1319-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1319-001:OBJECT_DELETE_MACRO_BATCH:62e35464233255a4", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_vse" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1319-001:OBJECT_DELETE_MACRO_BATCH:62e35464233255a4", + "selectedRecordIds": [ + "operator:ANIM_OT_keyframe_delete_vse" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ANIM_OT_keyframe_delete_vse type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1319-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1319-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ANIM_OT_keyframe_delete_vse\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1319-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:ANIM_OT_keyframe_delete_vse" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1320-000", + "phase": "1320", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1319-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1320", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1320-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1320-001", + "phase": "1320", + "title": "verify ARMATURE_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1320-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1320-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1320-001:OBJECT_DELETE_MACRO_BATCH:3dc748624bf180d7", + "selectedRecordIds": [ + "operator:ARMATURE_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1320-001:OBJECT_DELETE_MACRO_BATCH:3dc748624bf180d7", + "selectedRecordIds": [ + "operator:ARMATURE_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ARMATURE_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1320-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1320-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ARMATURE_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1320-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:ARMATURE_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1321-000", + "phase": "1321", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1320-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1321", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1321-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1321-001", + "phase": "1321", + "title": "verify ASSET_OT_catalog_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1321-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1321-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1321-001:OBJECT_DELETE_MACRO_BATCH:e6f7639baf491f4d", + "selectedRecordIds": [ + "operator:ASSET_OT_catalog_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1321-001:OBJECT_DELETE_MACRO_BATCH:e6f7639baf491f4d", + "selectedRecordIds": [ + "operator:ASSET_OT_catalog_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/asset/intern/asset_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ASSET_OT_catalog_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1321-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1321-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ASSET_OT_catalog_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1321-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:ASSET_OT_catalog_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1322-000", + "phase": "1322", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1321-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1322", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1322-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1322-001", + "phase": "1322", + "title": "verify BRUSH_OT_asset_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1322-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1322-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1322-001:OBJECT_DELETE_MACRO_BATCH:f31405fceb00c7a7", + "selectedRecordIds": [ + "operator:BRUSH_OT_asset_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1322-001:OBJECT_DELETE_MACRO_BATCH:f31405fceb00c7a7", + "selectedRecordIds": [ + "operator:BRUSH_OT_asset_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/sculpt_paint/paint_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "BRUSH_OT_asset_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1322-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1322-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:BRUSH_OT_asset_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1322-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:BRUSH_OT_asset_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1323-000", + "phase": "1323", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1322-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1323", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1323-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1323-001", + "phase": "1323", + "title": "verify CLIP_OT_delete_marker through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1323-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1323-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1323-001:OBJECT_DELETE_MACRO_BATCH:209753308893d52a", + "selectedRecordIds": [ + "operator:CLIP_OT_delete_marker" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1323-001:OBJECT_DELETE_MACRO_BATCH:209753308893d52a", + "selectedRecordIds": [ + "operator:CLIP_OT_delete_marker" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CLIP_OT_delete_marker type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1323-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1323-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CLIP_OT_delete_marker\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1323-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:CLIP_OT_delete_marker" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1324-000", + "phase": "1324", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1323-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1324", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1324-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1324-001", + "phase": "1324", + "title": "verify CLIP_OT_delete_track through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1324-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1324-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1324-001:OBJECT_DELETE_MACRO_BATCH:b8fade257b34994a", + "selectedRecordIds": [ + "operator:CLIP_OT_delete_track" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1324-001:OBJECT_DELETE_MACRO_BATCH:b8fade257b34994a", + "selectedRecordIds": [ + "operator:CLIP_OT_delete_track" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CLIP_OT_delete_track type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1324-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1324-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CLIP_OT_delete_track\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1324-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:CLIP_OT_delete_track" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1325-000", + "phase": "1325", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1324-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1325", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1325-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1325-001", + "phase": "1325", + "title": "verify CLIP_OT_graph_delete_curve through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1325-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1325-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1325-001:OBJECT_DELETE_MACRO_BATCH:707e82ac5c21f6c3", + "selectedRecordIds": [ + "operator:CLIP_OT_graph_delete_curve" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1325-001:OBJECT_DELETE_MACRO_BATCH:707e82ac5c21f6c3", + "selectedRecordIds": [ + "operator:CLIP_OT_graph_delete_curve" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CLIP_OT_graph_delete_curve type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1325-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1325-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CLIP_OT_graph_delete_curve\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1325-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:CLIP_OT_graph_delete_curve" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1326-000", + "phase": "1326", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1325-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1326", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1326-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1326-001", + "phase": "1326", + "title": "verify CLIP_OT_graph_delete_knot through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1326-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1326-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1326-001:OBJECT_DELETE_MACRO_BATCH:b437fad9579b5a17", + "selectedRecordIds": [ + "operator:CLIP_OT_graph_delete_knot" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1326-001:OBJECT_DELETE_MACRO_BATCH:b437fad9579b5a17", + "selectedRecordIds": [ + "operator:CLIP_OT_graph_delete_knot" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CLIP_OT_graph_delete_knot type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1326-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1326-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CLIP_OT_graph_delete_knot\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1326-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:CLIP_OT_graph_delete_knot" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1327-000", + "phase": "1327", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1326-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1327", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1327-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1327-001", + "phase": "1327", + "title": "verify CLIP_OT_keyframe_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1327-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1327-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1327-001:OBJECT_DELETE_MACRO_BATCH:fd3cb8da3866d1b6", + "selectedRecordIds": [ + "operator:CLIP_OT_keyframe_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1327-001:OBJECT_DELETE_MACRO_BATCH:fd3cb8da3866d1b6", + "selectedRecordIds": [ + "operator:CLIP_OT_keyframe_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_clip/space_clip.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CLIP_OT_keyframe_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1327-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1327-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CLIP_OT_keyframe_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1327-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:CLIP_OT_keyframe_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1328-000", + "phase": "1328", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1327-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1328", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1328-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1328-001", + "phase": "1328", + "title": "verify CONSOLE_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1328-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1328-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1328-001:OBJECT_DELETE_MACRO_BATCH:1ea75a3223caaca4", + "selectedRecordIds": [ + "operator:CONSOLE_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1328-001:OBJECT_DELETE_MACRO_BATCH:1ea75a3223caaca4", + "selectedRecordIds": [ + "operator:CONSOLE_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_console/space_console.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CONSOLE_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1328-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1328-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CONSOLE_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1328-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:CONSOLE_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1329-000", + "phase": "1329", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1328-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1329", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1329-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1329-001", + "phase": "1329", + "title": "verify CONSTRAINT_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1329-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1329-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1329-001:OBJECT_DELETE_MACRO_BATCH:48cbbba4745aacfb", + "selectedRecordIds": [ + "operator:CONSTRAINT_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1329-001:OBJECT_DELETE_MACRO_BATCH:48cbbba4745aacfb", + "selectedRecordIds": [ + "operator:CONSTRAINT_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CONSTRAINT_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1329-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1329-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CONSTRAINT_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1329-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:CONSTRAINT_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1330-000", + "phase": "1330", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1329-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1330", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1330-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1330-001", + "phase": "1330", + "title": "verify CURVES_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1330-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1330-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1330-001:OBJECT_DELETE_MACRO_BATCH:f3db5bbfe0b7ecbd", + "selectedRecordIds": [ + "operator:CURVES_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1330-001:OBJECT_DELETE_MACRO_BATCH:f3db5bbfe0b7ecbd", + "selectedRecordIds": [ + "operator:CURVES_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curves/intern/curves_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CURVES_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1330-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1330-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CURVES_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1330-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:CURVES_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1331-000", + "phase": "1331", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1330-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1331", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1331-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1331-001", + "phase": "1331", + "title": "verify CURVE_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1331-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1331-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1331-001:OBJECT_DELETE_MACRO_BATCH:b2bf1ed53edddf62", + "selectedRecordIds": [ + "operator:CURVE_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1331-001:OBJECT_DELETE_MACRO_BATCH:b2bf1ed53edddf62", + "selectedRecordIds": [ + "operator:CURVE_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CURVE_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1331-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1331-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CURVE_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1331-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:CURVE_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1332-000", + "phase": "1332", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1331-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1332", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1332-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1332-001", + "phase": "1332", + "title": "verify FILE_OT_bookmark_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1332-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1332-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1332-001:OBJECT_DELETE_MACRO_BATCH:cae72da15f82a67a", + "selectedRecordIds": [ + "operator:FILE_OT_bookmark_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1332-001:OBJECT_DELETE_MACRO_BATCH:cae72da15f82a67a", + "selectedRecordIds": [ + "operator:FILE_OT_bookmark_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_file/space_file.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FILE_OT_bookmark_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1332-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1332-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:FILE_OT_bookmark_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1332-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:FILE_OT_bookmark_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1333-000", + "phase": "1333", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1332-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1333", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1333-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1333-001", + "phase": "1333", + "title": "verify FILE_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1333-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1333-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1333-001:OBJECT_DELETE_MACRO_BATCH:8aa9ba5e78fc43c9", + "selectedRecordIds": [ + "operator:FILE_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1333-001:OBJECT_DELETE_MACRO_BATCH:8aa9ba5e78fc43c9", + "selectedRecordIds": [ + "operator:FILE_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_file/space_file.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FILE_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1333-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1333-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:FILE_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1333-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:FILE_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1334-000", + "phase": "1334", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1333-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1334", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1334-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1334-001", + "phase": "1334", + "title": "verify FONT_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1334-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1334-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1334-001:OBJECT_DELETE_MACRO_BATCH:c78158291ec665a8", + "selectedRecordIds": [ + "operator:FONT_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1334-001:OBJECT_DELETE_MACRO_BATCH:c78158291ec665a8", + "selectedRecordIds": [ + "operator:FONT_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "FONT_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1334-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1334-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:FONT_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1334-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:FONT_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1335-000", + "phase": "1335", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1334-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1335", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1335-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1335-001", + "phase": "1335", + "title": "verify GPENCIL_OT_annotation_active_frame_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1335-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1335-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1335-001:OBJECT_DELETE_MACRO_BATCH:ec864424ffc659fd", + "selectedRecordIds": [ + "operator:GPENCIL_OT_annotation_active_frame_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1335-001:OBJECT_DELETE_MACRO_BATCH:ec864424ffc659fd", + "selectedRecordIds": [ + "operator:GPENCIL_OT_annotation_active_frame_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/gpencil_legacy/gpencil_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GPENCIL_OT_annotation_active_frame_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1335-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1335-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GPENCIL_OT_annotation_active_frame_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1335-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:GPENCIL_OT_annotation_active_frame_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1336-000", + "phase": "1336", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1335-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1336", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1336-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1336-001", + "phase": "1336", + "title": "verify GRAPH_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1336-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1336-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1336-001:OBJECT_DELETE_MACRO_BATCH:2eee7fcefc7dcc14", + "selectedRecordIds": [ + "operator:GRAPH_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1336-001:OBJECT_DELETE_MACRO_BATCH:2eee7fcefc7dcc14", + "selectedRecordIds": [ + "operator:GRAPH_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_graph/graph_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GRAPH_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1336-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1336-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GRAPH_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1336-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:GRAPH_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1337-000", + "phase": "1337", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1336-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1337", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1337-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1337-001", + "phase": "1337", + "title": "verify GRAPH_OT_driver_delete_invalid through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1337-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1337-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1337-001:OBJECT_DELETE_MACRO_BATCH:ccc1e9d8ed3c4954", + "selectedRecordIds": [ + "operator:GRAPH_OT_driver_delete_invalid" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1337-001:OBJECT_DELETE_MACRO_BATCH:ccc1e9d8ed3c4954", + "selectedRecordIds": [ + "operator:GRAPH_OT_driver_delete_invalid" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_graph/graph_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GRAPH_OT_driver_delete_invalid type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1337-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1337-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GRAPH_OT_driver_delete_invalid\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1337-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:GRAPH_OT_driver_delete_invalid" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1338-000", + "phase": "1338", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1337-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1338", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1338-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1338-001", + "phase": "1338", + "title": "verify GRAPH_OT_fmodifier_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1338-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1338-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1338-001:OBJECT_DELETE_MACRO_BATCH:ef176984e43319fc", + "selectedRecordIds": [ + "operator:GRAPH_OT_fmodifier_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1338-001:OBJECT_DELETE_MACRO_BATCH:ef176984e43319fc", + "selectedRecordIds": [ + "operator:GRAPH_OT_fmodifier_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_graph/graph_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GRAPH_OT_fmodifier_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1338-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1338-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GRAPH_OT_fmodifier_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1338-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:GRAPH_OT_fmodifier_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1339-000", + "phase": "1339", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1338-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1339", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1339-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1339-001", + "phase": "1339", + "title": "verify GREASE_PENCIL_OT_active_frame_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1339-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1339-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1339-001:OBJECT_DELETE_MACRO_BATCH:5d0774ca778f5ad4", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_active_frame_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1339-001:OBJECT_DELETE_MACRO_BATCH:5d0774ca778f5ad4", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_active_frame_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GREASE_PENCIL_OT_active_frame_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1339-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1339-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GREASE_PENCIL_OT_active_frame_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1339-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:GREASE_PENCIL_OT_active_frame_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1340-000", + "phase": "1340", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1339-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1340", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1340-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1340-001", + "phase": "1340", + "title": "verify GREASE_PENCIL_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1340-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1340-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1340-001:OBJECT_DELETE_MACRO_BATCH:8ba52365eef76487", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1340-001:OBJECT_DELETE_MACRO_BATCH:8ba52365eef76487", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GREASE_PENCIL_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1340-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1340-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GREASE_PENCIL_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1340-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:GREASE_PENCIL_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1341-000", + "phase": "1341", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1340-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1341", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1341-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1341-001", + "phase": "1341", + "title": "verify GREASE_PENCIL_OT_delete_breakdown through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1341-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1341-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1341-001:OBJECT_DELETE_MACRO_BATCH:8fc79b26bd0d5694", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_delete_breakdown" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1341-001:OBJECT_DELETE_MACRO_BATCH:8fc79b26bd0d5694", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_delete_breakdown" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_frames.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GREASE_PENCIL_OT_delete_breakdown type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1341-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1341-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GREASE_PENCIL_OT_delete_breakdown\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1341-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:GREASE_PENCIL_OT_delete_breakdown" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1342-000", + "phase": "1342", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1341-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1342", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1342-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1342-001", + "phase": "1342", + "title": "verify GREASE_PENCIL_OT_delete_frame through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1342-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1342-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1342-001:OBJECT_DELETE_MACRO_BATCH:78ddf544eb4d6df3", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_delete_frame" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1342-001:OBJECT_DELETE_MACRO_BATCH:78ddf544eb4d6df3", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_delete_frame" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GREASE_PENCIL_OT_delete_frame type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1342-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1342-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GREASE_PENCIL_OT_delete_frame\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1342-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:GREASE_PENCIL_OT_delete_frame" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1343-000", + "phase": "1343", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1342-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1343", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1343-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1343-001", + "phase": "1343", + "title": "verify INFO_OT_report_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1343-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1343-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1343-001:OBJECT_DELETE_MACRO_BATCH:e835c9fb99ff260b", + "selectedRecordIds": [ + "operator:INFO_OT_report_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1343-001:OBJECT_DELETE_MACRO_BATCH:e835c9fb99ff260b", + "selectedRecordIds": [ + "operator:INFO_OT_report_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_info/space_info.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "INFO_OT_report_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1343-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1343-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:INFO_OT_report_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1343-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:INFO_OT_report_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1344-000", + "phase": "1344", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1343-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1344", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1344-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1344-001", + "phase": "1344", + "title": "verify MARKER_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1344-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1344-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1344-001:OBJECT_DELETE_MACRO_BATCH:1e84276bc178e89e", + "selectedRecordIds": [ + "operator:MARKER_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1344-001:OBJECT_DELETE_MACRO_BATCH:1e84276bc178e89e", + "selectedRecordIds": [ + "operator:MARKER_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_markers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MARKER_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1344-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1344-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MARKER_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1344-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:MARKER_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1345-000", + "phase": "1345", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1344-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1345", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1345-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1345-001", + "phase": "1345", + "title": "verify MASK_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1345-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1345-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1345-001:OBJECT_DELETE_MACRO_BATCH:21824a30cf73822f", + "selectedRecordIds": [ + "operator:MASK_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1345-001:OBJECT_DELETE_MACRO_BATCH:21824a30cf73822f", + "selectedRecordIds": [ + "operator:MASK_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MASK_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1345-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1345-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MASK_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1345-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:MASK_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1346-000", + "phase": "1346", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1345-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1346", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1346-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1346-001", + "phase": "1346", + "title": "verify MBALL_OT_delete_metaelems through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1346-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1346-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1346-001:OBJECT_DELETE_MACRO_BATCH:51c6038df857be73", + "selectedRecordIds": [ + "operator:MBALL_OT_delete_metaelems" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1346-001:OBJECT_DELETE_MACRO_BATCH:51c6038df857be73", + "selectedRecordIds": [ + "operator:MBALL_OT_delete_metaelems" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/metaball/mball_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MBALL_OT_delete_metaelems type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1346-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1346-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MBALL_OT_delete_metaelems\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1346-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:MBALL_OT_delete_metaelems" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1347-000", + "phase": "1347", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1346-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1347", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1347-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1347-001", + "phase": "1347", + "title": "verify MESH_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1347-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1347-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1347-001:OBJECT_DELETE_MACRO_BATCH:160eb42931ab4cb9", + "selectedRecordIds": [ + "operator:MESH_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1347-001:OBJECT_DELETE_MACRO_BATCH:160eb42931ab4cb9", + "selectedRecordIds": [ + "operator:MESH_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1347-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1347-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1347-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1348-000", + "phase": "1348", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1347-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1348", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1348-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1348-001", + "phase": "1348", + "title": "verify MESH_OT_delete_edgeloop through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1348-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1348-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1348-001:OBJECT_DELETE_MACRO_BATCH:30939d7ebb7aef1e", + "selectedRecordIds": [ + "operator:MESH_OT_delete_edgeloop" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1348-001:OBJECT_DELETE_MACRO_BATCH:30939d7ebb7aef1e", + "selectedRecordIds": [ + "operator:MESH_OT_delete_edgeloop" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_delete_edgeloop type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1348-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1348-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_delete_edgeloop\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1348-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_delete_edgeloop" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1349-000", + "phase": "1349", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1348-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1349", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1349-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1349-001", + "phase": "1349", + "title": "verify MESH_OT_delete_loose through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1349-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1349-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1349-001:OBJECT_DELETE_MACRO_BATCH:d3ebfcd44987d033", + "selectedRecordIds": [ + "operator:MESH_OT_delete_loose" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1349-001:OBJECT_DELETE_MACRO_BATCH:d3ebfcd44987d033", + "selectedRecordIds": [ + "operator:MESH_OT_delete_loose" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_delete_loose type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1349-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1349-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_delete_loose\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1349-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_delete_loose" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1350-000", + "phase": "1350", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1349-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1350", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1350-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1350-001", + "phase": "1350", + "title": "verify MESH_OT_polybuild_delete_at_cursor through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1350-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1350-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1350-001:OBJECT_DELETE_MACRO_BATCH:cb1053d26cafd659", + "selectedRecordIds": [ + "operator:MESH_OT_polybuild_delete_at_cursor" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1350-001:OBJECT_DELETE_MACRO_BATCH:cb1053d26cafd659", + "selectedRecordIds": [ + "operator:MESH_OT_polybuild_delete_at_cursor" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_polybuild_delete_at_cursor type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1350-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1350-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_polybuild_delete_at_cursor\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1350-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_polybuild_delete_at_cursor" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1351-000", + "phase": "1351", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1350-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1351", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1351-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1351-001", + "phase": "1351", + "title": "verify NLA_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1351-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1351-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1351-001:OBJECT_DELETE_MACRO_BATCH:4d3e5ad86af478ad", + "selectedRecordIds": [ + "operator:NLA_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1351-001:OBJECT_DELETE_MACRO_BATCH:4d3e5ad86af478ad", + "selectedRecordIds": [ + "operator:NLA_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_nla/nla_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NLA_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1351-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1351-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:NLA_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1351-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:NLA_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1352-000", + "phase": "1352", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1351-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1352", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1352-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1352-001", + "phase": "1352", + "title": "verify NLA_OT_tracks_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1352-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1352-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1352-001:OBJECT_DELETE_MACRO_BATCH:c4c76a25367bc8a0", + "selectedRecordIds": [ + "operator:NLA_OT_tracks_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1352-001:OBJECT_DELETE_MACRO_BATCH:c4c76a25367bc8a0", + "selectedRecordIds": [ + "operator:NLA_OT_tracks_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_nla/nla_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NLA_OT_tracks_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1352-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1352-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:NLA_OT_tracks_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1352-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:NLA_OT_tracks_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1353-000", + "phase": "1353", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1352-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1353", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1353-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1353-001", + "phase": "1353", + "title": "verify NODE_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1353-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1353-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1353-001:OBJECT_DELETE_MACRO_BATCH:6259c20cbf6abe09", + "selectedRecordIds": [ + "operator:NODE_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1353-001:OBJECT_DELETE_MACRO_BATCH:6259c20cbf6abe09", + "selectedRecordIds": [ + "operator:NODE_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NODE_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1353-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1353-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:NODE_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1353-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:NODE_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1354-000", + "phase": "1354", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1353-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1354", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1354-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1354-001", + "phase": "1354", + "title": "verify NODE_OT_delete_reconnect through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1354-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1354-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1354-001:OBJECT_DELETE_MACRO_BATCH:595ee7ff4fe3957a", + "selectedRecordIds": [ + "operator:NODE_OT_delete_reconnect" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1354-001:OBJECT_DELETE_MACRO_BATCH:595ee7ff4fe3957a", + "selectedRecordIds": [ + "operator:NODE_OT_delete_reconnect" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NODE_OT_delete_reconnect type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1354-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1354-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:NODE_OT_delete_reconnect\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1354-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:NODE_OT_delete_reconnect" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1355-000", + "phase": "1355", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1354-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1355", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1355-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1355-001", + "phase": "1355", + "title": "verify OBJECT_OT_multires_higher_levels_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1355-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1355-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1355-001:OBJECT_DELETE_MACRO_BATCH:0a25ac0a68c3df08", + "selectedRecordIds": [ + "operator:OBJECT_OT_multires_higher_levels_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1355-001:OBJECT_DELETE_MACRO_BATCH:0a25ac0a68c3df08", + "selectedRecordIds": [ + "operator:OBJECT_OT_multires_higher_levels_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_multires_higher_levels_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1355-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1355-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_multires_higher_levels_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1355-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_multires_higher_levels_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1356-000", + "phase": "1356", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1355-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1356", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1356-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1356-001", + "phase": "1356", + "title": "verify OBJECT_OT_vertex_weight_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1356-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1356-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1356-001:OBJECT_DELETE_MACRO_BATCH:58d1e68d18fa7298", + "selectedRecordIds": [ + "operator:OBJECT_OT_vertex_weight_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1356-001:OBJECT_DELETE_MACRO_BATCH:58d1e68d18fa7298", + "selectedRecordIds": [ + "operator:OBJECT_OT_vertex_weight_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_vertex_weight_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1356-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1356-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_vertex_weight_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1356-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_vertex_weight_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1357-000", + "phase": "1357", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1356-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1357", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1357-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1357-001", + "phase": "1357", + "title": "verify OUTLINER_OT_collection_hierarchy_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1357-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1357-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1357-001:OBJECT_DELETE_MACRO_BATCH:319b632d890ad5b8", + "selectedRecordIds": [ + "operator:OUTLINER_OT_collection_hierarchy_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1357-001:OBJECT_DELETE_MACRO_BATCH:319b632d890ad5b8", + "selectedRecordIds": [ + "operator:OUTLINER_OT_collection_hierarchy_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_outliner/outliner_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OUTLINER_OT_collection_hierarchy_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1357-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1357-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OUTLINER_OT_collection_hierarchy_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1357-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:OUTLINER_OT_collection_hierarchy_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1358-000", + "phase": "1358", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1357-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1358", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1358-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1358-001", + "phase": "1358", + "title": "verify OUTLINER_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1358-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1358-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1358-001:OBJECT_DELETE_MACRO_BATCH:8eea095aaa160fe0", + "selectedRecordIds": [ + "operator:OUTLINER_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1358-001:OBJECT_DELETE_MACRO_BATCH:8eea095aaa160fe0", + "selectedRecordIds": [ + "operator:OUTLINER_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_outliner/outliner_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OUTLINER_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1358-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1358-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OUTLINER_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1358-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:OUTLINER_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1359-000", + "phase": "1359", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1358-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1359", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1359-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1359-001", + "phase": "1359", + "title": "verify OUTLINER_OT_drivers_delete_selected through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1359-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1359-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1359-001:OBJECT_DELETE_MACRO_BATCH:908ab62518cec5da", + "selectedRecordIds": [ + "operator:OUTLINER_OT_drivers_delete_selected" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1359-001:OBJECT_DELETE_MACRO_BATCH:908ab62518cec5da", + "selectedRecordIds": [ + "operator:OUTLINER_OT_drivers_delete_selected" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_outliner/outliner_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OUTLINER_OT_drivers_delete_selected type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1359-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1359-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OUTLINER_OT_drivers_delete_selected\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1359-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:OUTLINER_OT_drivers_delete_selected" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1360-000", + "phase": "1360", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1359-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1360", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1360-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1360-001", + "phase": "1360", + "title": "verify OUTLINER_OT_id_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1360-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1360-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1360-001:OBJECT_DELETE_MACRO_BATCH:7bc967b84721925c", + "selectedRecordIds": [ + "operator:OUTLINER_OT_id_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1360-001:OBJECT_DELETE_MACRO_BATCH:7bc967b84721925c", + "selectedRecordIds": [ + "operator:OUTLINER_OT_id_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_outliner/outliner_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OUTLINER_OT_id_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1360-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1360-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OUTLINER_OT_id_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1360-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:OUTLINER_OT_id_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1361-000", + "phase": "1361", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1360-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1361", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1361-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1361-001", + "phase": "1361", + "title": "verify PAINTCURVE_OT_delete_point through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1361-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1361-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1361-001:OBJECT_DELETE_MACRO_BATCH:c7e7ef2c01712236", + "selectedRecordIds": [ + "operator:PAINTCURVE_OT_delete_point" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1361-001:OBJECT_DELETE_MACRO_BATCH:c7e7ef2c01712236", + "selectedRecordIds": [ + "operator:PAINTCURVE_OT_delete_point" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/sculpt_paint/paint_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "PAINTCURVE_OT_delete_point type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1361-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1361-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:PAINTCURVE_OT_delete_point\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1361-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:PAINTCURVE_OT_delete_point" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1362-000", + "phase": "1362", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1361-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1362", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1362-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1362-001", + "phase": "1362", + "title": "verify PALETTE_OT_color_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1362-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1362-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1362-001:OBJECT_DELETE_MACRO_BATCH:fa9f28b4ef15542b", + "selectedRecordIds": [ + "operator:PALETTE_OT_color_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1362-001:OBJECT_DELETE_MACRO_BATCH:fa9f28b4ef15542b", + "selectedRecordIds": [ + "operator:PALETTE_OT_color_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/sculpt_paint/paint_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "PALETTE_OT_color_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1362-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1362-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:PALETTE_OT_color_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1362-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:PALETTE_OT_color_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1363-000", + "phase": "1363", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1362-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1363", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1363-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1363-001", + "phase": "1363", + "title": "verify PARTICLE_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1363-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1363-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1363-001:OBJECT_DELETE_MACRO_BATCH:fa927874e02d6a86", + "selectedRecordIds": [ + "operator:PARTICLE_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1363-001:OBJECT_DELETE_MACRO_BATCH:fa927874e02d6a86", + "selectedRecordIds": [ + "operator:PARTICLE_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/physics/physics_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "PARTICLE_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1363-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1363-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:PARTICLE_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1363-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:PARTICLE_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1364-000", + "phase": "1364", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1363-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1364", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1364-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1364-001", + "phase": "1364", + "title": "verify POINTCLOUD_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1364-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1364-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1364-001:OBJECT_DELETE_MACRO_BATCH:045288d2c691a502", + "selectedRecordIds": [ + "operator:POINTCLOUD_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1364-001:OBJECT_DELETE_MACRO_BATCH:045288d2c691a502", + "selectedRecordIds": [ + "operator:POINTCLOUD_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/pointcloud/intern/operators.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "POINTCLOUD_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1364-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1364-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:POINTCLOUD_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1364-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:POINTCLOUD_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1365-000", + "phase": "1365", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1364-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1365", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1365-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1365-001", + "phase": "1365", + "title": "verify SCENE_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1365-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1365-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1365-001:OBJECT_DELETE_MACRO_BATCH:1d404190e2359326", + "selectedRecordIds": [ + "operator:SCENE_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1365-001:OBJECT_DELETE_MACRO_BATCH:1d404190e2359326", + "selectedRecordIds": [ + "operator:SCENE_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/scene/scene_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SCENE_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1365-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1365-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:SCENE_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1365-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:SCENE_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1366-000", + "phase": "1366", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1365-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1366", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1366-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1366-001", + "phase": "1366", + "title": "verify SCREEN_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1366-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1366-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1366-001:OBJECT_DELETE_MACRO_BATCH:33e239df6953f6be", + "selectedRecordIds": [ + "operator:SCREEN_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1366-001:OBJECT_DELETE_MACRO_BATCH:33e239df6953f6be", + "selectedRecordIds": [ + "operator:SCREEN_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/screen/screen_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SCREEN_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1366-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1366-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:SCREEN_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1366-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:SCREEN_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1367-000", + "phase": "1367", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1366-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1367", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1367-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1367-001", + "phase": "1367", + "title": "verify SEQUENCER_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1367-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1367-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1367-001:OBJECT_DELETE_MACRO_BATCH:03b04f041e841582", + "selectedRecordIds": [ + "operator:SEQUENCER_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1367-001:OBJECT_DELETE_MACRO_BATCH:03b04f041e841582", + "selectedRecordIds": [ + "operator:SEQUENCER_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SEQUENCER_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1367-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1367-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:SEQUENCER_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1367-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:SEQUENCER_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1368-000", + "phase": "1368", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1367-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1368", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1368-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1368-001", + "phase": "1368", + "title": "verify SEQUENCER_OT_retiming_key_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1368-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1368-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1368-001:OBJECT_DELETE_MACRO_BATCH:c4a082a5c144969b", + "selectedRecordIds": [ + "operator:SEQUENCER_OT_retiming_key_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1368-001:OBJECT_DELETE_MACRO_BATCH:c4a082a5c144969b", + "selectedRecordIds": [ + "operator:SEQUENCER_OT_retiming_key_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SEQUENCER_OT_retiming_key_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1368-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1368-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:SEQUENCER_OT_retiming_key_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1368-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:SEQUENCER_OT_retiming_key_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1369-000", + "phase": "1369", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1368-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1369", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1369-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1369-001", + "phase": "1369", + "title": "verify SEQUENCER_OT_text_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1369-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1369-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1369-001:OBJECT_DELETE_MACRO_BATCH:7996b0c83f4d0b2c", + "selectedRecordIds": [ + "operator:SEQUENCER_OT_text_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1369-001:OBJECT_DELETE_MACRO_BATCH:7996b0c83f4d0b2c", + "selectedRecordIds": [ + "operator:SEQUENCER_OT_text_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_sequencer/sequencer_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SEQUENCER_OT_text_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1369-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1369-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:SEQUENCER_OT_text_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1369-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:SEQUENCER_OT_text_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1370-000", + "phase": "1370", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1369-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1370", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1370-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1370-001", + "phase": "1370", + "title": "verify TEXT_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1370-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1370-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1370-001:OBJECT_DELETE_MACRO_BATCH:6e92825d5e16d565", + "selectedRecordIds": [ + "operator:TEXT_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1370-001:OBJECT_DELETE_MACRO_BATCH:6e92825d5e16d565", + "selectedRecordIds": [ + "operator:TEXT_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_text/space_text.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "TEXT_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1370-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1370-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:TEXT_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1370-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:TEXT_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1371-000", + "phase": "1371", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1370-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1371", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1371-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1371-001", + "phase": "1371", + "title": "verify TRANSFORM_OT_delete_orientation through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1371-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1371-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1371-001:OBJECT_DELETE_MACRO_BATCH:5eecba0f0cd1d45e", + "selectedRecordIds": [ + "operator:TRANSFORM_OT_delete_orientation" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1371-001:OBJECT_DELETE_MACRO_BATCH:5eecba0f0cd1d45e", + "selectedRecordIds": [ + "operator:TRANSFORM_OT_delete_orientation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/transform/transform_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "TRANSFORM_OT_delete_orientation type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1371-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1371-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:TRANSFORM_OT_delete_orientation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1371-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:TRANSFORM_OT_delete_orientation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1372-000", + "phase": "1372", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1371-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1372", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1372-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1372-001", + "phase": "1372", + "title": "verify UI_OT_view_item_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1372-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1372-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1372-001:OBJECT_DELETE_MACRO_BATCH:95dbea0c5998184a", + "selectedRecordIds": [ + "operator:UI_OT_view_item_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1372-001:OBJECT_DELETE_MACRO_BATCH:95dbea0c5998184a", + "selectedRecordIds": [ + "operator:UI_OT_view_item_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/interface/interface_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "UI_OT_view_item_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1372-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1372-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:UI_OT_view_item_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1372-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:UI_OT_view_item_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1373-000", + "phase": "1373", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1372-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1373", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1373-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1373-001", + "phase": "1373", + "title": "verify WORKSPACE_OT_delete through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1373-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1373-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1373-001:OBJECT_DELETE_MACRO_BATCH:8816424e5aaf5621", + "selectedRecordIds": [ + "operator:WORKSPACE_OT_delete" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1373-001:OBJECT_DELETE_MACRO_BATCH:8816424e5aaf5621", + "selectedRecordIds": [ + "operator:WORKSPACE_OT_delete" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/screen/workspace_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "WORKSPACE_OT_delete type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1373-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1373-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:WORKSPACE_OT_delete\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1373-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:WORKSPACE_OT_delete" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1374-000", + "phase": "1374", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1373-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1374", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1374-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1374-001", + "phase": "1374", + "title": "verify WORKSPACE_OT_delete_all_others through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1374-000" + ], + "parityId": "OBJECT_DELETE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_delete_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1374-001.md", + "behavior": "Verify the OBJECT_DELETE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1374-001:OBJECT_DELETE_MACRO_BATCH:6a6a6def269e362e", + "selectedRecordIds": [ + "operator:WORKSPACE_OT_delete_all_others" + ], + "module": { + "moduleId": "OBJECT_DELETE_MACRO_BATCH", + "batchId": "WBV2-P1374-001:OBJECT_DELETE_MACRO_BATCH:6a6a6def269e362e", + "selectedRecordIds": [ + "operator:WORKSPACE_OT_delete_all_others" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_DELETE_MACRO_BATCH-READER", + "CAP-OBJECT_DELETE_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_DELETE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/screen/workspace_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-delete-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "WORKSPACE_OT_delete_all_others type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1374-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1374-001/object-delete-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:WORKSPACE_OT_delete_all_others\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-delete-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1374-001/object-delete-production.json" + ], + "coverageBindings": [ + "operator:WORKSPACE_OT_delete_all_others" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1375-000", + "phase": "1375", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1374-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1375", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1375-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1375-001", + "phase": "1375", + "title": "verify MASK_OT_hide_view_clear through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1375-000" + ], + "parityId": "OBJECT_VISIBILITY_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_visibility_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1375-001.md", + "behavior": "Verify the OBJECT_VISIBILITY_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1375-001:OBJECT_VISIBILITY_MACRO_BATCH:bdd1647034295380", + "selectedRecordIds": [ + "operator:MASK_OT_hide_view_clear" + ], + "module": { + "moduleId": "OBJECT_VISIBILITY_MACRO_BATCH", + "batchId": "WBV2-P1375-001:OBJECT_VISIBILITY_MACRO_BATCH:bdd1647034295380", + "selectedRecordIds": [ + "operator:MASK_OT_hide_view_clear" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-READER", + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-visibility-clear-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MASK_OT_hide_view_clear type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1375-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1375-001/object-visibility-clear-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MASK_OT_hide_view_clear\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-visibility-clear-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1375-001/object-visibility-clear-production.json" + ], + "coverageBindings": [ + "operator:MASK_OT_hide_view_clear" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1376-000", + "phase": "1376", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1375-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1376", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1376-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1376-001", + "phase": "1376", + "title": "verify MASK_OT_hide_view_set through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1376-000" + ], + "parityId": "OBJECT_VISIBILITY_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_visibility_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1376-001.md", + "behavior": "Verify the OBJECT_VISIBILITY_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1376-001:OBJECT_VISIBILITY_MACRO_BATCH:6d311893dd3a298c", + "selectedRecordIds": [ + "operator:MASK_OT_hide_view_set" + ], + "module": { + "moduleId": "OBJECT_VISIBILITY_MACRO_BATCH", + "batchId": "WBV2-P1376-001:OBJECT_VISIBILITY_MACRO_BATCH:6d311893dd3a298c", + "selectedRecordIds": [ + "operator:MASK_OT_hide_view_set" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-READER", + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_VISIBILITY_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-visibility-clear-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MASK_OT_hide_view_set type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1376-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1376-001/object-visibility-clear-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MASK_OT_hide_view_set\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-visibility-clear-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1376-001/object-visibility-clear-production.json" + ], + "coverageBindings": [ + "operator:MASK_OT_hide_view_set" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1377-000", + "phase": "1377", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1376-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1377", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1377-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1377-001", + "phase": "1377", + "title": "verify POSE_OT_scale_clear through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1377-000" + ], + "parityId": "OBJECT_SCALE_CLEAR_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_scale_clear_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1377-001.md", + "behavior": "Verify the OBJECT_SCALE_CLEAR_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1377-001:OBJECT_SCALE_CLEAR_MACRO_BATCH:21ee71209f57696a", + "selectedRecordIds": [ + "operator:POSE_OT_scale_clear" + ], + "module": { + "moduleId": "OBJECT_SCALE_CLEAR_MACRO_BATCH", + "batchId": "WBV2-P1377-001:OBJECT_SCALE_CLEAR_MACRO_BATCH:21ee71209f57696a", + "selectedRecordIds": [ + "operator:POSE_OT_scale_clear" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_SCALE_CLEAR_MACRO_BATCH-READER", + "CAP-OBJECT_SCALE_CLEAR_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_SCALE_CLEAR_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "POSE_OT_scale_clear type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1377-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1377-001/object-transform-clear-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_OPERATION=SCALE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:POSE_OT_scale_clear\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-transform-clear-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1377-001/object-transform-clear-production.json" + ], + "coverageBindings": [ + "operator:POSE_OT_scale_clear" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1378-000", + "phase": "1378", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1377-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1378", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1378-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1378-001", + "phase": "1378", + "title": "verify OBJECT_OT_visual_transform_apply through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1378-000" + ], + "parityId": "OBJECT_TRANSFORM_APPLY_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_transform_apply_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1378-001.md", + "behavior": "Verify the OBJECT_TRANSFORM_APPLY_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1378-001:OBJECT_TRANSFORM_APPLY_MACRO_BATCH:2b4f92dbb7cd4491", + "selectedRecordIds": [ + "operator:OBJECT_OT_visual_transform_apply" + ], + "module": { + "moduleId": "OBJECT_TRANSFORM_APPLY_MACRO_BATCH", + "batchId": "WBV2-P1378-001:OBJECT_TRANSFORM_APPLY_MACRO_BATCH:2b4f92dbb7cd4491", + "selectedRecordIds": [ + "operator:OBJECT_OT_visual_transform_apply" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-READER", + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-apply-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_visual_transform_apply type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1378-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1378-001/object-transform-apply-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_visual_transform_apply\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-transform-apply-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1378-001/object-transform-apply-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_visual_transform_apply" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1379-000", + "phase": "1379", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1378-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1379", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1379-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1379-001", + "phase": "1379", + "title": "verify POSE_OT_visual_transform_apply through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1379-000" + ], + "parityId": "OBJECT_TRANSFORM_APPLY_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_transform_apply_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1379-001.md", + "behavior": "Verify the OBJECT_TRANSFORM_APPLY_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1379-001:OBJECT_TRANSFORM_APPLY_MACRO_BATCH:bfe7daa60be2d712", + "selectedRecordIds": [ + "operator:POSE_OT_visual_transform_apply" + ], + "module": { + "moduleId": "OBJECT_TRANSFORM_APPLY_MACRO_BATCH", + "batchId": "WBV2-P1379-001:OBJECT_TRANSFORM_APPLY_MACRO_BATCH:bfe7daa60be2d712", + "selectedRecordIds": [ + "operator:POSE_OT_visual_transform_apply" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-READER", + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_TRANSFORM_APPLY_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-transform-apply-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "POSE_OT_visual_transform_apply type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1379-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1379-001/object-transform-apply-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:POSE_OT_visual_transform_apply\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-transform-apply-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1379-001/object-transform-apply-production.json" + ], + "coverageBindings": [ + "operator:POSE_OT_visual_transform_apply" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1380-000", + "phase": "1380", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1379-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1380", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1380-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1380-001", + "phase": "1380", + "title": "verify ARMATURE_OT_move_to_collection through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1380-000" + ], + "parityId": "OBJECT_MOVE_COLLECTION_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_move_collection_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1380-001.md", + "behavior": "Verify the OBJECT_MOVE_COLLECTION_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1380-001:OBJECT_MOVE_COLLECTION_MACRO_BATCH:77f44b047d1a88c1", + "selectedRecordIds": [ + "operator:ARMATURE_OT_move_to_collection" + ], + "module": { + "moduleId": "OBJECT_MOVE_COLLECTION_MACRO_BATCH", + "batchId": "WBV2-P1380-001:OBJECT_MOVE_COLLECTION_MACRO_BATCH:77f44b047d1a88c1", + "selectedRecordIds": [ + "operator:ARMATURE_OT_move_to_collection" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_MOVE_COLLECTION_MACRO_BATCH-READER", + "CAP-OBJECT_MOVE_COLLECTION_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_MOVE_COLLECTION_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-move-batch-production.spec.ts", + "tests/files/web/generated/WBV2-P24-001-OBJECT_OPERATIONS.MOVE_COLLECTION.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ARMATURE_OT_move_to_collection type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1380-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1380-001/object-move-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P24-001-OBJECT_OPERATIONS.MOVE_COLLECTION.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ARMATURE_OT_move_to_collection\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-move-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1380-001/object-move-production.json" + ], + "coverageBindings": [ + "operator:ARMATURE_OT_move_to_collection" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1381-000", + "phase": "1381", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1380-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1381", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1381-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1381-001", + "phase": "1381", + "title": "verify ARMATURE_OT_parent_set through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1381-000" + ], + "parityId": "OBJECT_PARENT_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_parent_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1381-001.md", + "behavior": "Verify the OBJECT_PARENT_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1381-001:OBJECT_PARENT_MACRO_BATCH:ec5938153f1e588a", + "selectedRecordIds": [ + "operator:ARMATURE_OT_parent_set" + ], + "module": { + "moduleId": "OBJECT_PARENT_MACRO_BATCH", + "batchId": "WBV2-P1381-001:OBJECT_PARENT_MACRO_BATCH:ec5938153f1e588a", + "selectedRecordIds": [ + "operator:ARMATURE_OT_parent_set" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_PARENT_MACRO_BATCH-READER", + "CAP-OBJECT_PARENT_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ARMATURE_OT_parent_set type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1381-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1381-001/object-parent-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ARMATURE_OT_parent_set\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-parent-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1381-001/object-parent-production.json" + ], + "coverageBindings": [ + "operator:ARMATURE_OT_parent_set" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1382-000", + "phase": "1382", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1381-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1382", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1382-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1382-001", + "phase": "1382", + "title": "verify MASK_OT_parent_set through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1382-000" + ], + "parityId": "OBJECT_PARENT_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_parent_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1382-001.md", + "behavior": "Verify the OBJECT_PARENT_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1382-001:OBJECT_PARENT_MACRO_BATCH:0447b9fb7a8b8660", + "selectedRecordIds": [ + "operator:MASK_OT_parent_set" + ], + "module": { + "moduleId": "OBJECT_PARENT_MACRO_BATCH", + "batchId": "WBV2-P1382-001:OBJECT_PARENT_MACRO_BATCH:0447b9fb7a8b8660", + "selectedRecordIds": [ + "operator:MASK_OT_parent_set" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_PARENT_MACRO_BATCH-READER", + "CAP-OBJECT_PARENT_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mask/mask_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MASK_OT_parent_set type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1382-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1382-001/object-parent-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MASK_OT_parent_set\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-parent-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1382-001/object-parent-production.json" + ], + "coverageBindings": [ + "operator:MASK_OT_parent_set" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1383-000", + "phase": "1383", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1382-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1383", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1383-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1383-001", + "phase": "1383", + "title": "verify NODE_OT_parent_set through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1383-000" + ], + "parityId": "OBJECT_PARENT_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_parent_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1383-001.md", + "behavior": "Verify the OBJECT_PARENT_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1383-001:OBJECT_PARENT_MACRO_BATCH:69a30bf3585d78b1", + "selectedRecordIds": [ + "operator:NODE_OT_parent_set" + ], + "module": { + "moduleId": "OBJECT_PARENT_MACRO_BATCH", + "batchId": "WBV2-P1383-001:OBJECT_PARENT_MACRO_BATCH:69a30bf3585d78b1", + "selectedRecordIds": [ + "operator:NODE_OT_parent_set" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_PARENT_MACRO_BATCH-READER", + "CAP-OBJECT_PARENT_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/space_node/node_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "NODE_OT_parent_set type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1383-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1383-001/object-parent-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:NODE_OT_parent_set\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-parent-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1383-001/object-parent-production.json" + ], + "coverageBindings": [ + "operator:NODE_OT_parent_set" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1384-000", + "phase": "1384", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1383-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1384", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1384-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1384-001", + "phase": "1384", + "title": "verify OBJECT_OT_vertex_parent_set through existing native gate", + "kind": "module", + "owner": "OBJECT", + "dependsOn": [ + "WBV2-P1384-000" + ], + "parityId": "OBJECT_PARENT_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-object_parent_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1384-001.md", + "behavior": "Verify the OBJECT_PARENT_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1384-001:OBJECT_PARENT_MACRO_BATCH:2f567b446f4dbed0", + "selectedRecordIds": [ + "operator:OBJECT_OT_vertex_parent_set" + ], + "module": { + "moduleId": "OBJECT_PARENT_MACRO_BATCH", + "batchId": "WBV2-P1384-001:OBJECT_PARENT_MACRO_BATCH:2f567b446f4dbed0", + "selectedRecordIds": [ + "operator:OBJECT_OT_vertex_parent_set" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-OBJECT_PARENT_MACRO_BATCH-READER", + "CAP-OBJECT_PARENT_MACRO_BATCH-RECOVERY", + "CAP-OBJECT_PARENT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/object/object_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-object-parent-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "OBJECT_OT_vertex_parent_set type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1384-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1384-001/object-parent-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:OBJECT_OT_vertex_parent_set\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-parent-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1384-001/object-parent-production.json" + ], + "coverageBindings": [ + "operator:OBJECT_OT_vertex_parent_set" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1385-000", + "phase": "1385", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1384-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1385", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1385-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1385-001", + "phase": "1385", + "title": "verify MESH_OT_primitive_cube_add_gizmo through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1385-000" + ], + "parityId": "MESH_PRIMITIVE_CUBE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_primitive_cube_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1385-001.md", + "behavior": "Verify the MESH_PRIMITIVE_CUBE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1385-001:MESH_PRIMITIVE_CUBE_MACRO_BATCH:d09d80f7c1b52bfe", + "selectedRecordIds": [ + "operator:MESH_OT_primitive_cube_add_gizmo" + ], + "module": { + "moduleId": "MESH_PRIMITIVE_CUBE_MACRO_BATCH", + "batchId": "WBV2-P1385-001:MESH_PRIMITIVE_CUBE_MACRO_BATCH:d09d80f7c1b52bfe", + "selectedRecordIds": [ + "operator:MESH_OT_primitive_cube_add_gizmo" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_PRIMITIVE_CUBE_MACRO_BATCH-READER", + "CAP-MESH_PRIMITIVE_CUBE_MACRO_BATCH-RECOVERY", + "CAP-MESH_PRIMITIVE_CUBE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-primitive-cube-batch-production.spec.ts", + "tests/files/web/basic_scene.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_primitive_cube_add_gizmo type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1385-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1385-001/primitive-cube-production.json WBV2_BATCH_FIXTURE=tests/files/web/basic_scene.blend WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_primitive_cube_add_gizmo\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-primitive-cube-batch-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1385-001/primitive-cube-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_primitive_cube_add_gizmo" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1386-000", + "phase": "1386", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1385-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1386", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1386-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1386-001", + "phase": "1386", + "title": "verify ARMATURE_OT_extrude_forked through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1386-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1386-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1386-001:MESH_EXTRUDE_MACRO_BATCH:5d88ca9ee68a105c", + "selectedRecordIds": [ + "operator-macro:ARMATURE_OT_extrude_forked" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1386-001:MESH_EXTRUDE_MACRO_BATCH:5d88ca9ee68a105c", + "selectedRecordIds": [ + "operator-macro:ARMATURE_OT_extrude_forked" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ARMATURE_OT_extrude_forked type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1386-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1386-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:ARMATURE_OT_extrude_forked\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1386-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:ARMATURE_OT_extrude_forked" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1387-000", + "phase": "1387", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1386-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1387", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1387-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1387-001", + "phase": "1387", + "title": "verify ARMATURE_OT_extrude_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1387-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1387-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1387-001:MESH_EXTRUDE_MACRO_BATCH:68ffe5ba3508a8e3", + "selectedRecordIds": [ + "operator-macro:ARMATURE_OT_extrude_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1387-001:MESH_EXTRUDE_MACRO_BATCH:68ffe5ba3508a8e3", + "selectedRecordIds": [ + "operator-macro:ARMATURE_OT_extrude_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ARMATURE_OT_extrude_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1387-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1387-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:ARMATURE_OT_extrude_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1387-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:ARMATURE_OT_extrude_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1388-000", + "phase": "1388", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1387-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1388", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1388-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1388-001", + "phase": "1388", + "title": "verify CURVES_OT_extrude_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1388-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1388-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1388-001:MESH_EXTRUDE_MACRO_BATCH:82fe86cad6cb37a8", + "selectedRecordIds": [ + "operator-macro:CURVES_OT_extrude_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1388-001:MESH_EXTRUDE_MACRO_BATCH:82fe86cad6cb37a8", + "selectedRecordIds": [ + "operator-macro:CURVES_OT_extrude_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curves/intern/curves_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CURVES_OT_extrude_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1388-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1388-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:CURVES_OT_extrude_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1388-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:CURVES_OT_extrude_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1389-000", + "phase": "1389", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1388-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1389", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1389-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1389-001", + "phase": "1389", + "title": "verify CURVE_OT_extrude_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1389-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1389-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1389-001:MESH_EXTRUDE_MACRO_BATCH:4de5a8969932e8e9", + "selectedRecordIds": [ + "operator-macro:CURVE_OT_extrude_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1389-001:MESH_EXTRUDE_MACRO_BATCH:4de5a8969932e8e9", + "selectedRecordIds": [ + "operator-macro:CURVE_OT_extrude_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CURVE_OT_extrude_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1389-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1389-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:CURVE_OT_extrude_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1389-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:CURVE_OT_extrude_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1390-000", + "phase": "1390", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1389-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1390", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1390-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1390-001", + "phase": "1390", + "title": "verify GREASE_PENCIL_OT_extrude_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1390-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1390-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1390-001:MESH_EXTRUDE_MACRO_BATCH:12bc92236398200b", + "selectedRecordIds": [ + "operator-macro:GREASE_PENCIL_OT_extrude_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1390-001:MESH_EXTRUDE_MACRO_BATCH:12bc92236398200b", + "selectedRecordIds": [ + "operator-macro:GREASE_PENCIL_OT_extrude_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GREASE_PENCIL_OT_extrude_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1390-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1390-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:GREASE_PENCIL_OT_extrude_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1390-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:GREASE_PENCIL_OT_extrude_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1391-000", + "phase": "1391", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1390-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1391", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1391-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1391-001", + "phase": "1391", + "title": "verify MESH_OT_extrude_context_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1391-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1391-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1391-001:MESH_EXTRUDE_MACRO_BATCH:5f067119b196acc9", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_context_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1391-001:MESH_EXTRUDE_MACRO_BATCH:5f067119b196acc9", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_context_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_context_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1391-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1391-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_extrude_context_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1391-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_extrude_context_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1392-000", + "phase": "1392", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1391-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1392", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1392-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1392-001", + "phase": "1392", + "title": "verify MESH_OT_extrude_edges_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1392-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1392-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1392-001:MESH_EXTRUDE_MACRO_BATCH:9b2db02d89b0195b", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_edges_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1392-001:MESH_EXTRUDE_MACRO_BATCH:9b2db02d89b0195b", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_edges_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_edges_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1392-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1392-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_extrude_edges_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1392-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_extrude_edges_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1393-000", + "phase": "1393", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1392-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1393", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1393-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1393-001", + "phase": "1393", + "title": "verify MESH_OT_extrude_faces_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1393-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1393-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1393-001:MESH_EXTRUDE_MACRO_BATCH:f900ba338f1dc4c1", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_faces_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1393-001:MESH_EXTRUDE_MACRO_BATCH:f900ba338f1dc4c1", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_faces_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_faces_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1393-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1393-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_extrude_faces_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1393-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_extrude_faces_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1394-000", + "phase": "1394", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1393-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1394", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1394-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1394-001", + "phase": "1394", + "title": "verify MESH_OT_extrude_manifold through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1394-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1394-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1394-001:MESH_EXTRUDE_MACRO_BATCH:4b7b98d81ce69e0d", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_manifold" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1394-001:MESH_EXTRUDE_MACRO_BATCH:4b7b98d81ce69e0d", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_manifold" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_manifold type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1394-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1394-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_extrude_manifold\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1394-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_extrude_manifold" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1395-000", + "phase": "1395", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1394-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1395", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1395-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1395-001", + "phase": "1395", + "title": "verify MESH_OT_extrude_region_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1395-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1395-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1395-001:MESH_EXTRUDE_MACRO_BATCH:d49f6c73e8a1bc83", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_region_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1395-001:MESH_EXTRUDE_MACRO_BATCH:d49f6c73e8a1bc83", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_region_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_region_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1395-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1395-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_extrude_region_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1395-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_extrude_region_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1396-000", + "phase": "1396", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1395-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1396", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1396-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1396-001", + "phase": "1396", + "title": "verify MESH_OT_extrude_region_shrink_fatten through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1396-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1396-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1396-001:MESH_EXTRUDE_MACRO_BATCH:5260939325059c04", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_region_shrink_fatten" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1396-001:MESH_EXTRUDE_MACRO_BATCH:5260939325059c04", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_region_shrink_fatten" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_region_shrink_fatten type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1396-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1396-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_extrude_region_shrink_fatten\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1396-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_extrude_region_shrink_fatten" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1397-000", + "phase": "1397", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1396-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1397", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1397-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1397-001", + "phase": "1397", + "title": "verify MESH_OT_extrude_vertices_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1397-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1397-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1397-001:MESH_EXTRUDE_MACRO_BATCH:a92a2cc72e827244", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_vertices_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1397-001:MESH_EXTRUDE_MACRO_BATCH:a92a2cc72e827244", + "selectedRecordIds": [ + "operator-macro:MESH_OT_extrude_vertices_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_vertices_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1397-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1397-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_extrude_vertices_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1397-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_extrude_vertices_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1398-000", + "phase": "1398", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1397-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1398", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1398-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1398-001", + "phase": "1398", + "title": "verify MESH_OT_polybuild_extrude_at_cursor_move through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1398-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1398-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1398-001:MESH_EXTRUDE_MACRO_BATCH:21ea2b18ae7fed33", + "selectedRecordIds": [ + "operator-macro:MESH_OT_polybuild_extrude_at_cursor_move" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1398-001:MESH_EXTRUDE_MACRO_BATCH:21ea2b18ae7fed33", + "selectedRecordIds": [ + "operator-macro:MESH_OT_polybuild_extrude_at_cursor_move" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_polybuild_extrude_at_cursor_move type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1398-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1398-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_polybuild_extrude_at_cursor_move\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1398-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_polybuild_extrude_at_cursor_move" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1399-000", + "phase": "1399", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1398-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1399", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1399-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1399-001", + "phase": "1399", + "title": "verify MESH_OT_dupli_extrude_cursor through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1399-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1399-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1399-001:MESH_EXTRUDE_MACRO_BATCH:ed1ff092325a7818", + "selectedRecordIds": [ + "operator:MESH_OT_dupli_extrude_cursor" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1399-001:MESH_EXTRUDE_MACRO_BATCH:ed1ff092325a7818", + "selectedRecordIds": [ + "operator:MESH_OT_dupli_extrude_cursor" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_dupli_extrude_cursor type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1399-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1399-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_dupli_extrude_cursor\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1399-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_dupli_extrude_cursor" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1400-000", + "phase": "1400", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1399-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1400", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1400-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1400-001", + "phase": "1400", + "title": "verify MESH_OT_extrude_context through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1400-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1400-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1400-001:MESH_EXTRUDE_MACRO_BATCH:101a68d06b531b4a", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_context" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1400-001:MESH_EXTRUDE_MACRO_BATCH:101a68d06b531b4a", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_context" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_context type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1400-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1400-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_extrude_context\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1400-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_extrude_context" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1401-000", + "phase": "1401", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1400-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1401", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1401-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1401-001", + "phase": "1401", + "title": "verify MESH_OT_extrude_edges_indiv through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1401-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1401-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1401-001:MESH_EXTRUDE_MACRO_BATCH:faeadd8684fee3e3", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_edges_indiv" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1401-001:MESH_EXTRUDE_MACRO_BATCH:faeadd8684fee3e3", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_edges_indiv" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_edges_indiv type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1401-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1401-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_extrude_edges_indiv\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1401-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_extrude_edges_indiv" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1402-000", + "phase": "1402", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1401-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1402", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1402-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1402-001", + "phase": "1402", + "title": "verify MESH_OT_extrude_faces_indiv through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1402-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1402-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1402-001:MESH_EXTRUDE_MACRO_BATCH:be2ad677cb5157e7", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_faces_indiv" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1402-001:MESH_EXTRUDE_MACRO_BATCH:be2ad677cb5157e7", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_faces_indiv" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_faces_indiv type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1402-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1402-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_extrude_faces_indiv\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1402-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_extrude_faces_indiv" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1403-000", + "phase": "1403", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1402-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1403", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1403-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1403-001", + "phase": "1403", + "title": "verify MESH_OT_extrude_repeat through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1403-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1403-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1403-001:MESH_EXTRUDE_MACRO_BATCH:bd238b4a7e125cc5", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_repeat" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1403-001:MESH_EXTRUDE_MACRO_BATCH:bd238b4a7e125cc5", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_repeat" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_repeat type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1403-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1403-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_extrude_repeat\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1403-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_extrude_repeat" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1404-000", + "phase": "1404", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1403-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1404", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1404-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1404-001", + "phase": "1404", + "title": "verify MESH_OT_extrude_verts_indiv through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1404-000" + ], + "parityId": "MESH_EXTRUDE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_extrude_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1404-001.md", + "behavior": "Verify the MESH_EXTRUDE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1404-001:MESH_EXTRUDE_MACRO_BATCH:a581546d0ff3dc35", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_verts_indiv" + ], + "module": { + "moduleId": "MESH_EXTRUDE_MACRO_BATCH", + "batchId": "WBV2-P1404-001:MESH_EXTRUDE_MACRO_BATCH:a581546d0ff3dc35", + "selectedRecordIds": [ + "operator:MESH_OT_extrude_verts_indiv" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_EXTRUDE_MACRO_BATCH-READER", + "CAP-MESH_EXTRUDE_MACRO_BATCH-RECOVERY", + "CAP-MESH_EXTRUDE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_extrude_verts_indiv type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1404-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1404-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=EXTRUDE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_extrude_verts_indiv\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1404-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_extrude_verts_indiv" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1405-000", + "phase": "1405", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1404-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1405", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1405-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1405-001", + "phase": "1405", + "title": "verify MESH_OT_loopcut_slide through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1405-000" + ], + "parityId": "MESH_LOOPCUT_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_loopcut_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1405-001.md", + "behavior": "Verify the MESH_LOOPCUT_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1405-001:MESH_LOOPCUT_MACRO_BATCH:361c56cb78cfa6f7", + "selectedRecordIds": [ + "operator-macro:MESH_OT_loopcut_slide" + ], + "module": { + "moduleId": "MESH_LOOPCUT_MACRO_BATCH", + "batchId": "WBV2-P1405-001:MESH_LOOPCUT_MACRO_BATCH:361c56cb78cfa6f7", + "selectedRecordIds": [ + "operator-macro:MESH_OT_loopcut_slide" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_LOOPCUT_MACRO_BATCH-READER", + "CAP-MESH_LOOPCUT_MACRO_BATCH-RECOVERY", + "CAP-MESH_LOOPCUT_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_loopcut_slide type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1405-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1405-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=LOOP_CUT WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator-macro:MESH_OT_loopcut_slide\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1405-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator-macro:MESH_OT_loopcut_slide" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1406-000", + "phase": "1406", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1405-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1406", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1406-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1406-001", + "phase": "1406", + "title": "verify ARMATURE_OT_dissolve through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1406-000" + ], + "parityId": "MESH_DISSOLVE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1406-001.md", + "behavior": "Verify the MESH_DISSOLVE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1406-001:MESH_DISSOLVE_MACRO_BATCH:8b7fa667c8c517b0", + "selectedRecordIds": [ + "operator:ARMATURE_OT_dissolve" + ], + "module": { + "moduleId": "MESH_DISSOLVE_MACRO_BATCH", + "batchId": "WBV2-P1406-001:MESH_DISSOLVE_MACRO_BATCH:8b7fa667c8c517b0", + "selectedRecordIds": [ + "operator:ARMATURE_OT_dissolve" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/armature/armature_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ARMATURE_OT_dissolve type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1406-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1406-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ARMATURE_OT_dissolve\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1406-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:ARMATURE_OT_dissolve" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1407-000", + "phase": "1407", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1406-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1407", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1407-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1407-001", + "phase": "1407", + "title": "verify CURVE_OT_dissolve_verts through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1407-000" + ], + "parityId": "MESH_DISSOLVE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1407-001.md", + "behavior": "Verify the MESH_DISSOLVE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1407-001:MESH_DISSOLVE_MACRO_BATCH:9daaf10e3afe5523", + "selectedRecordIds": [ + "operator:CURVE_OT_dissolve_verts" + ], + "module": { + "moduleId": "MESH_DISSOLVE_MACRO_BATCH", + "batchId": "WBV2-P1407-001:MESH_DISSOLVE_MACRO_BATCH:9daaf10e3afe5523", + "selectedRecordIds": [ + "operator:CURVE_OT_dissolve_verts" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/curve/curve_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "CURVE_OT_dissolve_verts type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1407-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1407-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:CURVE_OT_dissolve_verts\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1407-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:CURVE_OT_dissolve_verts" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1408-000", + "phase": "1408", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1407-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1408", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1408-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1408-001", + "phase": "1408", + "title": "verify GREASE_PENCIL_OT_dissolve through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1408-000" + ], + "parityId": "MESH_DISSOLVE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1408-001.md", + "behavior": "Verify the MESH_DISSOLVE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1408-001:MESH_DISSOLVE_MACRO_BATCH:017824f266ac2393", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_dissolve" + ], + "module": { + "moduleId": "MESH_DISSOLVE_MACRO_BATCH", + "batchId": "WBV2-P1408-001:MESH_DISSOLVE_MACRO_BATCH:017824f266ac2393", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_dissolve" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GREASE_PENCIL_OT_dissolve type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1408-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1408-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GREASE_PENCIL_OT_dissolve\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1408-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:GREASE_PENCIL_OT_dissolve" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1409-000", + "phase": "1409", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1408-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1409", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1409-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1409-001", + "phase": "1409", + "title": "verify MESH_OT_dissolve_degenerate through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1409-000" + ], + "parityId": "MESH_DISSOLVE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1409-001.md", + "behavior": "Verify the MESH_DISSOLVE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1409-001:MESH_DISSOLVE_MACRO_BATCH:485d8cb2ab41f10b", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_degenerate" + ], + "module": { + "moduleId": "MESH_DISSOLVE_MACRO_BATCH", + "batchId": "WBV2-P1409-001:MESH_DISSOLVE_MACRO_BATCH:485d8cb2ab41f10b", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_degenerate" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_dissolve_degenerate type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1409-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1409-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_dissolve_degenerate\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1409-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_dissolve_degenerate" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1410-000", + "phase": "1410", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1409-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1410", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1410-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1410-001", + "phase": "1410", + "title": "verify MESH_OT_dissolve_faces through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1410-000" + ], + "parityId": "MESH_DISSOLVE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1410-001.md", + "behavior": "Verify the MESH_DISSOLVE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1410-001:MESH_DISSOLVE_MACRO_BATCH:ae9148bee3425973", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_faces" + ], + "module": { + "moduleId": "MESH_DISSOLVE_MACRO_BATCH", + "batchId": "WBV2-P1410-001:MESH_DISSOLVE_MACRO_BATCH:ae9148bee3425973", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_faces" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_dissolve_faces type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1410-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1410-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_dissolve_faces\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1410-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_dissolve_faces" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1411-000", + "phase": "1411", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1410-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1411", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1411-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1411-001", + "phase": "1411", + "title": "verify MESH_OT_dissolve_limited through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1411-000" + ], + "parityId": "MESH_DISSOLVE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1411-001.md", + "behavior": "Verify the MESH_DISSOLVE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1411-001:MESH_DISSOLVE_MACRO_BATCH:b5bf0587bcb6cd5c", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_limited" + ], + "module": { + "moduleId": "MESH_DISSOLVE_MACRO_BATCH", + "batchId": "WBV2-P1411-001:MESH_DISSOLVE_MACRO_BATCH:b5bf0587bcb6cd5c", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_limited" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_dissolve_limited type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1411-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1411-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_dissolve_limited\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1411-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_dissolve_limited" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1412-000", + "phase": "1412", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1411-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1412", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1412-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1412-001", + "phase": "1412", + "title": "verify MESH_OT_dissolve_mode through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1412-000" + ], + "parityId": "MESH_DISSOLVE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1412-001.md", + "behavior": "Verify the MESH_DISSOLVE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1412-001:MESH_DISSOLVE_MACRO_BATCH:6f8dcbe6ddf044ef", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_mode" + ], + "module": { + "moduleId": "MESH_DISSOLVE_MACRO_BATCH", + "batchId": "WBV2-P1412-001:MESH_DISSOLVE_MACRO_BATCH:6f8dcbe6ddf044ef", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_mode" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_dissolve_mode type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1412-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1412-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_dissolve_mode\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1412-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_dissolve_mode" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1413-000", + "phase": "1413", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1412-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1413", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1413-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1413-001", + "phase": "1413", + "title": "verify MESH_OT_dissolve_verts through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1413-000" + ], + "parityId": "MESH_DISSOLVE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1413-001.md", + "behavior": "Verify the MESH_DISSOLVE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1413-001:MESH_DISSOLVE_MACRO_BATCH:cdec8905043147bc", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_verts" + ], + "module": { + "moduleId": "MESH_DISSOLVE_MACRO_BATCH", + "batchId": "WBV2-P1413-001:MESH_DISSOLVE_MACRO_BATCH:cdec8905043147bc", + "selectedRecordIds": [ + "operator:MESH_OT_dissolve_verts" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_dissolve_verts type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1413-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1413-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_dissolve_verts\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1413-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_dissolve_verts" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1414-000", + "phase": "1414", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1413-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1414", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1414-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1414-001", + "phase": "1414", + "title": "verify MESH_OT_polybuild_dissolve_at_cursor through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1414-000" + ], + "parityId": "MESH_DISSOLVE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_dissolve_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1414-001.md", + "behavior": "Verify the MESH_DISSOLVE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1414-001:MESH_DISSOLVE_MACRO_BATCH:63f53955183b00ce", + "selectedRecordIds": [ + "operator:MESH_OT_polybuild_dissolve_at_cursor" + ], + "module": { + "moduleId": "MESH_DISSOLVE_MACRO_BATCH", + "batchId": "WBV2-P1414-001:MESH_DISSOLVE_MACRO_BATCH:63f53955183b00ce", + "selectedRecordIds": [ + "operator:MESH_OT_polybuild_dissolve_at_cursor" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_DISSOLVE_MACRO_BATCH-READER", + "CAP-MESH_DISSOLVE_MACRO_BATCH-RECOVERY", + "CAP-MESH_DISSOLVE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_polybuild_dissolve_at_cursor type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1414-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1414-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=DISSOLVE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_polybuild_dissolve_at_cursor\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1414-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_polybuild_dissolve_at_cursor" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1415-000", + "phase": "1415", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1414-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1415", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1415-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1415-001", + "phase": "1415", + "title": "verify ANIM_OT_merge_animation through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1415-000" + ], + "parityId": "MESH_MERGE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_merge_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1415-001.md", + "behavior": "Verify the MESH_MERGE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1415-001:MESH_MERGE_MACRO_BATCH:f34f40626ea8b27c", + "selectedRecordIds": [ + "operator:ANIM_OT_merge_animation" + ], + "module": { + "moduleId": "MESH_MERGE_MACRO_BATCH", + "batchId": "WBV2-P1415-001:MESH_MERGE_MACRO_BATCH:f34f40626ea8b27c", + "selectedRecordIds": [ + "operator:ANIM_OT_merge_animation" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/animation/anim_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "ANIM_OT_merge_animation type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1415-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1415-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=MERGE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:ANIM_OT_merge_animation\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1415-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:ANIM_OT_merge_animation" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1416-000", + "phase": "1416", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1415-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1416", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1416-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1416-001", + "phase": "1416", + "title": "verify GREASE_PENCIL_OT_layer_merge through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1416-000" + ], + "parityId": "MESH_MERGE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_merge_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1416-001.md", + "behavior": "Verify the MESH_MERGE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1416-001:MESH_MERGE_MACRO_BATCH:51c37d6fb5bfe2cc", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_layer_merge" + ], + "module": { + "moduleId": "MESH_MERGE_MACRO_BATCH", + "batchId": "WBV2-P1416-001:MESH_MERGE_MACRO_BATCH:51c37d6fb5bfe2cc", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_layer_merge" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_layers.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GREASE_PENCIL_OT_layer_merge type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1416-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1416-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=MERGE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GREASE_PENCIL_OT_layer_merge\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1416-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:GREASE_PENCIL_OT_layer_merge" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1417-000", + "phase": "1417", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1416-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1417", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1417-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1417-001", + "phase": "1417", + "title": "verify GREASE_PENCIL_OT_stroke_merge_by_distance through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1417-000" + ], + "parityId": "MESH_MERGE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_merge_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1417-001.md", + "behavior": "Verify the MESH_MERGE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1417-001:MESH_MERGE_MACRO_BATCH:1f85aa65f8ded787", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_stroke_merge_by_distance" + ], + "module": { + "moduleId": "MESH_MERGE_MACRO_BATCH", + "batchId": "WBV2-P1417-001:MESH_MERGE_MACRO_BATCH:1f85aa65f8ded787", + "selectedRecordIds": [ + "operator:GREASE_PENCIL_OT_stroke_merge_by_distance" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "GREASE_PENCIL_OT_stroke_merge_by_distance type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1417-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1417-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=MERGE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:GREASE_PENCIL_OT_stroke_merge_by_distance\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1417-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:GREASE_PENCIL_OT_stroke_merge_by_distance" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1418-000", + "phase": "1418", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1417-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1418", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1418-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1418-001", + "phase": "1418", + "title": "verify MESH_OT_merge_normals through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1418-000" + ], + "parityId": "MESH_MERGE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_merge_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1418-001.md", + "behavior": "Verify the MESH_MERGE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1418-001:MESH_MERGE_MACRO_BATCH:2b75cafbbb8ed0e8", + "selectedRecordIds": [ + "operator:MESH_OT_merge_normals" + ], + "module": { + "moduleId": "MESH_MERGE_MACRO_BATCH", + "batchId": "WBV2-P1418-001:MESH_MERGE_MACRO_BATCH:2b75cafbbb8ed0e8", + "selectedRecordIds": [ + "operator:MESH_OT_merge_normals" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/mesh/mesh_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "MESH_OT_merge_normals type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1418-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1418-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=MERGE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:MESH_OT_merge_normals\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1418-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:MESH_OT_merge_normals" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1419-000", + "phase": "1419", + "title": "authorize_modifier_reader_batch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1418-001" + ], + "parityId": null, + "implementationClass": "QUEUE_ONLY", + "parallelGroup": "module-root-1419", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1419-000.md", + "behavior": "Authorize one shared source-backed modifier reader batch.", + "outputs": [ + "successor authorization", + "module plan", + "manifest", + "status" + ], + "acceptance": [ + "prior evidence remains hash-bound", + "batch source mapping is explicit", + "inventory remains source-derived" + ], + "commands": [ + "node tools/web/check-execution-control-plane.mjs" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1419-001", + "phase": "1419", + "title": "verify SCREEN_OT_edge_merge through existing native gate", + "kind": "module", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1419-000" + ], + "parityId": "MESH_MERGE_MACRO_BATCH", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "module-mesh_merge_macro_batch", + "gate": "MODULE", + "card": "docs/tasks/WBV2-P1419-001.md", + "behavior": "Verify the MESH_MERGE_MACRO_BATCH batch through Blender Main, WASM and Chromium recovery.", + "outputs": [ + "aggregate module receipt", + "coverage bindings", + "manifest", + "status" + ], + "acceptance": [ + "source and protocol hashes are bound", + "every selected Main reader type is proven", + "negative no-mutation and recovery are proven", + "Chromium and save/reopen evidence are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "batchId": "WBV2-P1419-001:MESH_MERGE_MACRO_BATCH:4ad92687badfa0da", + "selectedRecordIds": [ + "operator:SCREEN_OT_edge_merge" + ], + "module": { + "moduleId": "MESH_MERGE_MACRO_BATCH", + "batchId": "WBV2-P1419-001:MESH_MERGE_MACRO_BATCH:4ad92687badfa0da", + "selectedRecordIds": [ + "operator:SCREEN_OT_edge_merge" + ], + "sourceBacked": true, + "capabilities": [ + "CAP-MESH_MERGE_MACRO_BATCH-READER", + "CAP-MESH_MERGE_MACRO_BATCH-RECOVERY", + "CAP-MESH_MERGE_MACRO_BATCH-FAIL-CLOSED" + ], + "sourcePaths": [ + "blender-5.2.0/source/blender/editors/screen/screen_ops.cc", + "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "web/app/src/vendor/blender/web_engine.wasm", + "web/app/public/vendor/blender/web_engine.wasm", + "web/app/public/wasm-module-manifest.json", + "web/app/public/vendor/blender/modules/single/web_engine.secondary.wasm", + "web/app/public/vendor/blender/modules/pthread/web_engine.secondary.wasm" + ], + "reuseReceipts": [ + { + "manifest": "tests/golden/WBV2-P1107-000/manifest.json", + "report": "tests/golden/WBV2-P1107-000/module-receipt.json" + } + ], + "dependencyReuse": [], + "positive": [ + "SCREEN_OT_edge_merge type is read from Blender Main", + "shared RNA metadata is preserved", + "save/reopen preserves the batch metadata" + ], + "negative": [ + "malformed blend is rejected without Main mutation", + "unsupported batch data fails closed", + "non-finite metadata is not synthesized" + ], + "recovery": [ + "save/reopen", + "worker termination", + "deterministic second read" + ], + "commands": [ + "source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/single --split-funcs web_engine_get_live_handles && node tools/web/split-wbv2-wasm.mjs --input web/app/public/vendor/blender/pthread/web_engine.wasm --output-dir web/app/public/vendor/blender/modules/pthread --split-funcs web_engine_get_live_handles", + "npm --prefix web run typecheck", + "npm --prefix web run build", + "WBV2_BATCH_TASK=WBV2-P1419-001 WBV2_BATCH_PRODUCTION=tests/golden/WBV2-P1419-001/mesh-topology-production.json WBV2_BATCH_FIXTURE=tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend WBV2_BATCH_OPERATION=MERGE WBV2_BATCH_TYPES='[]' WBV2_BATCH_UNITS='[\"operator:SCREEN_OT_edge_merge\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-topology-production.spec.ts" + ], + "fullFamilyParity": false, + "evidencePaths": [ + "tests/golden/WBV2-P1419-001/mesh-topology-production.json" + ], + "coverageBindings": [ + "operator:SCREEN_OT_edge_merge" + ], + "commandBudget": { + "maxCommands": 48, + "maxReadCommands": 16 + } + } + }, + { + "id": "WBV2-P1420-000", + "phase": "1420", + "title": "authorize implementation-first Web product migration", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1419-001" + ], + "implementationClass": "QUEUE_ONLY", + "card": "docs/tasks/WBV2-P1420-000.md", + "commands": [], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1420-001", + "phase": "1420", + "title": "complete user-facing Web workflow implementation", + "kind": "product-module", + "owner": "WEB_PRODUCT", + "dependsOn": [ + "WBV2-P1420-000" + ], + "implementationClass": "PRODUCT_WORKFLOW", + "card": "docs/tasks/WBV2-P1420-001.md", + "commands": [ + "python3 my-tools/run_web_product_migration.py" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "productBacklog": "tests/golden/WBV2/web-product-backlog.json" + }, + { + "id": "WBV2-P1421-000", + "phase": "1420", + "title": "authorize implementation-first Web product migration", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1420-001" + ], + "implementationClass": "QUEUE_ONLY", + "card": "docs/tasks/WBV2-P1421-000.md", + "commands": [], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1421-001", + "phase": "1420", + "title": "complete user-facing Web workflow implementation", + "kind": "product-module", + "owner": "WEB_PRODUCT", + "dependsOn": [ + "WBV2-P1421-000" + ], + "implementationClass": "PRODUCT_WORKFLOW", + "card": "docs/tasks/WBV2-P1421-001.md", + "commands": [ + "python3 my-tools/run_web_product_migration.py" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "productBacklog": "tests/golden/WBV2/web-product-backlog.json", + "module": { + "sourcePaths": [ + "web/protocol/web-engine.ts", + "web/protocol/web-engine-capabilities.ts", + "web/app/src/workers/web-engine.worker.ts", + "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", + "blender-5.2.0/source/blender/web_engine/CMakeLists.txt", + "web/app/src/app/App.tsx", + "web/app/src/engine-client/WebEngineClient.ts", + "web/protocol/blender-operator.ts", + "web/protocol/core-scene-commands.ts", + "web/protocol/mesh-authoring-commands.ts", + "web/protocol/modifier.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/geometry-nodes.ts", + "web/protocol/shader-graph-commands.ts", + "web/protocol/shader-graph.ts", + "web/protocol/scene-ir.ts", + "web/protocol/animation-render-commands.ts", + "web/protocol/sequencer.ts", + "web/app/src/sequencer/SequencerTimeline.ts", + "web/protocol/io-format-ui-gate.ts", + "web/protocol/io-media-commands.ts", + "web/app/src/capabilities/io-format-ui-registry.json", + "web/protocol/paint.ts", + "web/protocol/sculpt.ts" + ] + } + }, + { + "id": "WBV2-P1422-000", + "phase": "1422", + "title": "authorize full Web feature gap implementation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P1421-001" + ], + "implementationClass": "QUEUE_ONLY", + "card": "docs/tasks/WBV2-P1422-000.md", + "commands": [], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P1422-001", + "phase": "1422", + "title": "complete full Web feature gap implementation", + "kind": "product-module", + "owner": "WEB_PRODUCT", + "dependsOn": [ + "WBV2-P1422-000" + ], + "implementationClass": "PRODUCT_WORKFLOW", + "card": "docs/tasks/WBV2-P1422-001.md", + "commands": [ + "python3 my-tools/run_web_product_migration.py" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true, + "productBacklog": "tests/golden/WBV2/web-product-backlog.json", + "module": { + "sourcePaths": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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/mesh-authoring-commands.ts", + "web/protocol/nonmesh-geometry-commands.ts", + "web/protocol/animation-render-commands.ts", + "web/protocol/sequencer.ts", + "web/protocol/compositor-commands.ts", + "web/protocol/physics-simulation.ts", + "web/protocol/tracking-mask.ts", + "web/protocol/grease-pencil.ts", + "web/protocol/render-routing.ts", + "web/protocol/render-capabilities.ts", + "web/protocol/asset-library-io.ts", + "web/protocol/library-main-append.ts", + "web/app/src/engine-client/WebEngineClient.ts" + ] + } + } + ] +} diff --git a/tests/golden/WBV2-P1422-001/manifest.json b/tests/golden/WBV2-P1422-001/manifest.json new file mode 100644 index 000000000..51ffd4779 --- /dev/null +++ b/tests/golden/WBV2-P1422-001/manifest.json @@ -0,0 +1,40 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1422-001", + "parentTask": "WBV2-P1422-000", + "operation": "WEB_PRODUCT_IMPLEMENTATION_COMPLETE", + "status": "done", + "implementationComplete": true, + "verificationDeferred": true, + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P1422-000/manifest.json", + "sha256": "029338b696a70067a81226e2550f1d6625cf14811bce4531feda9725bbd4386b" + }, + "backlog": { + "path": "tests/golden/WBV2/web-product-backlog.json", + "sha256": "b5e13411f42d2f1f7df8cf28709df746814bebe594206e2903810934a02eae41" + }, + "strategy": { + "path": "docs/WEB_PRODUCT_MIGRATION_STRATEGY.md", + "sha256": "b0086cf81a52c71b9efdd764c005d65de7fe48a8f013ce6405a76486bf2310e6" + }, + "report": { + "path": "tests/golden/WBV2-P1422-001/product-implementation-report.json", + "sha256": "7ec3cb49be0511958c995870975508eebd4f2c3d8396008cdcc83947c0e6c388" + }, + "status": { + "path": "docs/status/WBV2-P1422-001.md", + "sha256": "2c66f1acb30ee99695ca515098745f26d0d88329a3e7251584669b38a3008d18" + }, + "plan": { + "path": "tests/golden/WBV2-P1422-000/product-implementation-plan.json", + "sha256": "81ddad9460df9f8429fb5ccbccb4fde019bb1512e4434a66333b8a577f28ad7a" + }, + "taskContext": { + "path": "tests/golden/WBV2-P1422-001/task-context.json", + "sha256": "935832fa685b703cd9f886b022db7d629e1a4e32d66c9facb3dc08bacfb41146" + } + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P1422-001/product-implementation-report.json b/tests/golden/WBV2-P1422-001/product-implementation-report.json new file mode 100644 index 000000000..fb23154f4 --- /dev/null +++ b/tests/golden/WBV2-P1422-001/product-implementation-report.json @@ -0,0 +1,823 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1422-001", + "operation": "WEB_PRODUCT_IMPLEMENTATION_COMPLETE", + "status": "implemented", + "strategy": "implementation_first_full_feature_gaps", + "verificationPolicy": "deferred_until_user_reports", + "workflowModules": [ + { + "id": "PROJECT", + "title": "Project open, save and recovery", + "status": "implemented" + }, + { + "id": "WORKSPACE", + "title": "Web workspace and viewport", + "status": "implemented", + "taskIds": [ + "NATIVE-OPERATOR-BRIDGE", + "WEBUI-OPERATOR-PALETTE" + ] + }, + { + "id": "OBJECT", + "title": "Object and scene graph", + "status": "implemented", + "taskIds": [ + "NATIVE-OPERATOR-BRIDGE", + "OBJECT-EDITOR-COVERAGE" + ] + }, + { + "id": "MESH", + "title": "Mesh modeling and UV", + "status": "implemented", + "taskIds": [ + "MESH-EXTENDED-AUTHORING", + "MESH-EDITOR-COVERAGE" + ] + }, + { + "id": "NONMESH", + "title": "Non-mesh geometry", + "status": "implemented", + "taskIds": [ + "WEBUI-NONMESH-ADVANCED", + "WEBUI-FONT-ASSETS", + "CURVE-SURFACE-COVERAGE" + ] + }, + { + "id": "MATERIAL", + "title": "Materials, shaders and textures", + "status": "implemented" + }, + { + "id": "MODIFIER", + "title": "Modifiers and geometry nodes", + "status": "implemented", + "taskIds": [ + "MODIFIER-STACK-AUTHORING", + "NODE-GRAPH-AUTHORING" + ] + }, + { + "id": "ANIMATION", + "title": "Animation and NLA", + "status": "implemented", + "taskIds": [ + "WEBUI-NLA-STRIP", + "RIG-POSE-AUTHORING", + "ACTION-MARKER-AUTHORING", + "ARMATURE-EDITOR-COVERAGE", + "ANIMATION-FCURVE-DRIVER-COVERAGE" + ] + }, + { + "id": "PAINT", + "title": "Sculpt, paint and Grease Pencil", + "status": "implemented", + "taskIds": [ + "WEBUI-SCULPT", + "SCULPT-ADVANCED-AUTHORING", + "GREASE-PENCIL-COVERAGE" + ] + }, + { + "id": "RENDER", + "title": "Render, light, camera and world", + "status": "implemented", + "taskIds": [ + "RENDER-CAMERA-LIGHT-COVERAGE" + ] + }, + { + "id": "COMPOSITOR", + "title": "Compositor", + "status": "implemented" + }, + { + "id": "SIMULATION", + "title": "Physics and simulation", + "status": "implemented", + "taskIds": [ + "PHYSICS-SIMULATION-COVERAGE" + ] + }, + { + "id": "MEDIA", + "title": "Media, audio and sequencer", + "status": "implemented", + "taskIds": [ + "SEQUENCER-AUTHORING", + "SEQUENCER-COMPOSITOR-COVERAGE" + ] + }, + { + "id": "ASSET_IO", + "title": "Assets, libraries and interchange", + "status": "implemented", + "taskIds": [ + "IO-ROUTE-COMPLETION", + "TRACKING-MASK-COVERAGE", + "ASSET-LIBRARY-COVERAGE" + ] + }, + { + "id": "STORAGE", + "title": "Browser storage and recovery", + "status": "implemented" + }, + { + "id": "RUNTIME", + "title": "Worker, performance and modular WASM lifecycle", + "status": "implemented", + "taskIds": [ + "RNA-DATABLOCK-REFLECTION" + ] + } + ], + "implementationTasks": [ + { + "id": "WEBUI-NONMESH-ADVANCED", + "module": "NONMESH", + "title": "Expose advanced curve, surface and non-mesh deletion commands", + "status": "implemented", + "attempts": 1, + "commands": [ + "deleteNonMeshData", + "setCurveHandle", + "setCurveSplines", + "setSurfaceTopology" + ], + "ownedPaths": [ + "web/app/src/app/App.tsx", + "web/protocol/nonmesh-geometry-commands.ts" + ], + "resultPath": "tests/golden/WBV2/product-migration/WEBUI-NONMESH-ADVANCED-result.json", + "implementation": "Add context-aware user controls that construct the existing typed commands from the active non-mesh snapshot. Reuse current curve/surface state; do not create a generic JSON command console.", + "startedAt": "2026-09-05T20:52:34.181776+00:00", + "completedAt": "2026-09-05T21:00:54.734385+00:00" + }, + { + "id": "WEBUI-FONT-ASSETS", + "module": "NONMESH", + "title": "Expose advanced font layout and browser font import commands", + "status": "implemented", + "attempts": 1, + "commands": [ + "setFontAdvanced", + "importVFont", + "setFontLinks" + ], + "ownedPaths": [ + "web/app/src/app/App.tsx", + "web/protocol/nonmesh-geometry-commands.ts", + "web/app/src/fonts/external-vfont-import.ts" + ], + "resultPath": "tests/golden/WBV2/product-migration/WEBUI-FONT-ASSETS-result.json", + "implementation": "Add usable font layout/link controls and a TTF/OTF/PFB file picker that uses the existing browser font import adapter and native command route.", + "startedAt": "2026-09-05T21:05:24.110864+00:00", + "completedAt": "2026-09-05T21:28:47.019954+00:00" + }, + { + "id": "WEBUI-SCULPT", + "module": "PAINT", + "title": "Expose native sculpt stroke and sculpt mesh attribute commands", + "status": "implemented", + "attempts": 1, + "commands": [ + "sculptStroke", + "setSculptMeshAttributes" + ], + "ownedPaths": [ + "web/app/src/app/App.tsx", + "web/protocol/paint.ts" + ], + "resultPath": "tests/golden/WBV2/product-migration/WEBUI-SCULPT-result.json", + "implementation": "Add a compact sculpt panel for the active mesh, including brush controls, a deliberate apply action, and the existing native sculpt attribute route.", + "startedAt": "2026-09-05T21:30:26.904527+00:00", + "completedAt": "2026-09-05T21:37:32.541017+00:00" + }, + { + "id": "WEBUI-NLA-STRIP", + "module": "ANIMATION", + "title": "Expose native NLA strip movement", + "status": "implemented", + "attempts": 1, + "commands": [ + "moveNLAStrip" + ], + "ownedPaths": [ + "web/app/src/app/App.tsx", + "web/protocol/animation-render-commands.ts", + "web/protocol/nla.ts" + ], + "resultPath": "tests/golden/WBV2/product-migration/WEBUI-NLA-STRIP-result.json", + "implementation": "Add context-aware NLA track/strip selection and frame-start editing to the Timeline, using the existing typed moveNLAStrip command.", + "startedAt": "2026-09-05T21:37:32.541259+00:00", + "completedAt": "2026-09-05T21:44:42.999869+00:00" + }, + { + "id": "NATIVE-OPERATOR-BRIDGE", + "module": "WORKSPACE", + "title": "Add an allowlisted native Blender operator bridge", + "status": "implemented", + "attempts": 1, + "commands": [ + "listBlenderOperators", + "invokeBlenderOperator" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/web-engine-capabilities.ts", + "web/app/src/workers/web-engine.worker.ts", + "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", + "blender-5.2.0/source/blender/web_engine/CMakeLists.txt" + ], + "resultPath": "tests/golden/WBV2/product-migration/NATIVE-OPERATOR-BRIDGE-result.json", + "implementation": "Implement a source-backed operator catalog and invocation command for background-safe Blender operators. Use explicit allowlisting, typed JSON properties, context/poll checks, Main transaction rollback, revision updates, and scene refresh. UI/window/file-browser operators must be rejected and left to browser-native workflows.", + "startedAt": "2026-09-05T22:14:54.144626+00:00", + "completedAt": "2026-09-05T22:27:55.341091+00:00" + }, + { + "id": "WEBUI-OPERATOR-PALETTE", + "module": "WORKSPACE", + "title": "Expose the native operator catalog in the Web command palette", + "status": "implemented", + "attempts": 1, + "commands": [ + "listBlenderOperators", + "invokeBlenderOperator" + ], + "ownedPaths": [ + "web/app/src/app/App.tsx", + "web/app/src/engine-client/WebEngineClient.ts", + "web/protocol/blender-operator.ts", + "web/protocol/web-engine.ts" + ], + "resultPath": "tests/golden/WBV2/product-migration/WEBUI-OPERATOR-PALETTE-result.json", + "implementation": "Load the native background-safe operator catalog and merge it into F3 search. Add a compact typed property form for boolean, number, enum, and string properties, with an explicit execute action and no generic arbitrary JSON console.", + "startedAt": "2026-09-05T22:27:55.341459+00:00", + "completedAt": "2026-09-05T22:37:00.849547+00:00" + }, + { + "id": "MESH-EXTENDED-AUTHORING", + "module": "MESH", + "title": "Complete common primitive and mesh authoring workflows", + "status": "implemented", + "attempts": 1, + "commands": [ + "createPrimitive", + "meshEdit", + "invokeBlenderOperator" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/core-scene-commands.ts", + "web/protocol/mesh-authoring-commands.ts", + "web/app/src/app/App.tsx", + "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" + ], + "resultPath": "tests/golden/WBV2/product-migration/MESH-EXTENDED-AUTHORING-result.json", + "implementation": "Expose plane, UV sphere, ico sphere, cylinder, cone and torus creation plus subdivide, fill, triangulate, recalculate normals, bridge loops and delete mesh elements. Reuse the native operator bridge where a direct Main writer is not already present.", + "startedAt": "2026-09-05T22:37:00.849921+00:00", + "completedAt": "2026-09-05T22:47:31.861458+00:00" + }, + { + "id": "MODIFIER-STACK-AUTHORING", + "module": "MODIFIER", + "title": "Add complete modifier stack authoring controls", + "status": "implemented", + "attempts": 2, + "commands": [ + "addModifier", + "removeModifier", + "moveModifier", + "setModifierParameters" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/modifier.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "resultPath": "tests/golden/WBV2/product-migration/MODIFIER-STACK-AUTHORING-result.json", + "implementation": "Add native commands and Web controls to add, remove, reorder and edit supported modifier parameters. Drive available types and fields from existing modifier metadata rather than hard-coded test fixtures.", + "startedAt": "2026-09-05T23:02:33.341362+00:00", + "completedAt": "2026-09-05T23:08:38.910114+00:00" + }, + { + "id": "NODE-GRAPH-AUTHORING", + "module": "MODIFIER", + "title": "Add node graph creation and editing workflows", + "status": "implemented", + "attempts": 1, + "commands": [ + "setGeometryNodeGraph", + "setShaderGraph" + ], + "ownedPaths": [ + "web/app/src/app/App.tsx", + "web/protocol/geometry-node-commands.ts", + "web/protocol/geometry-nodes.ts", + "web/protocol/shader-graph-commands.ts", + "web/protocol/shader-graph.ts" + ], + "resultPath": "tests/golden/WBV2/product-migration/NODE-GRAPH-AUTHORING-result.json", + "implementation": "Provide usable graph controls for adding/removing nodes, connecting/disconnecting sockets, editing values, and committing Geometry/Shader graphs through the existing native full-graph commands.", + "startedAt": "2026-09-05T23:08:38.910493+00:00", + "completedAt": "2026-09-05T23:18:10.222798+00:00" + }, + { + "id": "RIG-POSE-AUTHORING", + "module": "ANIMATION", + "title": "Add armature, bone and pose authoring", + "status": "implemented", + "attempts": 1, + "commands": [ + "setArmatureBones", + "setPoseBoneTransform" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "resultPath": "tests/golden/WBV2/product-migration/RIG-POSE-AUTHORING-result.json", + "implementation": "Implement native armature bone creation/editing and pose transforms with parent relationships, roll, head/tail and transform controls, then expose them for the active armature in the Properties workspace.", + "startedAt": "2026-09-05T23:18:10.223133+00:00", + "completedAt": "2026-09-05T23:30:01.504463+00:00" + }, + { + "id": "ACTION-MARKER-AUTHORING", + "module": "ANIMATION", + "title": "Complete Action, keyframe and timeline marker workflows", + "status": "implemented", + "attempts": 1, + "commands": [ + "createAction", + "removeAction", + "setKeyframe", + "setTimelineMarkers" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/animation-render-commands.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "resultPath": "tests/golden/WBV2/product-migration/ACTION-MARKER-AUTHORING-result.json", + "implementation": "Add user workflows for creating/removing Actions, editing individual keyframe values/handles/interpolation, and adding, renaming, moving and deleting timeline markers through native Main commands.", + "startedAt": "2026-09-05T23:30:01.504832+00:00", + "completedAt": "2026-09-05T23:44:12.624142+00:00" + }, + { + "id": "SEQUENCER-AUTHORING", + "module": "MEDIA", + "title": "Complete sequencer strip editing", + "status": "implemented", + "attempts": 1, + "commands": [ + "setSequencerStrips" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/sequencer.ts", + "web/app/src/app/App.tsx", + "web/app/src/sequencer/SequencerTimeline.ts", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "resultPath": "tests/golden/WBV2/product-migration/SEQUENCER-AUTHORING-result.json", + "implementation": "Expose add, remove, move, trim, split, mute and channel editing for scene, movie, sound, image and meta strips. Commit the complete bounded strip list to Blender Main and retain existing browser media proxy services.", + "startedAt": "2026-09-05T23:44:12.632646+00:00", + "completedAt": "2026-09-05T23:59:08.903421+00:00" + }, + { + "id": "IO-ROUTE-COMPLETION", + "module": "ASSET_IO", + "title": "Complete browser file import and export routes", + "status": "implemented", + "attempts": 3, + "commands": [ + "importScene", + "exportScene" + ], + "ownedPaths": [ + "web/app/src/app/App.tsx", + "web/protocol/io-format-ui-gate.ts", + "web/protocol/io-media-commands.ts", + "web/app/src/capabilities/io-format-ui-registry.json", + "web/app/src/workers/web-engine.worker.ts", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp" + ], + "resultPath": "tests/golden/WBV2/product-migration/IO-ROUTE-COMPLETION-result.json", + "implementation": "Connect browser file pickers and downloads for the locally available GLB/glTF, OBJ, STL and PLY routes, preserve explicit loss reports, and route formats requiring unavailable native libraries to the existing server job provider.", + "startedAt": "2026-09-06T00:17:31.550579+00:00", + "completedAt": "2026-09-06T00:18:41.723445+00:00" + }, + { + "id": "SCULPT-ADVANCED-AUTHORING", + "module": "PAINT", + "title": "Complete advanced sculpt workflows", + "status": "implemented", + "attempts": 1, + "commands": [ + "sculptStroke", + "setSculptMeshAttributes", + "invokeBlenderOperator" + ], + "ownedPaths": [ + "web/app/src/app/App.tsx", + "web/protocol/paint.ts", + "web/protocol/sculpt.ts", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "resultPath": "tests/golden/WBV2/product-migration/SCULPT-ADVANCED-AUTHORING-result.json", + "implementation": "Add cursor-derived multi-sample strokes, mask and face-set operations, symmetry, smooth/inflate/grab controls, and remesh entry points using native commands or the allowlisted operator bridge.", + "startedAt": "2026-09-06T00:18:41.740013+00:00", + "completedAt": "2026-09-06T00:28:32.739026+00:00" + }, + { + "id": "OBJECT-EDITOR-COVERAGE", + "module": "OBJECT", + "title": "Complete object editor authoring workflows", + "commands": [ + "clearObjectTransform", + "createObjectData", + "setObjectSelection", + "setCollectionVisibility" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Map the remaining object editor workflows to native Main transactions: clear location/rotation/scale, create camera/light/empty/armature data, selection/visibility and collection operations. Preserve browser-native viewport context; do not emulate desktop screens.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/OBJECT-EDITOR-COVERAGE-result.json", + "startedAt": "2026-09-06T07:05:58.136822+00:00", + "completedAt": "2026-09-06T07:12:53.620632+00:00" + }, + { + "id": "MESH-EDITOR-COVERAGE", + "module": "MESH", + "title": "Complete mesh and UV editor authoring workflows", + "commands": [ + "meshSubdivide", + "meshTriangulate", + "meshRecalculateNormals", + "meshBridgeLoops", + "meshDeleteElements", + "meshUVProject" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/mesh-authoring-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Extend the existing native mesh writer for subdivide, triangulate, normal recalculation, bridge loops, delete variants and common UV projection/seam workflows, with typed selection and no JavaScript mesh simulation.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/MESH-EDITOR-COVERAGE-result.json", + "startedAt": "2026-09-06T07:27:55.065807+00:00", + "completedAt": "2026-09-06T07:30:55.273587+00:00" + }, + { + "id": "CURVE-SURFACE-COVERAGE", + "module": "NONMESH", + "title": "Complete curve, surface and point-data authoring", + "commands": [ + "setCurveBevel", + "setCurveTaper", + "convertCurveType", + "setSurfaceResolution", + "setMetaballElements" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/nonmesh-geometry-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Complete user-reachable curve/surface/point-cloud workflows using Blender Main data, including bevel/taper/resolution/type conversion and remaining metaball/curve properties.", + "attempts": 3, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/CURVE-SURFACE-COVERAGE-result.json", + "startedAt": "2026-09-06T08:00:57.802264+00:00", + "completedAt": "2026-09-06T08:09:58.460157+00:00" + }, + { + "id": "ARMATURE-EDITOR-COVERAGE", + "module": "ANIMATION", + "title": "Complete armature edit and constraint workflows", + "commands": [ + "armatureEditOperations", + "setBoneRoll", + "setBoneSymmetry", + "setBoneParenting", + "setPoseConstraint" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Extend the existing armature hierarchy writer with edit operations, roll/symmetry/parenting and pose constraints through native Main.", + "attempts": 1, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/ARMATURE-EDITOR-COVERAGE-result.json", + "startedAt": "2026-09-06T08:09:58.460669+00:00", + "completedAt": "2026-09-06T08:20:13.976073+00:00" + }, + { + "id": "ANIMATION-FCURVE-DRIVER-COVERAGE", + "module": "ANIMATION", + "title": "Complete FCurve, driver and keying workflows", + "commands": [ + "setFCurveKeyframes", + "setDriverExpression", + "setActionGroups", + "setKeyingSet", + "bakeAnimation" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/animation-render-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Add typed FCurve point/driver/group/keying-set and bounded bake workflows to the existing Action/Main path.", + "attempts": 1, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/ANIMATION-FCURVE-DRIVER-COVERAGE-result.json", + "startedAt": "2026-09-06T08:20:13.976587+00:00", + "completedAt": "2026-09-06T08:32:40.102320+00:00" + }, + { + "id": "SEQUENCER-COMPOSITOR-COVERAGE", + "module": "MEDIA", + "title": "Complete Sequencer effects and compositor authoring", + "commands": [ + "setSequencerStripModifiers", + "setSequencerTransitions", + "setCompositorNodeGraph", + "setSequencerColorBalance" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/sequencer.ts", + "web/protocol/compositor-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Extend full-strip editing with effects/transitions and expose compositor graph editing through native Main graph transactions.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/SEQUENCER-COMPOSITOR-COVERAGE-result.json", + "startedAt": "2026-09-06T08:47:41.719319+00:00", + "completedAt": "2026-09-06T08:52:12.046553+00:00" + }, + { + "id": "PHYSICS-SIMULATION-COVERAGE", + "module": "SIMULATION", + "title": "Complete physics and cache authoring workflows", + "commands": [ + "setRigidBodySettings", + "setClothSettings", + "setFluidSettings", + "setParticleCache", + "setSimulationPlayback" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/physics-simulation.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Add typed native Main settings and cache/playback controls for rigid body, cloth, fluid, soft body and particle workflows, with explicit unavailable-resource errors.", + "attempts": 3, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/PHYSICS-SIMULATION-COVERAGE-result.json", + "startedAt": "2026-09-06T09:22:14.678742+00:00", + "completedAt": "2026-09-06T09:26:45.048145+00:00" + }, + { + "id": "TRACKING-MASK-COVERAGE", + "module": "ASSET_IO", + "title": "Complete movie tracking and mask workflows", + "commands": [ + "setTrackingMarkers", + "setTrackingSolve", + "setMaskSpline", + "setMaskPoint" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/tracking-mask.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Expose browser media-backed tracking markers, solve settings and mask spline/point editing through native Main or the existing server job boundary.", + "attempts": 3, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/TRACKING-MASK-COVERAGE-result.json", + "startedAt": "2026-09-06T09:56:47.387769+00:00", + "completedAt": "2026-09-06T10:02:27.813011+00:00" + }, + { + "id": "GREASE-PENCIL-COVERAGE", + "module": "PAINT", + "title": "Complete Grease Pencil draw/edit/paint workflows", + "commands": [ + "setGreasePencilDrawing", + "setGreasePencilMaterial", + "setGreasePencilSelection", + "setGreasePencilInterpolate" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/grease-pencil.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Extend existing layer/frame/stroke support to drawing edit, material, selection, interpolation and browser pointer workflows.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/GREASE-PENCIL-COVERAGE-result.json", + "startedAt": "2026-09-06T10:17:29.027120+00:00", + "completedAt": "2026-09-06T10:25:59.509893+00:00" + }, + { + "id": "RENDER-CAMERA-LIGHT-COVERAGE", + "module": "RENDER", + "title": "Complete render, camera, light and pass workflows", + "commands": [ + "renderFrame", + "renderAnimation", + "setRenderPasses", + "setCameraView", + "setLightLinking" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/render-routing.ts", + "web/protocol/render-capabilities.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Complete user-visible render execution/routing, camera view controls, advanced light linking and render pass settings through native or explicit server routes.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/RENDER-CAMERA-LIGHT-COVERAGE-result.json", + "startedAt": "2026-09-06T10:41:00.334693+00:00", + "completedAt": "2026-09-06T10:54:01.657249+00:00" + }, + { + "id": "ASSET-LIBRARY-COVERAGE", + "module": "ASSET_IO", + "title": "Complete asset browser and library workflows", + "commands": [ + "assetMark", + "assetCatalog", + "libraryLink", + "libraryOverride", + "libraryReload" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/asset-library-io.ts", + "web/protocol/library-main-append.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Expose browser-native asset catalog, link/append/override/reload workflows and preserve path/security rules.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/ASSET-LIBRARY-COVERAGE-result.json", + "startedAt": "2026-09-06T11:09:02.966513+00:00", + "completedAt": "2026-09-06T11:12:43.274302+00:00" + }, + { + "id": "RNA-DATABLOCK-REFLECTION", + "module": "RUNTIME", + "title": "Complete generic RNA data-block reflection and editing", + "commands": [ + "listRNADataBlocks", + "readRNAProperties", + "setRNAProperty", + "listRNACollections" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Add source-backed bounded RNA reflection for the remaining user-editable data-block properties. Reject unsupported pointers, context-only properties and unsafe arbitrary execution.", + "attempts": 1, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/RNA-DATABLOCK-REFLECTION-result.json", + "startedAt": "2026-09-06T11:12:43.274783+00:00", + "completedAt": "2026-09-06T11:22:48.995579+00:00" + } + ], + "changedFiles": [ + "web/app/src/app/App.tsx", + "web/protocol/nonmesh-geometry-commands.ts", + "tests/golden/WBV2/product-migration/WEBUI-NONMESH-ADVANCED-result.json", + "web/app/src/fonts/external-vfont-import.ts", + "tests/golden/WBV2/product-migration/WEBUI-FONT-ASSETS-result.json", + "web/protocol/paint.ts", + "web/protocol/animation-render-commands.ts", + "web/protocol/web-engine.ts", + "web/protocol/web-engine-capabilities.ts", + "web/app/src/workers/web-engine.worker.ts", + "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", + "blender-5.2.0/source/blender/web_engine/CMakeLists.txt", + "web/app/src/engine-client/WebEngineClient.ts", + "web/protocol/blender-operator.ts", + "tests/golden/WBV2/product-migration/WEBUI-OPERATOR-PALETTE-result.json", + "web/protocol/core-scene-commands.ts", + "tests/golden/WBV2/product-migration/MESH-EXTENDED-AUTHORING-result.json", + "web/protocol/modifier.ts", + "web/protocol/geometry-node-commands.ts", + "web/protocol/shader-graph-commands.ts", + "tests/golden/WBV2/product-migration/NODE-GRAPH-AUTHORING-result.json", + "web/protocol/scene-ir.ts", + "tests/golden/WBV2/product-migration/RIG-POSE-AUTHORING-result.json", + "web/app/src/sequencer/SequencerTimeline.ts", + "web/protocol/io-format-ui-gate.ts", + "web/protocol/io-media-commands.ts", + "web/app/src/capabilities/io-format-ui-registry.json", + "tests/golden/WBV2/product-migration/OBJECT-EDITOR-COVERAGE-result.json", + "web/protocol/mesh-authoring-commands.ts", + "tests/golden/WBV2/product-migration/MESH-EDITOR-COVERAGE-result.json", + "tests/golden/WBV2/product-migration/ARMATURE-EDITOR-COVERAGE-result.json", + "web/protocol/sequencer.ts", + "web/protocol/compositor-commands.ts", + "tests/golden/WBV2/product-migration/SEQUENCER-COMPOSITOR-COVERAGE-result.json", + "web/protocol/physics-simulation.ts", + "web/protocol/render-routing.ts", + "web/protocol/render-capabilities.ts", + "tests/golden/WBV2/product-migration/RENDER-CAMERA-LIGHT-COVERAGE-result.json", + "web/protocol/asset-library-io.ts" + ], + "sourceInventory": { + "unitCount": 3745, + "role": "traceability_only", + "completionDenominator": false + } +} diff --git a/tests/golden/WBV2-P1422-001/task-context.json b/tests/golden/WBV2-P1422-001/task-context.json new file mode 100644 index 000000000..60cfa3079 --- /dev/null +++ b/tests/golden/WBV2-P1422-001/task-context.json @@ -0,0 +1,199 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P1422-001", + "parentTask": "WBV2-P1422-000", + "status": "in_progress", + "goal": "Implement every pending user-reachable Web feature gap in the backlog through Blender Main/WASM routes, preserving browser-native equivalents for desktop-only UI.", + "scope": { + "gap": "workflow:complete full Web feature gap implementation", + "ownerFamily": "WEB_PRODUCT", + "implementationClass": "PRODUCT_WORKFLOW" + }, + "commands": [ + "node tools/web/print-task-context.mjs" + ], + "inputPaths": [ + "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md" + ], + "inputMetadata": { + "docs/EXECUTION_QUEUE.md": { + "path": "docs/EXECUTION_QUEUE.md", + "exists": true, + "bytes": 4030, + "mtime_ns": "1788677406923880868", + "sha256": "780b955de6199a58cde8d2ed5bc67996980b6d3e245115f0568c993fa249f8bd" + }, + "docs/tasks/WBV2-P1422-001.md": { + "path": "docs/tasks/WBV2-P1422-001.md", + "exists": true, + "bytes": 1538, + "mtime_ns": "1788677406922421604", + "sha256": "4c583ed40f0b8a37e841d65cb487d6f971f88784b84541cb69202c06cdf12664" + }, + "tests/golden/WBV2-P1422-000/manifest.json": { + "path": "tests/golden/WBV2-P1422-000/manifest.json", + "exists": true, + "bytes": 907, + "mtime_ns": "1788693769038474014", + "sha256": "029338b696a70067a81226e2550f1d6625cf14811bce4531feda9725bbd4386b" + }, + "docs/status/WBV2-P1422-000.md": { + "path": "docs/status/WBV2-P1422-000.md", + "exists": true, + "bytes": 129, + "mtime_ns": "1788677406922505846", + "sha256": "343546c03b6d19e26f307c1cca9c63be9c612a9235c7c8d022c9897fc08d71f3" + }, + "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md": { + "path": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md", + "exists": true, + "bytes": 3236, + "mtime_ns": "1788676702684357487", + "sha256": "f50767b7757b3dc4b23a50fd23f87a1799254555ce03900b2fb9a5071c4c8fcb" + } + }, + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 3300, + "contextRemainingTokens": 823 + }, + "source": { + "bytes": 6604, + "tokens": 1653 + }, + "selected": [ + { + "path": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md", + "bytes": 3236, + "tokens": 809 + } + ], + "excluded": [ + { + "path": "tests/golden/WBV2/web-product-backlog.json", + "bytes": 31380, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2/product-migration/*-result.json", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P1422-001/product-implementation-report.json", + "bytes": 33598, + "reason": "EVIDENCE_BYTE_BUDGET" + } + ], + "totals": { + "files": 1, + "bytes": 3236, + "tokens": 809 + } + }, + "exitCriteria": [ + "focused command exits 0", + "report and manifest are hash-bound", + "failure path does not publish a late result" + ], + "nextTask": null, + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P1422-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P1422-000/manifest.json", + "parentStatus": "docs/status/WBV2-P1422-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P1422-001.md", + "tests/golden/WBV2-P1422-000/manifest.json", + "docs/status/WBV2-P1422-000.md" + ], + "machineOnly": [ + "tests/golden/WBV2/task-index.json", + "tests/golden/M15-03A/task-catalog.jsonl" + ], + "optionalByNeed": [ + "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "任务卡列出的精确协议/生产路径", + "任务卡明确命名的长期计划小节" + ], + "forbiddenByDefault": [ + "完整 CURRENT_EXECUTION_PLAN.md", + "完整 PROJECT_STATUS_AND_NEXT_WORK.md", + "全部 docs/status/*.md", + "完整 parity/WBS 计划", + "README 历史和 test-results/" + ] + }, + "parent": { + "manifest": { + "schemaVersion": 1, + "task": "WBV2-P1422-000", + "parentTask": "WBV2-P1421-001", + "status": "done", + "nextTask": "WBV2-P1422-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P1422-000 status", + "- status: `done`", + "- gap inventory: `docs/WEB_FULL_FEATURE_GAP_INVENTORY.md`", + "- nextTask: `WBV2-P1422-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1538, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 40, + "taskTokens": 385 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 4030, + "lines": 58, + "tokens": 1008 + }, + { + "path": "docs/tasks/WBV2-P1422-001.md", + "bytes": 1538, + "lines": 40, + "tokens": 385 + }, + { + "path": "tests/golden/WBV2-P1422-000/manifest.json", + "bytes": 907, + "lines": 27, + "tokens": 227 + }, + { + "path": "docs/status/WBV2-P1422-000.md", + "bytes": 129, + "lines": 6, + "tokens": 33 + } + ], + "sourceTokens": 1653, + "evidenceFiles": 1, + "evidenceBytes": 3236, + "evidenceTokens": 809, + "totalTokens": 2462, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3486, + "serializedContextTokens": 663, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/product-migration/ANIMATION-FCURVE-DRIVER-COVERAGE-result.json b/tests/golden/WBV2/product-migration/ANIMATION-FCURVE-DRIVER-COVERAGE-result.json new file mode 100644 index 000000000..7a5a970da --- /dev/null +++ b/tests/golden/WBV2/product-migration/ANIMATION-FCURVE-DRIVER-COVERAGE-result.json @@ -0,0 +1,14 @@ +{ + "schemaVersion": 1, + "task": "ANIMATION-FCURVE-DRIVER-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/protocol/animation-render-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "summary": "Added typed FCurve point, driver expression, Action group, Keying Set, and bounded frame-stepped bake commands through the Blender Main/WASM route, with Worker validation and Timeline controls." +} diff --git a/tests/golden/WBV2/product-migration/ARMATURE-EDITOR-COVERAGE-result.json b/tests/golden/WBV2/product-migration/ARMATURE-EDITOR-COVERAGE-result.json new file mode 100644 index 000000000..203c1ff8a --- /dev/null +++ b/tests/golden/WBV2/product-migration/ARMATURE-EDITOR-COVERAGE-result.json @@ -0,0 +1,16 @@ +{ + "schemaVersion": 1, + "task": "ARMATURE-EDITOR-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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", + "tests/golden/WBV2/product-migration/ARMATURE-EDITOR-COVERAGE-result.json" + ], + "summary": "Added native Main-backed armature edit batches, bone roll, X symmetry, parenting, and pose constraint commands with protocol, Worker, and UI wiring." +} diff --git a/tests/golden/WBV2/product-migration/ASSET-LIBRARY-COVERAGE-result.json b/tests/golden/WBV2/product-migration/ASSET-LIBRARY-COVERAGE-result.json new file mode 100644 index 000000000..fa2a459b1 --- /dev/null +++ b/tests/golden/WBV2/product-migration/ASSET-LIBRARY-COVERAGE-result.json @@ -0,0 +1,14 @@ +{ + "schemaVersion": 1, + "task": "ASSET-LIBRARY-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/protocol/asset-library-io.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "summary": "Exposed asset marking/catalog and library link, override, reload, and append workflows through the browser protocol, Worker, UI, and Blender Main/WASM routes with existing project-path security preserved; aligned the UI handler name with the five command controls." +} diff --git a/tests/golden/WBV2/product-migration/CURVE-SURFACE-COVERAGE-result.json b/tests/golden/WBV2/product-migration/CURVE-SURFACE-COVERAGE-result.json new file mode 100644 index 000000000..eba708eb5 --- /dev/null +++ b/tests/golden/WBV2/product-migration/CURVE-SURFACE-COVERAGE-result.json @@ -0,0 +1,14 @@ +{ + "schemaVersion": 1, + "task": "CURVE-SURFACE-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/protocol/nonmesh-geometry-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "summary": "Exposed curve bevel and taper authoring, curve/surface conversion, surface resolution, and metaball element editing through validated WebEngine commands backed by Blender Main data; conversion now synchronizes referencing Object types and dependency-graph recalc flags." +} diff --git a/tests/golden/WBV2/product-migration/GREASE-PENCIL-COVERAGE-result.json b/tests/golden/WBV2/product-migration/GREASE-PENCIL-COVERAGE-result.json new file mode 100644 index 000000000..3386addbc --- /dev/null +++ b/tests/golden/WBV2/product-migration/GREASE-PENCIL-COVERAGE-result.json @@ -0,0 +1,13 @@ +{ + "schemaVersion": 1, + "task": "GREASE-PENCIL-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "summary": "Completed Grease Pencil drawing edit, material assignment, selection, interpolation, and browser pointer workflows through the existing WebEngine protocol, Worker validation, and Blender Main/WASM command routes; corrected selection revision/drawing argument integration." +} diff --git a/tests/golden/WBV2/product-migration/MESH-EDITOR-COVERAGE-result.json b/tests/golden/WBV2/product-migration/MESH-EDITOR-COVERAGE-result.json new file mode 100644 index 000000000..556c5d533 --- /dev/null +++ b/tests/golden/WBV2/product-migration/MESH-EDITOR-COVERAGE-result.json @@ -0,0 +1,15 @@ +{ + "schemaVersion": 1, + "task": "MESH-EDITOR-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/protocol/mesh-authoring-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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", + "tests/golden/WBV2/product-migration/MESH-EDITOR-COVERAGE-result.json" + ], + "summary": "Exposed typed subdivide, triangulate, normal recalculation, bridge-loop, element-delete, and UV projection/seam commands through the existing WebEngine worker and Blender Main/WASM native mesh writer without JavaScript mesh simulation." +} diff --git a/tests/golden/WBV2/product-migration/OBJECT-EDITOR-COVERAGE-result.json b/tests/golden/WBV2/product-migration/OBJECT-EDITOR-COVERAGE-result.json new file mode 100644 index 000000000..bd0d02c7a --- /dev/null +++ b/tests/golden/WBV2/product-migration/OBJECT-EDITOR-COVERAGE-result.json @@ -0,0 +1,15 @@ +{ + "schemaVersion": 1, + "task": "OBJECT-EDITOR-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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", + "tests/golden/WBV2/product-migration/OBJECT-EDITOR-COVERAGE-result.json" + ], + "summary": "Exposed object transform clearing, camera/light/empty/armature creation, object selection, and collection visibility through validated browser controls and transactional Blender Main/WASM command routes." +} diff --git a/tests/golden/WBV2/product-migration/PHYSICS-SIMULATION-COVERAGE-result.json b/tests/golden/WBV2/product-migration/PHYSICS-SIMULATION-COVERAGE-result.json new file mode 100644 index 000000000..cc98f1b29 --- /dev/null +++ b/tests/golden/WBV2/product-migration/PHYSICS-SIMULATION-COVERAGE-result.json @@ -0,0 +1,14 @@ +{ + "schemaVersion": 1, + "task": "PHYSICS-SIMULATION-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/protocol/physics-simulation.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "summary": "Added typed physics Main authoring commands for rigid body, cloth, fluid, soft body, particle cache, and simulation playback, including native unavailable-resource errors." +} diff --git a/tests/golden/WBV2/product-migration/RENDER-CAMERA-LIGHT-COVERAGE-result.json b/tests/golden/WBV2/product-migration/RENDER-CAMERA-LIGHT-COVERAGE-result.json new file mode 100644 index 000000000..93c621c8e --- /dev/null +++ b/tests/golden/WBV2/product-migration/RENDER-CAMERA-LIGHT-COVERAGE-result.json @@ -0,0 +1,16 @@ +{ + "schemaVersion": 1, + "task": "RENDER-CAMERA-LIGHT-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/protocol/render-routing.ts", + "web/protocol/render-capabilities.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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", + "tests/golden/WBV2/product-migration/RENDER-CAMERA-LIGHT-COVERAGE-result.json" + ], + "summary": "Exposed renderFrame/renderAnimation native server routes and added bounded render-pass, camera-view, and light-linking commands delegating to Blender Main mutations, with protocol capability gates and App controls." +} diff --git a/tests/golden/WBV2/product-migration/RNA-DATABLOCK-REFLECTION-result.json b/tests/golden/WBV2/product-migration/RNA-DATABLOCK-REFLECTION-result.json new file mode 100644 index 000000000..27a73bb8a --- /dev/null +++ b/tests/golden/WBV2/product-migration/RNA-DATABLOCK-REFLECTION-result.json @@ -0,0 +1,16 @@ +{ + "schemaVersion": 1, + "task": "RNA-DATABLOCK-REFLECTION", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "summary": "Added bounded source-backed RNA data-block listing, primitive property reflection and editing, collection listing, revision-aware Main mutation, and fail-closed rejection of pointer, collection, context-only, readonly, and arbitrary execution paths across protocol, Worker, UI surface, and Blender WASM Main routes." +} diff --git a/tests/golden/WBV2/product-migration/SEQUENCER-COMPOSITOR-COVERAGE-result.json b/tests/golden/WBV2/product-migration/SEQUENCER-COMPOSITOR-COVERAGE-result.json new file mode 100644 index 000000000..bd7266be3 --- /dev/null +++ b/tests/golden/WBV2/product-migration/SEQUENCER-COMPOSITOR-COVERAGE-result.json @@ -0,0 +1,16 @@ +{ + "schemaVersion": 1, + "task": "SEQUENCER-COMPOSITOR-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/protocol/sequencer.ts", + "web/protocol/compositor-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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", + "tests/golden/WBV2/product-migration/SEQUENCER-COMPOSITOR-COVERAGE-result.json" + ], + "summary": "Completed native Main-backed Sequencer strip modifier, transition, color-balance, and compositor node-graph authoring routes with protocol, Worker, and App exposure." +} diff --git a/tests/golden/WBV2/product-migration/TRACKING-MASK-COVERAGE-result.json b/tests/golden/WBV2/product-migration/TRACKING-MASK-COVERAGE-result.json new file mode 100644 index 000000000..898b0abae --- /dev/null +++ b/tests/golden/WBV2/product-migration/TRACKING-MASK-COVERAGE-result.json @@ -0,0 +1,13 @@ +{ + "schemaVersion": 1, + "task": "TRACKING-MASK-COVERAGE", + "status": "implemented", + "changedFiles": [ + "web/protocol/web-engine.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "summary": "Exposed browser media-backed tracking marker and camera-solve commands plus mask spline and point editing through the WebEngine protocol, worker/app command boundary, and Blender Main/WASM native routes." +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index f3837c9fd..632654e4c 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -620,4 +620,6 @@ {"id":"WBV2-P1420-000","gapId":"workflow:authorize implementation-first Web product migration","ownerFamily":"PROGRAM","sourceTask":"1420","state":"completed","targetImplementationClass":"QUEUE_ONLY"} {"id":"WBV2-P1420-001","gapId":"workflow:complete user-facing Web workflow implementation","ownerFamily":"WEB_PRODUCT","sourceTask":"1420","state":"completed","targetImplementationClass":"PRODUCT_WORKFLOW"} {"id":"WBV2-P1421-000","gapId":"workflow:authorize implementation-first Web product migration","ownerFamily":"PROGRAM","sourceTask":"1420","state":"completed","targetImplementationClass":"QUEUE_ONLY"} -{"id":"WBV2-P1421-001","gapId":"workflow:complete user-facing Web workflow implementation","ownerFamily":"WEB_PRODUCT","sourceTask":"1420","state":"active","targetImplementationClass":"PRODUCT_WORKFLOW"} +{"id":"WBV2-P1421-001","gapId":"workflow:complete user-facing Web workflow implementation","ownerFamily":"WEB_PRODUCT","sourceTask":"1420","state":"completed","targetImplementationClass":"PRODUCT_WORKFLOW"} +{"id":"WBV2-P1422-000","gapId":"workflow:authorize full Web feature gap implementation","ownerFamily":"PROGRAM","sourceTask":"1422","state":"completed","targetImplementationClass":"QUEUE_ONLY"} +{"id":"WBV2-P1422-001","gapId":"workflow:complete full Web feature gap implementation","ownerFamily":"WEB_PRODUCT","sourceTask":"1422","state":"completed","targetImplementationClass":"PRODUCT_WORKFLOW"} diff --git a/tests/golden/WBV2/task-index.json b/tests/golden/WBV2/task-index.json index 90ba154ec..b31dd5051 100644 --- a/tests/golden/WBV2/task-index.json +++ b/tests/golden/WBV2/task-index.json @@ -1 +1 @@ -{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1421-000/product-implementation-plan.json","sha256":"24baf7b9b1995f5c763a13f3baa708089ac6e60b8006deadbd8445479d859531"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"11edbc43a88c4fdf5cc41524bebccd9c23448710db3b158e3e8e8fe9ffaf9b35"},"taskCount":623,"activeTask":"WBV2-P1421-001","entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":"WBV2-P1164-000"},"WBV2-P1164-000":{"line":107,"offset":38702,"length":303,"previous":"WBV2-P1163-001","next":"WBV2-P1164-001"},"WBV2-P1164-001":{"line":108,"offset":39005,"length":360,"previous":"WBV2-P1164-000","next":"WBV2-P1165-000"},"WBV2-P1165-000":{"line":109,"offset":39365,"length":303,"previous":"WBV2-P1164-001","next":"WBV2-P1165-001"},"WBV2-P1165-001":{"line":110,"offset":39668,"length":366,"previous":"WBV2-P1165-000","next":"WBV2-P1166-000"},"WBV2-P1166-000":{"line":111,"offset":40034,"length":303,"previous":"WBV2-P1165-001","next":"WBV2-P1166-001"},"WBV2-P1166-001":{"line":112,"offset":40337,"length":366,"previous":"WBV2-P1166-000","next":"WBV2-P1167-000"},"WBV2-P1167-000":{"line":113,"offset":40703,"length":303,"previous":"WBV2-P1166-001","next":"WBV2-P1167-001"},"WBV2-P1167-001":{"line":114,"offset":41006,"length":366,"previous":"WBV2-P1167-000","next":"WBV2-P1168-000"},"WBV2-P1168-000":{"line":115,"offset":41372,"length":303,"previous":"WBV2-P1167-001","next":"WBV2-P1168-001"},"WBV2-P1168-001":{"line":116,"offset":41675,"length":366,"previous":"WBV2-P1168-000","next":"WBV2-P1169-000"},"WBV2-P1169-000":{"line":117,"offset":42041,"length":303,"previous":"WBV2-P1168-001","next":"WBV2-P1169-001"},"WBV2-P1169-001":{"line":118,"offset":42344,"length":366,"previous":"WBV2-P1169-000","next":"WBV2-P1170-000"},"WBV2-P1170-000":{"line":119,"offset":42710,"length":303,"previous":"WBV2-P1169-001","next":"WBV2-P1170-001"},"WBV2-P1170-001":{"line":120,"offset":43013,"length":366,"previous":"WBV2-P1170-000","next":"WBV2-P1171-000"},"WBV2-P1171-000":{"line":121,"offset":43379,"length":303,"previous":"WBV2-P1170-001","next":"WBV2-P1171-001"},"WBV2-P1171-001":{"line":122,"offset":43682,"length":366,"previous":"WBV2-P1171-000","next":"WBV2-P1172-000"},"WBV2-P1172-000":{"line":123,"offset":44048,"length":303,"previous":"WBV2-P1171-001","next":"WBV2-P1172-001"},"WBV2-P1172-001":{"line":124,"offset":44351,"length":366,"previous":"WBV2-P1172-000","next":"WBV2-P1173-000"},"WBV2-P1173-000":{"line":125,"offset":44717,"length":303,"previous":"WBV2-P1172-001","next":"WBV2-P1173-001"},"WBV2-P1173-001":{"line":126,"offset":45020,"length":366,"previous":"WBV2-P1173-000","next":"WBV2-P1174-000"},"WBV2-P1174-000":{"line":127,"offset":45386,"length":303,"previous":"WBV2-P1173-001","next":"WBV2-P1174-001"},"WBV2-P1174-001":{"line":128,"offset":45689,"length":366,"previous":"WBV2-P1174-000","next":"WBV2-P1175-000"},"WBV2-P1175-000":{"line":129,"offset":46055,"length":303,"previous":"WBV2-P1174-001","next":"WBV2-P1175-001"},"WBV2-P1175-001":{"line":130,"offset":46358,"length":366,"previous":"WBV2-P1175-000","next":"WBV2-P1176-000"},"WBV2-P1176-000":{"line":131,"offset":46724,"length":303,"previous":"WBV2-P1175-001","next":"WBV2-P1176-001"},"WBV2-P1176-001":{"line":132,"offset":47027,"length":364,"previous":"WBV2-P1176-000","next":"WBV2-P1177-000"},"WBV2-P1177-000":{"line":133,"offset":47391,"length":303,"previous":"WBV2-P1176-001","next":"WBV2-P1177-001"},"WBV2-P1177-001":{"line":134,"offset":47694,"length":364,"previous":"WBV2-P1177-000","next":"WBV2-P1178-000"},"WBV2-P1178-000":{"line":135,"offset":48058,"length":303,"previous":"WBV2-P1177-001","next":"WBV2-P1178-001"},"WBV2-P1178-001":{"line":136,"offset":48361,"length":364,"previous":"WBV2-P1178-000","next":"WBV2-P1179-000"},"WBV2-P1179-000":{"line":137,"offset":48725,"length":303,"previous":"WBV2-P1178-001","next":"WBV2-P1179-001"},"WBV2-P1179-001":{"line":138,"offset":49028,"length":364,"previous":"WBV2-P1179-000","next":"WBV2-P1180-000"},"WBV2-P1180-000":{"line":139,"offset":49392,"length":303,"previous":"WBV2-P1179-001","next":"WBV2-P1180-001"},"WBV2-P1180-001":{"line":140,"offset":49695,"length":364,"previous":"WBV2-P1180-000","next":"WBV2-P1181-000"},"WBV2-P1181-000":{"line":141,"offset":50059,"length":303,"previous":"WBV2-P1180-001","next":"WBV2-P1181-001"},"WBV2-P1181-001":{"line":142,"offset":50362,"length":364,"previous":"WBV2-P1181-000","next":"WBV2-P1182-000"},"WBV2-P1182-000":{"line":143,"offset":50726,"length":303,"previous":"WBV2-P1181-001","next":"WBV2-P1182-001"},"WBV2-P1182-001":{"line":144,"offset":51029,"length":364,"previous":"WBV2-P1182-000","next":"WBV2-P1183-000"},"WBV2-P1183-000":{"line":145,"offset":51393,"length":303,"previous":"WBV2-P1182-001","next":"WBV2-P1183-001"},"WBV2-P1183-001":{"line":146,"offset":51696,"length":364,"previous":"WBV2-P1183-000","next":"WBV2-P1184-000"},"WBV2-P1184-000":{"line":147,"offset":52060,"length":303,"previous":"WBV2-P1183-001","next":"WBV2-P1184-001"},"WBV2-P1184-001":{"line":148,"offset":52363,"length":364,"previous":"WBV2-P1184-000","next":"WBV2-P1185-000"},"WBV2-P1185-000":{"line":149,"offset":52727,"length":303,"previous":"WBV2-P1184-001","next":"WBV2-P1185-001"},"WBV2-P1185-001":{"line":150,"offset":53030,"length":364,"previous":"WBV2-P1185-000","next":"WBV2-P1186-000"},"WBV2-P1186-000":{"line":151,"offset":53394,"length":303,"previous":"WBV2-P1185-001","next":"WBV2-P1186-001"},"WBV2-P1186-001":{"line":152,"offset":53697,"length":364,"previous":"WBV2-P1186-000","next":"WBV2-P1187-000"},"WBV2-P1187-000":{"line":153,"offset":54061,"length":303,"previous":"WBV2-P1186-001","next":"WBV2-P1187-001"},"WBV2-P1187-001":{"line":154,"offset":54364,"length":364,"previous":"WBV2-P1187-000","next":"WBV2-P1188-000"},"WBV2-P1188-000":{"line":155,"offset":54728,"length":303,"previous":"WBV2-P1187-001","next":"WBV2-P1188-001"},"WBV2-P1188-001":{"line":156,"offset":55031,"length":364,"previous":"WBV2-P1188-000","next":"WBV2-P1189-000"},"WBV2-P1189-000":{"line":157,"offset":55395,"length":303,"previous":"WBV2-P1188-001","next":"WBV2-P1189-001"},"WBV2-P1189-001":{"line":158,"offset":55698,"length":364,"previous":"WBV2-P1189-000","next":"WBV2-P1190-000"},"WBV2-P1190-000":{"line":159,"offset":56062,"length":303,"previous":"WBV2-P1189-001","next":"WBV2-P1190-001"},"WBV2-P1190-001":{"line":160,"offset":56365,"length":364,"previous":"WBV2-P1190-000","next":"WBV2-P1191-000"},"WBV2-P1191-000":{"line":161,"offset":56729,"length":303,"previous":"WBV2-P1190-001","next":"WBV2-P1191-001"},"WBV2-P1191-001":{"line":162,"offset":57032,"length":364,"previous":"WBV2-P1191-000","next":"WBV2-P1192-000"},"WBV2-P1192-000":{"line":163,"offset":57396,"length":303,"previous":"WBV2-P1191-001","next":"WBV2-P1192-001"},"WBV2-P1192-001":{"line":164,"offset":57699,"length":364,"previous":"WBV2-P1192-000","next":"WBV2-P1193-000"},"WBV2-P1193-000":{"line":165,"offset":58063,"length":303,"previous":"WBV2-P1192-001","next":"WBV2-P1193-001"},"WBV2-P1193-001":{"line":166,"offset":58366,"length":364,"previous":"WBV2-P1193-000","next":"WBV2-P1194-000"},"WBV2-P1194-000":{"line":167,"offset":58730,"length":303,"previous":"WBV2-P1193-001","next":"WBV2-P1194-001"},"WBV2-P1194-001":{"line":168,"offset":59033,"length":364,"previous":"WBV2-P1194-000","next":"WBV2-P1195-000"},"WBV2-P1195-000":{"line":169,"offset":59397,"length":303,"previous":"WBV2-P1194-001","next":"WBV2-P1195-001"},"WBV2-P1195-001":{"line":170,"offset":59700,"length":364,"previous":"WBV2-P1195-000","next":"WBV2-P1196-000"},"WBV2-P1196-000":{"line":171,"offset":60064,"length":303,"previous":"WBV2-P1195-001","next":"WBV2-P1196-001"},"WBV2-P1196-001":{"line":172,"offset":60367,"length":364,"previous":"WBV2-P1196-000","next":"WBV2-P1197-000"},"WBV2-P1197-000":{"line":173,"offset":60731,"length":303,"previous":"WBV2-P1196-001","next":"WBV2-P1197-001"},"WBV2-P1197-001":{"line":174,"offset":61034,"length":364,"previous":"WBV2-P1197-000","next":"WBV2-P1198-000"},"WBV2-P1198-000":{"line":175,"offset":61398,"length":303,"previous":"WBV2-P1197-001","next":"WBV2-P1198-001"},"WBV2-P1198-001":{"line":176,"offset":61701,"length":364,"previous":"WBV2-P1198-000","next":"WBV2-P1199-000"},"WBV2-P1199-000":{"line":177,"offset":62065,"length":303,"previous":"WBV2-P1198-001","next":"WBV2-P1199-001"},"WBV2-P1199-001":{"line":178,"offset":62368,"length":364,"previous":"WBV2-P1199-000","next":"WBV2-P1200-000"},"WBV2-P1200-000":{"line":179,"offset":62732,"length":303,"previous":"WBV2-P1199-001","next":"WBV2-P1200-001"},"WBV2-P1200-001":{"line":180,"offset":63035,"length":364,"previous":"WBV2-P1200-000","next":"WBV2-P1201-000"},"WBV2-P1201-000":{"line":181,"offset":63399,"length":303,"previous":"WBV2-P1200-001","next":"WBV2-P1201-001"},"WBV2-P1201-001":{"line":182,"offset":63702,"length":364,"previous":"WBV2-P1201-000","next":"WBV2-P1202-000"},"WBV2-P1202-000":{"line":183,"offset":64066,"length":303,"previous":"WBV2-P1201-001","next":"WBV2-P1202-001"},"WBV2-P1202-001":{"line":184,"offset":64369,"length":364,"previous":"WBV2-P1202-000","next":"WBV2-P1203-000"},"WBV2-P1203-000":{"line":185,"offset":64733,"length":303,"previous":"WBV2-P1202-001","next":"WBV2-P1203-001"},"WBV2-P1203-001":{"line":186,"offset":65036,"length":364,"previous":"WBV2-P1203-000","next":"WBV2-P1204-000"},"WBV2-P1204-000":{"line":187,"offset":65400,"length":303,"previous":"WBV2-P1203-001","next":"WBV2-P1204-001"},"WBV2-P1204-001":{"line":188,"offset":65703,"length":364,"previous":"WBV2-P1204-000","next":"WBV2-P1205-000"},"WBV2-P1205-000":{"line":189,"offset":66067,"length":303,"previous":"WBV2-P1204-001","next":"WBV2-P1205-001"},"WBV2-P1205-001":{"line":190,"offset":66370,"length":364,"previous":"WBV2-P1205-000","next":"WBV2-P1206-000"},"WBV2-P1206-000":{"line":191,"offset":66734,"length":303,"previous":"WBV2-P1205-001","next":"WBV2-P1206-001"},"WBV2-P1206-001":{"line":192,"offset":67037,"length":364,"previous":"WBV2-P1206-000","next":"WBV2-P1207-000"},"WBV2-P1207-000":{"line":193,"offset":67401,"length":303,"previous":"WBV2-P1206-001","next":"WBV2-P1207-001"},"WBV2-P1207-001":{"line":194,"offset":67704,"length":364,"previous":"WBV2-P1207-000","next":"WBV2-P1208-000"},"WBV2-P1208-000":{"line":195,"offset":68068,"length":303,"previous":"WBV2-P1207-001","next":"WBV2-P1208-001"},"WBV2-P1208-001":{"line":196,"offset":68371,"length":364,"previous":"WBV2-P1208-000","next":"WBV2-P1209-000"},"WBV2-P1209-000":{"line":197,"offset":68735,"length":303,"previous":"WBV2-P1208-001","next":"WBV2-P1209-001"},"WBV2-P1209-001":{"line":198,"offset":69038,"length":364,"previous":"WBV2-P1209-000","next":"WBV2-P1210-000"},"WBV2-P1210-000":{"line":199,"offset":69402,"length":303,"previous":"WBV2-P1209-001","next":"WBV2-P1210-001"},"WBV2-P1210-001":{"line":200,"offset":69705,"length":364,"previous":"WBV2-P1210-000","next":"WBV2-P1211-000"},"WBV2-P1211-000":{"line":201,"offset":70069,"length":303,"previous":"WBV2-P1210-001","next":"WBV2-P1211-001"},"WBV2-P1211-001":{"line":202,"offset":70372,"length":364,"previous":"WBV2-P1211-000","next":"WBV2-P1212-000"},"WBV2-P1212-000":{"line":203,"offset":70736,"length":303,"previous":"WBV2-P1211-001","next":"WBV2-P1212-001"},"WBV2-P1212-001":{"line":204,"offset":71039,"length":364,"previous":"WBV2-P1212-000","next":"WBV2-P1213-000"},"WBV2-P1213-000":{"line":205,"offset":71403,"length":303,"previous":"WBV2-P1212-001","next":"WBV2-P1213-001"},"WBV2-P1213-001":{"line":206,"offset":71706,"length":364,"previous":"WBV2-P1213-000","next":"WBV2-P1214-000"},"WBV2-P1214-000":{"line":207,"offset":72070,"length":303,"previous":"WBV2-P1213-001","next":"WBV2-P1214-001"},"WBV2-P1214-001":{"line":208,"offset":72373,"length":364,"previous":"WBV2-P1214-000","next":"WBV2-P1215-000"},"WBV2-P1215-000":{"line":209,"offset":72737,"length":303,"previous":"WBV2-P1214-001","next":"WBV2-P1215-001"},"WBV2-P1215-001":{"line":210,"offset":73040,"length":364,"previous":"WBV2-P1215-000","next":"WBV2-P1216-000"},"WBV2-P1216-000":{"line":211,"offset":73404,"length":303,"previous":"WBV2-P1215-001","next":"WBV2-P1216-001"},"WBV2-P1216-001":{"line":212,"offset":73707,"length":364,"previous":"WBV2-P1216-000","next":"WBV2-P1217-000"},"WBV2-P1217-000":{"line":213,"offset":74071,"length":303,"previous":"WBV2-P1216-001","next":"WBV2-P1217-001"},"WBV2-P1217-001":{"line":214,"offset":74374,"length":364,"previous":"WBV2-P1217-000","next":"WBV2-P1218-000"},"WBV2-P1218-000":{"line":215,"offset":74738,"length":303,"previous":"WBV2-P1217-001","next":"WBV2-P1218-001"},"WBV2-P1218-001":{"line":216,"offset":75041,"length":364,"previous":"WBV2-P1218-000","next":"WBV2-P1219-000"},"WBV2-P1219-000":{"line":217,"offset":75405,"length":303,"previous":"WBV2-P1218-001","next":"WBV2-P1219-001"},"WBV2-P1219-001":{"line":218,"offset":75708,"length":364,"previous":"WBV2-P1219-000","next":"WBV2-P1220-000"},"WBV2-P1220-000":{"line":219,"offset":76072,"length":303,"previous":"WBV2-P1219-001","next":"WBV2-P1220-001"},"WBV2-P1220-001":{"line":220,"offset":76375,"length":364,"previous":"WBV2-P1220-000","next":"WBV2-P1221-000"},"WBV2-P1221-000":{"line":221,"offset":76739,"length":303,"previous":"WBV2-P1220-001","next":"WBV2-P1221-001"},"WBV2-P1221-001":{"line":222,"offset":77042,"length":364,"previous":"WBV2-P1221-000","next":"WBV2-P1222-000"},"WBV2-P1222-000":{"line":223,"offset":77406,"length":303,"previous":"WBV2-P1221-001","next":"WBV2-P1222-001"},"WBV2-P1222-001":{"line":224,"offset":77709,"length":364,"previous":"WBV2-P1222-000","next":"WBV2-P1223-000"},"WBV2-P1223-000":{"line":225,"offset":78073,"length":303,"previous":"WBV2-P1222-001","next":"WBV2-P1223-001"},"WBV2-P1223-001":{"line":226,"offset":78376,"length":364,"previous":"WBV2-P1223-000","next":"WBV2-P1224-000"},"WBV2-P1224-000":{"line":227,"offset":78740,"length":303,"previous":"WBV2-P1223-001","next":"WBV2-P1224-001"},"WBV2-P1224-001":{"line":228,"offset":79043,"length":364,"previous":"WBV2-P1224-000","next":"WBV2-P1225-000"},"WBV2-P1225-000":{"line":229,"offset":79407,"length":303,"previous":"WBV2-P1224-001","next":"WBV2-P1225-001"},"WBV2-P1225-001":{"line":230,"offset":79710,"length":364,"previous":"WBV2-P1225-000","next":"WBV2-P1226-000"},"WBV2-P1226-000":{"line":231,"offset":80074,"length":303,"previous":"WBV2-P1225-001","next":"WBV2-P1226-001"},"WBV2-P1226-001":{"line":232,"offset":80377,"length":364,"previous":"WBV2-P1226-000","next":"WBV2-P1227-000"},"WBV2-P1227-000":{"line":233,"offset":80741,"length":303,"previous":"WBV2-P1226-001","next":"WBV2-P1227-001"},"WBV2-P1227-001":{"line":234,"offset":81044,"length":364,"previous":"WBV2-P1227-000","next":"WBV2-P1228-000"},"WBV2-P1228-000":{"line":235,"offset":81408,"length":303,"previous":"WBV2-P1227-001","next":"WBV2-P1228-001"},"WBV2-P1228-001":{"line":236,"offset":81711,"length":364,"previous":"WBV2-P1228-000","next":"WBV2-P1229-000"},"WBV2-P1229-000":{"line":237,"offset":82075,"length":303,"previous":"WBV2-P1228-001","next":"WBV2-P1229-001"},"WBV2-P1229-001":{"line":238,"offset":82378,"length":364,"previous":"WBV2-P1229-000","next":"WBV2-P1230-000"},"WBV2-P1230-000":{"line":239,"offset":82742,"length":303,"previous":"WBV2-P1229-001","next":"WBV2-P1230-001"},"WBV2-P1230-001":{"line":240,"offset":83045,"length":364,"previous":"WBV2-P1230-000","next":"WBV2-P1231-000"},"WBV2-P1231-000":{"line":241,"offset":83409,"length":303,"previous":"WBV2-P1230-001","next":"WBV2-P1231-001"},"WBV2-P1231-001":{"line":242,"offset":83712,"length":364,"previous":"WBV2-P1231-000","next":"WBV2-P1232-000"},"WBV2-P1232-000":{"line":243,"offset":84076,"length":303,"previous":"WBV2-P1231-001","next":"WBV2-P1232-001"},"WBV2-P1232-001":{"line":244,"offset":84379,"length":364,"previous":"WBV2-P1232-000","next":"WBV2-P1233-000"},"WBV2-P1233-000":{"line":245,"offset":84743,"length":303,"previous":"WBV2-P1232-001","next":"WBV2-P1233-001"},"WBV2-P1233-001":{"line":246,"offset":85046,"length":364,"previous":"WBV2-P1233-000","next":"WBV2-P1234-000"},"WBV2-P1234-000":{"line":247,"offset":85410,"length":303,"previous":"WBV2-P1233-001","next":"WBV2-P1234-001"},"WBV2-P1234-001":{"line":248,"offset":85713,"length":364,"previous":"WBV2-P1234-000","next":"WBV2-P1235-000"},"WBV2-P1235-000":{"line":249,"offset":86077,"length":303,"previous":"WBV2-P1234-001","next":"WBV2-P1235-001"},"WBV2-P1235-001":{"line":250,"offset":86380,"length":364,"previous":"WBV2-P1235-000","next":"WBV2-P1236-000"},"WBV2-P1236-000":{"line":251,"offset":86744,"length":303,"previous":"WBV2-P1235-001","next":"WBV2-P1236-001"},"WBV2-P1236-001":{"line":252,"offset":87047,"length":364,"previous":"WBV2-P1236-000","next":"WBV2-P1237-000"},"WBV2-P1237-000":{"line":253,"offset":87411,"length":303,"previous":"WBV2-P1236-001","next":"WBV2-P1237-001"},"WBV2-P1237-001":{"line":254,"offset":87714,"length":364,"previous":"WBV2-P1237-000","next":"WBV2-P1238-000"},"WBV2-P1238-000":{"line":255,"offset":88078,"length":303,"previous":"WBV2-P1237-001","next":"WBV2-P1238-001"},"WBV2-P1238-001":{"line":256,"offset":88381,"length":364,"previous":"WBV2-P1238-000","next":"WBV2-P1239-000"},"WBV2-P1239-000":{"line":257,"offset":88745,"length":303,"previous":"WBV2-P1238-001","next":"WBV2-P1239-001"},"WBV2-P1239-001":{"line":258,"offset":89048,"length":364,"previous":"WBV2-P1239-000","next":"WBV2-P1240-000"},"WBV2-P1240-000":{"line":259,"offset":89412,"length":303,"previous":"WBV2-P1239-001","next":"WBV2-P1240-001"},"WBV2-P1240-001":{"line":260,"offset":89715,"length":364,"previous":"WBV2-P1240-000","next":"WBV2-P1241-000"},"WBV2-P1241-000":{"line":261,"offset":90079,"length":303,"previous":"WBV2-P1240-001","next":"WBV2-P1241-001"},"WBV2-P1241-001":{"line":262,"offset":90382,"length":364,"previous":"WBV2-P1241-000","next":"WBV2-P1242-000"},"WBV2-P1242-000":{"line":263,"offset":90746,"length":303,"previous":"WBV2-P1241-001","next":"WBV2-P1242-001"},"WBV2-P1242-001":{"line":264,"offset":91049,"length":364,"previous":"WBV2-P1242-000","next":"WBV2-P1243-000"},"WBV2-P1243-000":{"line":265,"offset":91413,"length":303,"previous":"WBV2-P1242-001","next":"WBV2-P1243-001"},"WBV2-P1243-001":{"line":266,"offset":91716,"length":364,"previous":"WBV2-P1243-000","next":"WBV2-P1244-000"},"WBV2-P1244-000":{"line":267,"offset":92080,"length":303,"previous":"WBV2-P1243-001","next":"WBV2-P1244-001"},"WBV2-P1244-001":{"line":268,"offset":92383,"length":364,"previous":"WBV2-P1244-000","next":"WBV2-P1245-000"},"WBV2-P1245-000":{"line":269,"offset":92747,"length":303,"previous":"WBV2-P1244-001","next":"WBV2-P1245-001"},"WBV2-P1245-001":{"line":270,"offset":93050,"length":364,"previous":"WBV2-P1245-000","next":"WBV2-P1246-000"},"WBV2-P1246-000":{"line":271,"offset":93414,"length":303,"previous":"WBV2-P1245-001","next":"WBV2-P1246-001"},"WBV2-P1246-001":{"line":272,"offset":93717,"length":362,"previous":"WBV2-P1246-000","next":"WBV2-P1247-000"},"WBV2-P1247-000":{"line":273,"offset":94079,"length":303,"previous":"WBV2-P1246-001","next":"WBV2-P1247-001"},"WBV2-P1247-001":{"line":274,"offset":94382,"length":362,"previous":"WBV2-P1247-000","next":"WBV2-P1248-000"},"WBV2-P1248-000":{"line":275,"offset":94744,"length":303,"previous":"WBV2-P1247-001","next":"WBV2-P1248-001"},"WBV2-P1248-001":{"line":276,"offset":95047,"length":362,"previous":"WBV2-P1248-000","next":"WBV2-P1249-000"},"WBV2-P1249-000":{"line":277,"offset":95409,"length":303,"previous":"WBV2-P1248-001","next":"WBV2-P1249-001"},"WBV2-P1249-001":{"line":278,"offset":95712,"length":362,"previous":"WBV2-P1249-000","next":"WBV2-P1250-000"},"WBV2-P1250-000":{"line":279,"offset":96074,"length":303,"previous":"WBV2-P1249-001","next":"WBV2-P1250-001"},"WBV2-P1250-001":{"line":280,"offset":96377,"length":362,"previous":"WBV2-P1250-000","next":"WBV2-P1251-000"},"WBV2-P1251-000":{"line":281,"offset":96739,"length":303,"previous":"WBV2-P1250-001","next":"WBV2-P1251-001"},"WBV2-P1251-001":{"line":282,"offset":97042,"length":362,"previous":"WBV2-P1251-000","next":"WBV2-P1252-000"},"WBV2-P1252-000":{"line":283,"offset":97404,"length":303,"previous":"WBV2-P1251-001","next":"WBV2-P1252-001"},"WBV2-P1252-001":{"line":284,"offset":97707,"length":362,"previous":"WBV2-P1252-000","next":"WBV2-P1253-000"},"WBV2-P1253-000":{"line":285,"offset":98069,"length":303,"previous":"WBV2-P1252-001","next":"WBV2-P1253-001"},"WBV2-P1253-001":{"line":286,"offset":98372,"length":362,"previous":"WBV2-P1253-000","next":"WBV2-P1254-000"},"WBV2-P1254-000":{"line":287,"offset":98734,"length":303,"previous":"WBV2-P1253-001","next":"WBV2-P1254-001"},"WBV2-P1254-001":{"line":288,"offset":99037,"length":362,"previous":"WBV2-P1254-000","next":"WBV2-P1255-000"},"WBV2-P1255-000":{"line":289,"offset":99399,"length":303,"previous":"WBV2-P1254-001","next":"WBV2-P1255-001"},"WBV2-P1255-001":{"line":290,"offset":99702,"length":362,"previous":"WBV2-P1255-000","next":"WBV2-P1256-000"},"WBV2-P1256-000":{"line":291,"offset":100064,"length":303,"previous":"WBV2-P1255-001","next":"WBV2-P1256-001"},"WBV2-P1256-001":{"line":292,"offset":100367,"length":362,"previous":"WBV2-P1256-000","next":"WBV2-P1257-000"},"WBV2-P1257-000":{"line":293,"offset":100729,"length":303,"previous":"WBV2-P1256-001","next":"WBV2-P1257-001"},"WBV2-P1257-001":{"line":294,"offset":101032,"length":362,"previous":"WBV2-P1257-000","next":"WBV2-P1258-000"},"WBV2-P1258-000":{"line":295,"offset":101394,"length":303,"previous":"WBV2-P1257-001","next":"WBV2-P1258-001"},"WBV2-P1258-001":{"line":296,"offset":101697,"length":362,"previous":"WBV2-P1258-000","next":"WBV2-P1259-000"},"WBV2-P1259-000":{"line":297,"offset":102059,"length":303,"previous":"WBV2-P1258-001","next":"WBV2-P1259-001"},"WBV2-P1259-001":{"line":298,"offset":102362,"length":362,"previous":"WBV2-P1259-000","next":"WBV2-P1260-000"},"WBV2-P1260-000":{"line":299,"offset":102724,"length":303,"previous":"WBV2-P1259-001","next":"WBV2-P1260-001"},"WBV2-P1260-001":{"line":300,"offset":103027,"length":362,"previous":"WBV2-P1260-000","next":"WBV2-P1261-000"},"WBV2-P1261-000":{"line":301,"offset":103389,"length":303,"previous":"WBV2-P1260-001","next":"WBV2-P1261-001"},"WBV2-P1261-001":{"line":302,"offset":103692,"length":362,"previous":"WBV2-P1261-000","next":"WBV2-P1262-000"},"WBV2-P1262-000":{"line":303,"offset":104054,"length":303,"previous":"WBV2-P1261-001","next":"WBV2-P1262-001"},"WBV2-P1262-001":{"line":304,"offset":104357,"length":362,"previous":"WBV2-P1262-000","next":"WBV2-P1263-000"},"WBV2-P1263-000":{"line":305,"offset":104719,"length":303,"previous":"WBV2-P1262-001","next":"WBV2-P1263-001"},"WBV2-P1263-001":{"line":306,"offset":105022,"length":362,"previous":"WBV2-P1263-000","next":"WBV2-P1264-000"},"WBV2-P1264-000":{"line":307,"offset":105384,"length":303,"previous":"WBV2-P1263-001","next":"WBV2-P1264-001"},"WBV2-P1264-001":{"line":308,"offset":105687,"length":362,"previous":"WBV2-P1264-000","next":"WBV2-P1265-000"},"WBV2-P1265-000":{"line":309,"offset":106049,"length":303,"previous":"WBV2-P1264-001","next":"WBV2-P1265-001"},"WBV2-P1265-001":{"line":310,"offset":106352,"length":364,"previous":"WBV2-P1265-000","next":"WBV2-P1266-000"},"WBV2-P1266-000":{"line":311,"offset":106716,"length":303,"previous":"WBV2-P1265-001","next":"WBV2-P1266-001"},"WBV2-P1266-001":{"line":312,"offset":107019,"length":364,"previous":"WBV2-P1266-000","next":"WBV2-P1267-000"},"WBV2-P1267-000":{"line":313,"offset":107383,"length":303,"previous":"WBV2-P1266-001","next":"WBV2-P1267-001"},"WBV2-P1267-001":{"line":314,"offset":107686,"length":366,"previous":"WBV2-P1267-000","next":"WBV2-P1268-000"},"WBV2-P1268-000":{"line":315,"offset":108052,"length":303,"previous":"WBV2-P1267-001","next":"WBV2-P1268-001"},"WBV2-P1268-001":{"line":316,"offset":108355,"length":364,"previous":"WBV2-P1268-000","next":"WBV2-P1269-000"},"WBV2-P1269-000":{"line":317,"offset":108719,"length":303,"previous":"WBV2-P1268-001","next":"WBV2-P1269-001"},"WBV2-P1269-001":{"line":318,"offset":109022,"length":361,"previous":"WBV2-P1269-000","next":"WBV2-P1270-000"},"WBV2-P1270-000":{"line":319,"offset":109383,"length":303,"previous":"WBV2-P1269-001","next":"WBV2-P1270-001"},"WBV2-P1270-001":{"line":320,"offset":109686,"length":365,"previous":"WBV2-P1270-000","next":"WBV2-P1271-000"},"WBV2-P1271-000":{"line":321,"offset":110051,"length":303,"previous":"WBV2-P1270-001","next":"WBV2-P1271-001"},"WBV2-P1271-001":{"line":322,"offset":110354,"length":372,"previous":"WBV2-P1271-000","next":"WBV2-P1272-000"},"WBV2-P1272-000":{"line":323,"offset":110726,"length":303,"previous":"WBV2-P1271-001","next":"WBV2-P1272-001"},"WBV2-P1272-001":{"line":324,"offset":111029,"length":361,"previous":"WBV2-P1272-000","next":"WBV2-P1273-000"},"WBV2-P1273-000":{"line":325,"offset":111390,"length":303,"previous":"WBV2-P1272-001","next":"WBV2-P1273-001"},"WBV2-P1273-001":{"line":326,"offset":111693,"length":365,"previous":"WBV2-P1273-000","next":"WBV2-P1274-000"},"WBV2-P1274-000":{"line":327,"offset":112058,"length":303,"previous":"WBV2-P1273-001","next":"WBV2-P1274-001"},"WBV2-P1274-001":{"line":328,"offset":112361,"length":370,"previous":"WBV2-P1274-000","next":"WBV2-P1275-000"},"WBV2-P1275-000":{"line":329,"offset":112731,"length":303,"previous":"WBV2-P1274-001","next":"WBV2-P1275-001"},"WBV2-P1275-001":{"line":330,"offset":113034,"length":371,"previous":"WBV2-P1275-000","next":"WBV2-P1276-000"},"WBV2-P1276-000":{"line":331,"offset":113405,"length":303,"previous":"WBV2-P1275-001","next":"WBV2-P1276-001"},"WBV2-P1276-001":{"line":332,"offset":113708,"length":370,"previous":"WBV2-P1276-000","next":"WBV2-P1277-000"},"WBV2-P1277-000":{"line":333,"offset":114078,"length":303,"previous":"WBV2-P1276-001","next":"WBV2-P1277-001"},"WBV2-P1277-001":{"line":334,"offset":114381,"length":356,"previous":"WBV2-P1277-000","next":"WBV2-P1278-000"},"WBV2-P1278-000":{"line":335,"offset":114737,"length":303,"previous":"WBV2-P1277-001","next":"WBV2-P1278-001"},"WBV2-P1278-001":{"line":336,"offset":115040,"length":356,"previous":"WBV2-P1278-000","next":"WBV2-P1279-000"},"WBV2-P1279-000":{"line":337,"offset":115396,"length":303,"previous":"WBV2-P1278-001","next":"WBV2-P1279-001"},"WBV2-P1279-001":{"line":338,"offset":115699,"length":358,"previous":"WBV2-P1279-000","next":"WBV2-P1280-000"},"WBV2-P1280-000":{"line":339,"offset":116057,"length":303,"previous":"WBV2-P1279-001","next":"WBV2-P1280-001"},"WBV2-P1280-001":{"line":340,"offset":116360,"length":358,"previous":"WBV2-P1280-000","next":"WBV2-P1281-000"},"WBV2-P1281-000":{"line":341,"offset":116718,"length":303,"previous":"WBV2-P1280-001","next":"WBV2-P1281-001"},"WBV2-P1281-001":{"line":342,"offset":117021,"length":359,"previous":"WBV2-P1281-000","next":"WBV2-P1282-000"},"WBV2-P1282-000":{"line":343,"offset":117380,"length":303,"previous":"WBV2-P1281-001","next":"WBV2-P1282-001"},"WBV2-P1282-001":{"line":344,"offset":117683,"length":356,"previous":"WBV2-P1282-000","next":"WBV2-P1283-000"},"WBV2-P1283-000":{"line":345,"offset":118039,"length":303,"previous":"WBV2-P1282-001","next":"WBV2-P1283-001"},"WBV2-P1283-001":{"line":346,"offset":118342,"length":369,"previous":"WBV2-P1283-000","next":"WBV2-P1284-000"},"WBV2-P1284-000":{"line":347,"offset":118711,"length":303,"previous":"WBV2-P1283-001","next":"WBV2-P1284-001"},"WBV2-P1284-001":{"line":348,"offset":119014,"length":369,"previous":"WBV2-P1284-000","next":"WBV2-P1285-000"},"WBV2-P1285-000":{"line":349,"offset":119383,"length":303,"previous":"WBV2-P1284-001","next":"WBV2-P1285-001"},"WBV2-P1285-001":{"line":350,"offset":119686,"length":366,"previous":"WBV2-P1285-000","next":"WBV2-P1286-000"},"WBV2-P1286-000":{"line":351,"offset":120052,"length":303,"previous":"WBV2-P1285-001","next":"WBV2-P1286-001"},"WBV2-P1286-001":{"line":352,"offset":120355,"length":359,"previous":"WBV2-P1286-000","next":"WBV2-P1287-000"},"WBV2-P1287-000":{"line":353,"offset":120714,"length":303,"previous":"WBV2-P1286-001","next":"WBV2-P1287-001"},"WBV2-P1287-001":{"line":354,"offset":121017,"length":372,"previous":"WBV2-P1287-000","next":"WBV2-P1288-000"},"WBV2-P1288-000":{"line":355,"offset":121389,"length":303,"previous":"WBV2-P1287-001","next":"WBV2-P1288-001"},"WBV2-P1288-001":{"line":356,"offset":121692,"length":359,"previous":"WBV2-P1288-000","next":"WBV2-P1289-000"},"WBV2-P1289-000":{"line":357,"offset":122051,"length":303,"previous":"WBV2-P1288-001","next":"WBV2-P1289-001"},"WBV2-P1289-001":{"line":358,"offset":122354,"length":375,"previous":"WBV2-P1289-000","next":"WBV2-P1290-000"},"WBV2-P1290-000":{"line":359,"offset":122729,"length":303,"previous":"WBV2-P1289-001","next":"WBV2-P1290-001"},"WBV2-P1290-001":{"line":360,"offset":123032,"length":375,"previous":"WBV2-P1290-000","next":"WBV2-P1291-000"},"WBV2-P1291-000":{"line":361,"offset":123407,"length":303,"previous":"WBV2-P1290-001","next":"WBV2-P1291-001"},"WBV2-P1291-001":{"line":362,"offset":123710,"length":355,"previous":"WBV2-P1291-000","next":"WBV2-P1292-000"},"WBV2-P1292-000":{"line":363,"offset":124065,"length":303,"previous":"WBV2-P1291-001","next":"WBV2-P1292-001"},"WBV2-P1292-001":{"line":364,"offset":124368,"length":361,"previous":"WBV2-P1292-000","next":"WBV2-P1293-000"},"WBV2-P1293-000":{"line":365,"offset":124729,"length":303,"previous":"WBV2-P1292-001","next":"WBV2-P1293-001"},"WBV2-P1293-001":{"line":366,"offset":125032,"length":361,"previous":"WBV2-P1293-000","next":"WBV2-P1294-000"},"WBV2-P1294-000":{"line":367,"offset":125393,"length":303,"previous":"WBV2-P1293-001","next":"WBV2-P1294-001"},"WBV2-P1294-001":{"line":368,"offset":125696,"length":361,"previous":"WBV2-P1294-000","next":"WBV2-P1295-000"},"WBV2-P1295-000":{"line":369,"offset":126057,"length":303,"previous":"WBV2-P1294-001","next":"WBV2-P1295-001"},"WBV2-P1295-001":{"line":370,"offset":126360,"length":361,"previous":"WBV2-P1295-000","next":"WBV2-P1296-000"},"WBV2-P1296-000":{"line":371,"offset":126721,"length":303,"previous":"WBV2-P1295-001","next":"WBV2-P1296-001"},"WBV2-P1296-001":{"line":372,"offset":127024,"length":361,"previous":"WBV2-P1296-000","next":"WBV2-P1297-000"},"WBV2-P1297-000":{"line":373,"offset":127385,"length":303,"previous":"WBV2-P1296-001","next":"WBV2-P1297-001"},"WBV2-P1297-001":{"line":374,"offset":127688,"length":361,"previous":"WBV2-P1297-000","next":"WBV2-P1298-000"},"WBV2-P1298-000":{"line":375,"offset":128049,"length":303,"previous":"WBV2-P1297-001","next":"WBV2-P1298-001"},"WBV2-P1298-001":{"line":376,"offset":128352,"length":361,"previous":"WBV2-P1298-000","next":"WBV2-P1299-000"},"WBV2-P1299-000":{"line":377,"offset":128713,"length":303,"previous":"WBV2-P1298-001","next":"WBV2-P1299-001"},"WBV2-P1299-001":{"line":378,"offset":129016,"length":361,"previous":"WBV2-P1299-000","next":"WBV2-P1300-000"},"WBV2-P1300-000":{"line":379,"offset":129377,"length":303,"previous":"WBV2-P1299-001","next":"WBV2-P1300-001"},"WBV2-P1300-001":{"line":380,"offset":129680,"length":361,"previous":"WBV2-P1300-000","next":"WBV2-P1301-000"},"WBV2-P1301-000":{"line":381,"offset":130041,"length":303,"previous":"WBV2-P1300-001","next":"WBV2-P1301-001"},"WBV2-P1301-001":{"line":382,"offset":130344,"length":361,"previous":"WBV2-P1301-000","next":"WBV2-P1302-000"},"WBV2-P1302-000":{"line":383,"offset":130705,"length":303,"previous":"WBV2-P1301-001","next":"WBV2-P1302-001"},"WBV2-P1302-001":{"line":384,"offset":131008,"length":361,"previous":"WBV2-P1302-000","next":"WBV2-P1303-000"},"WBV2-P1303-000":{"line":385,"offset":131369,"length":303,"previous":"WBV2-P1302-001","next":"WBV2-P1303-001"},"WBV2-P1303-001":{"line":386,"offset":131672,"length":361,"previous":"WBV2-P1303-000","next":"WBV2-P1304-000"},"WBV2-P1304-000":{"line":387,"offset":132033,"length":303,"previous":"WBV2-P1303-001","next":"WBV2-P1304-001"},"WBV2-P1304-001":{"line":388,"offset":132336,"length":361,"previous":"WBV2-P1304-000","next":"WBV2-P1305-000"},"WBV2-P1305-000":{"line":389,"offset":132697,"length":303,"previous":"WBV2-P1304-001","next":"WBV2-P1305-001"},"WBV2-P1305-001":{"line":390,"offset":133000,"length":361,"previous":"WBV2-P1305-000","next":"WBV2-P1306-000"},"WBV2-P1306-000":{"line":391,"offset":133361,"length":303,"previous":"WBV2-P1305-001","next":"WBV2-P1306-001"},"WBV2-P1306-001":{"line":392,"offset":133664,"length":361,"previous":"WBV2-P1306-000","next":"WBV2-P1307-000"},"WBV2-P1307-000":{"line":393,"offset":134025,"length":303,"previous":"WBV2-P1306-001","next":"WBV2-P1307-001"},"WBV2-P1307-001":{"line":394,"offset":134328,"length":361,"previous":"WBV2-P1307-000","next":"WBV2-P1308-000"},"WBV2-P1308-000":{"line":395,"offset":134689,"length":303,"previous":"WBV2-P1307-001","next":"WBV2-P1308-001"},"WBV2-P1308-001":{"line":396,"offset":134992,"length":361,"previous":"WBV2-P1308-000","next":"WBV2-P1309-000"},"WBV2-P1309-000":{"line":397,"offset":135353,"length":303,"previous":"WBV2-P1308-001","next":"WBV2-P1309-001"},"WBV2-P1309-001":{"line":398,"offset":135656,"length":361,"previous":"WBV2-P1309-000","next":"WBV2-P1310-000"},"WBV2-P1310-000":{"line":399,"offset":136017,"length":303,"previous":"WBV2-P1309-001","next":"WBV2-P1310-001"},"WBV2-P1310-001":{"line":400,"offset":136320,"length":361,"previous":"WBV2-P1310-000","next":"WBV2-P1311-000"},"WBV2-P1311-000":{"line":401,"offset":136681,"length":303,"previous":"WBV2-P1310-001","next":"WBV2-P1311-001"},"WBV2-P1311-001":{"line":402,"offset":136984,"length":361,"previous":"WBV2-P1311-000","next":"WBV2-P1312-000"},"WBV2-P1312-000":{"line":403,"offset":137345,"length":303,"previous":"WBV2-P1311-001","next":"WBV2-P1312-001"},"WBV2-P1312-001":{"line":404,"offset":137648,"length":358,"previous":"WBV2-P1312-000","next":"WBV2-P1313-000"},"WBV2-P1313-000":{"line":405,"offset":138006,"length":303,"previous":"WBV2-P1312-001","next":"WBV2-P1313-001"},"WBV2-P1313-001":{"line":406,"offset":138309,"length":358,"previous":"WBV2-P1313-000","next":"WBV2-P1314-000"},"WBV2-P1314-000":{"line":407,"offset":138667,"length":303,"previous":"WBV2-P1313-001","next":"WBV2-P1314-001"},"WBV2-P1314-001":{"line":408,"offset":138970,"length":358,"previous":"WBV2-P1314-000","next":"WBV2-P1315-000"},"WBV2-P1315-000":{"line":409,"offset":139328,"length":303,"previous":"WBV2-P1314-001","next":"WBV2-P1315-001"},"WBV2-P1315-001":{"line":410,"offset":139631,"length":358,"previous":"WBV2-P1315-000","next":"WBV2-P1316-000"},"WBV2-P1316-000":{"line":411,"offset":139989,"length":303,"previous":"WBV2-P1315-001","next":"WBV2-P1316-001"},"WBV2-P1316-001":{"line":412,"offset":140292,"length":358,"previous":"WBV2-P1316-000","next":"WBV2-P1317-000"},"WBV2-P1317-000":{"line":413,"offset":140650,"length":303,"previous":"WBV2-P1316-001","next":"WBV2-P1317-001"},"WBV2-P1317-001":{"line":414,"offset":140953,"length":358,"previous":"WBV2-P1317-000","next":"WBV2-P1318-000"},"WBV2-P1318-000":{"line":415,"offset":141311,"length":303,"previous":"WBV2-P1317-001","next":"WBV2-P1318-001"},"WBV2-P1318-001":{"line":416,"offset":141614,"length":358,"previous":"WBV2-P1318-000","next":"WBV2-P1319-000"},"WBV2-P1319-000":{"line":417,"offset":141972,"length":303,"previous":"WBV2-P1318-001","next":"WBV2-P1319-001"},"WBV2-P1319-001":{"line":418,"offset":142275,"length":358,"previous":"WBV2-P1319-000","next":"WBV2-P1320-000"},"WBV2-P1320-000":{"line":419,"offset":142633,"length":303,"previous":"WBV2-P1319-001","next":"WBV2-P1320-001"},"WBV2-P1320-001":{"line":420,"offset":142936,"length":358,"previous":"WBV2-P1320-000","next":"WBV2-P1321-000"},"WBV2-P1321-000":{"line":421,"offset":143294,"length":303,"previous":"WBV2-P1320-001","next":"WBV2-P1321-001"},"WBV2-P1321-001":{"line":422,"offset":143597,"length":358,"previous":"WBV2-P1321-000","next":"WBV2-P1322-000"},"WBV2-P1322-000":{"line":423,"offset":143955,"length":303,"previous":"WBV2-P1321-001","next":"WBV2-P1322-001"},"WBV2-P1322-001":{"line":424,"offset":144258,"length":358,"previous":"WBV2-P1322-000","next":"WBV2-P1323-000"},"WBV2-P1323-000":{"line":425,"offset":144616,"length":303,"previous":"WBV2-P1322-001","next":"WBV2-P1323-001"},"WBV2-P1323-001":{"line":426,"offset":144919,"length":358,"previous":"WBV2-P1323-000","next":"WBV2-P1324-000"},"WBV2-P1324-000":{"line":427,"offset":145277,"length":303,"previous":"WBV2-P1323-001","next":"WBV2-P1324-001"},"WBV2-P1324-001":{"line":428,"offset":145580,"length":358,"previous":"WBV2-P1324-000","next":"WBV2-P1325-000"},"WBV2-P1325-000":{"line":429,"offset":145938,"length":303,"previous":"WBV2-P1324-001","next":"WBV2-P1325-001"},"WBV2-P1325-001":{"line":430,"offset":146241,"length":358,"previous":"WBV2-P1325-000","next":"WBV2-P1326-000"},"WBV2-P1326-000":{"line":431,"offset":146599,"length":303,"previous":"WBV2-P1325-001","next":"WBV2-P1326-001"},"WBV2-P1326-001":{"line":432,"offset":146902,"length":358,"previous":"WBV2-P1326-000","next":"WBV2-P1327-000"},"WBV2-P1327-000":{"line":433,"offset":147260,"length":303,"previous":"WBV2-P1326-001","next":"WBV2-P1327-001"},"WBV2-P1327-001":{"line":434,"offset":147563,"length":358,"previous":"WBV2-P1327-000","next":"WBV2-P1328-000"},"WBV2-P1328-000":{"line":435,"offset":147921,"length":303,"previous":"WBV2-P1327-001","next":"WBV2-P1328-001"},"WBV2-P1328-001":{"line":436,"offset":148224,"length":358,"previous":"WBV2-P1328-000","next":"WBV2-P1329-000"},"WBV2-P1329-000":{"line":437,"offset":148582,"length":303,"previous":"WBV2-P1328-001","next":"WBV2-P1329-001"},"WBV2-P1329-001":{"line":438,"offset":148885,"length":358,"previous":"WBV2-P1329-000","next":"WBV2-P1330-000"},"WBV2-P1330-000":{"line":439,"offset":149243,"length":303,"previous":"WBV2-P1329-001","next":"WBV2-P1330-001"},"WBV2-P1330-001":{"line":440,"offset":149546,"length":358,"previous":"WBV2-P1330-000","next":"WBV2-P1331-000"},"WBV2-P1331-000":{"line":441,"offset":149904,"length":303,"previous":"WBV2-P1330-001","next":"WBV2-P1331-001"},"WBV2-P1331-001":{"line":442,"offset":150207,"length":358,"previous":"WBV2-P1331-000","next":"WBV2-P1332-000"},"WBV2-P1332-000":{"line":443,"offset":150565,"length":303,"previous":"WBV2-P1331-001","next":"WBV2-P1332-001"},"WBV2-P1332-001":{"line":444,"offset":150868,"length":358,"previous":"WBV2-P1332-000","next":"WBV2-P1333-000"},"WBV2-P1333-000":{"line":445,"offset":151226,"length":303,"previous":"WBV2-P1332-001","next":"WBV2-P1333-001"},"WBV2-P1333-001":{"line":446,"offset":151529,"length":358,"previous":"WBV2-P1333-000","next":"WBV2-P1334-000"},"WBV2-P1334-000":{"line":447,"offset":151887,"length":303,"previous":"WBV2-P1333-001","next":"WBV2-P1334-001"},"WBV2-P1334-001":{"line":448,"offset":152190,"length":358,"previous":"WBV2-P1334-000","next":"WBV2-P1335-000"},"WBV2-P1335-000":{"line":449,"offset":152548,"length":303,"previous":"WBV2-P1334-001","next":"WBV2-P1335-001"},"WBV2-P1335-001":{"line":450,"offset":152851,"length":358,"previous":"WBV2-P1335-000","next":"WBV2-P1336-000"},"WBV2-P1336-000":{"line":451,"offset":153209,"length":303,"previous":"WBV2-P1335-001","next":"WBV2-P1336-001"},"WBV2-P1336-001":{"line":452,"offset":153512,"length":358,"previous":"WBV2-P1336-000","next":"WBV2-P1337-000"},"WBV2-P1337-000":{"line":453,"offset":153870,"length":303,"previous":"WBV2-P1336-001","next":"WBV2-P1337-001"},"WBV2-P1337-001":{"line":454,"offset":154173,"length":358,"previous":"WBV2-P1337-000","next":"WBV2-P1338-000"},"WBV2-P1338-000":{"line":455,"offset":154531,"length":303,"previous":"WBV2-P1337-001","next":"WBV2-P1338-001"},"WBV2-P1338-001":{"line":456,"offset":154834,"length":358,"previous":"WBV2-P1338-000","next":"WBV2-P1339-000"},"WBV2-P1339-000":{"line":457,"offset":155192,"length":303,"previous":"WBV2-P1338-001","next":"WBV2-P1339-001"},"WBV2-P1339-001":{"line":458,"offset":155495,"length":358,"previous":"WBV2-P1339-000","next":"WBV2-P1340-000"},"WBV2-P1340-000":{"line":459,"offset":155853,"length":303,"previous":"WBV2-P1339-001","next":"WBV2-P1340-001"},"WBV2-P1340-001":{"line":460,"offset":156156,"length":358,"previous":"WBV2-P1340-000","next":"WBV2-P1341-000"},"WBV2-P1341-000":{"line":461,"offset":156514,"length":303,"previous":"WBV2-P1340-001","next":"WBV2-P1341-001"},"WBV2-P1341-001":{"line":462,"offset":156817,"length":358,"previous":"WBV2-P1341-000","next":"WBV2-P1342-000"},"WBV2-P1342-000":{"line":463,"offset":157175,"length":303,"previous":"WBV2-P1341-001","next":"WBV2-P1342-001"},"WBV2-P1342-001":{"line":464,"offset":157478,"length":358,"previous":"WBV2-P1342-000","next":"WBV2-P1343-000"},"WBV2-P1343-000":{"line":465,"offset":157836,"length":303,"previous":"WBV2-P1342-001","next":"WBV2-P1343-001"},"WBV2-P1343-001":{"line":466,"offset":158139,"length":358,"previous":"WBV2-P1343-000","next":"WBV2-P1344-000"},"WBV2-P1344-000":{"line":467,"offset":158497,"length":303,"previous":"WBV2-P1343-001","next":"WBV2-P1344-001"},"WBV2-P1344-001":{"line":468,"offset":158800,"length":358,"previous":"WBV2-P1344-000","next":"WBV2-P1345-000"},"WBV2-P1345-000":{"line":469,"offset":159158,"length":303,"previous":"WBV2-P1344-001","next":"WBV2-P1345-001"},"WBV2-P1345-001":{"line":470,"offset":159461,"length":358,"previous":"WBV2-P1345-000","next":"WBV2-P1346-000"},"WBV2-P1346-000":{"line":471,"offset":159819,"length":303,"previous":"WBV2-P1345-001","next":"WBV2-P1346-001"},"WBV2-P1346-001":{"line":472,"offset":160122,"length":358,"previous":"WBV2-P1346-000","next":"WBV2-P1347-000"},"WBV2-P1347-000":{"line":473,"offset":160480,"length":303,"previous":"WBV2-P1346-001","next":"WBV2-P1347-001"},"WBV2-P1347-001":{"line":474,"offset":160783,"length":358,"previous":"WBV2-P1347-000","next":"WBV2-P1348-000"},"WBV2-P1348-000":{"line":475,"offset":161141,"length":303,"previous":"WBV2-P1347-001","next":"WBV2-P1348-001"},"WBV2-P1348-001":{"line":476,"offset":161444,"length":358,"previous":"WBV2-P1348-000","next":"WBV2-P1349-000"},"WBV2-P1349-000":{"line":477,"offset":161802,"length":303,"previous":"WBV2-P1348-001","next":"WBV2-P1349-001"},"WBV2-P1349-001":{"line":478,"offset":162105,"length":358,"previous":"WBV2-P1349-000","next":"WBV2-P1350-000"},"WBV2-P1350-000":{"line":479,"offset":162463,"length":303,"previous":"WBV2-P1349-001","next":"WBV2-P1350-001"},"WBV2-P1350-001":{"line":480,"offset":162766,"length":358,"previous":"WBV2-P1350-000","next":"WBV2-P1351-000"},"WBV2-P1351-000":{"line":481,"offset":163124,"length":303,"previous":"WBV2-P1350-001","next":"WBV2-P1351-001"},"WBV2-P1351-001":{"line":482,"offset":163427,"length":358,"previous":"WBV2-P1351-000","next":"WBV2-P1352-000"},"WBV2-P1352-000":{"line":483,"offset":163785,"length":303,"previous":"WBV2-P1351-001","next":"WBV2-P1352-001"},"WBV2-P1352-001":{"line":484,"offset":164088,"length":358,"previous":"WBV2-P1352-000","next":"WBV2-P1353-000"},"WBV2-P1353-000":{"line":485,"offset":164446,"length":303,"previous":"WBV2-P1352-001","next":"WBV2-P1353-001"},"WBV2-P1353-001":{"line":486,"offset":164749,"length":358,"previous":"WBV2-P1353-000","next":"WBV2-P1354-000"},"WBV2-P1354-000":{"line":487,"offset":165107,"length":303,"previous":"WBV2-P1353-001","next":"WBV2-P1354-001"},"WBV2-P1354-001":{"line":488,"offset":165410,"length":358,"previous":"WBV2-P1354-000","next":"WBV2-P1355-000"},"WBV2-P1355-000":{"line":489,"offset":165768,"length":303,"previous":"WBV2-P1354-001","next":"WBV2-P1355-001"},"WBV2-P1355-001":{"line":490,"offset":166071,"length":358,"previous":"WBV2-P1355-000","next":"WBV2-P1356-000"},"WBV2-P1356-000":{"line":491,"offset":166429,"length":303,"previous":"WBV2-P1355-001","next":"WBV2-P1356-001"},"WBV2-P1356-001":{"line":492,"offset":166732,"length":358,"previous":"WBV2-P1356-000","next":"WBV2-P1357-000"},"WBV2-P1357-000":{"line":493,"offset":167090,"length":303,"previous":"WBV2-P1356-001","next":"WBV2-P1357-001"},"WBV2-P1357-001":{"line":494,"offset":167393,"length":358,"previous":"WBV2-P1357-000","next":"WBV2-P1358-000"},"WBV2-P1358-000":{"line":495,"offset":167751,"length":303,"previous":"WBV2-P1357-001","next":"WBV2-P1358-001"},"WBV2-P1358-001":{"line":496,"offset":168054,"length":358,"previous":"WBV2-P1358-000","next":"WBV2-P1359-000"},"WBV2-P1359-000":{"line":497,"offset":168412,"length":303,"previous":"WBV2-P1358-001","next":"WBV2-P1359-001"},"WBV2-P1359-001":{"line":498,"offset":168715,"length":358,"previous":"WBV2-P1359-000","next":"WBV2-P1360-000"},"WBV2-P1360-000":{"line":499,"offset":169073,"length":303,"previous":"WBV2-P1359-001","next":"WBV2-P1360-001"},"WBV2-P1360-001":{"line":500,"offset":169376,"length":358,"previous":"WBV2-P1360-000","next":"WBV2-P1361-000"},"WBV2-P1361-000":{"line":501,"offset":169734,"length":303,"previous":"WBV2-P1360-001","next":"WBV2-P1361-001"},"WBV2-P1361-001":{"line":502,"offset":170037,"length":358,"previous":"WBV2-P1361-000","next":"WBV2-P1362-000"},"WBV2-P1362-000":{"line":503,"offset":170395,"length":303,"previous":"WBV2-P1361-001","next":"WBV2-P1362-001"},"WBV2-P1362-001":{"line":504,"offset":170698,"length":358,"previous":"WBV2-P1362-000","next":"WBV2-P1363-000"},"WBV2-P1363-000":{"line":505,"offset":171056,"length":303,"previous":"WBV2-P1362-001","next":"WBV2-P1363-001"},"WBV2-P1363-001":{"line":506,"offset":171359,"length":358,"previous":"WBV2-P1363-000","next":"WBV2-P1364-000"},"WBV2-P1364-000":{"line":507,"offset":171717,"length":303,"previous":"WBV2-P1363-001","next":"WBV2-P1364-001"},"WBV2-P1364-001":{"line":508,"offset":172020,"length":358,"previous":"WBV2-P1364-000","next":"WBV2-P1365-000"},"WBV2-P1365-000":{"line":509,"offset":172378,"length":303,"previous":"WBV2-P1364-001","next":"WBV2-P1365-001"},"WBV2-P1365-001":{"line":510,"offset":172681,"length":358,"previous":"WBV2-P1365-000","next":"WBV2-P1366-000"},"WBV2-P1366-000":{"line":511,"offset":173039,"length":303,"previous":"WBV2-P1365-001","next":"WBV2-P1366-001"},"WBV2-P1366-001":{"line":512,"offset":173342,"length":358,"previous":"WBV2-P1366-000","next":"WBV2-P1367-000"},"WBV2-P1367-000":{"line":513,"offset":173700,"length":303,"previous":"WBV2-P1366-001","next":"WBV2-P1367-001"},"WBV2-P1367-001":{"line":514,"offset":174003,"length":358,"previous":"WBV2-P1367-000","next":"WBV2-P1368-000"},"WBV2-P1368-000":{"line":515,"offset":174361,"length":303,"previous":"WBV2-P1367-001","next":"WBV2-P1368-001"},"WBV2-P1368-001":{"line":516,"offset":174664,"length":358,"previous":"WBV2-P1368-000","next":"WBV2-P1369-000"},"WBV2-P1369-000":{"line":517,"offset":175022,"length":303,"previous":"WBV2-P1368-001","next":"WBV2-P1369-001"},"WBV2-P1369-001":{"line":518,"offset":175325,"length":358,"previous":"WBV2-P1369-000","next":"WBV2-P1370-000"},"WBV2-P1370-000":{"line":519,"offset":175683,"length":303,"previous":"WBV2-P1369-001","next":"WBV2-P1370-001"},"WBV2-P1370-001":{"line":520,"offset":175986,"length":358,"previous":"WBV2-P1370-000","next":"WBV2-P1371-000"},"WBV2-P1371-000":{"line":521,"offset":176344,"length":303,"previous":"WBV2-P1370-001","next":"WBV2-P1371-001"},"WBV2-P1371-001":{"line":522,"offset":176647,"length":358,"previous":"WBV2-P1371-000","next":"WBV2-P1372-000"},"WBV2-P1372-000":{"line":523,"offset":177005,"length":303,"previous":"WBV2-P1371-001","next":"WBV2-P1372-001"},"WBV2-P1372-001":{"line":524,"offset":177308,"length":358,"previous":"WBV2-P1372-000","next":"WBV2-P1373-000"},"WBV2-P1373-000":{"line":525,"offset":177666,"length":303,"previous":"WBV2-P1372-001","next":"WBV2-P1373-001"},"WBV2-P1373-001":{"line":526,"offset":177969,"length":358,"previous":"WBV2-P1373-000","next":"WBV2-P1374-000"},"WBV2-P1374-000":{"line":527,"offset":178327,"length":303,"previous":"WBV2-P1373-001","next":"WBV2-P1374-001"},"WBV2-P1374-001":{"line":528,"offset":178630,"length":358,"previous":"WBV2-P1374-000","next":"WBV2-P1375-000"},"WBV2-P1375-000":{"line":529,"offset":178988,"length":303,"previous":"WBV2-P1374-001","next":"WBV2-P1375-001"},"WBV2-P1375-001":{"line":530,"offset":179291,"length":362,"previous":"WBV2-P1375-000","next":"WBV2-P1376-000"},"WBV2-P1376-000":{"line":531,"offset":179653,"length":303,"previous":"WBV2-P1375-001","next":"WBV2-P1376-001"},"WBV2-P1376-001":{"line":532,"offset":179956,"length":362,"previous":"WBV2-P1376-000","next":"WBV2-P1377-000"},"WBV2-P1377-000":{"line":533,"offset":180318,"length":303,"previous":"WBV2-P1376-001","next":"WBV2-P1377-001"},"WBV2-P1377-001":{"line":534,"offset":180621,"length":363,"previous":"WBV2-P1377-000","next":"WBV2-P1378-000"},"WBV2-P1378-000":{"line":535,"offset":180984,"length":303,"previous":"WBV2-P1377-001","next":"WBV2-P1378-001"},"WBV2-P1378-001":{"line":536,"offset":181287,"length":367,"previous":"WBV2-P1378-000","next":"WBV2-P1379-000"},"WBV2-P1379-000":{"line":537,"offset":181654,"length":303,"previous":"WBV2-P1378-001","next":"WBV2-P1379-001"},"WBV2-P1379-001":{"line":538,"offset":181957,"length":367,"previous":"WBV2-P1379-000","next":"WBV2-P1380-000"},"WBV2-P1380-000":{"line":539,"offset":182324,"length":303,"previous":"WBV2-P1379-001","next":"WBV2-P1380-001"},"WBV2-P1380-001":{"line":540,"offset":182627,"length":367,"previous":"WBV2-P1380-000","next":"WBV2-P1381-000"},"WBV2-P1381-000":{"line":541,"offset":182994,"length":303,"previous":"WBV2-P1380-001","next":"WBV2-P1381-001"},"WBV2-P1381-001":{"line":542,"offset":183297,"length":358,"previous":"WBV2-P1381-000","next":"WBV2-P1382-000"},"WBV2-P1382-000":{"line":543,"offset":183655,"length":303,"previous":"WBV2-P1381-001","next":"WBV2-P1382-001"},"WBV2-P1382-001":{"line":544,"offset":183958,"length":358,"previous":"WBV2-P1382-000","next":"WBV2-P1383-000"},"WBV2-P1383-000":{"line":545,"offset":184316,"length":303,"previous":"WBV2-P1382-001","next":"WBV2-P1383-001"},"WBV2-P1383-001":{"line":546,"offset":184619,"length":358,"previous":"WBV2-P1383-000","next":"WBV2-P1384-000"},"WBV2-P1384-000":{"line":547,"offset":184977,"length":303,"previous":"WBV2-P1383-001","next":"WBV2-P1384-001"},"WBV2-P1384-001":{"line":548,"offset":185280,"length":358,"previous":"WBV2-P1384-000","next":"WBV2-P1385-000"},"WBV2-P1385-000":{"line":549,"offset":185638,"length":303,"previous":"WBV2-P1384-001","next":"WBV2-P1385-001"},"WBV2-P1385-001":{"line":550,"offset":185941,"length":362,"previous":"WBV2-P1385-000","next":"WBV2-P1386-000"},"WBV2-P1386-000":{"line":551,"offset":186303,"length":303,"previous":"WBV2-P1385-001","next":"WBV2-P1386-001"},"WBV2-P1386-001":{"line":552,"offset":186606,"length":355,"previous":"WBV2-P1386-000","next":"WBV2-P1387-000"},"WBV2-P1387-000":{"line":553,"offset":186961,"length":303,"previous":"WBV2-P1386-001","next":"WBV2-P1387-001"},"WBV2-P1387-001":{"line":554,"offset":187264,"length":355,"previous":"WBV2-P1387-000","next":"WBV2-P1388-000"},"WBV2-P1388-000":{"line":555,"offset":187619,"length":303,"previous":"WBV2-P1387-001","next":"WBV2-P1388-001"},"WBV2-P1388-001":{"line":556,"offset":187922,"length":355,"previous":"WBV2-P1388-000","next":"WBV2-P1389-000"},"WBV2-P1389-000":{"line":557,"offset":188277,"length":303,"previous":"WBV2-P1388-001","next":"WBV2-P1389-001"},"WBV2-P1389-001":{"line":558,"offset":188580,"length":355,"previous":"WBV2-P1389-000","next":"WBV2-P1390-000"},"WBV2-P1390-000":{"line":559,"offset":188935,"length":303,"previous":"WBV2-P1389-001","next":"WBV2-P1390-001"},"WBV2-P1390-001":{"line":560,"offset":189238,"length":355,"previous":"WBV2-P1390-000","next":"WBV2-P1391-000"},"WBV2-P1391-000":{"line":561,"offset":189593,"length":303,"previous":"WBV2-P1390-001","next":"WBV2-P1391-001"},"WBV2-P1391-001":{"line":562,"offset":189896,"length":355,"previous":"WBV2-P1391-000","next":"WBV2-P1392-000"},"WBV2-P1392-000":{"line":563,"offset":190251,"length":303,"previous":"WBV2-P1391-001","next":"WBV2-P1392-001"},"WBV2-P1392-001":{"line":564,"offset":190554,"length":355,"previous":"WBV2-P1392-000","next":"WBV2-P1393-000"},"WBV2-P1393-000":{"line":565,"offset":190909,"length":303,"previous":"WBV2-P1392-001","next":"WBV2-P1393-001"},"WBV2-P1393-001":{"line":566,"offset":191212,"length":355,"previous":"WBV2-P1393-000","next":"WBV2-P1394-000"},"WBV2-P1394-000":{"line":567,"offset":191567,"length":303,"previous":"WBV2-P1393-001","next":"WBV2-P1394-001"},"WBV2-P1394-001":{"line":568,"offset":191870,"length":355,"previous":"WBV2-P1394-000","next":"WBV2-P1395-000"},"WBV2-P1395-000":{"line":569,"offset":192225,"length":303,"previous":"WBV2-P1394-001","next":"WBV2-P1395-001"},"WBV2-P1395-001":{"line":570,"offset":192528,"length":355,"previous":"WBV2-P1395-000","next":"WBV2-P1396-000"},"WBV2-P1396-000":{"line":571,"offset":192883,"length":303,"previous":"WBV2-P1395-001","next":"WBV2-P1396-001"},"WBV2-P1396-001":{"line":572,"offset":193186,"length":355,"previous":"WBV2-P1396-000","next":"WBV2-P1397-000"},"WBV2-P1397-000":{"line":573,"offset":193541,"length":303,"previous":"WBV2-P1396-001","next":"WBV2-P1397-001"},"WBV2-P1397-001":{"line":574,"offset":193844,"length":355,"previous":"WBV2-P1397-000","next":"WBV2-P1398-000"},"WBV2-P1398-000":{"line":575,"offset":194199,"length":303,"previous":"WBV2-P1397-001","next":"WBV2-P1398-001"},"WBV2-P1398-001":{"line":576,"offset":194502,"length":355,"previous":"WBV2-P1398-000","next":"WBV2-P1399-000"},"WBV2-P1399-000":{"line":577,"offset":194857,"length":303,"previous":"WBV2-P1398-001","next":"WBV2-P1399-001"},"WBV2-P1399-001":{"line":578,"offset":195160,"length":355,"previous":"WBV2-P1399-000","next":"WBV2-P1400-000"},"WBV2-P1400-000":{"line":579,"offset":195515,"length":303,"previous":"WBV2-P1399-001","next":"WBV2-P1400-001"},"WBV2-P1400-001":{"line":580,"offset":195818,"length":355,"previous":"WBV2-P1400-000","next":"WBV2-P1401-000"},"WBV2-P1401-000":{"line":581,"offset":196173,"length":303,"previous":"WBV2-P1400-001","next":"WBV2-P1401-001"},"WBV2-P1401-001":{"line":582,"offset":196476,"length":355,"previous":"WBV2-P1401-000","next":"WBV2-P1402-000"},"WBV2-P1402-000":{"line":583,"offset":196831,"length":303,"previous":"WBV2-P1401-001","next":"WBV2-P1402-001"},"WBV2-P1402-001":{"line":584,"offset":197134,"length":355,"previous":"WBV2-P1402-000","next":"WBV2-P1403-000"},"WBV2-P1403-000":{"line":585,"offset":197489,"length":303,"previous":"WBV2-P1402-001","next":"WBV2-P1403-001"},"WBV2-P1403-001":{"line":586,"offset":197792,"length":355,"previous":"WBV2-P1403-000","next":"WBV2-P1404-000"},"WBV2-P1404-000":{"line":587,"offset":198147,"length":303,"previous":"WBV2-P1403-001","next":"WBV2-P1404-001"},"WBV2-P1404-001":{"line":588,"offset":198450,"length":355,"previous":"WBV2-P1404-000","next":"WBV2-P1405-000"},"WBV2-P1405-000":{"line":589,"offset":198805,"length":303,"previous":"WBV2-P1404-001","next":"WBV2-P1405-001"},"WBV2-P1405-001":{"line":590,"offset":199108,"length":355,"previous":"WBV2-P1405-000","next":"WBV2-P1406-000"},"WBV2-P1406-000":{"line":591,"offset":199463,"length":303,"previous":"WBV2-P1405-001","next":"WBV2-P1406-001"},"WBV2-P1406-001":{"line":592,"offset":199766,"length":356,"previous":"WBV2-P1406-000","next":"WBV2-P1407-000"},"WBV2-P1407-000":{"line":593,"offset":200122,"length":303,"previous":"WBV2-P1406-001","next":"WBV2-P1407-001"},"WBV2-P1407-001":{"line":594,"offset":200425,"length":356,"previous":"WBV2-P1407-000","next":"WBV2-P1408-000"},"WBV2-P1408-000":{"line":595,"offset":200781,"length":303,"previous":"WBV2-P1407-001","next":"WBV2-P1408-001"},"WBV2-P1408-001":{"line":596,"offset":201084,"length":356,"previous":"WBV2-P1408-000","next":"WBV2-P1409-000"},"WBV2-P1409-000":{"line":597,"offset":201440,"length":303,"previous":"WBV2-P1408-001","next":"WBV2-P1409-001"},"WBV2-P1409-001":{"line":598,"offset":201743,"length":356,"previous":"WBV2-P1409-000","next":"WBV2-P1410-000"},"WBV2-P1410-000":{"line":599,"offset":202099,"length":303,"previous":"WBV2-P1409-001","next":"WBV2-P1410-001"},"WBV2-P1410-001":{"line":600,"offset":202402,"length":356,"previous":"WBV2-P1410-000","next":"WBV2-P1411-000"},"WBV2-P1411-000":{"line":601,"offset":202758,"length":303,"previous":"WBV2-P1410-001","next":"WBV2-P1411-001"},"WBV2-P1411-001":{"line":602,"offset":203061,"length":356,"previous":"WBV2-P1411-000","next":"WBV2-P1412-000"},"WBV2-P1412-000":{"line":603,"offset":203417,"length":303,"previous":"WBV2-P1411-001","next":"WBV2-P1412-001"},"WBV2-P1412-001":{"line":604,"offset":203720,"length":356,"previous":"WBV2-P1412-000","next":"WBV2-P1413-000"},"WBV2-P1413-000":{"line":605,"offset":204076,"length":303,"previous":"WBV2-P1412-001","next":"WBV2-P1413-001"},"WBV2-P1413-001":{"line":606,"offset":204379,"length":356,"previous":"WBV2-P1413-000","next":"WBV2-P1414-000"},"WBV2-P1414-000":{"line":607,"offset":204735,"length":303,"previous":"WBV2-P1413-001","next":"WBV2-P1414-001"},"WBV2-P1414-001":{"line":608,"offset":205038,"length":356,"previous":"WBV2-P1414-000","next":"WBV2-P1415-000"},"WBV2-P1415-000":{"line":609,"offset":205394,"length":303,"previous":"WBV2-P1414-001","next":"WBV2-P1415-001"},"WBV2-P1415-001":{"line":610,"offset":205697,"length":353,"previous":"WBV2-P1415-000","next":"WBV2-P1416-000"},"WBV2-P1416-000":{"line":611,"offset":206050,"length":303,"previous":"WBV2-P1415-001","next":"WBV2-P1416-001"},"WBV2-P1416-001":{"line":612,"offset":206353,"length":353,"previous":"WBV2-P1416-000","next":"WBV2-P1417-000"},"WBV2-P1417-000":{"line":613,"offset":206706,"length":303,"previous":"WBV2-P1416-001","next":"WBV2-P1417-001"},"WBV2-P1417-001":{"line":614,"offset":207009,"length":353,"previous":"WBV2-P1417-000","next":"WBV2-P1418-000"},"WBV2-P1418-000":{"line":615,"offset":207362,"length":303,"previous":"WBV2-P1417-001","next":"WBV2-P1418-001"},"WBV2-P1418-001":{"line":616,"offset":207665,"length":353,"previous":"WBV2-P1418-000","next":"WBV2-P1419-000"},"WBV2-P1419-000":{"line":617,"offset":208018,"length":303,"previous":"WBV2-P1418-001","next":"WBV2-P1419-001"},"WBV2-P1419-001":{"line":618,"offset":208321,"length":353,"previous":"WBV2-P1419-000","next":"WBV2-P1420-000"},"WBV2-P1420-000":{"line":619,"offset":208674,"length":201,"previous":"WBV2-P1419-001","next":"WBV2-P1420-001"},"WBV2-P1420-001":{"line":620,"offset":208875,"length":207,"previous":"WBV2-P1420-000","next":"WBV2-P1421-000"},"WBV2-P1421-000":{"line":621,"offset":209082,"length":201,"previous":"WBV2-P1420-001","next":"WBV2-P1421-001"},"WBV2-P1421-001":{"line":622,"offset":209283,"length":204,"previous":"WBV2-P1421-000","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P1422-000/product-implementation-plan.json","sha256":"81ddad9460df9f8429fb5ccbccb4fde019bb1512e4434a66333b8a577f28ad7a"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"939052de60e15700eb39d4f2575d0e78c36a7b54e12d2ee25fb198074e9196b4"},"taskCount":625,"activeTask":null,"entries":{"WBV2-P1096-000":{"line":0,"offset":0,"length":267,"previous":"WBV2-P1095-003","next":"WBV2-P1100-000"},"WBV2-P1100-000":{"line":1,"offset":267,"length":300,"previous":"WBV2-P1096-000","next":"WBV2-P1100-001"},"WBV2-P1100-001":{"line":2,"offset":567,"length":375,"previous":"WBV2-P1100-000","next":"WBV2-P1100-002"},"WBV2-P1100-002":{"line":3,"offset":942,"length":377,"previous":"WBV2-P1100-001","next":"WBV2-P1100-003"},"WBV2-P1100-003":{"line":4,"offset":1319,"length":386,"previous":"WBV2-P1100-002","next":"WBV2-P1101-000"},"WBV2-P1101-000":{"line":5,"offset":1705,"length":374,"previous":"WBV2-P1100-003","next":"WBV2-P1101-001"},"WBV2-P1101-001":{"line":6,"offset":2079,"length":382,"previous":"WBV2-P1101-000","next":"WBV2-P1101-002"},"WBV2-P1101-002":{"line":7,"offset":2461,"length":363,"previous":"WBV2-P1101-001","next":"WBV2-P1101-003"},"WBV2-P1101-003":{"line":8,"offset":2824,"length":374,"previous":"WBV2-P1101-002","next":"WBV2-P1102-000"},"WBV2-P1102-000":{"line":9,"offset":3198,"length":365,"previous":"WBV2-P1101-003","next":"WBV2-P1102-001"},"WBV2-P1102-001":{"line":10,"offset":3563,"length":371,"previous":"WBV2-P1102-000","next":"WBV2-P1103-000"},"WBV2-P1103-000":{"line":11,"offset":3934,"length":373,"previous":"WBV2-P1102-001","next":"WBV2-P1104-000"},"WBV2-P1104-000":{"line":12,"offset":4307,"length":389,"previous":"WBV2-P1103-000","next":"WBV2-P1105-000"},"WBV2-P1105-000":{"line":13,"offset":4696,"length":426,"previous":"WBV2-P1104-000","next":"WBV2-P1106-000"},"WBV2-P1106-000":{"line":14,"offset":5122,"length":366,"previous":"WBV2-P1105-000","next":"WBV2-P1107-000"},"WBV2-P1107-000":{"line":15,"offset":5488,"length":373,"previous":"WBV2-P1106-000","next":"WBV2-P1108-000"},"WBV2-P1108-000":{"line":16,"offset":5861,"length":385,"previous":"WBV2-P1107-000","next":"WBV2-P1109-000"},"WBV2-P1109-000":{"line":17,"offset":6246,"length":397,"previous":"WBV2-P1108-000","next":"WBV2-P1110-000"},"WBV2-P1110-000":{"line":18,"offset":6643,"length":394,"previous":"WBV2-P1109-000","next":"WBV2-P1111-000"},"WBV2-P1111-000":{"line":19,"offset":7037,"length":384,"previous":"WBV2-P1110-000","next":"WBV2-P1112-000"},"WBV2-P1112-000":{"line":20,"offset":7421,"length":397,"previous":"WBV2-P1111-000","next":"WBV2-P1113-000"},"WBV2-P1113-000":{"line":21,"offset":7818,"length":393,"previous":"WBV2-P1112-000","next":"WBV2-P1114-000"},"WBV2-P1114-000":{"line":22,"offset":8211,"length":384,"previous":"WBV2-P1113-000","next":"WBV2-P1115-000"},"WBV2-P1115-000":{"line":23,"offset":8595,"length":388,"previous":"WBV2-P1114-000","next":"WBV2-P1116-000"},"WBV2-P1116-000":{"line":24,"offset":8983,"length":388,"previous":"WBV2-P1115-000","next":"WBV2-P1117-000"},"WBV2-P1117-000":{"line":25,"offset":9371,"length":413,"previous":"WBV2-P1116-000","next":"WBV2-P1118-000"},"WBV2-P1118-000":{"line":26,"offset":9784,"length":409,"previous":"WBV2-P1117-000","next":"WBV2-P1119-000"},"WBV2-P1119-000":{"line":27,"offset":10193,"length":379,"previous":"WBV2-P1118-000","next":"WBV2-P1120-000"},"WBV2-P1120-000":{"line":28,"offset":10572,"length":392,"previous":"WBV2-P1119-000","next":"WBV2-P1121-000"},"WBV2-P1121-000":{"line":29,"offset":10964,"length":375,"previous":"WBV2-P1120-000","next":"WBV2-P1122-000"},"WBV2-P1122-000":{"line":30,"offset":11339,"length":385,"previous":"WBV2-P1121-000","next":"WBV2-P1123-000"},"WBV2-P1123-000":{"line":31,"offset":11724,"length":385,"previous":"WBV2-P1122-000","next":"WBV2-P1124-000"},"WBV2-P1124-000":{"line":32,"offset":12109,"length":431,"previous":"WBV2-P1123-000","next":"WBV2-P1125-000"},"WBV2-P1125-000":{"line":33,"offset":12540,"length":406,"previous":"WBV2-P1124-000","next":"WBV2-P1126-000"},"WBV2-P1126-000":{"line":34,"offset":12946,"length":397,"previous":"WBV2-P1125-000","next":"WBV2-P1127-000"},"WBV2-P1127-000":{"line":35,"offset":13343,"length":406,"previous":"WBV2-P1126-000","next":"WBV2-P1128-000"},"WBV2-P1128-000":{"line":36,"offset":13749,"length":406,"previous":"WBV2-P1127-000","next":"WBV2-P1129-000"},"WBV2-P1129-000":{"line":37,"offset":14155,"length":331,"previous":"WBV2-P1128-000","next":"WBV2-P1129-001"},"WBV2-P1129-001":{"line":38,"offset":14486,"length":393,"previous":"WBV2-P1129-000","next":"WBV2-P1130-000"},"WBV2-P1130-000":{"line":39,"offset":14879,"length":348,"previous":"WBV2-P1129-001","next":"WBV2-P1130-001"},"WBV2-P1130-001":{"line":40,"offset":15227,"length":387,"previous":"WBV2-P1130-000","next":"WBV2-P1131-000"},"WBV2-P1131-000":{"line":41,"offset":15614,"length":349,"previous":"WBV2-P1130-001","next":"WBV2-P1131-001"},"WBV2-P1131-001":{"line":42,"offset":15963,"length":383,"previous":"WBV2-P1131-000","next":"WBV2-P1132-000"},"WBV2-P1132-000":{"line":43,"offset":16346,"length":345,"previous":"WBV2-P1131-001","next":"WBV2-P1132-001"},"WBV2-P1132-001":{"line":44,"offset":16691,"length":380,"previous":"WBV2-P1132-000","next":"WBV2-P1133-000"},"WBV2-P1133-000":{"line":45,"offset":17071,"length":346,"previous":"WBV2-P1132-001","next":"WBV2-P1133-001"},"WBV2-P1133-001":{"line":46,"offset":17417,"length":387,"previous":"WBV2-P1133-000","next":"WBV2-P1134-000"},"WBV2-P1134-000":{"line":47,"offset":17804,"length":353,"previous":"WBV2-P1133-001","next":"WBV2-P1134-001"},"WBV2-P1134-001":{"line":48,"offset":18157,"length":392,"previous":"WBV2-P1134-000","next":"WBV2-P1135-000"},"WBV2-P1135-000":{"line":49,"offset":18549,"length":339,"previous":"WBV2-P1134-001","next":"WBV2-P1135-001"},"WBV2-P1135-001":{"line":50,"offset":18888,"length":385,"previous":"WBV2-P1135-000","next":"WBV2-P1136-000"},"WBV2-P1136-000":{"line":51,"offset":19273,"length":349,"previous":"WBV2-P1135-001","next":"WBV2-P1136-001"},"WBV2-P1136-001":{"line":52,"offset":19622,"length":391,"previous":"WBV2-P1136-000","next":"WBV2-P1137-000"},"WBV2-P1137-000":{"line":53,"offset":20013,"length":354,"previous":"WBV2-P1136-001","next":"WBV2-P1137-001"},"WBV2-P1137-001":{"line":54,"offset":20367,"length":393,"previous":"WBV2-P1137-000","next":"WBV2-P1138-000"},"WBV2-P1138-000":{"line":55,"offset":20760,"length":340,"previous":"WBV2-P1137-001","next":"WBV2-P1138-001"},"WBV2-P1138-001":{"line":56,"offset":21100,"length":388,"previous":"WBV2-P1138-000","next":"WBV2-P1139-000"},"WBV2-P1139-000":{"line":57,"offset":21488,"length":344,"previous":"WBV2-P1138-001","next":"WBV2-P1139-001"},"WBV2-P1139-001":{"line":58,"offset":21832,"length":393,"previous":"WBV2-P1139-000","next":"WBV2-P1140-000"},"WBV2-P1140-000":{"line":59,"offset":22225,"length":362,"previous":"WBV2-P1139-001","next":"WBV2-P1140-001"},"WBV2-P1140-001":{"line":60,"offset":22587,"length":382,"previous":"WBV2-P1140-000","next":"WBV2-P1141-000"},"WBV2-P1141-000":{"line":61,"offset":22969,"length":368,"previous":"WBV2-P1140-001","next":"WBV2-P1141-001"},"WBV2-P1141-001":{"line":62,"offset":23337,"length":389,"previous":"WBV2-P1141-000","next":"WBV2-P1142-000"},"WBV2-P1142-000":{"line":63,"offset":23726,"length":364,"previous":"WBV2-P1141-001","next":"WBV2-P1142-001"},"WBV2-P1142-001":{"line":64,"offset":24090,"length":383,"previous":"WBV2-P1142-000","next":"WBV2-P1143-000"},"WBV2-P1143-000":{"line":65,"offset":24473,"length":369,"previous":"WBV2-P1142-001","next":"WBV2-P1143-001"},"WBV2-P1143-001":{"line":66,"offset":24842,"length":385,"previous":"WBV2-P1143-000","next":"WBV2-P1144-000"},"WBV2-P1144-000":{"line":67,"offset":25227,"length":351,"previous":"WBV2-P1143-001","next":"WBV2-P1144-001"},"WBV2-P1144-001":{"line":68,"offset":25578,"length":376,"previous":"WBV2-P1144-000","next":"WBV2-P1145-000"},"WBV2-P1145-000":{"line":69,"offset":25954,"length":371,"previous":"WBV2-P1144-001","next":"WBV2-P1145-001"},"WBV2-P1145-001":{"line":70,"offset":26325,"length":386,"previous":"WBV2-P1145-000","next":"WBV2-P1146-000"},"WBV2-P1146-000":{"line":71,"offset":26711,"length":303,"previous":"WBV2-P1145-001","next":"WBV2-P1146-001"},"WBV2-P1146-001":{"line":72,"offset":27014,"length":356,"previous":"WBV2-P1146-000","next":"WBV2-P1147-000"},"WBV2-P1147-000":{"line":73,"offset":27370,"length":303,"previous":"WBV2-P1146-001","next":"WBV2-P1147-001"},"WBV2-P1147-001":{"line":74,"offset":27673,"length":360,"previous":"WBV2-P1147-000","next":"WBV2-P1148-000"},"WBV2-P1148-000":{"line":75,"offset":28033,"length":303,"previous":"WBV2-P1147-001","next":"WBV2-P1148-001"},"WBV2-P1148-001":{"line":76,"offset":28336,"length":362,"previous":"WBV2-P1148-000","next":"WBV2-P1149-000"},"WBV2-P1149-000":{"line":77,"offset":28698,"length":303,"previous":"WBV2-P1148-001","next":"WBV2-P1149-001"},"WBV2-P1149-001":{"line":78,"offset":29001,"length":361,"previous":"WBV2-P1149-000","next":"WBV2-P1150-000"},"WBV2-P1150-000":{"line":79,"offset":29362,"length":303,"previous":"WBV2-P1149-001","next":"WBV2-P1150-001"},"WBV2-P1150-001":{"line":80,"offset":29665,"length":361,"previous":"WBV2-P1150-000","next":"WBV2-P1151-000"},"WBV2-P1151-000":{"line":81,"offset":30026,"length":303,"previous":"WBV2-P1150-001","next":"WBV2-P1151-001"},"WBV2-P1151-001":{"line":82,"offset":30329,"length":369,"previous":"WBV2-P1151-000","next":"WBV2-P1152-000"},"WBV2-P1152-000":{"line":83,"offset":30698,"length":303,"previous":"WBV2-P1151-001","next":"WBV2-P1152-001"},"WBV2-P1152-001":{"line":84,"offset":31001,"length":360,"previous":"WBV2-P1152-000","next":"WBV2-P1153-000"},"WBV2-P1153-000":{"line":85,"offset":31361,"length":303,"previous":"WBV2-P1152-001","next":"WBV2-P1153-001"},"WBV2-P1153-001":{"line":86,"offset":31664,"length":367,"previous":"WBV2-P1153-000","next":"WBV2-P1154-000"},"WBV2-P1154-000":{"line":87,"offset":32031,"length":303,"previous":"WBV2-P1153-001","next":"WBV2-P1154-001"},"WBV2-P1154-001":{"line":88,"offset":32334,"length":365,"previous":"WBV2-P1154-000","next":"WBV2-P1155-000"},"WBV2-P1155-000":{"line":89,"offset":32699,"length":303,"previous":"WBV2-P1154-001","next":"WBV2-P1155-001"},"WBV2-P1155-001":{"line":90,"offset":33002,"length":360,"previous":"WBV2-P1155-000","next":"WBV2-P1156-000"},"WBV2-P1156-000":{"line":91,"offset":33362,"length":303,"previous":"WBV2-P1155-001","next":"WBV2-P1156-001"},"WBV2-P1156-001":{"line":92,"offset":33665,"length":365,"previous":"WBV2-P1156-000","next":"WBV2-P1157-000"},"WBV2-P1157-000":{"line":93,"offset":34030,"length":303,"previous":"WBV2-P1156-001","next":"WBV2-P1157-001"},"WBV2-P1157-001":{"line":94,"offset":34333,"length":364,"previous":"WBV2-P1157-000","next":"WBV2-P1158-000"},"WBV2-P1158-000":{"line":95,"offset":34697,"length":303,"previous":"WBV2-P1157-001","next":"WBV2-P1158-001"},"WBV2-P1158-001":{"line":96,"offset":35000,"length":357,"previous":"WBV2-P1158-000","next":"WBV2-P1159-000"},"WBV2-P1159-000":{"line":97,"offset":35357,"length":303,"previous":"WBV2-P1158-001","next":"WBV2-P1159-001"},"WBV2-P1159-001":{"line":98,"offset":35660,"length":368,"previous":"WBV2-P1159-000","next":"WBV2-P1160-000"},"WBV2-P1160-000":{"line":99,"offset":36028,"length":303,"previous":"WBV2-P1159-001","next":"WBV2-P1160-001"},"WBV2-P1160-001":{"line":100,"offset":36331,"length":365,"previous":"WBV2-P1160-000","next":"WBV2-P1161-000"},"WBV2-P1161-000":{"line":101,"offset":36696,"length":303,"previous":"WBV2-P1160-001","next":"WBV2-P1161-001"},"WBV2-P1161-001":{"line":102,"offset":36999,"length":372,"previous":"WBV2-P1161-000","next":"WBV2-P1162-000"},"WBV2-P1162-000":{"line":103,"offset":37371,"length":303,"previous":"WBV2-P1161-001","next":"WBV2-P1162-001"},"WBV2-P1162-001":{"line":104,"offset":37674,"length":365,"previous":"WBV2-P1162-000","next":"WBV2-P1163-000"},"WBV2-P1163-000":{"line":105,"offset":38039,"length":303,"previous":"WBV2-P1162-001","next":"WBV2-P1163-001"},"WBV2-P1163-001":{"line":106,"offset":38342,"length":360,"previous":"WBV2-P1163-000","next":"WBV2-P1164-000"},"WBV2-P1164-000":{"line":107,"offset":38702,"length":303,"previous":"WBV2-P1163-001","next":"WBV2-P1164-001"},"WBV2-P1164-001":{"line":108,"offset":39005,"length":360,"previous":"WBV2-P1164-000","next":"WBV2-P1165-000"},"WBV2-P1165-000":{"line":109,"offset":39365,"length":303,"previous":"WBV2-P1164-001","next":"WBV2-P1165-001"},"WBV2-P1165-001":{"line":110,"offset":39668,"length":366,"previous":"WBV2-P1165-000","next":"WBV2-P1166-000"},"WBV2-P1166-000":{"line":111,"offset":40034,"length":303,"previous":"WBV2-P1165-001","next":"WBV2-P1166-001"},"WBV2-P1166-001":{"line":112,"offset":40337,"length":366,"previous":"WBV2-P1166-000","next":"WBV2-P1167-000"},"WBV2-P1167-000":{"line":113,"offset":40703,"length":303,"previous":"WBV2-P1166-001","next":"WBV2-P1167-001"},"WBV2-P1167-001":{"line":114,"offset":41006,"length":366,"previous":"WBV2-P1167-000","next":"WBV2-P1168-000"},"WBV2-P1168-000":{"line":115,"offset":41372,"length":303,"previous":"WBV2-P1167-001","next":"WBV2-P1168-001"},"WBV2-P1168-001":{"line":116,"offset":41675,"length":366,"previous":"WBV2-P1168-000","next":"WBV2-P1169-000"},"WBV2-P1169-000":{"line":117,"offset":42041,"length":303,"previous":"WBV2-P1168-001","next":"WBV2-P1169-001"},"WBV2-P1169-001":{"line":118,"offset":42344,"length":366,"previous":"WBV2-P1169-000","next":"WBV2-P1170-000"},"WBV2-P1170-000":{"line":119,"offset":42710,"length":303,"previous":"WBV2-P1169-001","next":"WBV2-P1170-001"},"WBV2-P1170-001":{"line":120,"offset":43013,"length":366,"previous":"WBV2-P1170-000","next":"WBV2-P1171-000"},"WBV2-P1171-000":{"line":121,"offset":43379,"length":303,"previous":"WBV2-P1170-001","next":"WBV2-P1171-001"},"WBV2-P1171-001":{"line":122,"offset":43682,"length":366,"previous":"WBV2-P1171-000","next":"WBV2-P1172-000"},"WBV2-P1172-000":{"line":123,"offset":44048,"length":303,"previous":"WBV2-P1171-001","next":"WBV2-P1172-001"},"WBV2-P1172-001":{"line":124,"offset":44351,"length":366,"previous":"WBV2-P1172-000","next":"WBV2-P1173-000"},"WBV2-P1173-000":{"line":125,"offset":44717,"length":303,"previous":"WBV2-P1172-001","next":"WBV2-P1173-001"},"WBV2-P1173-001":{"line":126,"offset":45020,"length":366,"previous":"WBV2-P1173-000","next":"WBV2-P1174-000"},"WBV2-P1174-000":{"line":127,"offset":45386,"length":303,"previous":"WBV2-P1173-001","next":"WBV2-P1174-001"},"WBV2-P1174-001":{"line":128,"offset":45689,"length":366,"previous":"WBV2-P1174-000","next":"WBV2-P1175-000"},"WBV2-P1175-000":{"line":129,"offset":46055,"length":303,"previous":"WBV2-P1174-001","next":"WBV2-P1175-001"},"WBV2-P1175-001":{"line":130,"offset":46358,"length":366,"previous":"WBV2-P1175-000","next":"WBV2-P1176-000"},"WBV2-P1176-000":{"line":131,"offset":46724,"length":303,"previous":"WBV2-P1175-001","next":"WBV2-P1176-001"},"WBV2-P1176-001":{"line":132,"offset":47027,"length":364,"previous":"WBV2-P1176-000","next":"WBV2-P1177-000"},"WBV2-P1177-000":{"line":133,"offset":47391,"length":303,"previous":"WBV2-P1176-001","next":"WBV2-P1177-001"},"WBV2-P1177-001":{"line":134,"offset":47694,"length":364,"previous":"WBV2-P1177-000","next":"WBV2-P1178-000"},"WBV2-P1178-000":{"line":135,"offset":48058,"length":303,"previous":"WBV2-P1177-001","next":"WBV2-P1178-001"},"WBV2-P1178-001":{"line":136,"offset":48361,"length":364,"previous":"WBV2-P1178-000","next":"WBV2-P1179-000"},"WBV2-P1179-000":{"line":137,"offset":48725,"length":303,"previous":"WBV2-P1178-001","next":"WBV2-P1179-001"},"WBV2-P1179-001":{"line":138,"offset":49028,"length":364,"previous":"WBV2-P1179-000","next":"WBV2-P1180-000"},"WBV2-P1180-000":{"line":139,"offset":49392,"length":303,"previous":"WBV2-P1179-001","next":"WBV2-P1180-001"},"WBV2-P1180-001":{"line":140,"offset":49695,"length":364,"previous":"WBV2-P1180-000","next":"WBV2-P1181-000"},"WBV2-P1181-000":{"line":141,"offset":50059,"length":303,"previous":"WBV2-P1180-001","next":"WBV2-P1181-001"},"WBV2-P1181-001":{"line":142,"offset":50362,"length":364,"previous":"WBV2-P1181-000","next":"WBV2-P1182-000"},"WBV2-P1182-000":{"line":143,"offset":50726,"length":303,"previous":"WBV2-P1181-001","next":"WBV2-P1182-001"},"WBV2-P1182-001":{"line":144,"offset":51029,"length":364,"previous":"WBV2-P1182-000","next":"WBV2-P1183-000"},"WBV2-P1183-000":{"line":145,"offset":51393,"length":303,"previous":"WBV2-P1182-001","next":"WBV2-P1183-001"},"WBV2-P1183-001":{"line":146,"offset":51696,"length":364,"previous":"WBV2-P1183-000","next":"WBV2-P1184-000"},"WBV2-P1184-000":{"line":147,"offset":52060,"length":303,"previous":"WBV2-P1183-001","next":"WBV2-P1184-001"},"WBV2-P1184-001":{"line":148,"offset":52363,"length":364,"previous":"WBV2-P1184-000","next":"WBV2-P1185-000"},"WBV2-P1185-000":{"line":149,"offset":52727,"length":303,"previous":"WBV2-P1184-001","next":"WBV2-P1185-001"},"WBV2-P1185-001":{"line":150,"offset":53030,"length":364,"previous":"WBV2-P1185-000","next":"WBV2-P1186-000"},"WBV2-P1186-000":{"line":151,"offset":53394,"length":303,"previous":"WBV2-P1185-001","next":"WBV2-P1186-001"},"WBV2-P1186-001":{"line":152,"offset":53697,"length":364,"previous":"WBV2-P1186-000","next":"WBV2-P1187-000"},"WBV2-P1187-000":{"line":153,"offset":54061,"length":303,"previous":"WBV2-P1186-001","next":"WBV2-P1187-001"},"WBV2-P1187-001":{"line":154,"offset":54364,"length":364,"previous":"WBV2-P1187-000","next":"WBV2-P1188-000"},"WBV2-P1188-000":{"line":155,"offset":54728,"length":303,"previous":"WBV2-P1187-001","next":"WBV2-P1188-001"},"WBV2-P1188-001":{"line":156,"offset":55031,"length":364,"previous":"WBV2-P1188-000","next":"WBV2-P1189-000"},"WBV2-P1189-000":{"line":157,"offset":55395,"length":303,"previous":"WBV2-P1188-001","next":"WBV2-P1189-001"},"WBV2-P1189-001":{"line":158,"offset":55698,"length":364,"previous":"WBV2-P1189-000","next":"WBV2-P1190-000"},"WBV2-P1190-000":{"line":159,"offset":56062,"length":303,"previous":"WBV2-P1189-001","next":"WBV2-P1190-001"},"WBV2-P1190-001":{"line":160,"offset":56365,"length":364,"previous":"WBV2-P1190-000","next":"WBV2-P1191-000"},"WBV2-P1191-000":{"line":161,"offset":56729,"length":303,"previous":"WBV2-P1190-001","next":"WBV2-P1191-001"},"WBV2-P1191-001":{"line":162,"offset":57032,"length":364,"previous":"WBV2-P1191-000","next":"WBV2-P1192-000"},"WBV2-P1192-000":{"line":163,"offset":57396,"length":303,"previous":"WBV2-P1191-001","next":"WBV2-P1192-001"},"WBV2-P1192-001":{"line":164,"offset":57699,"length":364,"previous":"WBV2-P1192-000","next":"WBV2-P1193-000"},"WBV2-P1193-000":{"line":165,"offset":58063,"length":303,"previous":"WBV2-P1192-001","next":"WBV2-P1193-001"},"WBV2-P1193-001":{"line":166,"offset":58366,"length":364,"previous":"WBV2-P1193-000","next":"WBV2-P1194-000"},"WBV2-P1194-000":{"line":167,"offset":58730,"length":303,"previous":"WBV2-P1193-001","next":"WBV2-P1194-001"},"WBV2-P1194-001":{"line":168,"offset":59033,"length":364,"previous":"WBV2-P1194-000","next":"WBV2-P1195-000"},"WBV2-P1195-000":{"line":169,"offset":59397,"length":303,"previous":"WBV2-P1194-001","next":"WBV2-P1195-001"},"WBV2-P1195-001":{"line":170,"offset":59700,"length":364,"previous":"WBV2-P1195-000","next":"WBV2-P1196-000"},"WBV2-P1196-000":{"line":171,"offset":60064,"length":303,"previous":"WBV2-P1195-001","next":"WBV2-P1196-001"},"WBV2-P1196-001":{"line":172,"offset":60367,"length":364,"previous":"WBV2-P1196-000","next":"WBV2-P1197-000"},"WBV2-P1197-000":{"line":173,"offset":60731,"length":303,"previous":"WBV2-P1196-001","next":"WBV2-P1197-001"},"WBV2-P1197-001":{"line":174,"offset":61034,"length":364,"previous":"WBV2-P1197-000","next":"WBV2-P1198-000"},"WBV2-P1198-000":{"line":175,"offset":61398,"length":303,"previous":"WBV2-P1197-001","next":"WBV2-P1198-001"},"WBV2-P1198-001":{"line":176,"offset":61701,"length":364,"previous":"WBV2-P1198-000","next":"WBV2-P1199-000"},"WBV2-P1199-000":{"line":177,"offset":62065,"length":303,"previous":"WBV2-P1198-001","next":"WBV2-P1199-001"},"WBV2-P1199-001":{"line":178,"offset":62368,"length":364,"previous":"WBV2-P1199-000","next":"WBV2-P1200-000"},"WBV2-P1200-000":{"line":179,"offset":62732,"length":303,"previous":"WBV2-P1199-001","next":"WBV2-P1200-001"},"WBV2-P1200-001":{"line":180,"offset":63035,"length":364,"previous":"WBV2-P1200-000","next":"WBV2-P1201-000"},"WBV2-P1201-000":{"line":181,"offset":63399,"length":303,"previous":"WBV2-P1200-001","next":"WBV2-P1201-001"},"WBV2-P1201-001":{"line":182,"offset":63702,"length":364,"previous":"WBV2-P1201-000","next":"WBV2-P1202-000"},"WBV2-P1202-000":{"line":183,"offset":64066,"length":303,"previous":"WBV2-P1201-001","next":"WBV2-P1202-001"},"WBV2-P1202-001":{"line":184,"offset":64369,"length":364,"previous":"WBV2-P1202-000","next":"WBV2-P1203-000"},"WBV2-P1203-000":{"line":185,"offset":64733,"length":303,"previous":"WBV2-P1202-001","next":"WBV2-P1203-001"},"WBV2-P1203-001":{"line":186,"offset":65036,"length":364,"previous":"WBV2-P1203-000","next":"WBV2-P1204-000"},"WBV2-P1204-000":{"line":187,"offset":65400,"length":303,"previous":"WBV2-P1203-001","next":"WBV2-P1204-001"},"WBV2-P1204-001":{"line":188,"offset":65703,"length":364,"previous":"WBV2-P1204-000","next":"WBV2-P1205-000"},"WBV2-P1205-000":{"line":189,"offset":66067,"length":303,"previous":"WBV2-P1204-001","next":"WBV2-P1205-001"},"WBV2-P1205-001":{"line":190,"offset":66370,"length":364,"previous":"WBV2-P1205-000","next":"WBV2-P1206-000"},"WBV2-P1206-000":{"line":191,"offset":66734,"length":303,"previous":"WBV2-P1205-001","next":"WBV2-P1206-001"},"WBV2-P1206-001":{"line":192,"offset":67037,"length":364,"previous":"WBV2-P1206-000","next":"WBV2-P1207-000"},"WBV2-P1207-000":{"line":193,"offset":67401,"length":303,"previous":"WBV2-P1206-001","next":"WBV2-P1207-001"},"WBV2-P1207-001":{"line":194,"offset":67704,"length":364,"previous":"WBV2-P1207-000","next":"WBV2-P1208-000"},"WBV2-P1208-000":{"line":195,"offset":68068,"length":303,"previous":"WBV2-P1207-001","next":"WBV2-P1208-001"},"WBV2-P1208-001":{"line":196,"offset":68371,"length":364,"previous":"WBV2-P1208-000","next":"WBV2-P1209-000"},"WBV2-P1209-000":{"line":197,"offset":68735,"length":303,"previous":"WBV2-P1208-001","next":"WBV2-P1209-001"},"WBV2-P1209-001":{"line":198,"offset":69038,"length":364,"previous":"WBV2-P1209-000","next":"WBV2-P1210-000"},"WBV2-P1210-000":{"line":199,"offset":69402,"length":303,"previous":"WBV2-P1209-001","next":"WBV2-P1210-001"},"WBV2-P1210-001":{"line":200,"offset":69705,"length":364,"previous":"WBV2-P1210-000","next":"WBV2-P1211-000"},"WBV2-P1211-000":{"line":201,"offset":70069,"length":303,"previous":"WBV2-P1210-001","next":"WBV2-P1211-001"},"WBV2-P1211-001":{"line":202,"offset":70372,"length":364,"previous":"WBV2-P1211-000","next":"WBV2-P1212-000"},"WBV2-P1212-000":{"line":203,"offset":70736,"length":303,"previous":"WBV2-P1211-001","next":"WBV2-P1212-001"},"WBV2-P1212-001":{"line":204,"offset":71039,"length":364,"previous":"WBV2-P1212-000","next":"WBV2-P1213-000"},"WBV2-P1213-000":{"line":205,"offset":71403,"length":303,"previous":"WBV2-P1212-001","next":"WBV2-P1213-001"},"WBV2-P1213-001":{"line":206,"offset":71706,"length":364,"previous":"WBV2-P1213-000","next":"WBV2-P1214-000"},"WBV2-P1214-000":{"line":207,"offset":72070,"length":303,"previous":"WBV2-P1213-001","next":"WBV2-P1214-001"},"WBV2-P1214-001":{"line":208,"offset":72373,"length":364,"previous":"WBV2-P1214-000","next":"WBV2-P1215-000"},"WBV2-P1215-000":{"line":209,"offset":72737,"length":303,"previous":"WBV2-P1214-001","next":"WBV2-P1215-001"},"WBV2-P1215-001":{"line":210,"offset":73040,"length":364,"previous":"WBV2-P1215-000","next":"WBV2-P1216-000"},"WBV2-P1216-000":{"line":211,"offset":73404,"length":303,"previous":"WBV2-P1215-001","next":"WBV2-P1216-001"},"WBV2-P1216-001":{"line":212,"offset":73707,"length":364,"previous":"WBV2-P1216-000","next":"WBV2-P1217-000"},"WBV2-P1217-000":{"line":213,"offset":74071,"length":303,"previous":"WBV2-P1216-001","next":"WBV2-P1217-001"},"WBV2-P1217-001":{"line":214,"offset":74374,"length":364,"previous":"WBV2-P1217-000","next":"WBV2-P1218-000"},"WBV2-P1218-000":{"line":215,"offset":74738,"length":303,"previous":"WBV2-P1217-001","next":"WBV2-P1218-001"},"WBV2-P1218-001":{"line":216,"offset":75041,"length":364,"previous":"WBV2-P1218-000","next":"WBV2-P1219-000"},"WBV2-P1219-000":{"line":217,"offset":75405,"length":303,"previous":"WBV2-P1218-001","next":"WBV2-P1219-001"},"WBV2-P1219-001":{"line":218,"offset":75708,"length":364,"previous":"WBV2-P1219-000","next":"WBV2-P1220-000"},"WBV2-P1220-000":{"line":219,"offset":76072,"length":303,"previous":"WBV2-P1219-001","next":"WBV2-P1220-001"},"WBV2-P1220-001":{"line":220,"offset":76375,"length":364,"previous":"WBV2-P1220-000","next":"WBV2-P1221-000"},"WBV2-P1221-000":{"line":221,"offset":76739,"length":303,"previous":"WBV2-P1220-001","next":"WBV2-P1221-001"},"WBV2-P1221-001":{"line":222,"offset":77042,"length":364,"previous":"WBV2-P1221-000","next":"WBV2-P1222-000"},"WBV2-P1222-000":{"line":223,"offset":77406,"length":303,"previous":"WBV2-P1221-001","next":"WBV2-P1222-001"},"WBV2-P1222-001":{"line":224,"offset":77709,"length":364,"previous":"WBV2-P1222-000","next":"WBV2-P1223-000"},"WBV2-P1223-000":{"line":225,"offset":78073,"length":303,"previous":"WBV2-P1222-001","next":"WBV2-P1223-001"},"WBV2-P1223-001":{"line":226,"offset":78376,"length":364,"previous":"WBV2-P1223-000","next":"WBV2-P1224-000"},"WBV2-P1224-000":{"line":227,"offset":78740,"length":303,"previous":"WBV2-P1223-001","next":"WBV2-P1224-001"},"WBV2-P1224-001":{"line":228,"offset":79043,"length":364,"previous":"WBV2-P1224-000","next":"WBV2-P1225-000"},"WBV2-P1225-000":{"line":229,"offset":79407,"length":303,"previous":"WBV2-P1224-001","next":"WBV2-P1225-001"},"WBV2-P1225-001":{"line":230,"offset":79710,"length":364,"previous":"WBV2-P1225-000","next":"WBV2-P1226-000"},"WBV2-P1226-000":{"line":231,"offset":80074,"length":303,"previous":"WBV2-P1225-001","next":"WBV2-P1226-001"},"WBV2-P1226-001":{"line":232,"offset":80377,"length":364,"previous":"WBV2-P1226-000","next":"WBV2-P1227-000"},"WBV2-P1227-000":{"line":233,"offset":80741,"length":303,"previous":"WBV2-P1226-001","next":"WBV2-P1227-001"},"WBV2-P1227-001":{"line":234,"offset":81044,"length":364,"previous":"WBV2-P1227-000","next":"WBV2-P1228-000"},"WBV2-P1228-000":{"line":235,"offset":81408,"length":303,"previous":"WBV2-P1227-001","next":"WBV2-P1228-001"},"WBV2-P1228-001":{"line":236,"offset":81711,"length":364,"previous":"WBV2-P1228-000","next":"WBV2-P1229-000"},"WBV2-P1229-000":{"line":237,"offset":82075,"length":303,"previous":"WBV2-P1228-001","next":"WBV2-P1229-001"},"WBV2-P1229-001":{"line":238,"offset":82378,"length":364,"previous":"WBV2-P1229-000","next":"WBV2-P1230-000"},"WBV2-P1230-000":{"line":239,"offset":82742,"length":303,"previous":"WBV2-P1229-001","next":"WBV2-P1230-001"},"WBV2-P1230-001":{"line":240,"offset":83045,"length":364,"previous":"WBV2-P1230-000","next":"WBV2-P1231-000"},"WBV2-P1231-000":{"line":241,"offset":83409,"length":303,"previous":"WBV2-P1230-001","next":"WBV2-P1231-001"},"WBV2-P1231-001":{"line":242,"offset":83712,"length":364,"previous":"WBV2-P1231-000","next":"WBV2-P1232-000"},"WBV2-P1232-000":{"line":243,"offset":84076,"length":303,"previous":"WBV2-P1231-001","next":"WBV2-P1232-001"},"WBV2-P1232-001":{"line":244,"offset":84379,"length":364,"previous":"WBV2-P1232-000","next":"WBV2-P1233-000"},"WBV2-P1233-000":{"line":245,"offset":84743,"length":303,"previous":"WBV2-P1232-001","next":"WBV2-P1233-001"},"WBV2-P1233-001":{"line":246,"offset":85046,"length":364,"previous":"WBV2-P1233-000","next":"WBV2-P1234-000"},"WBV2-P1234-000":{"line":247,"offset":85410,"length":303,"previous":"WBV2-P1233-001","next":"WBV2-P1234-001"},"WBV2-P1234-001":{"line":248,"offset":85713,"length":364,"previous":"WBV2-P1234-000","next":"WBV2-P1235-000"},"WBV2-P1235-000":{"line":249,"offset":86077,"length":303,"previous":"WBV2-P1234-001","next":"WBV2-P1235-001"},"WBV2-P1235-001":{"line":250,"offset":86380,"length":364,"previous":"WBV2-P1235-000","next":"WBV2-P1236-000"},"WBV2-P1236-000":{"line":251,"offset":86744,"length":303,"previous":"WBV2-P1235-001","next":"WBV2-P1236-001"},"WBV2-P1236-001":{"line":252,"offset":87047,"length":364,"previous":"WBV2-P1236-000","next":"WBV2-P1237-000"},"WBV2-P1237-000":{"line":253,"offset":87411,"length":303,"previous":"WBV2-P1236-001","next":"WBV2-P1237-001"},"WBV2-P1237-001":{"line":254,"offset":87714,"length":364,"previous":"WBV2-P1237-000","next":"WBV2-P1238-000"},"WBV2-P1238-000":{"line":255,"offset":88078,"length":303,"previous":"WBV2-P1237-001","next":"WBV2-P1238-001"},"WBV2-P1238-001":{"line":256,"offset":88381,"length":364,"previous":"WBV2-P1238-000","next":"WBV2-P1239-000"},"WBV2-P1239-000":{"line":257,"offset":88745,"length":303,"previous":"WBV2-P1238-001","next":"WBV2-P1239-001"},"WBV2-P1239-001":{"line":258,"offset":89048,"length":364,"previous":"WBV2-P1239-000","next":"WBV2-P1240-000"},"WBV2-P1240-000":{"line":259,"offset":89412,"length":303,"previous":"WBV2-P1239-001","next":"WBV2-P1240-001"},"WBV2-P1240-001":{"line":260,"offset":89715,"length":364,"previous":"WBV2-P1240-000","next":"WBV2-P1241-000"},"WBV2-P1241-000":{"line":261,"offset":90079,"length":303,"previous":"WBV2-P1240-001","next":"WBV2-P1241-001"},"WBV2-P1241-001":{"line":262,"offset":90382,"length":364,"previous":"WBV2-P1241-000","next":"WBV2-P1242-000"},"WBV2-P1242-000":{"line":263,"offset":90746,"length":303,"previous":"WBV2-P1241-001","next":"WBV2-P1242-001"},"WBV2-P1242-001":{"line":264,"offset":91049,"length":364,"previous":"WBV2-P1242-000","next":"WBV2-P1243-000"},"WBV2-P1243-000":{"line":265,"offset":91413,"length":303,"previous":"WBV2-P1242-001","next":"WBV2-P1243-001"},"WBV2-P1243-001":{"line":266,"offset":91716,"length":364,"previous":"WBV2-P1243-000","next":"WBV2-P1244-000"},"WBV2-P1244-000":{"line":267,"offset":92080,"length":303,"previous":"WBV2-P1243-001","next":"WBV2-P1244-001"},"WBV2-P1244-001":{"line":268,"offset":92383,"length":364,"previous":"WBV2-P1244-000","next":"WBV2-P1245-000"},"WBV2-P1245-000":{"line":269,"offset":92747,"length":303,"previous":"WBV2-P1244-001","next":"WBV2-P1245-001"},"WBV2-P1245-001":{"line":270,"offset":93050,"length":364,"previous":"WBV2-P1245-000","next":"WBV2-P1246-000"},"WBV2-P1246-000":{"line":271,"offset":93414,"length":303,"previous":"WBV2-P1245-001","next":"WBV2-P1246-001"},"WBV2-P1246-001":{"line":272,"offset":93717,"length":362,"previous":"WBV2-P1246-000","next":"WBV2-P1247-000"},"WBV2-P1247-000":{"line":273,"offset":94079,"length":303,"previous":"WBV2-P1246-001","next":"WBV2-P1247-001"},"WBV2-P1247-001":{"line":274,"offset":94382,"length":362,"previous":"WBV2-P1247-000","next":"WBV2-P1248-000"},"WBV2-P1248-000":{"line":275,"offset":94744,"length":303,"previous":"WBV2-P1247-001","next":"WBV2-P1248-001"},"WBV2-P1248-001":{"line":276,"offset":95047,"length":362,"previous":"WBV2-P1248-000","next":"WBV2-P1249-000"},"WBV2-P1249-000":{"line":277,"offset":95409,"length":303,"previous":"WBV2-P1248-001","next":"WBV2-P1249-001"},"WBV2-P1249-001":{"line":278,"offset":95712,"length":362,"previous":"WBV2-P1249-000","next":"WBV2-P1250-000"},"WBV2-P1250-000":{"line":279,"offset":96074,"length":303,"previous":"WBV2-P1249-001","next":"WBV2-P1250-001"},"WBV2-P1250-001":{"line":280,"offset":96377,"length":362,"previous":"WBV2-P1250-000","next":"WBV2-P1251-000"},"WBV2-P1251-000":{"line":281,"offset":96739,"length":303,"previous":"WBV2-P1250-001","next":"WBV2-P1251-001"},"WBV2-P1251-001":{"line":282,"offset":97042,"length":362,"previous":"WBV2-P1251-000","next":"WBV2-P1252-000"},"WBV2-P1252-000":{"line":283,"offset":97404,"length":303,"previous":"WBV2-P1251-001","next":"WBV2-P1252-001"},"WBV2-P1252-001":{"line":284,"offset":97707,"length":362,"previous":"WBV2-P1252-000","next":"WBV2-P1253-000"},"WBV2-P1253-000":{"line":285,"offset":98069,"length":303,"previous":"WBV2-P1252-001","next":"WBV2-P1253-001"},"WBV2-P1253-001":{"line":286,"offset":98372,"length":362,"previous":"WBV2-P1253-000","next":"WBV2-P1254-000"},"WBV2-P1254-000":{"line":287,"offset":98734,"length":303,"previous":"WBV2-P1253-001","next":"WBV2-P1254-001"},"WBV2-P1254-001":{"line":288,"offset":99037,"length":362,"previous":"WBV2-P1254-000","next":"WBV2-P1255-000"},"WBV2-P1255-000":{"line":289,"offset":99399,"length":303,"previous":"WBV2-P1254-001","next":"WBV2-P1255-001"},"WBV2-P1255-001":{"line":290,"offset":99702,"length":362,"previous":"WBV2-P1255-000","next":"WBV2-P1256-000"},"WBV2-P1256-000":{"line":291,"offset":100064,"length":303,"previous":"WBV2-P1255-001","next":"WBV2-P1256-001"},"WBV2-P1256-001":{"line":292,"offset":100367,"length":362,"previous":"WBV2-P1256-000","next":"WBV2-P1257-000"},"WBV2-P1257-000":{"line":293,"offset":100729,"length":303,"previous":"WBV2-P1256-001","next":"WBV2-P1257-001"},"WBV2-P1257-001":{"line":294,"offset":101032,"length":362,"previous":"WBV2-P1257-000","next":"WBV2-P1258-000"},"WBV2-P1258-000":{"line":295,"offset":101394,"length":303,"previous":"WBV2-P1257-001","next":"WBV2-P1258-001"},"WBV2-P1258-001":{"line":296,"offset":101697,"length":362,"previous":"WBV2-P1258-000","next":"WBV2-P1259-000"},"WBV2-P1259-000":{"line":297,"offset":102059,"length":303,"previous":"WBV2-P1258-001","next":"WBV2-P1259-001"},"WBV2-P1259-001":{"line":298,"offset":102362,"length":362,"previous":"WBV2-P1259-000","next":"WBV2-P1260-000"},"WBV2-P1260-000":{"line":299,"offset":102724,"length":303,"previous":"WBV2-P1259-001","next":"WBV2-P1260-001"},"WBV2-P1260-001":{"line":300,"offset":103027,"length":362,"previous":"WBV2-P1260-000","next":"WBV2-P1261-000"},"WBV2-P1261-000":{"line":301,"offset":103389,"length":303,"previous":"WBV2-P1260-001","next":"WBV2-P1261-001"},"WBV2-P1261-001":{"line":302,"offset":103692,"length":362,"previous":"WBV2-P1261-000","next":"WBV2-P1262-000"},"WBV2-P1262-000":{"line":303,"offset":104054,"length":303,"previous":"WBV2-P1261-001","next":"WBV2-P1262-001"},"WBV2-P1262-001":{"line":304,"offset":104357,"length":362,"previous":"WBV2-P1262-000","next":"WBV2-P1263-000"},"WBV2-P1263-000":{"line":305,"offset":104719,"length":303,"previous":"WBV2-P1262-001","next":"WBV2-P1263-001"},"WBV2-P1263-001":{"line":306,"offset":105022,"length":362,"previous":"WBV2-P1263-000","next":"WBV2-P1264-000"},"WBV2-P1264-000":{"line":307,"offset":105384,"length":303,"previous":"WBV2-P1263-001","next":"WBV2-P1264-001"},"WBV2-P1264-001":{"line":308,"offset":105687,"length":362,"previous":"WBV2-P1264-000","next":"WBV2-P1265-000"},"WBV2-P1265-000":{"line":309,"offset":106049,"length":303,"previous":"WBV2-P1264-001","next":"WBV2-P1265-001"},"WBV2-P1265-001":{"line":310,"offset":106352,"length":364,"previous":"WBV2-P1265-000","next":"WBV2-P1266-000"},"WBV2-P1266-000":{"line":311,"offset":106716,"length":303,"previous":"WBV2-P1265-001","next":"WBV2-P1266-001"},"WBV2-P1266-001":{"line":312,"offset":107019,"length":364,"previous":"WBV2-P1266-000","next":"WBV2-P1267-000"},"WBV2-P1267-000":{"line":313,"offset":107383,"length":303,"previous":"WBV2-P1266-001","next":"WBV2-P1267-001"},"WBV2-P1267-001":{"line":314,"offset":107686,"length":366,"previous":"WBV2-P1267-000","next":"WBV2-P1268-000"},"WBV2-P1268-000":{"line":315,"offset":108052,"length":303,"previous":"WBV2-P1267-001","next":"WBV2-P1268-001"},"WBV2-P1268-001":{"line":316,"offset":108355,"length":364,"previous":"WBV2-P1268-000","next":"WBV2-P1269-000"},"WBV2-P1269-000":{"line":317,"offset":108719,"length":303,"previous":"WBV2-P1268-001","next":"WBV2-P1269-001"},"WBV2-P1269-001":{"line":318,"offset":109022,"length":361,"previous":"WBV2-P1269-000","next":"WBV2-P1270-000"},"WBV2-P1270-000":{"line":319,"offset":109383,"length":303,"previous":"WBV2-P1269-001","next":"WBV2-P1270-001"},"WBV2-P1270-001":{"line":320,"offset":109686,"length":365,"previous":"WBV2-P1270-000","next":"WBV2-P1271-000"},"WBV2-P1271-000":{"line":321,"offset":110051,"length":303,"previous":"WBV2-P1270-001","next":"WBV2-P1271-001"},"WBV2-P1271-001":{"line":322,"offset":110354,"length":372,"previous":"WBV2-P1271-000","next":"WBV2-P1272-000"},"WBV2-P1272-000":{"line":323,"offset":110726,"length":303,"previous":"WBV2-P1271-001","next":"WBV2-P1272-001"},"WBV2-P1272-001":{"line":324,"offset":111029,"length":361,"previous":"WBV2-P1272-000","next":"WBV2-P1273-000"},"WBV2-P1273-000":{"line":325,"offset":111390,"length":303,"previous":"WBV2-P1272-001","next":"WBV2-P1273-001"},"WBV2-P1273-001":{"line":326,"offset":111693,"length":365,"previous":"WBV2-P1273-000","next":"WBV2-P1274-000"},"WBV2-P1274-000":{"line":327,"offset":112058,"length":303,"previous":"WBV2-P1273-001","next":"WBV2-P1274-001"},"WBV2-P1274-001":{"line":328,"offset":112361,"length":370,"previous":"WBV2-P1274-000","next":"WBV2-P1275-000"},"WBV2-P1275-000":{"line":329,"offset":112731,"length":303,"previous":"WBV2-P1274-001","next":"WBV2-P1275-001"},"WBV2-P1275-001":{"line":330,"offset":113034,"length":371,"previous":"WBV2-P1275-000","next":"WBV2-P1276-000"},"WBV2-P1276-000":{"line":331,"offset":113405,"length":303,"previous":"WBV2-P1275-001","next":"WBV2-P1276-001"},"WBV2-P1276-001":{"line":332,"offset":113708,"length":370,"previous":"WBV2-P1276-000","next":"WBV2-P1277-000"},"WBV2-P1277-000":{"line":333,"offset":114078,"length":303,"previous":"WBV2-P1276-001","next":"WBV2-P1277-001"},"WBV2-P1277-001":{"line":334,"offset":114381,"length":356,"previous":"WBV2-P1277-000","next":"WBV2-P1278-000"},"WBV2-P1278-000":{"line":335,"offset":114737,"length":303,"previous":"WBV2-P1277-001","next":"WBV2-P1278-001"},"WBV2-P1278-001":{"line":336,"offset":115040,"length":356,"previous":"WBV2-P1278-000","next":"WBV2-P1279-000"},"WBV2-P1279-000":{"line":337,"offset":115396,"length":303,"previous":"WBV2-P1278-001","next":"WBV2-P1279-001"},"WBV2-P1279-001":{"line":338,"offset":115699,"length":358,"previous":"WBV2-P1279-000","next":"WBV2-P1280-000"},"WBV2-P1280-000":{"line":339,"offset":116057,"length":303,"previous":"WBV2-P1279-001","next":"WBV2-P1280-001"},"WBV2-P1280-001":{"line":340,"offset":116360,"length":358,"previous":"WBV2-P1280-000","next":"WBV2-P1281-000"},"WBV2-P1281-000":{"line":341,"offset":116718,"length":303,"previous":"WBV2-P1280-001","next":"WBV2-P1281-001"},"WBV2-P1281-001":{"line":342,"offset":117021,"length":359,"previous":"WBV2-P1281-000","next":"WBV2-P1282-000"},"WBV2-P1282-000":{"line":343,"offset":117380,"length":303,"previous":"WBV2-P1281-001","next":"WBV2-P1282-001"},"WBV2-P1282-001":{"line":344,"offset":117683,"length":356,"previous":"WBV2-P1282-000","next":"WBV2-P1283-000"},"WBV2-P1283-000":{"line":345,"offset":118039,"length":303,"previous":"WBV2-P1282-001","next":"WBV2-P1283-001"},"WBV2-P1283-001":{"line":346,"offset":118342,"length":369,"previous":"WBV2-P1283-000","next":"WBV2-P1284-000"},"WBV2-P1284-000":{"line":347,"offset":118711,"length":303,"previous":"WBV2-P1283-001","next":"WBV2-P1284-001"},"WBV2-P1284-001":{"line":348,"offset":119014,"length":369,"previous":"WBV2-P1284-000","next":"WBV2-P1285-000"},"WBV2-P1285-000":{"line":349,"offset":119383,"length":303,"previous":"WBV2-P1284-001","next":"WBV2-P1285-001"},"WBV2-P1285-001":{"line":350,"offset":119686,"length":366,"previous":"WBV2-P1285-000","next":"WBV2-P1286-000"},"WBV2-P1286-000":{"line":351,"offset":120052,"length":303,"previous":"WBV2-P1285-001","next":"WBV2-P1286-001"},"WBV2-P1286-001":{"line":352,"offset":120355,"length":359,"previous":"WBV2-P1286-000","next":"WBV2-P1287-000"},"WBV2-P1287-000":{"line":353,"offset":120714,"length":303,"previous":"WBV2-P1286-001","next":"WBV2-P1287-001"},"WBV2-P1287-001":{"line":354,"offset":121017,"length":372,"previous":"WBV2-P1287-000","next":"WBV2-P1288-000"},"WBV2-P1288-000":{"line":355,"offset":121389,"length":303,"previous":"WBV2-P1287-001","next":"WBV2-P1288-001"},"WBV2-P1288-001":{"line":356,"offset":121692,"length":359,"previous":"WBV2-P1288-000","next":"WBV2-P1289-000"},"WBV2-P1289-000":{"line":357,"offset":122051,"length":303,"previous":"WBV2-P1288-001","next":"WBV2-P1289-001"},"WBV2-P1289-001":{"line":358,"offset":122354,"length":375,"previous":"WBV2-P1289-000","next":"WBV2-P1290-000"},"WBV2-P1290-000":{"line":359,"offset":122729,"length":303,"previous":"WBV2-P1289-001","next":"WBV2-P1290-001"},"WBV2-P1290-001":{"line":360,"offset":123032,"length":375,"previous":"WBV2-P1290-000","next":"WBV2-P1291-000"},"WBV2-P1291-000":{"line":361,"offset":123407,"length":303,"previous":"WBV2-P1290-001","next":"WBV2-P1291-001"},"WBV2-P1291-001":{"line":362,"offset":123710,"length":355,"previous":"WBV2-P1291-000","next":"WBV2-P1292-000"},"WBV2-P1292-000":{"line":363,"offset":124065,"length":303,"previous":"WBV2-P1291-001","next":"WBV2-P1292-001"},"WBV2-P1292-001":{"line":364,"offset":124368,"length":361,"previous":"WBV2-P1292-000","next":"WBV2-P1293-000"},"WBV2-P1293-000":{"line":365,"offset":124729,"length":303,"previous":"WBV2-P1292-001","next":"WBV2-P1293-001"},"WBV2-P1293-001":{"line":366,"offset":125032,"length":361,"previous":"WBV2-P1293-000","next":"WBV2-P1294-000"},"WBV2-P1294-000":{"line":367,"offset":125393,"length":303,"previous":"WBV2-P1293-001","next":"WBV2-P1294-001"},"WBV2-P1294-001":{"line":368,"offset":125696,"length":361,"previous":"WBV2-P1294-000","next":"WBV2-P1295-000"},"WBV2-P1295-000":{"line":369,"offset":126057,"length":303,"previous":"WBV2-P1294-001","next":"WBV2-P1295-001"},"WBV2-P1295-001":{"line":370,"offset":126360,"length":361,"previous":"WBV2-P1295-000","next":"WBV2-P1296-000"},"WBV2-P1296-000":{"line":371,"offset":126721,"length":303,"previous":"WBV2-P1295-001","next":"WBV2-P1296-001"},"WBV2-P1296-001":{"line":372,"offset":127024,"length":361,"previous":"WBV2-P1296-000","next":"WBV2-P1297-000"},"WBV2-P1297-000":{"line":373,"offset":127385,"length":303,"previous":"WBV2-P1296-001","next":"WBV2-P1297-001"},"WBV2-P1297-001":{"line":374,"offset":127688,"length":361,"previous":"WBV2-P1297-000","next":"WBV2-P1298-000"},"WBV2-P1298-000":{"line":375,"offset":128049,"length":303,"previous":"WBV2-P1297-001","next":"WBV2-P1298-001"},"WBV2-P1298-001":{"line":376,"offset":128352,"length":361,"previous":"WBV2-P1298-000","next":"WBV2-P1299-000"},"WBV2-P1299-000":{"line":377,"offset":128713,"length":303,"previous":"WBV2-P1298-001","next":"WBV2-P1299-001"},"WBV2-P1299-001":{"line":378,"offset":129016,"length":361,"previous":"WBV2-P1299-000","next":"WBV2-P1300-000"},"WBV2-P1300-000":{"line":379,"offset":129377,"length":303,"previous":"WBV2-P1299-001","next":"WBV2-P1300-001"},"WBV2-P1300-001":{"line":380,"offset":129680,"length":361,"previous":"WBV2-P1300-000","next":"WBV2-P1301-000"},"WBV2-P1301-000":{"line":381,"offset":130041,"length":303,"previous":"WBV2-P1300-001","next":"WBV2-P1301-001"},"WBV2-P1301-001":{"line":382,"offset":130344,"length":361,"previous":"WBV2-P1301-000","next":"WBV2-P1302-000"},"WBV2-P1302-000":{"line":383,"offset":130705,"length":303,"previous":"WBV2-P1301-001","next":"WBV2-P1302-001"},"WBV2-P1302-001":{"line":384,"offset":131008,"length":361,"previous":"WBV2-P1302-000","next":"WBV2-P1303-000"},"WBV2-P1303-000":{"line":385,"offset":131369,"length":303,"previous":"WBV2-P1302-001","next":"WBV2-P1303-001"},"WBV2-P1303-001":{"line":386,"offset":131672,"length":361,"previous":"WBV2-P1303-000","next":"WBV2-P1304-000"},"WBV2-P1304-000":{"line":387,"offset":132033,"length":303,"previous":"WBV2-P1303-001","next":"WBV2-P1304-001"},"WBV2-P1304-001":{"line":388,"offset":132336,"length":361,"previous":"WBV2-P1304-000","next":"WBV2-P1305-000"},"WBV2-P1305-000":{"line":389,"offset":132697,"length":303,"previous":"WBV2-P1304-001","next":"WBV2-P1305-001"},"WBV2-P1305-001":{"line":390,"offset":133000,"length":361,"previous":"WBV2-P1305-000","next":"WBV2-P1306-000"},"WBV2-P1306-000":{"line":391,"offset":133361,"length":303,"previous":"WBV2-P1305-001","next":"WBV2-P1306-001"},"WBV2-P1306-001":{"line":392,"offset":133664,"length":361,"previous":"WBV2-P1306-000","next":"WBV2-P1307-000"},"WBV2-P1307-000":{"line":393,"offset":134025,"length":303,"previous":"WBV2-P1306-001","next":"WBV2-P1307-001"},"WBV2-P1307-001":{"line":394,"offset":134328,"length":361,"previous":"WBV2-P1307-000","next":"WBV2-P1308-000"},"WBV2-P1308-000":{"line":395,"offset":134689,"length":303,"previous":"WBV2-P1307-001","next":"WBV2-P1308-001"},"WBV2-P1308-001":{"line":396,"offset":134992,"length":361,"previous":"WBV2-P1308-000","next":"WBV2-P1309-000"},"WBV2-P1309-000":{"line":397,"offset":135353,"length":303,"previous":"WBV2-P1308-001","next":"WBV2-P1309-001"},"WBV2-P1309-001":{"line":398,"offset":135656,"length":361,"previous":"WBV2-P1309-000","next":"WBV2-P1310-000"},"WBV2-P1310-000":{"line":399,"offset":136017,"length":303,"previous":"WBV2-P1309-001","next":"WBV2-P1310-001"},"WBV2-P1310-001":{"line":400,"offset":136320,"length":361,"previous":"WBV2-P1310-000","next":"WBV2-P1311-000"},"WBV2-P1311-000":{"line":401,"offset":136681,"length":303,"previous":"WBV2-P1310-001","next":"WBV2-P1311-001"},"WBV2-P1311-001":{"line":402,"offset":136984,"length":361,"previous":"WBV2-P1311-000","next":"WBV2-P1312-000"},"WBV2-P1312-000":{"line":403,"offset":137345,"length":303,"previous":"WBV2-P1311-001","next":"WBV2-P1312-001"},"WBV2-P1312-001":{"line":404,"offset":137648,"length":358,"previous":"WBV2-P1312-000","next":"WBV2-P1313-000"},"WBV2-P1313-000":{"line":405,"offset":138006,"length":303,"previous":"WBV2-P1312-001","next":"WBV2-P1313-001"},"WBV2-P1313-001":{"line":406,"offset":138309,"length":358,"previous":"WBV2-P1313-000","next":"WBV2-P1314-000"},"WBV2-P1314-000":{"line":407,"offset":138667,"length":303,"previous":"WBV2-P1313-001","next":"WBV2-P1314-001"},"WBV2-P1314-001":{"line":408,"offset":138970,"length":358,"previous":"WBV2-P1314-000","next":"WBV2-P1315-000"},"WBV2-P1315-000":{"line":409,"offset":139328,"length":303,"previous":"WBV2-P1314-001","next":"WBV2-P1315-001"},"WBV2-P1315-001":{"line":410,"offset":139631,"length":358,"previous":"WBV2-P1315-000","next":"WBV2-P1316-000"},"WBV2-P1316-000":{"line":411,"offset":139989,"length":303,"previous":"WBV2-P1315-001","next":"WBV2-P1316-001"},"WBV2-P1316-001":{"line":412,"offset":140292,"length":358,"previous":"WBV2-P1316-000","next":"WBV2-P1317-000"},"WBV2-P1317-000":{"line":413,"offset":140650,"length":303,"previous":"WBV2-P1316-001","next":"WBV2-P1317-001"},"WBV2-P1317-001":{"line":414,"offset":140953,"length":358,"previous":"WBV2-P1317-000","next":"WBV2-P1318-000"},"WBV2-P1318-000":{"line":415,"offset":141311,"length":303,"previous":"WBV2-P1317-001","next":"WBV2-P1318-001"},"WBV2-P1318-001":{"line":416,"offset":141614,"length":358,"previous":"WBV2-P1318-000","next":"WBV2-P1319-000"},"WBV2-P1319-000":{"line":417,"offset":141972,"length":303,"previous":"WBV2-P1318-001","next":"WBV2-P1319-001"},"WBV2-P1319-001":{"line":418,"offset":142275,"length":358,"previous":"WBV2-P1319-000","next":"WBV2-P1320-000"},"WBV2-P1320-000":{"line":419,"offset":142633,"length":303,"previous":"WBV2-P1319-001","next":"WBV2-P1320-001"},"WBV2-P1320-001":{"line":420,"offset":142936,"length":358,"previous":"WBV2-P1320-000","next":"WBV2-P1321-000"},"WBV2-P1321-000":{"line":421,"offset":143294,"length":303,"previous":"WBV2-P1320-001","next":"WBV2-P1321-001"},"WBV2-P1321-001":{"line":422,"offset":143597,"length":358,"previous":"WBV2-P1321-000","next":"WBV2-P1322-000"},"WBV2-P1322-000":{"line":423,"offset":143955,"length":303,"previous":"WBV2-P1321-001","next":"WBV2-P1322-001"},"WBV2-P1322-001":{"line":424,"offset":144258,"length":358,"previous":"WBV2-P1322-000","next":"WBV2-P1323-000"},"WBV2-P1323-000":{"line":425,"offset":144616,"length":303,"previous":"WBV2-P1322-001","next":"WBV2-P1323-001"},"WBV2-P1323-001":{"line":426,"offset":144919,"length":358,"previous":"WBV2-P1323-000","next":"WBV2-P1324-000"},"WBV2-P1324-000":{"line":427,"offset":145277,"length":303,"previous":"WBV2-P1323-001","next":"WBV2-P1324-001"},"WBV2-P1324-001":{"line":428,"offset":145580,"length":358,"previous":"WBV2-P1324-000","next":"WBV2-P1325-000"},"WBV2-P1325-000":{"line":429,"offset":145938,"length":303,"previous":"WBV2-P1324-001","next":"WBV2-P1325-001"},"WBV2-P1325-001":{"line":430,"offset":146241,"length":358,"previous":"WBV2-P1325-000","next":"WBV2-P1326-000"},"WBV2-P1326-000":{"line":431,"offset":146599,"length":303,"previous":"WBV2-P1325-001","next":"WBV2-P1326-001"},"WBV2-P1326-001":{"line":432,"offset":146902,"length":358,"previous":"WBV2-P1326-000","next":"WBV2-P1327-000"},"WBV2-P1327-000":{"line":433,"offset":147260,"length":303,"previous":"WBV2-P1326-001","next":"WBV2-P1327-001"},"WBV2-P1327-001":{"line":434,"offset":147563,"length":358,"previous":"WBV2-P1327-000","next":"WBV2-P1328-000"},"WBV2-P1328-000":{"line":435,"offset":147921,"length":303,"previous":"WBV2-P1327-001","next":"WBV2-P1328-001"},"WBV2-P1328-001":{"line":436,"offset":148224,"length":358,"previous":"WBV2-P1328-000","next":"WBV2-P1329-000"},"WBV2-P1329-000":{"line":437,"offset":148582,"length":303,"previous":"WBV2-P1328-001","next":"WBV2-P1329-001"},"WBV2-P1329-001":{"line":438,"offset":148885,"length":358,"previous":"WBV2-P1329-000","next":"WBV2-P1330-000"},"WBV2-P1330-000":{"line":439,"offset":149243,"length":303,"previous":"WBV2-P1329-001","next":"WBV2-P1330-001"},"WBV2-P1330-001":{"line":440,"offset":149546,"length":358,"previous":"WBV2-P1330-000","next":"WBV2-P1331-000"},"WBV2-P1331-000":{"line":441,"offset":149904,"length":303,"previous":"WBV2-P1330-001","next":"WBV2-P1331-001"},"WBV2-P1331-001":{"line":442,"offset":150207,"length":358,"previous":"WBV2-P1331-000","next":"WBV2-P1332-000"},"WBV2-P1332-000":{"line":443,"offset":150565,"length":303,"previous":"WBV2-P1331-001","next":"WBV2-P1332-001"},"WBV2-P1332-001":{"line":444,"offset":150868,"length":358,"previous":"WBV2-P1332-000","next":"WBV2-P1333-000"},"WBV2-P1333-000":{"line":445,"offset":151226,"length":303,"previous":"WBV2-P1332-001","next":"WBV2-P1333-001"},"WBV2-P1333-001":{"line":446,"offset":151529,"length":358,"previous":"WBV2-P1333-000","next":"WBV2-P1334-000"},"WBV2-P1334-000":{"line":447,"offset":151887,"length":303,"previous":"WBV2-P1333-001","next":"WBV2-P1334-001"},"WBV2-P1334-001":{"line":448,"offset":152190,"length":358,"previous":"WBV2-P1334-000","next":"WBV2-P1335-000"},"WBV2-P1335-000":{"line":449,"offset":152548,"length":303,"previous":"WBV2-P1334-001","next":"WBV2-P1335-001"},"WBV2-P1335-001":{"line":450,"offset":152851,"length":358,"previous":"WBV2-P1335-000","next":"WBV2-P1336-000"},"WBV2-P1336-000":{"line":451,"offset":153209,"length":303,"previous":"WBV2-P1335-001","next":"WBV2-P1336-001"},"WBV2-P1336-001":{"line":452,"offset":153512,"length":358,"previous":"WBV2-P1336-000","next":"WBV2-P1337-000"},"WBV2-P1337-000":{"line":453,"offset":153870,"length":303,"previous":"WBV2-P1336-001","next":"WBV2-P1337-001"},"WBV2-P1337-001":{"line":454,"offset":154173,"length":358,"previous":"WBV2-P1337-000","next":"WBV2-P1338-000"},"WBV2-P1338-000":{"line":455,"offset":154531,"length":303,"previous":"WBV2-P1337-001","next":"WBV2-P1338-001"},"WBV2-P1338-001":{"line":456,"offset":154834,"length":358,"previous":"WBV2-P1338-000","next":"WBV2-P1339-000"},"WBV2-P1339-000":{"line":457,"offset":155192,"length":303,"previous":"WBV2-P1338-001","next":"WBV2-P1339-001"},"WBV2-P1339-001":{"line":458,"offset":155495,"length":358,"previous":"WBV2-P1339-000","next":"WBV2-P1340-000"},"WBV2-P1340-000":{"line":459,"offset":155853,"length":303,"previous":"WBV2-P1339-001","next":"WBV2-P1340-001"},"WBV2-P1340-001":{"line":460,"offset":156156,"length":358,"previous":"WBV2-P1340-000","next":"WBV2-P1341-000"},"WBV2-P1341-000":{"line":461,"offset":156514,"length":303,"previous":"WBV2-P1340-001","next":"WBV2-P1341-001"},"WBV2-P1341-001":{"line":462,"offset":156817,"length":358,"previous":"WBV2-P1341-000","next":"WBV2-P1342-000"},"WBV2-P1342-000":{"line":463,"offset":157175,"length":303,"previous":"WBV2-P1341-001","next":"WBV2-P1342-001"},"WBV2-P1342-001":{"line":464,"offset":157478,"length":358,"previous":"WBV2-P1342-000","next":"WBV2-P1343-000"},"WBV2-P1343-000":{"line":465,"offset":157836,"length":303,"previous":"WBV2-P1342-001","next":"WBV2-P1343-001"},"WBV2-P1343-001":{"line":466,"offset":158139,"length":358,"previous":"WBV2-P1343-000","next":"WBV2-P1344-000"},"WBV2-P1344-000":{"line":467,"offset":158497,"length":303,"previous":"WBV2-P1343-001","next":"WBV2-P1344-001"},"WBV2-P1344-001":{"line":468,"offset":158800,"length":358,"previous":"WBV2-P1344-000","next":"WBV2-P1345-000"},"WBV2-P1345-000":{"line":469,"offset":159158,"length":303,"previous":"WBV2-P1344-001","next":"WBV2-P1345-001"},"WBV2-P1345-001":{"line":470,"offset":159461,"length":358,"previous":"WBV2-P1345-000","next":"WBV2-P1346-000"},"WBV2-P1346-000":{"line":471,"offset":159819,"length":303,"previous":"WBV2-P1345-001","next":"WBV2-P1346-001"},"WBV2-P1346-001":{"line":472,"offset":160122,"length":358,"previous":"WBV2-P1346-000","next":"WBV2-P1347-000"},"WBV2-P1347-000":{"line":473,"offset":160480,"length":303,"previous":"WBV2-P1346-001","next":"WBV2-P1347-001"},"WBV2-P1347-001":{"line":474,"offset":160783,"length":358,"previous":"WBV2-P1347-000","next":"WBV2-P1348-000"},"WBV2-P1348-000":{"line":475,"offset":161141,"length":303,"previous":"WBV2-P1347-001","next":"WBV2-P1348-001"},"WBV2-P1348-001":{"line":476,"offset":161444,"length":358,"previous":"WBV2-P1348-000","next":"WBV2-P1349-000"},"WBV2-P1349-000":{"line":477,"offset":161802,"length":303,"previous":"WBV2-P1348-001","next":"WBV2-P1349-001"},"WBV2-P1349-001":{"line":478,"offset":162105,"length":358,"previous":"WBV2-P1349-000","next":"WBV2-P1350-000"},"WBV2-P1350-000":{"line":479,"offset":162463,"length":303,"previous":"WBV2-P1349-001","next":"WBV2-P1350-001"},"WBV2-P1350-001":{"line":480,"offset":162766,"length":358,"previous":"WBV2-P1350-000","next":"WBV2-P1351-000"},"WBV2-P1351-000":{"line":481,"offset":163124,"length":303,"previous":"WBV2-P1350-001","next":"WBV2-P1351-001"},"WBV2-P1351-001":{"line":482,"offset":163427,"length":358,"previous":"WBV2-P1351-000","next":"WBV2-P1352-000"},"WBV2-P1352-000":{"line":483,"offset":163785,"length":303,"previous":"WBV2-P1351-001","next":"WBV2-P1352-001"},"WBV2-P1352-001":{"line":484,"offset":164088,"length":358,"previous":"WBV2-P1352-000","next":"WBV2-P1353-000"},"WBV2-P1353-000":{"line":485,"offset":164446,"length":303,"previous":"WBV2-P1352-001","next":"WBV2-P1353-001"},"WBV2-P1353-001":{"line":486,"offset":164749,"length":358,"previous":"WBV2-P1353-000","next":"WBV2-P1354-000"},"WBV2-P1354-000":{"line":487,"offset":165107,"length":303,"previous":"WBV2-P1353-001","next":"WBV2-P1354-001"},"WBV2-P1354-001":{"line":488,"offset":165410,"length":358,"previous":"WBV2-P1354-000","next":"WBV2-P1355-000"},"WBV2-P1355-000":{"line":489,"offset":165768,"length":303,"previous":"WBV2-P1354-001","next":"WBV2-P1355-001"},"WBV2-P1355-001":{"line":490,"offset":166071,"length":358,"previous":"WBV2-P1355-000","next":"WBV2-P1356-000"},"WBV2-P1356-000":{"line":491,"offset":166429,"length":303,"previous":"WBV2-P1355-001","next":"WBV2-P1356-001"},"WBV2-P1356-001":{"line":492,"offset":166732,"length":358,"previous":"WBV2-P1356-000","next":"WBV2-P1357-000"},"WBV2-P1357-000":{"line":493,"offset":167090,"length":303,"previous":"WBV2-P1356-001","next":"WBV2-P1357-001"},"WBV2-P1357-001":{"line":494,"offset":167393,"length":358,"previous":"WBV2-P1357-000","next":"WBV2-P1358-000"},"WBV2-P1358-000":{"line":495,"offset":167751,"length":303,"previous":"WBV2-P1357-001","next":"WBV2-P1358-001"},"WBV2-P1358-001":{"line":496,"offset":168054,"length":358,"previous":"WBV2-P1358-000","next":"WBV2-P1359-000"},"WBV2-P1359-000":{"line":497,"offset":168412,"length":303,"previous":"WBV2-P1358-001","next":"WBV2-P1359-001"},"WBV2-P1359-001":{"line":498,"offset":168715,"length":358,"previous":"WBV2-P1359-000","next":"WBV2-P1360-000"},"WBV2-P1360-000":{"line":499,"offset":169073,"length":303,"previous":"WBV2-P1359-001","next":"WBV2-P1360-001"},"WBV2-P1360-001":{"line":500,"offset":169376,"length":358,"previous":"WBV2-P1360-000","next":"WBV2-P1361-000"},"WBV2-P1361-000":{"line":501,"offset":169734,"length":303,"previous":"WBV2-P1360-001","next":"WBV2-P1361-001"},"WBV2-P1361-001":{"line":502,"offset":170037,"length":358,"previous":"WBV2-P1361-000","next":"WBV2-P1362-000"},"WBV2-P1362-000":{"line":503,"offset":170395,"length":303,"previous":"WBV2-P1361-001","next":"WBV2-P1362-001"},"WBV2-P1362-001":{"line":504,"offset":170698,"length":358,"previous":"WBV2-P1362-000","next":"WBV2-P1363-000"},"WBV2-P1363-000":{"line":505,"offset":171056,"length":303,"previous":"WBV2-P1362-001","next":"WBV2-P1363-001"},"WBV2-P1363-001":{"line":506,"offset":171359,"length":358,"previous":"WBV2-P1363-000","next":"WBV2-P1364-000"},"WBV2-P1364-000":{"line":507,"offset":171717,"length":303,"previous":"WBV2-P1363-001","next":"WBV2-P1364-001"},"WBV2-P1364-001":{"line":508,"offset":172020,"length":358,"previous":"WBV2-P1364-000","next":"WBV2-P1365-000"},"WBV2-P1365-000":{"line":509,"offset":172378,"length":303,"previous":"WBV2-P1364-001","next":"WBV2-P1365-001"},"WBV2-P1365-001":{"line":510,"offset":172681,"length":358,"previous":"WBV2-P1365-000","next":"WBV2-P1366-000"},"WBV2-P1366-000":{"line":511,"offset":173039,"length":303,"previous":"WBV2-P1365-001","next":"WBV2-P1366-001"},"WBV2-P1366-001":{"line":512,"offset":173342,"length":358,"previous":"WBV2-P1366-000","next":"WBV2-P1367-000"},"WBV2-P1367-000":{"line":513,"offset":173700,"length":303,"previous":"WBV2-P1366-001","next":"WBV2-P1367-001"},"WBV2-P1367-001":{"line":514,"offset":174003,"length":358,"previous":"WBV2-P1367-000","next":"WBV2-P1368-000"},"WBV2-P1368-000":{"line":515,"offset":174361,"length":303,"previous":"WBV2-P1367-001","next":"WBV2-P1368-001"},"WBV2-P1368-001":{"line":516,"offset":174664,"length":358,"previous":"WBV2-P1368-000","next":"WBV2-P1369-000"},"WBV2-P1369-000":{"line":517,"offset":175022,"length":303,"previous":"WBV2-P1368-001","next":"WBV2-P1369-001"},"WBV2-P1369-001":{"line":518,"offset":175325,"length":358,"previous":"WBV2-P1369-000","next":"WBV2-P1370-000"},"WBV2-P1370-000":{"line":519,"offset":175683,"length":303,"previous":"WBV2-P1369-001","next":"WBV2-P1370-001"},"WBV2-P1370-001":{"line":520,"offset":175986,"length":358,"previous":"WBV2-P1370-000","next":"WBV2-P1371-000"},"WBV2-P1371-000":{"line":521,"offset":176344,"length":303,"previous":"WBV2-P1370-001","next":"WBV2-P1371-001"},"WBV2-P1371-001":{"line":522,"offset":176647,"length":358,"previous":"WBV2-P1371-000","next":"WBV2-P1372-000"},"WBV2-P1372-000":{"line":523,"offset":177005,"length":303,"previous":"WBV2-P1371-001","next":"WBV2-P1372-001"},"WBV2-P1372-001":{"line":524,"offset":177308,"length":358,"previous":"WBV2-P1372-000","next":"WBV2-P1373-000"},"WBV2-P1373-000":{"line":525,"offset":177666,"length":303,"previous":"WBV2-P1372-001","next":"WBV2-P1373-001"},"WBV2-P1373-001":{"line":526,"offset":177969,"length":358,"previous":"WBV2-P1373-000","next":"WBV2-P1374-000"},"WBV2-P1374-000":{"line":527,"offset":178327,"length":303,"previous":"WBV2-P1373-001","next":"WBV2-P1374-001"},"WBV2-P1374-001":{"line":528,"offset":178630,"length":358,"previous":"WBV2-P1374-000","next":"WBV2-P1375-000"},"WBV2-P1375-000":{"line":529,"offset":178988,"length":303,"previous":"WBV2-P1374-001","next":"WBV2-P1375-001"},"WBV2-P1375-001":{"line":530,"offset":179291,"length":362,"previous":"WBV2-P1375-000","next":"WBV2-P1376-000"},"WBV2-P1376-000":{"line":531,"offset":179653,"length":303,"previous":"WBV2-P1375-001","next":"WBV2-P1376-001"},"WBV2-P1376-001":{"line":532,"offset":179956,"length":362,"previous":"WBV2-P1376-000","next":"WBV2-P1377-000"},"WBV2-P1377-000":{"line":533,"offset":180318,"length":303,"previous":"WBV2-P1376-001","next":"WBV2-P1377-001"},"WBV2-P1377-001":{"line":534,"offset":180621,"length":363,"previous":"WBV2-P1377-000","next":"WBV2-P1378-000"},"WBV2-P1378-000":{"line":535,"offset":180984,"length":303,"previous":"WBV2-P1377-001","next":"WBV2-P1378-001"},"WBV2-P1378-001":{"line":536,"offset":181287,"length":367,"previous":"WBV2-P1378-000","next":"WBV2-P1379-000"},"WBV2-P1379-000":{"line":537,"offset":181654,"length":303,"previous":"WBV2-P1378-001","next":"WBV2-P1379-001"},"WBV2-P1379-001":{"line":538,"offset":181957,"length":367,"previous":"WBV2-P1379-000","next":"WBV2-P1380-000"},"WBV2-P1380-000":{"line":539,"offset":182324,"length":303,"previous":"WBV2-P1379-001","next":"WBV2-P1380-001"},"WBV2-P1380-001":{"line":540,"offset":182627,"length":367,"previous":"WBV2-P1380-000","next":"WBV2-P1381-000"},"WBV2-P1381-000":{"line":541,"offset":182994,"length":303,"previous":"WBV2-P1380-001","next":"WBV2-P1381-001"},"WBV2-P1381-001":{"line":542,"offset":183297,"length":358,"previous":"WBV2-P1381-000","next":"WBV2-P1382-000"},"WBV2-P1382-000":{"line":543,"offset":183655,"length":303,"previous":"WBV2-P1381-001","next":"WBV2-P1382-001"},"WBV2-P1382-001":{"line":544,"offset":183958,"length":358,"previous":"WBV2-P1382-000","next":"WBV2-P1383-000"},"WBV2-P1383-000":{"line":545,"offset":184316,"length":303,"previous":"WBV2-P1382-001","next":"WBV2-P1383-001"},"WBV2-P1383-001":{"line":546,"offset":184619,"length":358,"previous":"WBV2-P1383-000","next":"WBV2-P1384-000"},"WBV2-P1384-000":{"line":547,"offset":184977,"length":303,"previous":"WBV2-P1383-001","next":"WBV2-P1384-001"},"WBV2-P1384-001":{"line":548,"offset":185280,"length":358,"previous":"WBV2-P1384-000","next":"WBV2-P1385-000"},"WBV2-P1385-000":{"line":549,"offset":185638,"length":303,"previous":"WBV2-P1384-001","next":"WBV2-P1385-001"},"WBV2-P1385-001":{"line":550,"offset":185941,"length":362,"previous":"WBV2-P1385-000","next":"WBV2-P1386-000"},"WBV2-P1386-000":{"line":551,"offset":186303,"length":303,"previous":"WBV2-P1385-001","next":"WBV2-P1386-001"},"WBV2-P1386-001":{"line":552,"offset":186606,"length":355,"previous":"WBV2-P1386-000","next":"WBV2-P1387-000"},"WBV2-P1387-000":{"line":553,"offset":186961,"length":303,"previous":"WBV2-P1386-001","next":"WBV2-P1387-001"},"WBV2-P1387-001":{"line":554,"offset":187264,"length":355,"previous":"WBV2-P1387-000","next":"WBV2-P1388-000"},"WBV2-P1388-000":{"line":555,"offset":187619,"length":303,"previous":"WBV2-P1387-001","next":"WBV2-P1388-001"},"WBV2-P1388-001":{"line":556,"offset":187922,"length":355,"previous":"WBV2-P1388-000","next":"WBV2-P1389-000"},"WBV2-P1389-000":{"line":557,"offset":188277,"length":303,"previous":"WBV2-P1388-001","next":"WBV2-P1389-001"},"WBV2-P1389-001":{"line":558,"offset":188580,"length":355,"previous":"WBV2-P1389-000","next":"WBV2-P1390-000"},"WBV2-P1390-000":{"line":559,"offset":188935,"length":303,"previous":"WBV2-P1389-001","next":"WBV2-P1390-001"},"WBV2-P1390-001":{"line":560,"offset":189238,"length":355,"previous":"WBV2-P1390-000","next":"WBV2-P1391-000"},"WBV2-P1391-000":{"line":561,"offset":189593,"length":303,"previous":"WBV2-P1390-001","next":"WBV2-P1391-001"},"WBV2-P1391-001":{"line":562,"offset":189896,"length":355,"previous":"WBV2-P1391-000","next":"WBV2-P1392-000"},"WBV2-P1392-000":{"line":563,"offset":190251,"length":303,"previous":"WBV2-P1391-001","next":"WBV2-P1392-001"},"WBV2-P1392-001":{"line":564,"offset":190554,"length":355,"previous":"WBV2-P1392-000","next":"WBV2-P1393-000"},"WBV2-P1393-000":{"line":565,"offset":190909,"length":303,"previous":"WBV2-P1392-001","next":"WBV2-P1393-001"},"WBV2-P1393-001":{"line":566,"offset":191212,"length":355,"previous":"WBV2-P1393-000","next":"WBV2-P1394-000"},"WBV2-P1394-000":{"line":567,"offset":191567,"length":303,"previous":"WBV2-P1393-001","next":"WBV2-P1394-001"},"WBV2-P1394-001":{"line":568,"offset":191870,"length":355,"previous":"WBV2-P1394-000","next":"WBV2-P1395-000"},"WBV2-P1395-000":{"line":569,"offset":192225,"length":303,"previous":"WBV2-P1394-001","next":"WBV2-P1395-001"},"WBV2-P1395-001":{"line":570,"offset":192528,"length":355,"previous":"WBV2-P1395-000","next":"WBV2-P1396-000"},"WBV2-P1396-000":{"line":571,"offset":192883,"length":303,"previous":"WBV2-P1395-001","next":"WBV2-P1396-001"},"WBV2-P1396-001":{"line":572,"offset":193186,"length":355,"previous":"WBV2-P1396-000","next":"WBV2-P1397-000"},"WBV2-P1397-000":{"line":573,"offset":193541,"length":303,"previous":"WBV2-P1396-001","next":"WBV2-P1397-001"},"WBV2-P1397-001":{"line":574,"offset":193844,"length":355,"previous":"WBV2-P1397-000","next":"WBV2-P1398-000"},"WBV2-P1398-000":{"line":575,"offset":194199,"length":303,"previous":"WBV2-P1397-001","next":"WBV2-P1398-001"},"WBV2-P1398-001":{"line":576,"offset":194502,"length":355,"previous":"WBV2-P1398-000","next":"WBV2-P1399-000"},"WBV2-P1399-000":{"line":577,"offset":194857,"length":303,"previous":"WBV2-P1398-001","next":"WBV2-P1399-001"},"WBV2-P1399-001":{"line":578,"offset":195160,"length":355,"previous":"WBV2-P1399-000","next":"WBV2-P1400-000"},"WBV2-P1400-000":{"line":579,"offset":195515,"length":303,"previous":"WBV2-P1399-001","next":"WBV2-P1400-001"},"WBV2-P1400-001":{"line":580,"offset":195818,"length":355,"previous":"WBV2-P1400-000","next":"WBV2-P1401-000"},"WBV2-P1401-000":{"line":581,"offset":196173,"length":303,"previous":"WBV2-P1400-001","next":"WBV2-P1401-001"},"WBV2-P1401-001":{"line":582,"offset":196476,"length":355,"previous":"WBV2-P1401-000","next":"WBV2-P1402-000"},"WBV2-P1402-000":{"line":583,"offset":196831,"length":303,"previous":"WBV2-P1401-001","next":"WBV2-P1402-001"},"WBV2-P1402-001":{"line":584,"offset":197134,"length":355,"previous":"WBV2-P1402-000","next":"WBV2-P1403-000"},"WBV2-P1403-000":{"line":585,"offset":197489,"length":303,"previous":"WBV2-P1402-001","next":"WBV2-P1403-001"},"WBV2-P1403-001":{"line":586,"offset":197792,"length":355,"previous":"WBV2-P1403-000","next":"WBV2-P1404-000"},"WBV2-P1404-000":{"line":587,"offset":198147,"length":303,"previous":"WBV2-P1403-001","next":"WBV2-P1404-001"},"WBV2-P1404-001":{"line":588,"offset":198450,"length":355,"previous":"WBV2-P1404-000","next":"WBV2-P1405-000"},"WBV2-P1405-000":{"line":589,"offset":198805,"length":303,"previous":"WBV2-P1404-001","next":"WBV2-P1405-001"},"WBV2-P1405-001":{"line":590,"offset":199108,"length":355,"previous":"WBV2-P1405-000","next":"WBV2-P1406-000"},"WBV2-P1406-000":{"line":591,"offset":199463,"length":303,"previous":"WBV2-P1405-001","next":"WBV2-P1406-001"},"WBV2-P1406-001":{"line":592,"offset":199766,"length":356,"previous":"WBV2-P1406-000","next":"WBV2-P1407-000"},"WBV2-P1407-000":{"line":593,"offset":200122,"length":303,"previous":"WBV2-P1406-001","next":"WBV2-P1407-001"},"WBV2-P1407-001":{"line":594,"offset":200425,"length":356,"previous":"WBV2-P1407-000","next":"WBV2-P1408-000"},"WBV2-P1408-000":{"line":595,"offset":200781,"length":303,"previous":"WBV2-P1407-001","next":"WBV2-P1408-001"},"WBV2-P1408-001":{"line":596,"offset":201084,"length":356,"previous":"WBV2-P1408-000","next":"WBV2-P1409-000"},"WBV2-P1409-000":{"line":597,"offset":201440,"length":303,"previous":"WBV2-P1408-001","next":"WBV2-P1409-001"},"WBV2-P1409-001":{"line":598,"offset":201743,"length":356,"previous":"WBV2-P1409-000","next":"WBV2-P1410-000"},"WBV2-P1410-000":{"line":599,"offset":202099,"length":303,"previous":"WBV2-P1409-001","next":"WBV2-P1410-001"},"WBV2-P1410-001":{"line":600,"offset":202402,"length":356,"previous":"WBV2-P1410-000","next":"WBV2-P1411-000"},"WBV2-P1411-000":{"line":601,"offset":202758,"length":303,"previous":"WBV2-P1410-001","next":"WBV2-P1411-001"},"WBV2-P1411-001":{"line":602,"offset":203061,"length":356,"previous":"WBV2-P1411-000","next":"WBV2-P1412-000"},"WBV2-P1412-000":{"line":603,"offset":203417,"length":303,"previous":"WBV2-P1411-001","next":"WBV2-P1412-001"},"WBV2-P1412-001":{"line":604,"offset":203720,"length":356,"previous":"WBV2-P1412-000","next":"WBV2-P1413-000"},"WBV2-P1413-000":{"line":605,"offset":204076,"length":303,"previous":"WBV2-P1412-001","next":"WBV2-P1413-001"},"WBV2-P1413-001":{"line":606,"offset":204379,"length":356,"previous":"WBV2-P1413-000","next":"WBV2-P1414-000"},"WBV2-P1414-000":{"line":607,"offset":204735,"length":303,"previous":"WBV2-P1413-001","next":"WBV2-P1414-001"},"WBV2-P1414-001":{"line":608,"offset":205038,"length":356,"previous":"WBV2-P1414-000","next":"WBV2-P1415-000"},"WBV2-P1415-000":{"line":609,"offset":205394,"length":303,"previous":"WBV2-P1414-001","next":"WBV2-P1415-001"},"WBV2-P1415-001":{"line":610,"offset":205697,"length":353,"previous":"WBV2-P1415-000","next":"WBV2-P1416-000"},"WBV2-P1416-000":{"line":611,"offset":206050,"length":303,"previous":"WBV2-P1415-001","next":"WBV2-P1416-001"},"WBV2-P1416-001":{"line":612,"offset":206353,"length":353,"previous":"WBV2-P1416-000","next":"WBV2-P1417-000"},"WBV2-P1417-000":{"line":613,"offset":206706,"length":303,"previous":"WBV2-P1416-001","next":"WBV2-P1417-001"},"WBV2-P1417-001":{"line":614,"offset":207009,"length":353,"previous":"WBV2-P1417-000","next":"WBV2-P1418-000"},"WBV2-P1418-000":{"line":615,"offset":207362,"length":303,"previous":"WBV2-P1417-001","next":"WBV2-P1418-001"},"WBV2-P1418-001":{"line":616,"offset":207665,"length":353,"previous":"WBV2-P1418-000","next":"WBV2-P1419-000"},"WBV2-P1419-000":{"line":617,"offset":208018,"length":303,"previous":"WBV2-P1418-001","next":"WBV2-P1419-001"},"WBV2-P1419-001":{"line":618,"offset":208321,"length":353,"previous":"WBV2-P1419-000","next":"WBV2-P1420-000"},"WBV2-P1420-000":{"line":619,"offset":208674,"length":201,"previous":"WBV2-P1419-001","next":"WBV2-P1420-001"},"WBV2-P1420-001":{"line":620,"offset":208875,"length":207,"previous":"WBV2-P1420-000","next":"WBV2-P1421-000"},"WBV2-P1421-000":{"line":621,"offset":209082,"length":201,"previous":"WBV2-P1420-001","next":"WBV2-P1421-001"},"WBV2-P1421-001":{"line":622,"offset":209283,"length":207,"previous":"WBV2-P1421-000","next":"WBV2-P1422-000"},"WBV2-P1422-000":{"line":623,"offset":209490,"length":194,"previous":"WBV2-P1421-001","next":"WBV2-P1422-001"},"WBV2-P1422-001":{"line":624,"offset":209684,"length":203,"previous":"WBV2-P1422-000","next":null}}} diff --git a/tests/golden/WBV2/web-product-backlog.json b/tests/golden/WBV2/web-product-backlog.json index f941bd0bb..50d0df65b 100644 --- a/tests/golden/WBV2/web-product-backlog.json +++ b/tests/golden/WBV2/web-product-backlog.json @@ -1,10 +1,10 @@ { "schemaVersion": 1, - "strategy": "implementation_first_user_feedback", + "strategy": "implementation_first_full_feature_gaps", "verificationPolicy": "deferred_until_user_reports", - "previousQueueTask": "WBV2-P1420-001", - "rootTask": "WBV2-P1421-000", - "queueTask": "WBV2-P1421-001", + "previousQueueTask": "WBV2-P1421-001", + "rootTask": "WBV2-P1422-000", + "queueTask": "WBV2-P1422-001", "sourceInventory": { "unitCount": 3745, "role": "traceability_only", @@ -30,7 +30,8 @@ "title": "Object and scene graph", "status": "implemented", "taskIds": [ - "NATIVE-OPERATOR-BRIDGE" + "NATIVE-OPERATOR-BRIDGE", + "OBJECT-EDITOR-COVERAGE" ] }, { @@ -38,7 +39,8 @@ "title": "Mesh modeling and UV", "status": "implemented", "taskIds": [ - "MESH-EXTENDED-AUTHORING" + "MESH-EXTENDED-AUTHORING", + "MESH-EDITOR-COVERAGE" ] }, { @@ -47,7 +49,8 @@ "status": "implemented", "taskIds": [ "WEBUI-NONMESH-ADVANCED", - "WEBUI-FONT-ASSETS" + "WEBUI-FONT-ASSETS", + "CURVE-SURFACE-COVERAGE" ] }, { @@ -71,7 +74,9 @@ "taskIds": [ "WEBUI-NLA-STRIP", "RIG-POSE-AUTHORING", - "ACTION-MARKER-AUTHORING" + "ACTION-MARKER-AUTHORING", + "ARMATURE-EDITOR-COVERAGE", + "ANIMATION-FCURVE-DRIVER-COVERAGE" ] }, { @@ -80,13 +85,17 @@ "status": "implemented", "taskIds": [ "WEBUI-SCULPT", - "SCULPT-ADVANCED-AUTHORING" + "SCULPT-ADVANCED-AUTHORING", + "GREASE-PENCIL-COVERAGE" ] }, { "id": "RENDER", "title": "Render, light, camera and world", - "status": "implemented" + "status": "implemented", + "taskIds": [ + "RENDER-CAMERA-LIGHT-COVERAGE" + ] }, { "id": "COMPOSITOR", @@ -96,14 +105,18 @@ { "id": "SIMULATION", "title": "Physics and simulation", - "status": "implemented" + "status": "implemented", + "taskIds": [ + "PHYSICS-SIMULATION-COVERAGE" + ] }, { "id": "MEDIA", "title": "Media, audio and sequencer", "status": "implemented", "taskIds": [ - "SEQUENCER-AUTHORING" + "SEQUENCER-AUTHORING", + "SEQUENCER-COMPOSITOR-COVERAGE" ] }, { @@ -111,7 +124,9 @@ "title": "Assets, libraries and interchange", "status": "implemented", "taskIds": [ - "IO-ROUTE-COMPLETION" + "IO-ROUTE-COMPLETION", + "TRACKING-MASK-COVERAGE", + "ASSET-LIBRARY-COVERAGE" ] }, { @@ -122,7 +137,10 @@ { "id": "RUNTIME", "title": "Worker, performance and modular WASM lifecycle", - "status": "implemented" + "status": "implemented", + "taskIds": [ + "RNA-DATABLOCK-REFLECTION" + ] } ], "tasks": [ @@ -442,6 +460,322 @@ "implementation": "Add cursor-derived multi-sample strokes, mask and face-set operations, symmetry, smooth/inflate/grab controls, and remesh entry points using native commands or the allowlisted operator bridge.", "startedAt": "2026-09-06T00:18:41.740013+00:00", "completedAt": "2026-09-06T00:28:32.739026+00:00" + }, + { + "id": "OBJECT-EDITOR-COVERAGE", + "module": "OBJECT", + "title": "Complete object editor authoring workflows", + "commands": [ + "clearObjectTransform", + "createObjectData", + "setObjectSelection", + "setCollectionVisibility" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Map the remaining object editor workflows to native Main transactions: clear location/rotation/scale, create camera/light/empty/armature data, selection/visibility and collection operations. Preserve browser-native viewport context; do not emulate desktop screens.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/OBJECT-EDITOR-COVERAGE-result.json", + "startedAt": "2026-09-06T07:05:58.136822+00:00", + "completedAt": "2026-09-06T07:12:53.620632+00:00" + }, + { + "id": "MESH-EDITOR-COVERAGE", + "module": "MESH", + "title": "Complete mesh and UV editor authoring workflows", + "commands": [ + "meshSubdivide", + "meshTriangulate", + "meshRecalculateNormals", + "meshBridgeLoops", + "meshDeleteElements", + "meshUVProject" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/mesh-authoring-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Extend the existing native mesh writer for subdivide, triangulate, normal recalculation, bridge loops, delete variants and common UV projection/seam workflows, with typed selection and no JavaScript mesh simulation.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/MESH-EDITOR-COVERAGE-result.json", + "startedAt": "2026-09-06T07:27:55.065807+00:00", + "completedAt": "2026-09-06T07:30:55.273587+00:00" + }, + { + "id": "CURVE-SURFACE-COVERAGE", + "module": "NONMESH", + "title": "Complete curve, surface and point-data authoring", + "commands": [ + "setCurveBevel", + "setCurveTaper", + "convertCurveType", + "setSurfaceResolution", + "setMetaballElements" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/nonmesh-geometry-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Complete user-reachable curve/surface/point-cloud workflows using Blender Main data, including bevel/taper/resolution/type conversion and remaining metaball/curve properties.", + "attempts": 3, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/CURVE-SURFACE-COVERAGE-result.json", + "startedAt": "2026-09-06T08:00:57.802264+00:00", + "completedAt": "2026-09-06T08:09:58.460157+00:00" + }, + { + "id": "ARMATURE-EDITOR-COVERAGE", + "module": "ANIMATION", + "title": "Complete armature edit and constraint workflows", + "commands": [ + "armatureEditOperations", + "setBoneRoll", + "setBoneSymmetry", + "setBoneParenting", + "setPoseConstraint" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Extend the existing armature hierarchy writer with edit operations, roll/symmetry/parenting and pose constraints through native Main.", + "attempts": 1, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/ARMATURE-EDITOR-COVERAGE-result.json", + "startedAt": "2026-09-06T08:09:58.460669+00:00", + "completedAt": "2026-09-06T08:20:13.976073+00:00" + }, + { + "id": "ANIMATION-FCURVE-DRIVER-COVERAGE", + "module": "ANIMATION", + "title": "Complete FCurve, driver and keying workflows", + "commands": [ + "setFCurveKeyframes", + "setDriverExpression", + "setActionGroups", + "setKeyingSet", + "bakeAnimation" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/animation-render-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Add typed FCurve point/driver/group/keying-set and bounded bake workflows to the existing Action/Main path.", + "attempts": 1, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/ANIMATION-FCURVE-DRIVER-COVERAGE-result.json", + "startedAt": "2026-09-06T08:20:13.976587+00:00", + "completedAt": "2026-09-06T08:32:40.102320+00:00" + }, + { + "id": "SEQUENCER-COMPOSITOR-COVERAGE", + "module": "MEDIA", + "title": "Complete Sequencer effects and compositor authoring", + "commands": [ + "setSequencerStripModifiers", + "setSequencerTransitions", + "setCompositorNodeGraph", + "setSequencerColorBalance" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/sequencer.ts", + "web/protocol/compositor-commands.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Extend full-strip editing with effects/transitions and expose compositor graph editing through native Main graph transactions.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/SEQUENCER-COMPOSITOR-COVERAGE-result.json", + "startedAt": "2026-09-06T08:47:41.719319+00:00", + "completedAt": "2026-09-06T08:52:12.046553+00:00" + }, + { + "id": "PHYSICS-SIMULATION-COVERAGE", + "module": "SIMULATION", + "title": "Complete physics and cache authoring workflows", + "commands": [ + "setRigidBodySettings", + "setClothSettings", + "setFluidSettings", + "setParticleCache", + "setSimulationPlayback" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/physics-simulation.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Add typed native Main settings and cache/playback controls for rigid body, cloth, fluid, soft body and particle workflows, with explicit unavailable-resource errors.", + "attempts": 3, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/PHYSICS-SIMULATION-COVERAGE-result.json", + "startedAt": "2026-09-06T09:22:14.678742+00:00", + "completedAt": "2026-09-06T09:26:45.048145+00:00" + }, + { + "id": "TRACKING-MASK-COVERAGE", + "module": "ASSET_IO", + "title": "Complete movie tracking and mask workflows", + "commands": [ + "setTrackingMarkers", + "setTrackingSolve", + "setMaskSpline", + "setMaskPoint" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/tracking-mask.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Expose browser media-backed tracking markers, solve settings and mask spline/point editing through native Main or the existing server job boundary.", + "attempts": 3, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/TRACKING-MASK-COVERAGE-result.json", + "startedAt": "2026-09-06T09:56:47.387769+00:00", + "completedAt": "2026-09-06T10:02:27.813011+00:00" + }, + { + "id": "GREASE-PENCIL-COVERAGE", + "module": "PAINT", + "title": "Complete Grease Pencil draw/edit/paint workflows", + "commands": [ + "setGreasePencilDrawing", + "setGreasePencilMaterial", + "setGreasePencilSelection", + "setGreasePencilInterpolate" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/grease-pencil.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Extend existing layer/frame/stroke support to drawing edit, material, selection, interpolation and browser pointer workflows.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/GREASE-PENCIL-COVERAGE-result.json", + "startedAt": "2026-09-06T10:17:29.027120+00:00", + "completedAt": "2026-09-06T10:25:59.509893+00:00" + }, + { + "id": "RENDER-CAMERA-LIGHT-COVERAGE", + "module": "RENDER", + "title": "Complete render, camera, light and pass workflows", + "commands": [ + "renderFrame", + "renderAnimation", + "setRenderPasses", + "setCameraView", + "setLightLinking" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/render-routing.ts", + "web/protocol/render-capabilities.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Complete user-visible render execution/routing, camera view controls, advanced light linking and render pass settings through native or explicit server routes.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/RENDER-CAMERA-LIGHT-COVERAGE-result.json", + "startedAt": "2026-09-06T10:41:00.334693+00:00", + "completedAt": "2026-09-06T10:54:01.657249+00:00" + }, + { + "id": "ASSET-LIBRARY-COVERAGE", + "module": "ASSET_IO", + "title": "Complete asset browser and library workflows", + "commands": [ + "assetMark", + "assetCatalog", + "libraryLink", + "libraryOverride", + "libraryReload" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/asset-library-io.ts", + "web/protocol/library-main-append.ts", + "web/app/src/app/App.tsx", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Expose browser-native asset catalog, link/append/override/reload workflows and preserve path/security rules.", + "attempts": 2, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/ASSET-LIBRARY-COVERAGE-result.json", + "startedAt": "2026-09-06T11:09:02.966513+00:00", + "completedAt": "2026-09-06T11:12:43.274302+00:00" + }, + { + "id": "RNA-DATABLOCK-REFLECTION", + "module": "RUNTIME", + "title": "Complete generic RNA data-block reflection and editing", + "commands": [ + "listRNADataBlocks", + "readRNAProperties", + "setRNAProperty", + "listRNACollections" + ], + "ownedPaths": [ + "web/protocol/web-engine.ts", + "web/protocol/scene-ir.ts", + "web/app/src/app/App.tsx", + "web/app/src/engine-client/WebEngineClient.ts", + "web/app/src/workers/web-engine.worker.ts", + "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" + ], + "implementation": "Add source-backed bounded RNA reflection for the remaining user-editable data-block properties. Reject unsupported pointers, context-only properties and unsafe arbitrary execution.", + "attempts": 1, + "status": "implemented", + "resultPath": "tests/golden/WBV2/product-migration/RNA-DATABLOCK-REFLECTION-result.json", + "startedAt": "2026-09-06T11:12:43.274783+00:00", + "completedAt": "2026-09-06T11:22:48.995579+00:00" } - ] + ], + "gapInventory": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md" } diff --git a/tools/web/search-wbv2-batch-source.mjs b/tools/web/search-wbv2-batch-source.mjs index 4a4e7e1d8..fdafd0e12 100644 --- a/tools/web/search-wbv2-batch-source.mjs +++ b/tools/web/search-wbv2-batch-source.mjs @@ -61,6 +61,14 @@ const runtimeAllowlist = new Set([ "web/protocol/shader-graph-commands.ts", "web/protocol/shader-graph.ts", "web/protocol/sequencer.ts", + "web/protocol/compositor-commands.ts", + "web/protocol/physics-simulation.ts", + "web/protocol/tracking-mask.ts", + "web/protocol/grease-pencil.ts", + "web/protocol/render-routing.ts", + "web/protocol/render-capabilities.ts", + "web/protocol/asset-library-io.ts", + "web/protocol/library-main-append.ts", "web/protocol/io-format-ui-gate.ts", "web/protocol/io-media-commands.ts", "web/app/src/sequencer/SequencerTimeline.ts", diff --git a/web/app/src/app/App.tsx b/web/app/src/app/App.tsx index e554baa43..be309b512 100644 --- a/web/app/src/app/App.tsx +++ b/web/app/src/app/App.tsx @@ -4,10 +4,24 @@ import { WebEngineClient } from "../engine-client/WebEngineClient"; import { loadWebEngineManifest, verifyWasmResource } from "../../../protocol/manifest"; import type { ProgressEvent } from "../../../protocol/progress"; import type { SceneSnapshotIR } from "../../../protocol/scene-ir"; +import { sequencerCommands } from "../../../protocol/sequencer"; import type { SequencerStripIR, SequencerStripType, SequencerTimelineIR } from "../../../protocol/sequencer"; import type { GPUTextureAsset } from "../../../protocol/render-assets"; import { collectGPUTextureAssetRequests, createGPUTextureAsset, RenderAssetValidationError } from "../../../protocol/render-assets"; -import type { MeshEditOperation, MeshElementMode, MeshGeometryBuffer, MeshPrimitive, WebEngineEditCommand, WebEngineLODLevelResult } from "../../../protocol/web-engine"; +import type { MeshEditOperation, MeshElementMode, MeshGeometryBuffer, MeshPrimitive, WebEngineEditCommand, WebEngineJsonCommand, WebEngineLODLevelResult, RNADataBlockDescriptor, RNAPropertyDescriptor } from "../../../protocol/web-engine"; + +export function RNADataBlockReflectionPanel({client, dataBlocks, properties, onRefresh}: { + client: { listRNADataBlocks: (params?: Record) => Promise<{ dataBlocks: RNADataBlockDescriptor[] }>; readRNAProperties: (params: Record) => Promise<{ properties: RNAPropertyDescriptor[] }>; setRNAProperty: (params: Record) => Promise; listRNACollections: (params?: Record) => Promise } | null; + dataBlocks: RNADataBlockDescriptor[]; + properties: RNAPropertyDescriptor[]; + onRefresh?: (dataBlocks: RNADataBlockDescriptor[], properties: RNAPropertyDescriptor[]) => void; +}): JSX.Element { + return
+ + {dataBlocks.length} editable data-blocks + {properties.length} reflected properties +
; +} import type { BlenderOperatorDescriptor, BlenderOperatorPropertySpec, BlenderOperatorPropertyValue } from "../../../protocol/blender-operator"; import { coreSceneCommands } from "../../../protocol/core-scene-commands"; import { meshAuthoringCommands } from "../../../protocol/mesh-authoring-commands"; @@ -663,8 +677,11 @@ function GreasePencilCanvas2D({ drawing, scope, selection, onSelect }: { scope: GreasePencilDrawingScopeIR; selection: GreasePencilSelectionStateIR; onSelect: (point: GreasePencilPointRef, additive: boolean, baseSelectionRevision: number) => void; + onDraw?: (points: Array<[number, number, number]>) => void; }) { const canvasRef = useRef(null); + const drawingPointerRef = useRef(null); + const drawingStrokeRef = useRef>([]); const layout = useMemo(() => { const points = drawing.strokes.flatMap((stroke, strokeIndex) => (stroke.points ?? []).map((point, pointIndex) => ({ point: { ...scope, strokeId: stroke.id, pointId: point.id, strokeIndex, pointIndex }, @@ -745,17 +762,47 @@ function GreasePencilCanvas2D({ drawing, scope, selection, onSelect }: { const selectedIds = new Set(selection.selectedPoints.map((point) => point.pointId)); onSelect(layout.find((item) => !selectedIds.has(item.point.pointId))?.point ?? layout[0].point, event.shiftKey || event.ctrlKey || event.metaKey, selection.revision); }; + const drawPoint = (event: React.PointerEvent): [number, number, number] => { + const canvas = canvasRef.current; + const bounds = canvas?.getBoundingClientRect(); + if (!bounds) return [0, 0, 0]; + return [((event.clientX - bounds.left) / Math.max(1, bounds.width) - 0.5) * 2, (0.5 - (event.clientY - bounds.top) / Math.max(1, bounds.height)) * 2, 0]; + }; + const beginDraw = (event: React.PointerEvent): void => { + if (!onDraw || event.button !== 0 || !event.altKey) return; + drawingPointerRef.current = event.pointerId; + drawingStrokeRef.current = [drawPoint(event)]; + event.currentTarget.setPointerCapture(event.pointerId); + event.preventDefault(); + }; + const moveDraw = (event: React.PointerEvent): void => { + if (drawingPointerRef.current !== event.pointerId) return; + const point = drawPoint(event); + const previous = drawingStrokeRef.current.at(-1); + if (!previous || Math.hypot(point[0] - previous[0], point[1] - previous[1]) >= 0.01) drawingStrokeRef.current.push(point); + event.preventDefault(); + }; + const endDraw = (event: React.PointerEvent): void => { + if (drawingPointerRef.current !== event.pointerId) return; + drawingPointerRef.current = null; + const stroke = drawingStrokeRef.current; + drawingStrokeRef.current = []; + if (stroke.length > 0) onDraw?.(stroke); + if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId); + event.preventDefault(); + }; return point.pointId).join(",")} data-point-layout={JSON.stringify(layout.map(({ point, x, y }) => ({ pointId: point.pointId, x, y })))} - onPointerDown={(event) => selectAt(event.clientX, event.clientY, event.shiftKey || event.ctrlKey || event.metaKey)} + onPointerDown={(event) => { beginDraw(event); if (!event.altKey) selectAt(event.clientX, event.clientY, event.shiftKey || event.ctrlKey || event.metaKey); }} + onPointerMove={moveDraw} onPointerUp={endDraw} onPointerCancel={endDraw} onKeyDown={keyboardSelect} />; } -function Properties({ snapshot, editorWorkflow, selectedFaceIndices, selectedVertexIndices, greasePencilSelection, onGreasePencilCanvasPointSelect, onCommand, onImportImage, onImportVFont, onRequestAsset, onAppendLibraryObject, onQueryRenderCapability, onApplyDecimate, onPreviewDecimate, onGenerateLOD, onSetModifierEnabled, previewActive, onCancelPreview }: { +function Properties({ snapshot, editorWorkflow, selectedFaceIndices, selectedVertexIndices, greasePencilSelection, onGreasePencilCanvasPointSelect, onCommand, onImportImage, onImportVFont, onRequestAsset, onAppendLibraryObject, onAssetLibraryCommand, onQueryRenderCapability, onApplyDecimate, onPreviewDecimate, onGenerateLOD, onSetModifierEnabled, previewActive, onCancelPreview }: { snapshot: SceneSnapshotIR | null; editorWorkflow: EditorWorkflowIR | null; selectedFaceIndices: number[]; @@ -767,6 +814,7 @@ function Properties({ snapshot, editorWorkflow, selectedFaceIndices, selectedVer onImportVFont: (file: File) => void; onRequestAsset: (assetId: string) => void; onAppendLibraryObject: (source: ArrayBuffer, request: LibraryMainAppendRequestIR) => Promise; + onAssetLibraryCommand: (command: WebEngineJsonCommand, params: Record) => Promise; onQueryRenderCapability: (request: RenderCapabilityRequest) => void; onApplyDecimate: (profile: SimplifyProfile, meshId: string) => void; onPreviewDecimate: (profile: SimplifyProfile, meshId: string) => void; @@ -851,6 +899,10 @@ function Properties({ snapshot, editorWorkflow, selectedFaceIndices, selectedVer const [librarySourceFile, setLibrarySourceFile] = useState(null); const [libraryRequestFile, setLibraryRequestFile] = useState(null); const [libraryAppendError, setLibraryAppendError] = useState(""); + const [assetCatalogId, setAssetCatalogId] = useState("web-assets"); + const [assetCatalogName, setAssetCatalogName] = useState("Web Assets"); + const [libraryId, setLibraryId] = useState(""); + const [librarySourcePath, setLibrarySourcePath] = useState(""); const activeNode = snapshot?.nodes.find((node) => node.id === snapshot.activeObjectId); const activeMesh = activeNode?.dataId ? snapshot?.meshes.find((mesh) => mesh.id === activeNode.dataId) : undefined; const activeNonMeshData = activeNode?.dataId ? snapshot?.nonMeshData?.find((data) => data.id === activeNode.dataId) : undefined; @@ -1268,7 +1320,7 @@ function Properties({ snapshot, editorWorkflow, selectedFaceIndices, selectedVer {activeSpeaker ?

Speaker

{activeSpeaker.name} · {activeSpeaker.soundId ?? "No sound"}Volume {activeSpeaker.volume.toFixed(2)} · Pitch {activeSpeaker.pitch.toFixed(2)}
: null} {activeParticleSettings ?

Particle Settings

{activeParticleSettings.name} · {activeParticleSettings.totalParticles} particlesLifetime {activeParticleSettings.lifetime.toFixed(2)} · Size {activeParticleSettings.size.toFixed(3)}
: null} {activeTexture ?

Texture

{activeTexture.name} · Type {activeTexture.type}Noise {activeTexture.noiseScale.toFixed(3)} · Depth {activeTexture.noiseDepth}
: null} - {(snapshot?.libraries?.length ?? 0) > 0 ?

Library Append

{snapshot?.libraries?.slice(0, 16).map((library) => {library.name} · {library.status} · {library.sourcePath})}{libraryAppendError ? {libraryAppendError} : null}
: null} + {(snapshot?.libraries?.length ?? 0) > 0 || activeNode ?

Asset Browser & Libraries

{snapshot?.libraries?.slice(0, 16).map((library) => {library.name} · {library.status} · {library.sourcePath})}{activeNode ? <>
: null}
{libraryAppendError ? {libraryAppendError} : null}
: null} {activeCamera ?

Camera

{activeCamera.projection} · {activeCamera.lensMm.toFixed(1)}mmPanorama {activeCamera.panoramaType ?? 0} · Fisheye {(activeCamera.fisheyeFov ?? Math.PI).toFixed(2)} rad
: null} {activeLight ?

Light

{activeLight.energy.toFixed(1)} energy贡献因子 D {(activeLight.diffuseFactor ?? 1).toFixed(2)} · S {(activeLight.specularFactor ?? 1).toFixed(2)} · T {(activeLight.transmissionFactor ?? 1).toFixed(2)} · V {(activeLight.volumeFactor ?? 1).toFixed(2)}
阴影控制 A {(activeLight.attenuationDistance ?? 40).toFixed(1)} · Filter {(activeLight.shadowFilterRadius ?? 1).toFixed(2)} · MaxRes {(activeLight.shadowMaximumResolution ?? 0.001).toFixed(4)} · Overblur {(activeLight.shadowJitterOverblur ?? 10).toFixed(1)}
级联阴影距离 {(activeLight.cascadeMaxDistance ?? 200).toFixed(1)} · 指数 {(activeLight.cascadeExponent ?? 0.8).toFixed(2)} · 淡出 {(activeLight.cascadeFade ?? 0.1).toFixed(2)} · 层数 {activeLight.cascadeCount ?? 4}
Area 深度 {(activeLight.areaSizeZ ?? 0.25).toFixed(2)} · Clip start {(activeLight.clipStart ?? 0.05).toFixed(3)}
: null} {activeWorld ?

World

Exposure {activeWorld.exposure.toFixed(2)} · Lightgroup {activeWorld.lightgroup ?? "None"}Environment {(activeWorld.environmentStrength ?? 1).toFixed(2)} · AO {(activeWorld.ambientOcclusionDistance ?? 10).toFixed(1)}m / {(activeWorld.ambientOcclusionEnergy ?? 1).toFixed(2)} · Sun {(activeWorld.sunThreshold ?? 10).toFixed(1)}Probe {activeWorld.probeResolution ?? 10} · Sun Shadow {activeWorld.useSunShadow === false ? "Off" : "On"}
: null} @@ -1281,12 +1333,22 @@ function Properties({ snapshot, editorWorkflow, selectedFaceIndices, selectedVer {activeScene?.performanceSettings ?

Render Performance

{activeScene.performanceSettings.fixedThreads ? `${activeScene.performanceSettings.threads} fixed threads` : "Automatic threads"} · {activeScene.performanceSettings.persistentData ? "Persistent data" : "Transient data"} · {activeScene.performanceSettings.highQualityNormals ? "HQ normals" : "Standard normals"}
: null} {activeScene?.samplingSettings ?

Image Sampling

Pixel aspect {activeScene.samplingSettings.pixelAspectX.toFixed(3)} × {activeScene.samplingSettings.pixelAspectY.toFixed(3)} · Filter {activeScene.samplingSettings.filterSize.toFixed(3)} · Dither {activeScene.samplingSettings.dither.toFixed(3)}
: null} {activeScene?.multiviewSettings ?

Multiview

{activeScene.multiviewSettings.enabled ? "Enabled" : "Disabled"} · Views {activeScene.multiviewSettings.viewsFormat} · Output {activeScene.multiviewSettings.imageViewsFormat} · Stereo {activeScene.multiviewSettings.stereoDisplayMode}
: null} - {activeScene?.renderSettings ?

Render Output

{activeScene.renderSettings.resolutionX} × {activeScene.renderSettings.resolutionY} @ {activeScene.renderSettings.resolutionPercentage}%Frames {activeScene.renderSettings.frameStart} - {activeScene.renderSettings.frameEnd} · {activeScene.renderSettings.outputPath}
: null} + {activeScene?.renderSettings ?

Render Output

{activeScene.renderSettings.resolutionX} × {activeScene.renderSettings.resolutionY} @ {activeScene.renderSettings.resolutionPercentage}%Frames {activeScene.renderSettings.frameStart} - {activeScene.renderSettings.frameEnd} · {activeScene.renderSettings.outputPath}
: null} {activeScene?.audioSettings ?

Scene Audio

Volume {activeScene.audioSettings.volume.toFixed(2)} · Speed {activeScene.audioSettings.speedOfSound.toFixed(1)} · Doppler {activeScene.audioSettings.dopplerFactor.toFixed(2)}Distance model {activeScene.audioSettings.distanceModel} · {activeScene.audioSettings.muted ? "Muted" : "Audible"} · {activeScene.audioSettings.sync ? "Synced" : "Free"}
: null} {activeScene?.unitSettings ?

Scene Units

System {activeScene.unitSettings.system} · Scale {activeScene.unitSettings.scaleLength.toFixed(4)} · Rotation {activeScene.unitSettings.rotationSystem}Length {activeScene.unitSettings.lengthUnit} · Mass {activeScene.unitSettings.massUnit} · Time {activeScene.unitSettings.timeUnit}
: null} {activeScene?.timelineSettings ?

Timeline Settings

{activeScene.timelineSettings.fps} / {activeScene.timelineSettings.fpsBase.toFixed(3)} fps · Step {activeScene.timelineSettings.frameStep}{activeScene.timelineSettings.usePreviewRange ? `Preview ${activeScene.timelineSettings.previewStart} - ${activeScene.timelineSettings.previewEnd}` : "Full frame range"}
: null} {activeScene?.pipelineSettings ?

Render Pipeline

{activeScene.pipelineSettings.useCompositor ? "Compositor" : "Direct"} · {activeScene.pipelineSettings.useSequencer ? "Sequencer" : "No Sequencer"}{activeScene.pipelineSettings.saveOutput ? "Save output" : "Preview only"} · {activeScene.pipelineSettings.noOverwrite ? "No overwrite" : "Overwrite allowed"}
: null} {activeScene ?

Scene Bindings

Camera {activeScene.cameraObjectId ?? "None"} · World {activeScene.worldId ?? "None"}
: null} +
+

Object Data

+
+ {(["CAMERA", "LIGHT", "EMPTY", "ARMATURE"] as const).map((objectType) => ( + + ))} +
+
+ {activeNode ?

Object Authoring

: null} + {snapshot?.collections.length ?

Collection Visibility

{snapshot.collections.map((collection) =>
{collection.name}
)}
: null} {activeNode ?

Object Lightgroup

{activeNode.lightgroup ?? "No lightgroup"}
: null} {activeScene?.viewLayers?.length ?

View Layers

{activeScene.viewLayers.map((layer) =>
{layer.name} · {layer.useRender ? "Render" : "Disabled"} · {layer.useFreestyle ? "Freestyle" : "No Freestyle"} · {layer.samples} samples
)}
: null} {activeScene?.viewLayers?.filter((layer) => layer.aovs?.length).map((layer) =>

{layer.name} AOVs

{layer.aovs?.map((aov) => {aov.name} · {aov.type === 1 ? "Color" : "Value"})}
) ?? null} @@ -1312,13 +1374,24 @@ function Properties({ snapshot, editorWorkflow, selectedFaceIndices, selectedVer return

Armature

{armature.bones.length} bones +
+ + + {armature.bones[0] ? <> + + + + + + : null} +
{ event.preventDefault(); const data = new FormData(event.currentTarget); const name = String(data.get("newBoneName") ?? "").trim(); if (!name) return; const number = (field: string) => Number(data.get(field)); - onCommand({ type: "setArmatureBones", objectId: activeNode.id, bones: [...commandBones, { + onCommand({ type: "armatureEditOperations", objectId: activeNode.id, operations: [{ operation: "ADD", name, parentName: String(data.get("newBoneParent") ?? "") || null, head: [number("newHeadX"), number("newHeadY"), number("newHeadZ")], @@ -1359,7 +1432,7 @@ function Properties({ snapshot, editorWorkflow, selectedFaceIndices, selectedVer {(["X", "Y", "Z"] as const).map((axis, index) => )} -
+
{ event.preventDefault(); @@ -1381,11 +1454,11 @@ function Properties({ snapshot, editorWorkflow, selectedFaceIndices, selectedVer })() : null} {activeMetaball ?

Metaball

{activeMetaball.elements?.length ?? 0} elements{activeMetaball.elements?.length ?
: No editable elements}
: null} {activeNonMeshData ?

Non-Mesh Data

{activeNonMeshData.name} · {activeNonMeshData.type} · {activeNonMeshData.pointCount} points
: null} -

Render Capabilities

{snapshot?.scenes[0]?.compositorGraph ? : null}
+

Render Capabilities

{snapshot?.scenes[0]?.compositorGraph ? : null}

Viewport Display

{activeCurve && curveTopologyOperatorGate("TOGGLE_CYCLIC").status === "READY" ?

Curve Topology

{activeCurve.cyclicU?.[curveSplineIndex] ? "Cyclic" : "Open"}{curveTopologyError ? {curveTopologyError} : null}
: null} - {activeCurve ?

Advanced Curve

{activeCurve.pointCount} points · {activeCurve.splineCount} splines · handles {activeCurve.handlePoints?.length ?? 0}
: null} - {activeSurface ?

Advanced Surface

{activeSurface.pointCount} points · {activeSurface.splineDimensions?.length ?? 0} spline surfaces · U {(activeSurface.cyclicU ?? []).map((value) => value ? "Cyclic" : "Open").join(", ") || "n/a"} · V {(activeSurface.cyclicV ?? []).map((value) => value ? "Cyclic" : "Open").join(", ") || "n/a"}
: null} + {activeCurve ?

Advanced Curve

{activeCurve.pointCount} points · {activeCurve.splineCount} splines · handles {activeCurve.handlePoints?.length ?? 0} · resolution {activeCurve.resolution ?? "n/a"}
: null} + {activeSurface ?

Advanced Surface

{activeSurface.pointCount} points · {activeSurface.splineDimensions?.length ?? 0} spline surfaces · U {(activeSurface.cyclicU ?? []).map((value) => value ? "Cyclic" : "Open").join(", ") || "n/a"} · V {(activeSurface.cyclicV ?? []).map((value) => value ? "Cyclic" : "Open").join(", ") || "n/a"} · resolution {activeSurface.resolution ?? "n/a"}
: null} {activeMesh ?

UV Maps

: null} {activeGreasePencil ?
Target frame setGreasePencilTargetFrame(Number(event.target.value))} />
{greasePencilReorderError ? {greasePencilReorderError} : null} - {greasePencilCanvasFrame && greasePencilSelection ? : null} + {greasePencilCanvasFrame && greasePencilSelection ? { + const drawingScope = greasePencilSelection.drawing; + const strokes = greasePencilCanvasFrame.drawing.strokes.map((stroke) => ({ + cyclic: stroke.cyclic, + materialIndex: stroke.materialIndex, + points: (stroke.points ?? []).map((point) => ({ position: point.position, radius: point.radius, opacity: point.opacity, vertexColor: point.vertexColor })), + })); + strokes.push({ cyclic: false, materialIndex: 0, points: points.map((position) => ({ position, radius: 0.01, opacity: 1 })) }); + onCommand({ type: "setGreasePencilDrawing", dataId: drawingScope.dataId, layerId: drawingScope.layerId, frame: drawingScope.frame, drawingId: drawingScope.drawingId, baseRevision: snapshot?.revision, strokes }); + }} /> : null} {activeGreasePencilFrame ? <> @@ -1635,7 +1717,7 @@ function SequencerAuthoringPanel({ scene, revision, frame, onCommand }: { scene: commit(strips.flatMap((strip) => strip.id === selected.id ? [left, right] : [strip])); setSelectedId(rightId); }; - return
{selected ?
{selected.id} · {selected.type}
: {scene.sequencerStatus === "AVAILABLE" ? "No strips" : "Sequencer timeline will be created in Main"}}
; + return
{selected ?
{selected.id} · {selected.type}
: {scene.sequencerStatus === "AVAILABLE" ? "No strips" : "Sequencer timeline will be created in Main"}}
; } function Timeline({ snapshot, frame, start, end, onFrameChange, onCommand }: { snapshot: SceneSnapshotIR | null; frame: number; start: number; end: number; onFrameChange: (value: number) => void; onCommand: (command: WebEngineEditCommand) => void }) { @@ -1645,6 +1727,10 @@ function Timeline({ snapshot, frame, start, end, onFrameChange, onCommand }: { s const [nlaFrameStartDraft, setNlaFrameStartDraft] = useState(""); const [actionNameDraft, setActionNameDraft] = useState(""); const [markerNameDraft, setMarkerNameDraft] = useState(""); + const [driverExpressionDraft, setDriverExpressionDraft] = useState("frame"); + const [actionGroupDraft, setActionGroupDraft] = useState("Web"); + const [keyingSetDraft, setKeyingSetDraft] = useState("Web Keying Set"); + const [bakeEndDraft, setBakeEndDraft] = useState(String(end)); useEffect(() => { if (!playing) return undefined; const timer = window.setInterval(() => { @@ -1697,12 +1783,15 @@ function Timeline({ snapshot, frame, start, end, onFrameChange, onCommand }: { s .filter((keyframe) => keyframe >= start && keyframe <= end) .sort((left, right) => left - right); const activeKeyframe = animation?.channels[0]?.keyframes.find((keyframe) => keyframe.frame === frame); + const activePath = animation?.channels[0]?.path; return (
{frame}{snapshot?.activeObjectId ? <> : null}
onFrameChange(Number(event.target.value))} aria-label="当前帧" />
{start}{mid}{second}{third}{fourth}{end}
{greasePencil?.name ?? animation?.name ?? "No Action"}
{keyframes.map((keyframe) =>
{!greasePencil && animation?.channels[0] ? : }{snapshot?.activeObjectId ? <> setActionNameDraft(event.target.value)} />{animation ? : null}{actions.length > 0 ? : null} : null}{snapshot?.activeObjectId && nlaTracks.length > 0 ? : null}
+ {!greasePencil && animation?.channels[0] ?
: null} + {activeScene && snapshot ?
setKeyingSetDraft(event.target.value)} />
: null} {!greasePencil && animation?.channels[0] ?
: null} {activeScene ?
setMarkerNameDraft(event.target.value)} />{markers.map((marker, index) =>
onCommand(animationRenderCommands.setTimelineMarkers(activeScene.id, markers.map((entry, markerIndex) => markerIndex === index ? { ...entry, name: event.target.value } : entry)))} /> onCommand(animationRenderCommands.setTimelineMarkers(activeScene.id, markers.map((entry, markerIndex) => markerIndex === index ? { ...entry, frame: Number(event.target.value) } : entry)))} />
)}
: null} {activeScene && snapshot ? : null} @@ -1974,6 +2063,7 @@ export function App() { source: GreasePencilSelectionSource, operation: GreasePencilSelectionOperation, points: readonly GreasePencilPointRef[], + baseSelectionRevision?: number, drawing = activeGreasePencilDrawing, baseSelectionRevision?: number, ): GreasePencilSelectionStateIR | null => { @@ -2064,7 +2154,7 @@ export function App() { }); }; const selectGreasePencilPoint = (point: GreasePencilPointRef, additive: boolean, baseSelectionRevision?: number): void => { - if (!commitGreasePencilSelection("VIEWPORT_3D", additive ? "TOGGLE" : "REPLACE", [point], point, baseSelectionRevision)) return; + if (!commitGreasePencilSelection("VIEWPORT_3D", additive ? "TOGGLE" : "REPLACE", [point], baseSelectionRevision, activeGreasePencilDrawing)) return; const owner = snapshot?.nodes.find((node) => node.dataId === point.dataId); if (owner) { setSelectedObjectIds((current) => additive ? new Set([...current, owner.id]) : new Set([owner.id])); @@ -2082,7 +2172,7 @@ export function App() { })); return; } - const nextSelection = commitGreasePencilSelection("VIEWPORT_3D", additive ? "ADD" : "REPLACE", result.selectedPoints, currentDrawing, result.baseSelectionRevision); + const nextSelection = commitGreasePencilSelection("VIEWPORT_3D", additive ? "ADD" : "REPLACE", result.selectedPoints, result.baseSelectionRevision, currentDrawing); if (!nextSelection) return; const owner = snapshot.nodes.find((node) => node.dataId === currentDrawing.dataId); if (owner) { @@ -2223,6 +2313,24 @@ export function App() { } }; + const onAssetLibraryCommand = async (command: Extract, params: Record): Promise => { + const client = webClientRef.current; + if (!client) return; + try { + const response = await client.callJson>(command, params); + const next = await client.snapshot(); + setSnapshot(next.snapshot); + setGeometryBuffers(next.geometryBuffers); + setNonMeshGeometryBuffers(next.nonMeshGeometryBuffers ?? []); + setFrame(next.snapshot.frame.current); + projectRevisionRef.current = next.snapshot.revision; + setEngineStatus(`${command}: ${String(response.result.status ?? "APPLIED")}`); + } + catch (error) { + setEngineStatus(recordDiagnostic("ENGINE", "COMMAND_FAILED", error, { command })); + } + }; + const applyDecimate = (profile: SimplifyProfile, meshId: string): void => { void applyEditCommand(meshAuthoringCommands.decimate(meshId, profile)); }; @@ -2263,6 +2371,30 @@ export function App() { setMeshSelection({ meshId: mesh.id, mode: meshSelection.mode, indices: new Set(Array.from({ length: count }, (_, index) => index)), nonMeshSelections: undefined }); }; const runMeshEdit = (operation: MeshEditOperation): void => { + if (meshSelection.meshId && meshSelection.indices.size > 0) { + const meshId = meshSelection.meshId; + const indices = [...meshSelection.indices]; + if (operation === "SUBDIVIDE") { + void applyEditCommand(meshAuthoringCommands.meshSubdivide(meshId, meshSelection.mode, indices)); + return; + } + if (operation === "TRIANGULATE") { + void applyEditCommand(meshAuthoringCommands.meshTriangulate(meshId, meshSelection.mode === "FACE" ? indices : [])); + return; + } + if (operation === "RECALCULATE_NORMALS") { + void applyEditCommand(meshAuthoringCommands.meshRecalculateNormals(meshId, meshSelection.mode === "FACE" ? indices : [])); + return; + } + if (operation === "BRIDGE_LOOPS") { + void applyEditCommand(meshAuthoringCommands.meshBridgeLoops(meshId, meshSelection.mode === "EDGE" ? indices : [])); + return; + } + if (operation === "DELETE") { + void applyEditCommand(meshAuthoringCommands.meshDeleteElements(meshId, meshSelection.mode, indices)); + return; + } + } if (!meshSelection.meshId || meshSelection.indices.size === 0) return; void applyEditCommand(meshAuthoringCommands.edit(meshSelection.meshId, operation, meshSelection.mode, [...meshSelection.indices], { ...(operation === "EXTRUDE" ? { offset: [0, 0, 0.25] } : {}), diff --git a/web/app/src/engine-client/WebEngineClient.ts b/web/app/src/engine-client/WebEngineClient.ts index 6af85b1f0..a2d7f17ec 100644 --- a/web/app/src/engine-client/WebEngineClient.ts +++ b/web/app/src/engine-client/WebEngineClient.ts @@ -11,6 +11,9 @@ import type { WebEngineResult, WebEngineOpenResourceStatus, WebEngineStatus, + RNADataBlockDescriptor, + RNAPropertyDescriptor, + RNACollectionDescriptor, } from "../../../protocol/web-engine"; import type { LODGenerationRequest } from "../../../protocol/lod"; import type { SceneSnapshotIR } from "../../../protocol/scene-ir"; @@ -183,6 +186,28 @@ export class WebEngineClient { return { status, operators: normalizeOperatorCatalog(result) }; } + async listRNADataBlocks(params: Record = {}): Promise<{ status: WebEngineStatus; dataBlocks: RNADataBlockDescriptor[] }> { + const { status, result } = await this.callJson("listRNADataBlocks", params); + const dataBlocks = Array.isArray(result) ? result : (result && typeof result === "object" && Array.isArray((result as { dataBlocks?: unknown }).dataBlocks) ? (result as { dataBlocks: unknown[] }).dataBlocks : []); + return { status, dataBlocks: dataBlocks.filter((item): item is RNADataBlockDescriptor => Boolean(item && typeof item === "object")) }; + } + + async readRNAProperties(params: Record): Promise<{ status: WebEngineStatus; properties: RNAPropertyDescriptor[] }> { + const { status, result } = await this.callJson("readRNAProperties", params); + const properties = Array.isArray(result) ? result : (result && typeof result === "object" && Array.isArray((result as { properties?: unknown }).properties) ? (result as { properties: unknown[] }).properties : []); + return { status, properties: properties.filter((item): item is RNAPropertyDescriptor => Boolean(item && typeof item === "object")) }; + } + + async setRNAProperty(params: Record): Promise<{ status: WebEngineStatus; result: unknown }> { + return this.callJson("setRNAProperty", params); + } + + async listRNACollections(params: Record = {}): Promise<{ status: WebEngineStatus; collections: RNACollectionDescriptor[] }> { + const { status, result } = await this.callJson("listRNACollections", params); + const collections = Array.isArray(result) ? result : (result && typeof result === "object" && Array.isArray((result as { collections?: unknown }).collections) ? (result as { collections: unknown[] }).collections : []); + return { status, collections: collections.filter((item): item is RNACollectionDescriptor => Boolean(item && typeof item === "object")) }; + } + async invokeBlenderOperator(invocation: BlenderOperatorInvocation): Promise { if (!invocation.operator.trim()) throw this.report("INVALID_ARGUMENT", "Blender operator 不能为空", true); const result = await this.request({ type: "jsonCommand", cmd: "invokeBlenderOperator", params: invocation as unknown as Record }); diff --git a/web/app/src/workers/web-engine.worker.ts b/web/app/src/workers/web-engine.worker.ts index b4e6889d0..39b149b71 100644 --- a/web/app/src/workers/web-engine.worker.ts +++ b/web/app/src/workers/web-engine.worker.ts @@ -10,6 +10,7 @@ import { evaluateSkinSimplifyGate } from "../../../protocol/skin"; import { evaluateMeshModifierStack } from "../../../protocol/modifier-graph"; import { parseDepsgraphEvaluation } from "../../../protocol/depsgraph"; import { normalizeProjectAssetPath } from "../../../protocol/asset-path"; +import { parseAssetLibraryCommand } from "../../../protocol/asset-library-io"; import { cloneMeshGeometryBuffers, diffMeshGeometryBuffers } from "../../../protocol/mesh-geometry-delta"; import { gateSculptCapability, parseSculptMeshAttributes, parseSculptStroke } from "../../../protocol/sculpt"; import { gateGeometryNodeGraph } from "../../../protocol/geometry-nodes"; @@ -283,6 +284,52 @@ function sculptMeshGate(meshId: string): CapabilityGateResult { } function assertFutureCapability(payload: Extract["payload"]): void { + if (payload.type === "renderFrame") { + if (typeof payload.dataId !== "string" || payload.dataId.length === 0 || (payload.frame !== undefined && (!Number.isSafeInteger(payload.frame) || payload.frame < -1000000 || payload.frame > 1000000))) throw report("RENDER_PROPERTY_INVALID", "renderFrame target or frame is invalid"); + return; + } + if (payload.type === "renderAnimation") { + if (typeof payload.dataId !== "string" || payload.dataId.length === 0 || (payload.frameStart !== undefined && !Number.isSafeInteger(payload.frameStart)) || (payload.frameEnd !== undefined && !Number.isSafeInteger(payload.frameEnd)) || (payload.frameStart !== undefined && payload.frameEnd !== undefined && payload.frameStart > payload.frameEnd) || (payload.step !== undefined && (!Number.isSafeInteger(payload.step) || payload.step < 1 || payload.step > 1000))) throw report("RENDER_PROPERTY_INVALID", "renderAnimation range is invalid"); + return; + } + if (payload.type === "setRenderPasses") { + const scene = currentSnapshot?.scenes.find((candidate) => candidate.id === payload.dataId); + if (!scene || typeof payload.layerName !== "string" || payload.layerName.length === 0 || !validPropertyKeys(payload.passes, ["passMask", "cryptomatteMask", "cryptomatteLevels", "alphaThreshold"])) throw report("RENDER_PROPERTY_INVALID", "setRenderPasses target or passes are invalid"); + for (const field of ["passMask", "cryptomatteMask"] as const) if (payload.passes[field] !== undefined && (!Number.isSafeInteger(payload.passes[field]) || payload.passes[field] < 0 || payload.passes[field] > 0x7fffffff)) throw report("RENDER_PROPERTY_INVALID", `setRenderPasses ${field} is outside the bounded range`); + if (payload.passes.cryptomatteLevels !== undefined && (!Number.isSafeInteger(payload.passes.cryptomatteLevels) || payload.passes.cryptomatteLevels < 1 || payload.passes.cryptomatteLevels > 16)) throw report("RENDER_PROPERTY_INVALID", "setRenderPasses cryptomatteLevels is invalid"); + if (payload.passes.alphaThreshold !== undefined && !boundedNumber(payload.passes.alphaThreshold, 0, 1)) throw report("RENDER_PROPERTY_INVALID", "setRenderPasses alphaThreshold is invalid"); + return; + } + if (payload.type === "setCameraView") { + if (!currentSnapshot?.scenes.some((scene) => scene.id === payload.dataId) || (payload.cameraObjectId !== null && (typeof payload.cameraObjectId !== "string" || !currentSnapshot?.nodes.some((node) => node.id === payload.cameraObjectId && node.type === "CAMERA")))) throw report("RENDER_PROPERTY_INVALID", "setCameraView target is invalid"); + return; + } + if (payload.type === "setLightLinking") { + if (typeof payload.dataId !== "string" || payload.dataId.length === 0 || (payload.target !== undefined && payload.target !== "OBJECT" && payload.target !== "WORLD") || (payload.lightgroup !== null && (typeof payload.lightgroup !== "string" || payload.lightgroup.length === 0 || new TextEncoder().encode(payload.lightgroup).byteLength > 63))) throw report("RENDER_PROPERTY_INVALID", "setLightLinking target is invalid"); + return; + } + if (payload.type === "meshSubdivide" || payload.type === "meshTriangulate" || + payload.type === "meshRecalculateNormals" || payload.type === "meshBridgeLoops" || + payload.type === "meshDeleteElements" || payload.type === "meshUVProject") { + if (typeof payload.meshId !== "string" || payload.meshId.length === 0) { + throw report("INVALID_ARGUMENT", `${payload.type} requires meshId`, true); + } + const indices = "faceIndices" in payload + ? payload.faceIndices + : "edgeIndices" in payload + ? payload.edgeIndices + : payload.elementIndices; + if (!Array.isArray(indices) || indices.some((index) => !Number.isSafeInteger(index) || index < 0)) { + throw report("INVALID_ARGUMENT", `${payload.type} contains invalid typed selection indices`, true); + } + if ((payload.type === "meshSubdivide" || payload.type === "meshDeleteElements") && + !["VERT", "EDGE", "FACE"].includes(payload.selectionMode)) { + throw report("INVALID_ARGUMENT", `${payload.type} contains an invalid selection mode`, true); + } + if (payload.type === "meshUVProject" && !["PLANAR", "CUBE", "CYLINDER", "SPHERE"].includes(payload.method)) { + throw report("INVALID_ARGUMENT", "meshUVProject contains an unsupported projection method", true); + } + } if (payload.type === "createAction") { if (typeof payload.name !== "string" || payload.name.trim().length === 0 || payload.name.length > 256) throw report("ANIMATION_ACTION_INVALID", "Action name is required"); if (payload.objectId !== undefined && typeof payload.objectId !== "string") throw report("ANIMATION_ACTION_INVALID", "Action objectId is invalid"); @@ -293,6 +340,27 @@ function assertFutureCapability(payload: Extract typeof value === "number" && Number.isFinite(value)))) throw report("ANIMATION_KEYFRAME_INVALID", "Keyframe value is invalid"); for (const handle of [payload.handleLeft, payload.handleRight]) if (handle !== undefined && (!Array.isArray(handle) || handle.length !== 2 || !handle.every((value) => typeof value === "number" && Number.isFinite(value)))) throw report("ANIMATION_KEYFRAME_INVALID", "Keyframe handle is invalid"); } + if (payload.type === "setFCurveKeyframes") { + if (typeof payload.animationId !== "string" || payload.animationId.length === 0 || typeof payload.path !== "string" || payload.path.length === 0 || !Array.isArray(payload.points) || payload.points.length === 0 || payload.points.length > 4096) throw report("ANIMATION_FCURVE_INVALID", "FCurve points are invalid"); + for (const point of payload.points) { + if (!point || !Number.isFinite(point.frame) || !Number.isFinite(point.value)) throw report("ANIMATION_FCURVE_INVALID", "FCurve point coordinates are invalid"); + for (const handle of [point.handleLeft, point.handleRight]) if (handle !== undefined && (!Array.isArray(handle) || handle.length !== 2 || !handle.every((value) => typeof value === "number" && Number.isFinite(value)))) throw report("ANIMATION_FCURVE_INVALID", "FCurve handle is invalid"); + } + } + if (payload.type === "setDriverExpression") { + if (typeof payload.animationId !== "string" || payload.animationId.length === 0 || typeof payload.path !== "string" || payload.path.length === 0 || typeof payload.expression !== "string" || payload.expression.length > 256) throw report("ANIMATION_DRIVER_INVALID", "Driver expression is invalid"); + } + if (payload.type === "setActionGroups") { + if (typeof payload.animationId !== "string" || payload.animationId.length === 0 || !Array.isArray(payload.groups) || payload.groups.length > 128) throw report("ANIMATION_GROUP_INVALID", "Action groups are invalid"); + for (const group of payload.groups) if (!group || typeof group.name !== "string" || group.name.trim().length === 0 || group.name.length > 64 || !Array.isArray(group.paths) || group.paths.length > 4096 || group.paths.some((path) => typeof path !== "string" || path.length === 0 || path.length > 256)) throw report("ANIMATION_GROUP_INVALID", "Action group entries are invalid"); + } + if (payload.type === "setKeyingSet") { + if (typeof payload.sceneId !== "string" || payload.sceneId.length === 0 || typeof payload.name !== "string" || payload.name.trim().length === 0 || payload.name.length > 64 || !Array.isArray(payload.paths) || payload.paths.length > 4096) throw report("ANIMATION_KEYING_SET_INVALID", "Keying Set is invalid"); + if (payload.paths.some((path) => !path || typeof path.path !== "string" || path.path.length === 0 || path.path.length > 256 || (path.arrayIndex !== undefined && (!Number.isSafeInteger(path.arrayIndex) || path.arrayIndex < -1 || path.arrayIndex > 64)))) throw report("ANIMATION_KEYING_SET_INVALID", "Keying Set paths are invalid"); + } + if (payload.type === "bakeAnimation") { + if (typeof payload.objectId !== "string" || payload.objectId.length === 0 || !Number.isSafeInteger(payload.frameStart) || !Number.isSafeInteger(payload.frameEnd) || payload.frameStart > payload.frameEnd || payload.frameEnd - payload.frameStart > 100000 || (payload.step !== undefined && (!Number.isSafeInteger(payload.step) || payload.step < 1 || payload.step > 1000))) throw report("ANIMATION_BAKE_INVALID", "Bake range is invalid"); + } if (payload.type === "setTimelineMarkers") { if (typeof payload.dataId !== "string" || !Array.isArray(payload.markers) || payload.markers.length > 10000 || payload.markers.some((marker) => !marker || !Number.isFinite(marker.frame) || typeof marker.name !== "string" || marker.name.length > 256)) throw report("ANIMATION_MARKER_INVALID", "Timeline markers are invalid"); } @@ -349,6 +417,30 @@ function assertFutureCapability(payload: Extract 1024)) throw report("NON_MESH_PROPERTY_INVALID", "Curve resolution must be between 1 and 1024"); return; } + case "setCurveBevel": { + const data = currentSnapshot?.nonMeshData?.find((candidate) => candidate.id === payload.dataId); + if (!data || data.type !== "CURVE") throw report("NON_MESH_DATA_UNSUPPORTED", `Curve data block is unavailable: ${payload.dataId}`); + if (payload.bevelDepth !== undefined && (!Number.isFinite(payload.bevelDepth) || payload.bevelDepth < 0 || payload.bevelDepth > 100000)) throw report("NON_MESH_PROPERTY_INVALID", "Curve bevel depth is outside the bounded range"); + for (const value of [payload.bevelFactorStart, payload.bevelFactorEnd]) { + if (value !== undefined && (!Number.isFinite(value) || value < 0 || value > 1)) throw report("NON_MESH_PROPERTY_INVALID", "Curve bevel factors must be between 0 and 1"); + } + if (payload.bevelFactorStart !== undefined && payload.bevelFactorEnd !== undefined && payload.bevelFactorStart > payload.bevelFactorEnd) throw report("NON_MESH_PROPERTY_INVALID", "Curve bevel factor range is invalid"); + if (payload.bevelResolution !== undefined && (!Number.isSafeInteger(payload.bevelResolution) || payload.bevelResolution < 0 || payload.bevelResolution > 64)) throw report("NON_MESH_PROPERTY_INVALID", "Curve bevel resolution must be between 0 and 64"); + break; + } + case "setCurveTaper": { + const data = currentSnapshot?.nonMeshData?.find((candidate) => candidate.id === payload.dataId); + if (!data || data.type !== "CURVE") throw report("NON_MESH_DATA_UNSUPPORTED", `Curve data block is unavailable: ${payload.dataId}`); + if (payload.taperObjectId !== null && (typeof payload.taperObjectId !== "string" || payload.taperObjectId.length === 0 || payload.taperObjectId.length > 63)) throw report("NON_MESH_PROPERTY_INVALID", "Curve taper object identity is invalid"); + if (payload.taperRadiusMode !== undefined && (!Number.isSafeInteger(payload.taperRadiusMode) || payload.taperRadiusMode < 0 || payload.taperRadiusMode > 2)) throw report("NON_MESH_PROPERTY_INVALID", "Curve taper radius mode is invalid"); + break; + } + case "convertCurveType": { + const data = currentSnapshot?.nonMeshData?.find((candidate) => candidate.id === payload.dataId); + if (!data || (data.type !== "CURVE" && data.type !== "SURFACE")) throw report("NON_MESH_DATA_UNSUPPORTED", `Curve or surface data block is unavailable: ${payload.dataId}`); + if (payload.targetType !== "CURVE" && payload.targetType !== "SURFACE") throw report("NON_MESH_PROPERTY_INVALID", "Curve target type is invalid"); + break; + } case "setCurveHandle": { const data = currentSnapshot?.nonMeshData?.find((candidate) => candidate.id === payload.dataId); if (!data || data.type !== "CURVE" || !data.handlePoints) throw report("NON_MESH_DATA_UNSUPPORTED", `N-015 Bezier data block is unavailable: ${payload.dataId}`); @@ -412,6 +504,12 @@ function assertFutureCapability(payload: Extract 1_000_000 || !Array.isArray(payload.controlPoints) || payload.controlPoints.length !== pointCount * 3 || payload.controlPoints.some((value) => !Number.isFinite(value)) || !Array.isArray(payload.pointWeights) || payload.pointWeights.length !== pointCount || payload.pointWeights.some((value) => !Number.isFinite(value) || value <= 0 || value > 1_000_000)) throw report("NON_MESH_DATA_BUDGET_EXCEEDED", "Surface control grid exceeds the finite 1M point budget"); return; } + case "setSurfaceResolution": { + const data = currentSnapshot?.nonMeshData?.find((candidate) => candidate.id === payload.dataId); + if (!data || data.type !== "SURFACE") throw report("NON_MESH_DATA_UNSUPPORTED", `Surface data block is unavailable: ${payload.dataId}`); + if (!Number.isSafeInteger(payload.resolutionU) || payload.resolutionU < 1 || payload.resolutionU > 1024 || (payload.resolutionV !== undefined && (!Number.isSafeInteger(payload.resolutionV) || payload.resolutionV < 1 || payload.resolutionV > 1024))) throw report("NON_MESH_PROPERTY_INVALID", "Surface resolution must be between 1 and 1024"); + break; + } case "setFontBody": { const data = currentSnapshot?.nonMeshData?.find((candidate) => candidate.id === payload.dataId); if (!data || data.type !== "FONT") throw report("NON_MESH_DATA_UNSUPPORTED", `N-015 font data block is unavailable: ${payload.dataId}`); @@ -518,6 +616,25 @@ function assertFutureCapability(payload: Extract 1024) throw report("ARMATURE_EDIT_INVALID", "Armature edit operations must contain between 1 and 1024 entries"); + for (const operation of payload.operations) { + if (!["ADD", "DELETE", "RENAME", "EXTRUDE", "DUPLICATE"].includes(operation.operation)) throw report("ARMATURE_EDIT_INVALID", "Armature edit operation is unsupported"); + } + return; + } + case "setBoneRoll": + if (!Number.isFinite(payload.roll)) throw report("ARMATURE_ROLL_INVALID", "Bone roll must be finite"); + return; + case "setBoneSymmetry": + if (typeof payload.enabled !== "boolean") throw report("ARMATURE_SYMMETRY_INVALID", "Armature symmetry requires a boolean state"); + return; + case "setBoneParenting": + if (typeof payload.boneName !== "string" || (payload.parentName !== null && typeof payload.parentName !== "string") || typeof payload.connected !== "boolean") throw report("ARMATURE_PARENT_INVALID", "Bone parenting fields are invalid"); + return; + case "setPoseConstraint": + if (typeof payload.boneName !== "string" || typeof payload.constraintName !== "string" || (payload.constraintType !== null && !["COPY_LOCATION", "COPY_ROTATION", "COPY_SCALE", "IK", "TRACK_TO"].includes(payload.constraintType)) || (payload.influence !== undefined && (!Number.isFinite(payload.influence) || payload.influence < 0 || payload.influence > 1))) throw report("POSE_CONSTRAINT_INVALID", "Pose constraint fields are invalid"); + return; case "setMetaballElements": { const data = currentSnapshot?.nonMeshData?.find((candidate) => candidate.id === payload.dataId); if (!data || data.type !== "METABALL") throw report("NON_MESH_DATA_UNSUPPORTED", `N-015 Metaball data block is unavailable: ${payload.dataId}`); @@ -559,7 +676,8 @@ function assertFutureCapability(payload: Extract 1_000_000)) throw report("GREASE_PENCIL_SCHEMA_INVALID", "Grease Pencil frame duration is invalid"); return; } - case "setGreasePencilStrokes": { + case "setGreasePencilStrokes": + case "setGreasePencilDrawing": { if (typeof payload.dataId !== "string" || typeof payload.layerId !== "string" || !Number.isSafeInteger(payload.frame) || payload.frame < -1_000_000 || payload.frame > 1_000_000 || !Array.isArray(payload.strokes) || payload.strokes.length > 1_000_000) throw report("GREASE_PENCIL_SCHEMA_INVALID", "Grease Pencil stroke transaction is invalid"); if (payload.baseRevision !== undefined && payload.baseRevision !== currentSnapshot?.revision) throw report("REVISION_CONFLICT", "Grease Pencil stroke base revision does not match the current SceneIR"); let points = 0; @@ -573,6 +691,21 @@ function assertFutureCapability(payload: Extract 1_000_000 || !Number.isSafeInteger(payload.materialIndex) || payload.materialIndex < 0 || payload.materialIndex > 32767 || (payload.strokeIndices !== undefined && (!Array.isArray(payload.strokeIndices) || payload.strokeIndices.some((index) => !Number.isSafeInteger(index) || index < 0)))) throw report("GREASE_PENCIL_SCHEMA_INVALID", "Grease Pencil material edit is invalid"); + if (payload.baseRevision !== undefined && payload.baseRevision !== currentSnapshot?.revision) throw report("REVISION_CONFLICT", "Grease Pencil material base revision does not match the current SceneIR"); + return; + } + case "setGreasePencilSelection": { + if (typeof payload.dataId !== "string" || typeof payload.layerId !== "string" || !Number.isSafeInteger(payload.frame) || payload.frame < -1_000_000 || payload.frame > 1_000_000 || (payload.pointIndices !== undefined && (!Array.isArray(payload.pointIndices) || payload.pointIndices.some((index) => !Number.isSafeInteger(index) || index < 0))) || (payload.strokeIndices !== undefined && (!Array.isArray(payload.strokeIndices) || payload.strokeIndices.some((index) => !Number.isSafeInteger(index) || index < 0))) || (payload.mode !== undefined && !["REPLACE", "ADD", "SUBTRACT", "TOGGLE"].includes(payload.mode))) throw report("GREASE_PENCIL_SCHEMA_INVALID", "Grease Pencil selection edit is invalid"); + if (payload.baseRevision !== undefined && payload.baseRevision !== currentSnapshot?.revision) throw report("REVISION_CONFLICT", "Grease Pencil selection base revision does not match the current SceneIR"); + return; + } + case "setGreasePencilInterpolate": { + if (typeof payload.dataId !== "string" || typeof payload.layerId !== "string" || !Number.isSafeInteger(payload.sourceFrame) || !Number.isSafeInteger(payload.targetFrame) || payload.sourceFrame < -1_000_000 || payload.sourceFrame > 1_000_000 || payload.targetFrame < -1_000_000 || payload.targetFrame > 1_000_000 || payload.sourceFrame === payload.targetFrame || !Number.isFinite(payload.factor) || payload.factor < 0 || payload.factor > 1) throw report("GREASE_PENCIL_SCHEMA_INVALID", "Grease Pencil interpolation edit is invalid"); + if (payload.baseRevision !== undefined && payload.baseRevision !== currentSnapshot?.revision) throw report("REVISION_CONFLICT", "Grease Pencil interpolation base revision does not match the current SceneIR"); + return; + } case "setVertexColors": { const mesh = currentSnapshot?.meshes.find((candidate) => candidate.id === payload.meshId); const domainCount = payload.domain === "POINT" ? mesh?.vertexCount : payload.domain === "CORNER" ? mesh?.cornerCount : undefined; @@ -852,6 +985,22 @@ function assertFutureCapability(payload: Extract 1_000_000) throw report("TRACKING_SCHEMA_INVALID", "Tracking markers are invalid"); + return; + } + case "setTrackingSolve": { + if (typeof payload.clipId !== "string" || payload.clipId.length === 0 || !payload.solve || typeof payload.solve !== "object") throw report("TRACKING_SCHEMA_INVALID", "Tracking solve settings are invalid"); + return; + } + case "setMaskSpline": { + if (typeof payload.maskId !== "string" || payload.maskId.length === 0 || typeof payload.layerId !== "string" || payload.layerId.length === 0 || !payload.spline || typeof payload.spline !== "object" || !Array.isArray(payload.spline.points) || payload.spline.points.length < 2 || payload.spline.points.length > 1_000_000) throw report("MASK_SCHEMA_INVALID", "Mask spline is invalid"); + return; + } + case "setMaskPoint": { + if (typeof payload.maskId !== "string" || payload.maskId.length === 0 || typeof payload.layerId !== "string" || payload.layerId.length === 0 || typeof payload.splineId !== "string" || payload.splineId.length === 0 || !payload.point || typeof payload.point !== "object") throw report("MASK_SCHEMA_INVALID", "Mask point is invalid"); + return; + } case "setSceneStampSettings": { const scene = currentSnapshot?.scenes.find((candidate) => candidate.id === payload.dataId); const properties = payload.properties; @@ -898,6 +1047,39 @@ function assertFutureCapability(payload: Extract 63 || names.has(name)) throw report("RENDER_PROPERTY_INVALID", "Scene lightgroup names must be unique and bounded"); names.add(name); } return; } + case "clearObjectTransform": { + if (!currentSnapshot?.nodes.some((candidate) => candidate.id === payload.objectId) || + !Array.isArray(payload.channels) || payload.channels.length === 0 || payload.channels.length > 3 || + new Set(payload.channels).size !== payload.channels.length || + payload.channels.some((channel) => !["LOCATION", "ROTATION", "SCALE"].includes(channel))) { + throw report("OBJECT_EDITOR_INVALID", "Object transform clear target or channels are invalid"); + } + return; + } + case "createObjectData": { + if (!["CAMERA", "LIGHT", "EMPTY", "ARMATURE"].includes(payload.objectType) || + (payload.name !== undefined && (typeof payload.name !== "string" || payload.name.length === 0 || new TextEncoder().encode(payload.name).byteLength > 63))) { + throw report("OBJECT_EDITOR_INVALID", "Object data type or name is invalid"); + } + return; + } + case "setObjectSelection": { + if (!currentSnapshot?.nodes.some((candidate) => candidate.id === payload.objectId) || + typeof payload.selected !== "boolean" || + (payload.active !== undefined && typeof payload.active !== "boolean") || (payload.active === true && !payload.selected)) { + throw report("OBJECT_EDITOR_INVALID", "Object selection target or state is invalid"); + } + return; + } + case "setCollectionVisibility": { + if (!currentSnapshot?.collections.some((candidate) => candidate.id === payload.collectionId) || + (payload.viewportVisible === undefined && payload.renderVisible === undefined) || + (payload.viewportVisible !== undefined && typeof payload.viewportVisible !== "boolean") || + (payload.renderVisible !== undefined && typeof payload.renderVisible !== "boolean")) { + throw report("OBJECT_EDITOR_INVALID", "Collection visibility target or state is invalid"); + } + return; + } case "setObjectLightgroup": { const object = currentSnapshot?.nodes.find((candidate) => candidate.id === payload.objectId); if (!object || typeof payload.lightgroup !== "string" && payload.lightgroup !== null) throw report("RENDER_PROPERTY_INVALID", "Object lightgroup target is invalid"); @@ -956,6 +1138,34 @@ function assertFutureCapability(payload: Extract candidate.id === payload.sceneId); + if (!scene || typeof payload.stripId !== "string" || payload.stripId.length === 0 || !Array.isArray(payload.modifiers) || payload.modifiers.length > 128) throw report("SEQUENCER_SCHEMA_INVALID", "Sequencer modifier target is invalid"); + for (const modifier of payload.modifiers) { + if (!modifier || typeof modifier.id !== "string" || modifier.id.length === 0 || modifier.id.length > 128 || typeof modifier.type !== "string" || modifier.type.length === 0 || modifier.type.length > 128) throw report("SEQUENCER_SCHEMA_INVALID", "Sequencer modifier identity is invalid"); + if (modifier.enabled !== undefined && typeof modifier.enabled !== "boolean") throw report("SEQUENCER_SCHEMA_INVALID", "Sequencer modifier enabled flag is invalid"); + if (modifier.properties !== undefined && (!modifier.properties || typeof modifier.properties !== "object" || Array.isArray(modifier.properties))) throw report("SEQUENCER_SCHEMA_INVALID", "Sequencer modifier properties are invalid"); + } + return; + } + case "setSequencerTransitions": { + if (!currentSnapshot?.scenes.some((candidate) => candidate.id === payload.sceneId)) throw report("SEQUENCER_SCHEMA_INVALID", "Sequencer transition scene is invalid"); + parseSequencerTimeline(payload.timeline); + return; + } + case "setSequencerColorBalance": { + if (!currentSnapshot?.scenes.some((candidate) => candidate.id === payload.sceneId) || typeof payload.stripId !== "string" || payload.stripId.length === 0) throw report("SEQUENCER_SCHEMA_INVALID", "Sequencer color balance target is invalid"); + const balance = payload.colorBalance; + if (!balance || !Array.isArray(balance.lift) || balance.lift.length !== 3 || !Array.isArray(balance.gamma) || balance.gamma.length !== 3 || !Array.isArray(balance.gain) || balance.gain.length !== 3 || [...balance.lift, ...balance.gamma, ...balance.gain].some((value) => typeof value !== "number" || !Number.isFinite(value))) throw report("SEQUENCER_SCHEMA_INVALID", "Sequencer color balance channels are invalid"); + for (const field of ["exposure", "contrast", "saturation"] as const) if (balance[field] !== undefined && !boundedNumber(balance[field], -100, 100)) throw report("SEQUENCER_SCHEMA_INVALID", `Sequencer color balance ${field} is invalid`); + return; + } + case "setCompositorNodeGraph": { + if (!currentSnapshot?.scenes.some((candidate) => candidate.id === payload.sceneId) || !payload.graph || typeof payload.graph !== "object") throw report("COMPOSITOR_GRAPH_INVALID", "Compositor graph target is invalid"); + const graph = payload.graph as Record; + if (graph.schemaVersion !== 1 || typeof graph.id !== "string" || graph.id.length === 0 || !Array.isArray(graph.nodes) || !Array.isArray(graph.links) || graph.nodes.length > 4096 || graph.links.length > 16384) throw report("COMPOSITOR_GRAPH_INVALID", "Compositor graph schema or bounds are invalid"); + return; + } case "setSequencerStrips": { const scene = currentSnapshot?.scenes.find((candidate) => candidate.id === payload.sceneId); if (!scene) throw report("SEQUENCER_SCHEMA_INVALID", `Sequencer scene does not exist: ${payload.sceneId}`); @@ -1090,8 +1300,32 @@ function callUnifiedJson(cmd: string, params: Record = {}, t } type WebEngineRouteJsonCommand = WebEngineJsonCommand | "importScene" | "exportScene"; -const READ_ONLY_JSON_COMMANDS: ReadonlySet = new Set(["snapshot", "delta", "depsgraph", "memoryStats", "listBlenderOperators", "exportScene"]); -const STATEFUL_JSON_COMMANDS: ReadonlySet = new Set(["applyCommand", "undo", "redo", "invokeBlenderOperator", "importScene"]); +const READ_ONLY_JSON_COMMANDS: ReadonlySet = new Set(["snapshot", "delta", "depsgraph", "memoryStats", "listBlenderOperators", "exportScene", "listRNADataBlocks", "readRNAProperties", "listRNACollections"]); +const STATEFUL_JSON_COMMANDS: ReadonlySet = new Set(["applyCommand", "undo", "redo", "invokeBlenderOperator", "importScene", "assetMark", "assetCatalog", "libraryLink", "libraryOverride", "libraryReload", "setRNAProperty"]); + +function validateRNAParams(command: WebEngineRouteJsonCommand, value: unknown): void { + if (typeof value !== "object" || value === null || Array.isArray(value)) throw report("INVALID_ARGUMENT", `${command} requires an object params payload`, true); + const params = value as Record; + const allowed = command === "listRNADataBlocks" ? ["type", "dataBlockType", "editableOnly", "limit"] : command === "setRNAProperty" ? ["type", "dataBlockType", "name", "dataBlockName", "property", "propertyIdentifier", "value", "baseRevision"] : ["type", "dataBlockType", "name", "dataBlockName", "limit"]; + if (Object.keys(params).some((key) => !allowed.includes(key))) throw report("INVALID_ARGUMENT", `${command} received an unknown parameter`, true); + const type = params.type ?? params.dataBlockType; + const name = params.name ?? params.dataBlockName; + const property = params.property ?? params.propertyIdentifier; + if (type !== undefined && (typeof type !== "string" || type.length === 0 || type.length > 96)) throw report("INVALID_ARGUMENT", `${command} requires a bounded data-block type`, true); + if (name !== undefined && (typeof name !== "string" || name.length === 0 || name.length > 256)) throw report("INVALID_ARGUMENT", `${command} requires a bounded data-block name`, true); + if (property !== undefined && (typeof property !== "string" || property.length === 0 || property.length > 128)) throw report("INVALID_ARGUMENT", `${command} requires a bounded RNA property identifier`, true); + if (params.limit !== undefined && (!Number.isSafeInteger(params.limit) || (params.limit as number) < 1 || (params.limit as number) > 1024)) throw report("INVALID_ARGUMENT", `${command} limit is outside the bounded reflection budget`, true); + if (params.editableOnly !== undefined && typeof params.editableOnly !== "boolean") throw report("INVALID_ARGUMENT", `${command} editableOnly must be boolean`, true); + if (command === "setRNAProperty" && (property === undefined || !Object.prototype.hasOwnProperty.call(params, "value"))) throw report("INVALID_ARGUMENT", "setRNAProperty requires property and value", true); + if (params.baseRevision !== undefined && (!Number.isSafeInteger(params.baseRevision) || (params.baseRevision as number) < 0)) throw report("REVISION_CONFLICT", "setRNAProperty baseRevision must be non-negative", true); + const valueIsSafe = (candidate: unknown, depth = 0): boolean => { + if (depth > 4 || candidate === null || typeof candidate === "string" || typeof candidate === "boolean") return candidate === null || typeof candidate !== "string" || candidate.length <= 4096; + if (typeof candidate === "number") return Number.isFinite(candidate); + if (Array.isArray(candidate)) return candidate.length <= 64 && candidate.every((item) => valueIsSafe(item, depth + 1)); + return false; + }; + if (command === "setRNAProperty" && !valueIsSafe(params.value)) throw report("INVALID_ARGUMENT", "setRNAProperty value must be bounded scalar JSON", true); +} function readSnapshot(): ReturnType { const snapshot = parseSceneSnapshotIR(callUnifiedJson("snapshot")); @@ -1585,6 +1819,15 @@ async function handleRequest(event: MessageEvent): Promise, "type" | "animationId" | "path" | "frame"> = {}): AnimationCommand<"setKeyframe"> { return { type: "setKeyframe", animationId, path, frame, ...options }; }, + setFCurveKeyframes(animationId: string, path: string, points: AnimationCommand<"setFCurveKeyframes">["points"]): AnimationCommand<"setFCurveKeyframes"> { + return { type: "setFCurveKeyframes", animationId, path, points: points.map((point) => ({ ...point, handleLeft: point.handleLeft ? [...point.handleLeft] as [number, number] : undefined, handleRight: point.handleRight ? [...point.handleRight] as [number, number] : undefined })) }; + }, + setDriverExpression(animationId: string, path: string, expression: string): AnimationCommand<"setDriverExpression"> { + return { type: "setDriverExpression", animationId, path, expression }; + }, + setActionGroups(animationId: string, groups: AnimationCommand<"setActionGroups">["groups"]): AnimationCommand<"setActionGroups"> { + return { type: "setActionGroups", animationId, groups: groups.map((group) => ({ name: group.name, paths: [...group.paths] })) }; + }, + setKeyingSet(sceneId: string, name: string, paths: AnimationCommand<"setKeyingSet">["paths"], active = true): AnimationCommand<"setKeyingSet"> { + return { type: "setKeyingSet", sceneId, name, paths: paths.map((path) => ({ ...path })), active }; + }, + bakeAnimation(objectId: string, frameStart: number, frameEnd: number, step = 1): AnimationCommand<"bakeAnimation"> { + return { type: "bakeAnimation", objectId, frameStart, frameEnd, step }; + }, setTimelineMarkers(dataId: string, markers: AnimationCommand<"setTimelineMarkers">["markers"]): AnimationCommand<"setTimelineMarkers"> { return { type: "setTimelineMarkers", dataId, markers: markers.map((marker) => ({ ...marker })) }; }, diff --git a/web/protocol/asset-library-io.ts b/web/protocol/asset-library-io.ts index 1190bf423..d4cf79842 100644 --- a/web/protocol/asset-library-io.ts +++ b/web/protocol/asset-library-io.ts @@ -171,10 +171,61 @@ export function gateIORequest(value: unknown): CapabilityGateResult { } export function gateLibraryMutation(operation: "CATALOG_EDIT" | "APPEND" | "LINK" | "OVERRIDE" | "RELOAD" | "RELOCATE"): CapabilityGateResult { - if (operation === "CATALOG_EDIT") return readyGate("N-023", operation); + if (["CATALOG_EDIT", "APPEND", "LINK", "OVERRIDE", "RELOAD"].includes(operation)) return readyGate("N-023", operation); return blockedGate("N-023", operation, [capabilityIssue("LIBRARY_MUTATION_UNAVAILABLE", `${operation} requires a real Blender Main transaction`)]); } +export type AssetLibraryCommandName = "assetMark" | "assetCatalog" | "libraryLink" | "libraryOverride" | "libraryReload"; + +export interface AssetLibraryCommandIR { + command: AssetLibraryCommandName; + params: Record; +} + +const ASSET_LIBRARY_COMMANDS = new Set(["assetMark", "assetCatalog", "libraryLink", "libraryOverride", "libraryReload"]); + +function boundedId(value: unknown, name: string): string { + return text(value, name, 256); +} + +function boundedTags(value: unknown): string[] { + if (value === undefined) return []; + if (!Array.isArray(value) || value.length > ASSET_LIBRARY_BUDGET.maxTagsPerAsset) throw new AssetLibraryValidationError("ASSET_MANIFEST_INVALID", "tags are invalid"); + return value.map((tag, index) => text(tag, `tags[${index}]`, 64)); +} + +/** Validate browser-originated asset/library commands before they cross into WASM. */ +export function parseAssetLibraryCommand(command: string, value: unknown): AssetLibraryCommandIR { + if (!ASSET_LIBRARY_COMMANDS.has(command as AssetLibraryCommandName) || !record(value)) throw new AssetLibraryValidationError("ASSET_MANIFEST_INVALID", "Unsupported asset/library command"); + const name = command as AssetLibraryCommandName; + const params: Record = { ...value }; + if (name === "assetMark") { + params.dataId = boundedId(params.dataId, "dataId"); + params.catalogId = params.catalogId === undefined || params.catalogId === null ? null : boundedId(params.catalogId, "catalogId"); + params.tags = boundedTags(params.tags); + params.marked = params.marked === undefined ? true : params.marked; + if (typeof params.marked !== "boolean") throw new AssetLibraryValidationError("ASSET_MANIFEST_INVALID", "marked is invalid"); + } + else if (name === "assetCatalog") { + const operation = params.operation === undefined ? "LIST" : params.operation; + if (!["LIST", "UPSERT", "REMOVE"].includes(operation as string)) throw new AssetLibraryValidationError("ASSET_MANIFEST_INVALID", "catalog operation is invalid"); + params.operation = operation; + if (operation !== "LIST") { + params.catalogId = boundedId(params.catalogId, "catalogId"); + if (operation === "UPSERT") { + params.name = text(params.name, "name", 256); + params.parentId = params.parentId === undefined || params.parentId === null ? null : boundedId(params.parentId, "parentId"); + } + } + } + else { + params.libraryId = boundedId(params.libraryId, "libraryId"); + if (name === "libraryLink" || params.sourcePath !== undefined) params.sourcePath = projectPath(params.sourcePath, "sourcePath", "IO_EXTERNAL_URI_BLOCKED"); + if (name === "libraryLink" || name === "libraryOverride") params.dataId = boundedId(params.dataId, "dataId"); + } + return { command: name, params }; +} + export function assetStorageCapabilities(scope: typeof globalThis = globalThis): { contentAddressedIndex: "LOCAL_BOUNDED"; opfs: "PROBE_REQUIRED" | "UNAVAILABLE" } { const storage = (scope.navigator as Navigator & { storage?: { getDirectory?: unknown } } | undefined)?.storage; return { contentAddressedIndex: "LOCAL_BOUNDED", opfs: storage && typeof storage.getDirectory === "function" ? "PROBE_REQUIRED" : "UNAVAILABLE" }; diff --git a/web/protocol/compositor-commands.ts b/web/protocol/compositor-commands.ts index eb46b1b1f..30db79b89 100644 --- a/web/protocol/compositor-commands.ts +++ b/web/protocol/compositor-commands.ts @@ -5,4 +5,7 @@ export const compositorCommands = Object.freeze({ evaluate(graph: CompositorGraphIR): CompositorGraphIR { return structuredClone(graph); }, + setNodeGraph(sceneId: string, graph: CompositorGraphIR) { + return { type: "setCompositorNodeGraph", sceneId, graph } as const; + }, } as const); diff --git a/web/protocol/mesh-authoring-commands.ts b/web/protocol/mesh-authoring-commands.ts index 41553bf8d..f8e79e67e 100644 --- a/web/protocol/mesh-authoring-commands.ts +++ b/web/protocol/mesh-authoring-commands.ts @@ -17,6 +17,24 @@ export const meshAuthoringCommands = Object.freeze({ ...(options.segments === undefined ? {} : { segments: options.segments }), }; }, + meshSubdivide(meshId: string, selectionMode: MeshElementMode, elementIndices: readonly number[], segments = 1): MeshCommand<"meshSubdivide"> { + return { type: "meshSubdivide", meshId, selectionMode, elementIndices: [...elementIndices], segments: Math.max(1, Math.min(64, Math.trunc(segments))) }; + }, + meshTriangulate(meshId: string, faceIndices: readonly number[]): MeshCommand<"meshTriangulate"> { + return { type: "meshTriangulate", meshId, faceIndices: [...faceIndices] }; + }, + meshRecalculateNormals(meshId: string, faceIndices: readonly number[]): MeshCommand<"meshRecalculateNormals"> { + return { type: "meshRecalculateNormals", meshId, faceIndices: [...faceIndices] }; + }, + meshBridgeLoops(meshId: string, edgeIndices: readonly number[]): MeshCommand<"meshBridgeLoops"> { + return { type: "meshBridgeLoops", meshId, edgeIndices: [...edgeIndices] }; + }, + meshDeleteElements(meshId: string, selectionMode: MeshElementMode, elementIndices: readonly number[]): MeshCommand<"meshDeleteElements"> { + return { type: "meshDeleteElements", meshId, selectionMode, elementIndices: [...elementIndices] }; + }, + meshUVProject(meshId: string, faceIndices: readonly number[], method: "PLANAR" | "CUBE" | "CYLINDER" | "SPHERE" = "PLANAR", seamEdgeIndices: readonly number[] = []): MeshCommand<"meshUVProject"> { + return { type: "meshUVProject", meshId, faceIndices: [...faceIndices], method, ...(seamEdgeIndices.length ? { seamEdgeIndices: [...seamEdgeIndices] } : {}) }; + }, decimate(meshId: string, profile: SimplifyProfile): MeshCommand<"decimateMesh"> { return { type: "decimateMesh", meshId, profile }; }, diff --git a/web/protocol/nonmesh-geometry-commands.ts b/web/protocol/nonmesh-geometry-commands.ts index 7be631964..6e771535f 100644 --- a/web/protocol/nonmesh-geometry-commands.ts +++ b/web/protocol/nonmesh-geometry-commands.ts @@ -13,6 +13,15 @@ export const nonMeshGeometryCommands = Object.freeze({ setCurveControlPoints(dataId: string, controlPoints: readonly number[], splineOffsets?: readonly number[], resolution?: number): NonMeshCommand<"setCurveControlPoints"> { return { type: "setCurveControlPoints", dataId, controlPoints: [...controlPoints], ...(splineOffsets ? { splineOffsets: [...splineOffsets] } : {}), ...(resolution === undefined ? {} : { resolution }) }; }, + setCurveBevel(dataId: string, bevelDepth?: number, bevelResolution?: number, bevelFactorStart?: number, bevelFactorEnd?: number): NonMeshCommand<"setCurveBevel"> { + return { type: "setCurveBevel", dataId, ...(bevelDepth === undefined ? {} : { bevelDepth }), ...(bevelResolution === undefined ? {} : { bevelResolution }), ...(bevelFactorStart === undefined ? {} : { bevelFactorStart }), ...(bevelFactorEnd === undefined ? {} : { bevelFactorEnd }) }; + }, + setCurveTaper(dataId: string, taperObjectId: string | null, taperRadiusMode?: number): NonMeshCommand<"setCurveTaper"> { + return { type: "setCurveTaper", dataId, taperObjectId, ...(taperRadiusMode === undefined ? {} : { taperRadiusMode }) }; + }, + convertCurveType(dataId: string, targetType: "CURVE" | "SURFACE"): NonMeshCommand<"convertCurveType"> { + return { type: "convertCurveType", dataId, targetType }; + }, setCurveHandle(dataId: string, pointIndex: number, side: "LEFT" | "RIGHT", position: readonly [number, number, number]): NonMeshCommand<"setCurveHandle"> { return { type: "setCurveHandle", dataId, pointIndex, side, position: [...position] as [number, number, number] }; }, @@ -58,6 +67,9 @@ export const nonMeshGeometryCommands = Object.freeze({ cyclicV: [...cyclicV], }; }, + setSurfaceResolution(dataId: string, resolutionU: number, resolutionV?: number): NonMeshCommand<"setSurfaceResolution"> { + return { type: "setSurfaceResolution", dataId, resolutionU, ...(resolutionV === undefined ? {} : { resolutionV }) }; + }, setFontBody(dataId: string, body: string): NonMeshCommand<"setFontBody"> { return { type: "setFontBody", dataId, body }; }, diff --git a/web/protocol/physics-simulation.ts b/web/protocol/physics-simulation.ts index 4accd367b..a663be585 100644 --- a/web/protocol/physics-simulation.ts +++ b/web/protocol/physics-simulation.ts @@ -28,6 +28,72 @@ export type PhysicsFamily = typeof PHYSICS_FAMILIES[number]; export type PhysicsExecutionRequest = "METADATA" | "CACHE_MANIFEST" | "CACHE_PLAYBACK" | "LOCAL_SOLVER" | "SERVER_JOB"; export type PhysicsSettingValue = boolean | number | string | null; +/** Typed Main-authoring payloads for the physics families exposed by WebEngine. */ +export interface PhysicsRigidBodySettings { + type?: number; + mass?: number; + friction?: number; + restitution?: number; + collisionShape?: number; + kinematic?: boolean; + enabled?: boolean; + linearDamping?: number; + angularDamping?: number; + stepsPerSecond?: number; + solverIterations?: number; +} + +export interface PhysicsClothSettings { + mass?: number; + airDamping?: number; + tensionStiffness?: number; + compressionStiffness?: number; + shearStiffness?: number; + bendingStiffness?: number; + springDamping?: number; + pinStiffness?: number; + quality?: number; + usePin?: boolean; +} + +export interface PhysicsFluidSettings { + fluidType?: number; + domainType?: number; + resolution?: number; + timeScale?: number; + viscosity?: number; + gravity?: number; + cacheFrameStart?: number; + cacheFrameEnd?: number; + cacheType?: number; +} + +export interface PhysicsSoftBodySettings { + nodeMass?: number; + gravity?: number; + mediaFriction?: number; + physicsSpeed?: number; + goalSpring?: number; + goalFriction?: number; + solverFlags?: number; +} + +export interface PhysicsParticleCacheSettings { + frameStart?: number; + frameEnd?: number; + cacheType?: number; + compression?: number; + useDiskCache?: boolean; + pointCacheId?: string; +} + +export interface PhysicsSimulationPlaybackSettings { + frame?: number; + playing?: boolean; + direction?: -1 | 1; + reset?: boolean; +} + export interface PhysicsCacheFrameIR { frame: number; byteOffset: number; diff --git a/web/protocol/render-capabilities.ts b/web/protocol/render-capabilities.ts index 8e1300233..e8ec88dcc 100644 --- a/web/protocol/render-capabilities.ts +++ b/web/protocol/render-capabilities.ts @@ -3,19 +3,22 @@ import type { ShaderNodeType } from "./shader-graph"; export type RenderBackend = "WEBGL2" | "WEBGPU"; export type PostProcessPass = "FXAA" | "BLOOM" | "SSAO" | "SSR" | "TAA" | "DOF" | "MOTION_BLUR"; +export type RenderPassName = "COMBINED" | "Z" | "MIST" | "NORMAL" | "VECTOR" | "UV" | "OBJECT_INDEX" | "MATERIAL_INDEX" | "SHADOW" | "AO" | "EMISSION" | "ENVIRONMENT" | "DIFFUSE_DIRECT" | "DIFFUSE_INDIRECT" | "GLOSSY_DIRECT" | "GLOSSY_INDIRECT" | "TRANSMISSION_DIRECT" | "TRANSMISSION_INDIRECT" | "VOLUME_DIRECT" | "VOLUME_INDIRECT" | "CRYPTOMATTE_OBJECT" | "CRYPTOMATTE_MATERIAL" | "CRYPTOMATTE_ASSET"; export type RenderCapabilityRequest = | { kind: "ARBITRARY_SHADER"; nodeTypes: string[] } | { kind: "VOLUME" } | { kind: "SUBSURFACE" } | { kind: "WEBGPU_BACKEND" } - | { kind: "POSTPROCESS"; passes: PostProcessPass[] }; + | { kind: "POSTPROCESS"; passes: PostProcessPass[] } + | { kind: "RENDER_PASSES"; passes: RenderPassName[] }; export interface RenderCapabilityContext { webgpuAvailable?: boolean; webgpuRendererBundled?: boolean; supportedShaderNodes?: ReadonlySet; supportedPostProcessPasses?: ReadonlySet; + supportedRenderPasses?: ReadonlySet; volumeRendererAvailable?: boolean; subsurfaceRendererAvailable?: boolean; } @@ -57,6 +60,13 @@ export function gateRenderCapability( const reason = context.webgpuAvailable ? "The WebGPU renderer bundle is not installed" : "WebGPU is unavailable in this browser or device"; return blockedGate("PBR-012", "WEBGPU_BACKEND", [capabilityIssue("WEBGPU_RENDERER_UNAVAILABLE", reason)]); } + if (request.kind === "RENDER_PASSES") { + const supported = context.supportedRenderPasses ?? new Set(["COMBINED", "Z", "MIST", "NORMAL", "VECTOR", "UV", "OBJECT_INDEX", "MATERIAL_INDEX", "SHADOW", "AO", "EMISSION", "ENVIRONMENT", "DIFFUSE_DIRECT", "DIFFUSE_INDIRECT", "GLOSSY_DIRECT", "GLOSSY_INDIRECT", "TRANSMISSION_DIRECT", "TRANSMISSION_INDIRECT", "VOLUME_DIRECT", "VOLUME_INDIRECT", "CRYPTOMATTE_OBJECT", "CRYPTOMATTE_MATERIAL", "CRYPTOMATTE_ASSET"]); + const unsupported = [...new Set(request.passes.filter((pass) => !supported.has(pass)))]; + return unsupported.length === 0 + ? readyGate("PBR-012", "RENDER_PASSES") + : blockedGate("PBR-012", "RENDER_PASSES", [capabilityIssue("RENDER_PASS_UNAVAILABLE", `Unsupported render passes: ${unsupported.join(", ")}`, "passes")]); + } const supported = context.supportedPostProcessPasses ?? new Set(); const unsupported = [...new Set(request.passes.filter((pass) => !supported.has(pass)))]; return unsupported.length === 0 diff --git a/web/protocol/render-routing.ts b/web/protocol/render-routing.ts index 7a1446804..780796a30 100644 --- a/web/protocol/render-routing.ts +++ b/web/protocol/render-routing.ts @@ -41,6 +41,17 @@ export interface RenderRoutingResultIR { issues: Array<{ code: ErrorCode; message: string; recoverable: boolean }>; } +export type RenderCommandKind = "renderFrame" | "renderAnimation"; + +export interface RenderCommandRequestIR { + kind: RenderCommandKind; + routing: RenderRoutingRequestIR; + frame?: number; + frameStart?: number; + frameEnd?: number; + step?: number; +} + function blocked( target: RenderRoutingTarget, capability: RenderRoutingResultIR["capability"], @@ -103,3 +114,19 @@ export function routeRenderExecution(request: RenderRoutingRequestIR, context: R } return blocked("SERVER_JOB", "UNSUPPORTED_RENDER_ENGINE", "UNSUPPORTED_ENGINE", "PLATFORM_CAPABILITY_UNAVAILABLE", "The requested render engine has no declared Web or server route"); } + +/** Routes a user-visible frame or animation render through the declared native/server capability. */ +export function routeRenderCommand(request: RenderCommandRequestIR, context: RenderRoutingContextIR = {}): RenderRoutingResultIR { + if (request.kind === "renderFrame" && request.frame !== undefined && (!Number.isSafeInteger(request.frame) || request.frame < -1000000 || request.frame > 1000000)) { + throw new Error("INVALID_ARGUMENT: render frame is outside the bounded range"); + } + if (request.kind === "renderAnimation") { + if (!Number.isSafeInteger(request.frameStart) || !Number.isSafeInteger(request.frameEnd) || request.frameStart! > request.frameEnd!) { + throw new Error("INVALID_ARGUMENT: render animation range is invalid"); + } + if (request.step !== undefined && (!Number.isSafeInteger(request.step) || request.step < 1 || request.step > 1000)) { + throw new Error("INVALID_ARGUMENT: render animation step is invalid"); + } + } + return routeRenderExecution(request.routing, context); +} diff --git a/web/protocol/scene-ir.ts b/web/protocol/scene-ir.ts index a348305cb..d8df7ad0e 100644 --- a/web/protocol/scene-ir.ts +++ b/web/protocol/scene-ir.ts @@ -139,6 +139,14 @@ export interface ArmatureBoneIR { connected?: boolean; restMatrix: number[]; poseMatrix?: number[]; + poseConstraints?: Array<{ + name: string; + type: "COPY_LOCATION" | "COPY_ROTATION" | "COPY_SCALE" | "IK" | "TRACK_TO" | "UNKNOWN"; + targetObjectId?: string | null; + targetBoneName?: string; + influence: number; + enabled: boolean; + }>; } export interface ArmatureIR { @@ -661,6 +669,21 @@ export interface SceneIR { sequencerStatus?: "AVAILABLE" | "BLOCKED"; } +export interface SceneRNADataBlockIR { + type: string; + name: string; + libraryLinked: boolean; + editable: boolean; +} + +export interface SceneRNAPropertyIR { + identifier: string; + type: "BOOLEAN" | "INT" | "FLOAT" | "STRING" | "ENUM"; + arrayLength: number; + readonly: boolean; + value?: boolean | number | string | null | Array; +} + export interface SceneSnapshotIR { schemaVersion: 1; revision: number; @@ -1375,6 +1398,18 @@ export function parseSceneSnapshotIR(value: unknown): SceneSnapshotIR { if (bone.connected !== undefined) requireBoolean(bone.connected, `armatures[${index}].bones[${boneIndex}].connected`); requireTuple(bone.restMatrix, 16, `armatures[${index}].bones[${boneIndex}].restMatrix`); if (bone.poseMatrix !== undefined) requireTuple(bone.poseMatrix, 16, `armatures[${index}].bones[${boneIndex}].poseMatrix`); + if (bone.poseConstraints !== undefined) { + const constraints = requireArray(bone.poseConstraints, `armatures[${index}].bones[${boneIndex}].poseConstraints`); + for (const [constraintIndex, constraint] of constraints.entries()) { + if (!isRecord(constraint)) throw new Error(`armatures[${index}].bones[${boneIndex}].poseConstraints[${constraintIndex}] must be an object`); + requireString(constraint.name, `armatures[${index}].bones[${boneIndex}].poseConstraints[${constraintIndex}].name`); + requireString(constraint.type, `armatures[${index}].bones[${boneIndex}].poseConstraints[${constraintIndex}].type`); + if (constraint.targetObjectId !== undefined && constraint.targetObjectId !== null) requireString(constraint.targetObjectId, `armatures[${index}].bones[${boneIndex}].poseConstraints[${constraintIndex}].targetObjectId`); + if (constraint.targetBoneName !== undefined) requireString(constraint.targetBoneName, `armatures[${index}].bones[${boneIndex}].poseConstraints[${constraintIndex}].targetBoneName`); + requireNumber(constraint.influence, `armatures[${index}].bones[${boneIndex}].poseConstraints[${constraintIndex}].influence`); + requireBoolean(constraint.enabled, `armatures[${index}].bones[${boneIndex}].poseConstraints[${constraintIndex}].enabled`); + } + } } } for (const [index, image] of (value.images as unknown[]).entries()) { diff --git a/web/protocol/sequencer.ts b/web/protocol/sequencer.ts index 73e86f0a9..1831a28dc 100644 --- a/web/protocol/sequencer.ts +++ b/web/protocol/sequencer.ts @@ -424,3 +424,16 @@ export function gateSequencerCodec(requestValue: unknown, resultValue: unknown): return blockedGate("N-021", capability, [capabilityIssue("SEQUENCER_CODEC_UNSUPPORTED", error instanceof Error ? error.message : "Codec probe is invalid")]); } } + +/** Main-backed authoring commands for strip effects, transitions and color balance. */ +export const sequencerCommands = Object.freeze({ + setStripModifiers(sceneId: string, stripId: string, modifiers: Array<{ id: string; type: string; enabled?: boolean; properties?: Record }>) { + return { type: "setSequencerStripModifiers", sceneId, stripId, modifiers } as const; + }, + setTransitions(sceneId: string, timeline: SequencerTimelineIR) { + return { type: "setSequencerTransitions", sceneId, timeline } as const; + }, + setColorBalance(sceneId: string, stripId: string, colorBalance: { lift: [number, number, number]; gamma: [number, number, number]; gain: [number, number, number]; exposure?: number; contrast?: number; saturation?: number }) { + return { type: "setSequencerColorBalance", sceneId, stripId, colorBalance } as const; + }, +} as const); diff --git a/web/protocol/web-engine.ts b/web/protocol/web-engine.ts index 18c17baa2..09dcc2924 100644 --- a/web/protocol/web-engine.ts +++ b/web/protocol/web-engine.ts @@ -9,11 +9,20 @@ import type { LODManifest } from "./simplify"; import type { DepsgraphEvaluationIR } from "./depsgraph"; import type { SculptMeshAttributesIR, SculptStrokeIR } from "./sculpt"; import type { GeometryNodeGraphIR } from "./geometry-nodes"; -import type { PhysicsSimulationManifestIR } from "./physics-simulation"; +import type { + PhysicsClothSettings, + PhysicsFluidSettings, + PhysicsParticleCacheSettings, + PhysicsRigidBodySettings, + PhysicsSimulationManifestIR, + PhysicsSimulationPlaybackSettings, + PhysicsSoftBodySettings, +} from "./physics-simulation"; import type { ShaderGraphIR } from "./shader-graph"; import type { ShaderCompileReport } from "./shader-compiler"; import type { NlaMoveStripCommand, NlaTrackIR } from "./nla"; import type { RenderCapabilityRequest } from "./render-capabilities"; +import type { RenderRoutingRequestIR } from "./render-routing"; import type { CapabilityGateResult } from "./capability-gates"; import type { NonMeshGeometryChunk } from "./nonmesh-binary"; import type { @@ -27,6 +36,7 @@ import type { PaintPBVHCapabilityRequest } from "./paint-pbvh-capability"; import type { LibraryMainAppendReceiptIR, LibraryMainAppendRequestIR } from "./library-main-append"; import type { BlenderOperatorDescriptor, BlenderOperatorPropertySpec, BlenderOperatorInvocation, BlenderOperatorPropertyValue } from "./blender-operator"; import type { SequencerTimelineIR } from "./sequencer"; +import type { CompositorGraphIR } from "./compositor"; export interface MeshGeometryBuffer { schemaVersion: 1; @@ -81,6 +91,28 @@ export type MeshPrimitive = "CUBE" | "PLANE" | "UV_SPHERE" | "ICO_SPHERE" | "CYL export type MeshEditOperation = "MERGE" | "DISSOLVE" | "EXTRUDE" | "INSET" | "BEVEL" | "LOOP_CUT" | "SUBDIVIDE" | "FILL" | "TRIANGULATE" | "RECALCULATE_NORMALS" | "BRIDGE_LOOPS" | "DELETE"; export type FCurveInterpolation = "CONSTANT" | "LINEAR" | "BEZIER"; export type KeyframeHandle = [number, number]; +export interface FCurvePoint { + frame: number; + value: number; + handleLeft?: KeyframeHandle; + handleRight?: KeyframeHandle; + interpolation?: FCurveInterpolation; +} +export interface ActionGroupDefinition { + name: string; + paths: string[]; +} +export interface KeyingSetPathDefinition { + path: string; + arrayIndex?: number; +} +export type ArmatureEditOperation = + | { operation: "ADD"; name: string; parentName?: string | null; head: [number, number, number]; tail: [number, number, number]; roll?: number; connected?: boolean } + | { operation: "DELETE"; boneName: string } + | { operation: "RENAME"; boneName: string; name: string } + | { operation: "EXTRUDE"; boneName: string; name: string; tail: [number, number, number] } + | { operation: "DUPLICATE"; boneName: string; name: string; offset?: [number, number, number] }; +export type PoseConstraintType = "COPY_LOCATION" | "COPY_ROTATION" | "COPY_SCALE" | "IK" | "TRACK_TO"; export type WebEngineEditCommand = | { type: "setFrame"; frame: number } @@ -99,8 +131,19 @@ export type WebEngineEditCommand = | { type: "setObjectTransform"; objectId: string; translation: [number, number, number]; rotationEuler: [number, number, number]; scale: [number, number, number] } | { type: "setArmatureBones"; objectId: string; bones: Array<{ name: string; parentName: string | null; head: [number, number, number]; tail: [number, number, number]; roll: number; connected?: boolean }> } | { type: "setPoseBoneTransform"; objectId: string; boneName: string; translation: [number, number, number]; rotationEuler: [number, number, number]; scale: [number, number, number] } + | { type: "armatureEditOperations"; objectId: string; operations: ArmatureEditOperation[] } + | { type: "setBoneRoll"; objectId: string; boneName: string; roll: number } + | { type: "setBoneSymmetry"; objectId: string; enabled: boolean } + | { type: "setBoneParenting"; objectId: string; boneName: string; parentName: string | null; connected: boolean } + | { type: "setPoseConstraint"; objectId: string; boneName: string; constraintName: string; constraintType: PoseConstraintType | null; targetObjectId?: string | null; targetBoneName?: string; influence?: number; enabled?: boolean } | { type: "translateMeshVertices"; meshId: string; vertexIndices: number[]; offset: [number, number, number] } | { type: "meshEdit"; meshId: string; operation: MeshEditOperation; selectionMode: MeshElementMode; elementIndices: number[]; offset?: [number, number, number]; amount?: number; segments?: number } + | { type: "meshSubdivide"; meshId: string; selectionMode: MeshElementMode; elementIndices: number[]; segments?: number } + | { type: "meshTriangulate"; meshId: string; faceIndices: number[] } + | { type: "meshRecalculateNormals"; meshId: string; faceIndices: number[] } + | { type: "meshBridgeLoops"; meshId: string; edgeIndices: number[] } + | { type: "meshDeleteElements"; meshId: string; selectionMode: MeshElementMode; elementIndices: number[] } + | { type: "meshUVProject"; meshId: string; faceIndices: number[]; method: "PLANAR" | "CUBE" | "CYLINDER" | "SPHERE"; seamEdgeIndices?: number[] } | { type: "createUVMap"; meshId: string; name: string } | { type: "setActiveUVMap"; meshId: string; name: string } | { type: "unwrapUV"; meshId: string; faceIndices: number[]; method: "PLANAR" | "CUBE" } @@ -115,6 +158,11 @@ export type WebEngineEditCommand = | { type: "createAction"; name: string; objectId?: string } | { type: "removeAction"; actionId: string } | { type: "setKeyframe"; animationId: string; path: string; frame: number; value?: number[]; handleLeft?: KeyframeHandle; handleRight?: KeyframeHandle; interpolation?: FCurveInterpolation } + | { type: "setFCurveKeyframes"; animationId: string; path: string; points: FCurvePoint[] } + | { type: "setDriverExpression"; animationId: string; path: string; expression: string } + | { type: "setActionGroups"; animationId: string; groups: ActionGroupDefinition[] } + | { type: "setKeyingSet"; sceneId: string; name: string; paths: KeyingSetPathDefinition[]; active?: boolean } + | { type: "bakeAnimation"; objectId: string; frameStart: number; frameEnd: number; step?: number } | { type: "setTimelineMarkers"; dataId: string; markers: Array<{ frame: number; name: string }> } | { type: "setFCurveInterpolation"; animationId: string; path: string; interpolation: FCurveInterpolation } | { type: "setActiveAction"; objectId: string; actionId: string | null } @@ -130,10 +178,14 @@ export type WebEngineEditCommand = | { type: "createCurve"; curveType: "CURVE"; name?: string; controlPoints: number[]; cyclic?: boolean; resolution?: number } | { type: "deleteNonMeshData"; dataId: string } | { type: "setCurveControlPoints"; dataId: string; controlPoints: number[]; splineOffsets?: number[]; resolution?: number } + | { type: "setCurveBevel"; dataId: string; bevelDepth?: number; bevelResolution?: number; bevelFactorStart?: number; bevelFactorEnd?: number } + | { type: "setCurveTaper"; dataId: string; taperObjectId: string | null; taperRadiusMode?: number } + | { type: "convertCurveType"; dataId: string; targetType: "CURVE" | "SURFACE" } | { type: "setCurveHandle"; dataId: string; pointIndex: number; side: "LEFT" | "RIGHT"; position: [number, number, number] } | { type: "setCurveTopology"; dataId: string; baseRevision?: number; splineTypes?: NonMeshCurveSplineType[]; cyclicU?: boolean[]; cyclicV?: boolean[]; handleTypes?: number[]; handlePoints?: number[] } | { type: "setCurveSplines"; dataId: string; splineTypes: NonMeshCurveSplineType[]; splineOffsets: number[]; ordersU: number[]; controlPoints: number[]; pointWeights: number[]; cyclicU: boolean[]; handleTypes: number[]; handlePoints: number[] } | { type: "setSurfaceTopology"; dataId: string; splineDimensions: Array<{ u: number; v: number; orderU: number; orderV: number }>; controlPoints: number[]; pointWeights: number[]; cyclicU: boolean[]; cyclicV: boolean[] } + | { type: "setSurfaceResolution"; dataId: string; resolutionU: number; resolutionV?: number } | { type: "setFontBody"; dataId: string; body: string } | { type: "setFontProperties"; dataId: string; properties: Partial } | { type: "setFontAdvanced"; dataId: string; characters: NonMeshFontCharacterIR[]; textBoxes: NonMeshFontTextBoxIR[]; activeTextBox: number } @@ -152,6 +204,10 @@ export type WebEngineEditCommand = | { type: "insertGreasePencilFrame"; dataId: string; layerId: string; frame: number; duration?: number } | { type: "removeGreasePencilFrame"; dataId: string; layerId: string; frame: number } | { type: "setGreasePencilStrokes"; dataId: string; layerId: string; frame: number; baseRevision?: number; strokes: Array<{ cyclic?: boolean; materialIndex?: number; points: Array<{ position: [number, number, number]; radius?: number; opacity?: number; vertexColor?: [number, number, number, number] }> }> } + | { type: "setGreasePencilDrawing"; dataId: string; layerId: string; frame: number; drawingId?: string; baseRevision?: number; strokes: Array<{ cyclic?: boolean; materialIndex?: number; points: Array<{ position: [number, number, number]; radius?: number; opacity?: number; vertexColor?: [number, number, number, number] }> }> } + | { type: "setGreasePencilMaterial"; dataId: string; layerId: string; frame: number; materialIndex: number; strokeIndices?: number[]; baseRevision?: number } + | { type: "setGreasePencilSelection"; dataId: string; layerId: string; frame: number; pointIndices?: number[]; strokeIndices?: number[]; mode?: "REPLACE" | "ADD" | "SUBTRACT" | "TOGGLE"; baseRevision?: number } + | { type: "setGreasePencilInterpolate"; dataId: string; layerId: string; sourceFrame: number; targetFrame: number; factor: number; baseRevision?: number } | { type: "setVertexColors"; meshId: string; attributeName: string; domain: "POINT" | "CORNER"; indices: number[]; colors: number[] } | { type: "setVertexWeights"; objectId: string; vertexGroup: string; indices: number[]; values: number[]; normalize?: boolean; limit?: number; mirror?: boolean; mirrorAxis?: 0 | 1 | 2; mirrorTolerance?: number } | { type: "setLightProperties"; dataId: string; properties: { type?: "POINT" | "SUN" | "SPOT" | "AREA"; areaShape?: 0 | 1 | 4 | 5; diffuseFactor?: number; specularFactor?: number; transmissionFactor?: number; volumeFactor?: number; attenuationDistance?: number; shadowFilterRadius?: number; shadowMaximumResolution?: number; shadowJitterOverblur?: number; cascadeMaxDistance?: number; cascadeExponent?: number; cascadeFade?: number; cascadeCount?: number; areaSizeZ?: number; clipStart?: number; color?: [number, number, number]; energy?: number; exposure?: number; temperature?: number; useTemperature?: boolean; castsShadow?: boolean; radius?: number; spotAngle?: number; spotBlend?: number; areaSize?: number; areaSizeY?: number; areaSpread?: number; sunAngle?: number } } @@ -163,7 +219,16 @@ export type WebEngineEditCommand = | { type: "setSceneUnitSettings"; dataId: string; properties: { system?: number; scaleLength?: number; rotationSystem?: number; lengthUnit?: number; massUnit?: number; timeUnit?: number; temperatureUnit?: number } } | { type: "setSceneTimelineSettings"; dataId: string; properties: { fps?: number; fpsBase?: number; frameStep?: number; usePreviewRange?: boolean; previewStart?: number; previewEnd?: number } } | { type: "setScenePipelineSettings"; dataId: string; properties: { useCompositor?: boolean; useSequencer?: boolean; noOverwrite?: boolean; saveOutput?: boolean; alphaPremultiplied?: boolean } } + | { type: "renderFrame"; dataId: string; frame?: number; route?: RenderRoutingRequestIR } + | { type: "renderAnimation"; dataId: string; frameStart?: number; frameEnd?: number; step?: number; route?: RenderRoutingRequestIR } + | { type: "setRenderPasses"; dataId: string; layerName: string; passes: { passMask?: number; cryptomatteMask?: number; cryptomatteLevels?: number; alphaThreshold?: number } } + | { type: "setCameraView"; dataId: string; cameraObjectId: string | null } + | { type: "setLightLinking"; dataId: string; target?: "OBJECT" | "WORLD"; lightgroup: string | null } | { type: "setSequencerStrips"; sceneId: string; timeline: SequencerTimelineIR } + | { type: "setSequencerStripModifiers"; sceneId: string; stripId: string; modifiers: Array<{ id: string; type: string; enabled?: boolean; properties?: Record }> } + | { type: "setSequencerTransitions"; sceneId: string; timeline: SequencerTimelineIR } + | { type: "setSequencerColorBalance"; sceneId: string; stripId: string; colorBalance: { lift: [number, number, number]; gamma: [number, number, number]; gain: [number, number, number]; exposure?: number; contrast?: number; saturation?: number } } + | { type: "setCompositorNodeGraph"; sceneId: string; graph: CompositorGraphIR } | { type: "setSceneBindings"; dataId: string; properties: { cameraObjectId?: string | null; worldId?: string | null } } | { type: "setSceneViewLayerSettings"; dataId: string; layerName: string; properties: { useRender?: boolean; useFreestyle?: boolean; samples?: number } } | { type: "setSceneCollectionSettings"; dataId: string; layerName: string; collectionId: string; properties: { exclude?: boolean; holdout?: boolean; indirectOnly?: boolean; hide?: boolean } } @@ -178,10 +243,18 @@ export type WebEngineEditCommand = | { type: "setSceneSamplingSettings"; dataId: string; properties: { pixelAspectX?: number; pixelAspectY?: number; filterSize?: number; dither?: number } } | { type: "setSceneMultiviewSettings"; dataId: string; properties: { enabled?: boolean; viewsFormat?: 0 | 1; imageViewsFormat?: 0 | 1 | 2; stereoDisplayMode?: 0 | 1 | 2 | 3 | 4; interlaceSwap?: boolean; sideBySideCrossed?: boolean; squeezedFrame?: boolean } } | { type: "setSceneStampSettings"; dataId: string; properties: { stampMask?: number; fontId?: number; userText?: string; foreground?: [number, number, number, number]; background?: [number, number, number, number] } } + | { type: "setTrackingMarkers"; clipId: string; trackId: string; markers: TrackingMarkerIR[]; sourceSha256?: string } + | { type: "setTrackingSolve"; clipId: string; solve: CameraSolveIR; sourceSha256?: string } + | { type: "setMaskSpline"; maskId: string; layerId: string; spline: MaskSplineIR } + | { type: "setMaskPoint"; maskId: string; layerId: string; splineId: string; point: MaskPointIR } | { type: "setSceneLineSettings"; dataId: string; properties: { mode?: 1 | 2; thickness?: number } } | { type: "setSceneViewLayerPassSettings"; dataId: string; layerName: string; properties: { passMask?: number; cryptomatteMask?: number; cryptomatteLevels?: number; alphaThreshold?: number } } | { type: "setSceneViewLayerAOVs"; dataId: string; layerName: string; aovs: Array<{ name: string; type: 0 | 1 }> } | { type: "setSceneViewLayerLightgroups"; dataId: string; layerName: string; lightgroups: string[] } + | { type: "clearObjectTransform"; objectId: string; channels: Array<"LOCATION" | "ROTATION" | "SCALE"> } + | { type: "createObjectData"; objectType: "CAMERA" | "LIGHT" | "EMPTY" | "ARMATURE"; name?: string } + | { type: "setObjectSelection"; objectId: string; selected: boolean; active?: boolean } + | { type: "setCollectionVisibility"; collectionId: string; viewportVisible?: boolean; renderVisible?: boolean } | { type: "setObjectLightgroup"; objectId: string; lightgroup: string | null } | { type: "setWorldLightgroup"; dataId: string; lightgroup: string | null } | { type: "setMetaballElements"; dataId: string; elements: Array<{ type: number; position: [number, number, number]; radius: number; scale: [number, number, number] }> } @@ -189,6 +262,11 @@ export type WebEngineEditCommand = | { type: "setSculptMeshAttributes"; attributes: SculptMeshAttributesIR } | { type: "setGeometryNodeGraph"; meshId: string; graph: GeometryNodeGraphIR } | { type: "setPhysicsSimulation"; manifest: PhysicsSimulationManifestIR } + | { type: "setRigidBodySettings"; objectId: string; family?: "RIGID_BODY" | "SOFT_BODY"; settings: PhysicsRigidBodySettings | PhysicsSoftBodySettings } + | { type: "setClothSettings"; objectId: string; settings: PhysicsClothSettings } + | { type: "setFluidSettings"; objectId: string; settings: PhysicsFluidSettings } + | { type: "setParticleCache"; objectId: string; settings: PhysicsParticleCacheSettings } + | { type: "setSimulationPlayback"; settings: PhysicsSimulationPlaybackSettings } | { type: "setShaderGraph"; materialId: string; graph: ShaderGraphIR } | { type: "setNLAStack"; objectId: string; tracks: NlaTrackIR[]; baseRevision?: number } | NlaMoveStripCommand @@ -201,6 +279,31 @@ export type WebEngineOperatorPropertySpec = BlenderOperatorPropertySpec; export type WebEngineOperatorDescriptor = BlenderOperatorDescriptor; export type WebEngineOperatorInvocation = BlenderOperatorInvocation; +export type RNAPropertyValue = boolean | number | string | null; +export interface RNADataBlockDescriptor { + type: string; + name: string; + libraryLinked: boolean; + editable: boolean; +} +export interface RNAPropertyDescriptor { + identifier: string; + name: string; + description?: string; + type: "BOOLEAN" | "INT" | "FLOAT" | "STRING" | "ENUM"; + subtype?: number; + arrayLength: number; + readonly: boolean; + value?: RNAPropertyValue | RNAPropertyValue[]; + enumItems?: Array<{ identifier: string; name: string; value: number }>; +} +export interface RNACollectionDescriptor { + identifier: string; + name: string; + itemType?: string; + items: Array<{ name: string; type?: string }>; +} + /** Read-only commands supported by the stable Worker-to-WASM JSON facade. */ export type WebEngineJsonCommand = | "snapshot" @@ -211,7 +314,16 @@ export type WebEngineJsonCommand = | "undo" | "redo" | "listBlenderOperators" - | "invokeBlenderOperator"; + | "invokeBlenderOperator" + | "assetMark" + | "assetCatalog" + | "libraryLink" + | "libraryOverride" + | "libraryReload" + | "listRNADataBlocks" + | "readRNAProperties" + | "setRNAProperty" + | "listRNACollections"; export type WebEngineRequest = | { requestId: string; command: { type: "init" } } @@ -311,3 +423,4 @@ export type WebEngineResponse = | { kind: "progress"; requestId: string; progress: ProgressEvent } | { kind: "result"; requestId: string; ok: true; result: WebEngineResult } | { kind: "result"; requestId: string; ok: false; error: ErrorReport }; +import type { CameraSolveIR, MaskPointIR, MaskSplineIR, TrackingMarkerIR } from "./tracking-mask";