{ "schemaVersion": 1, "task": "WBV2-P1424-001", "job": "MODIFIER-STACK-AUTHORING", "parentSha256": "46a3ce65d56747da8684af422a1a94540612c767a6dcc42da7939930731399d5", "acceptance": "pending independent local validation", "result": { "status": "ready", "summary": "Modifier stack editing uses original Blender RNA accessors and retains the active data owner", "workflow": "Add, remove and reorder modifiers; edit supported BEVEL, ARRAY, MIRROR, SOLIDIFY and SUBSURF parameters; validate native Main, invalid input rollback, history, save/reopen and deterministic replay", "sourceUnits": [ "web-command:addModifier", "web-command:removeModifier", "web-command:moveModifier", "web-command:setModifierParameters", "web-command:setModifierParameters", "web-command:setModifierParameters", "web-command:setModifierParameters", "web-command:setModifierParameters" ], "routeIds": [ "web-command:addModifier", "web-command:removeModifier", "web-command:moveModifier", "web-command:setModifierParameters", "web-command:setModifierParameters", "web-command:setModifierParameters", "web-command:setModifierParameters", "web-command:setModifierParameters" ], "sourceReferences": [ "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/makesrna/intern/rna_modifier.cc", "blender-5.2.0/source/blender/editors/object/object_modifier.cc", "blender-5.2.0/source/blender/web_engine/extract_modifier_accessors.py", "blender-5.2.0/source/blender/web_engine/extract_id_property_rna.py", "blender-5.2.0/source/blender/web_engine/web_engine_modifier_properties.hh", "blender-5.2.0/source/blender/web_engine/web_engine_main_state.h", "blender-5.2.0/source/blender/web_engine/CMakeLists.txt" ], "changedFiles": [ "web/tests/e2e/modifier-stack-ui-production.spec.ts", "web/tests/fixtures/modifier-stack-main-snapshots.py", "my-tools/prepare_wbv2_modifier_stack_workflow.py", "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_api.cpp", "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", "blender-5.2.0/source/blender/editors/object/object_modifier.cc", "blender-5.2.0/source/blender/web_engine/extract_modifier_accessors.py", "blender-5.2.0/source/blender/web_engine/extract_id_property_rna.py", "blender-5.2.0/source/blender/web_engine/web_engine_modifier_properties.hh", "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/ModifierParameterField.tsx", "web/app/src/app/ModifierParameterField.css", "web/app/src/app/app-shell.css", "web/protocol/modifier.ts", "web/protocol/scene-ir.ts", "web/tests/fixtures/create-modifier-stack-input.py", "my-tools/test_wbv2_modifier_accessors.py" ], "dependencies": [ ".emscripten-web", "blender-5.2.0/source/blender/editors/object/object_modifier.cc", "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc", "blender-5.2.0/source/blender/web_engine/CMakeLists.txt", "blender-5.2.0/source/blender/web_engine/extract_id_property_rna.py", "blender-5.2.0/source/blender/web_engine/extract_modifier_accessors.py", "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/web_engine_modifier_properties.hh", "build_web_blender6/CMakeCache.txt", "build_web_blender6/source/blender/makesrna/intern/rna_modifier_gen.cc", "my-tools/build_local_webengine.py", "my-tools/prepare_wbv2_modifier_stack_workflow.py", "my-tools/test_wbv2_modifier_accessors.py", "tests/files/web/modifier_stack_scene.blend", "tools/web/incremental-web-build.mjs", "tools/web/sync-web-engine-runtime.mjs", "web/app/src/app/App.tsx", "web/app/src/app/ModifierParameterField.css", "web/app/src/app/ModifierParameterField.tsx", "web/app/src/app/app-shell.css", "web/app/src/engine-client/WebEngineClient.ts", "web/app/src/workers/web-engine.worker.ts", "web/app/vite.config.ts", "web/package.json", "web/playwright.config.ts", "web/protocol/modifier.ts", "web/protocol/scene-ir.ts", "web/protocol/web-engine.ts", "web/tests/e2e/modifier-stack-ui-production.spec.ts", "web/tests/fixtures/create-modifier-stack-input.py", "web/tests/fixtures/modifier-stack-main-snapshots.py", "web/tests/fixtures/native-ui-workflow.ts", "web/tsconfig.json" ], "artifacts": [ "build_web_blender6/bin/web_engine.wasm", "build_web_blender6/bin/web_engine.js", "build_blender_native/bin/blender" ], "checks": [ { "id": "wasm-source-build", "argv": [ "python3", "my-tools/build_local_webengine.py" ], "cwd": ".", "kinds": [ "source_build" ], "timeoutSeconds": 1200, "continueOnFailure": true }, { "id": "web-build", "argv": [ "node", "tools/web/incremental-web-build.mjs" ], "cwd": ".", "kinds": [ "typecheck" ], "dependsOn": [ "wasm-source-build" ], "timeoutSeconds": 300, "continueOnFailure": true }, { "id": "authoring-lint", "argv": [ "node", "node_modules/eslint/bin/eslint.js", "app/src/app/App.tsx", "tests/e2e/modifier-stack-ui-production.spec.ts" ], "cwd": "web", "kinds": [ "lint" ], "timeoutSeconds": 90, "continueOnFailure": true }, { "id": "chromium-panel", "argv": [ "env", "WEB_TEST_PORT=5382", "node", "node_modules/@playwright/test/cli.js", "test", "--config", "playwright.config.ts", "tests/e2e/modifier-stack-ui-production.spec.ts", "--grep", "modifier stack panel ", "--workers=1", "--max-failures=1" ], "cwd": "web", "kinds": [ "chromium" ], "dependsOn": [ "wasm-source-build", "web-build", "authoring-lint" ], "timeoutSeconds": 75, "continueOnFailure": true }, { "id": "chromium-add", "argv": [ "env", "WEB_TEST_PORT=5382", "node", "node_modules/@playwright/test/cli.js", "test", "--config", "playwright.config.ts", "tests/e2e/modifier-stack-ui-production.spec.ts", "--grep", "modifier stack add ", "--workers=1", "--max-failures=1" ], "cwd": "web", "kinds": [ "chromium", "positive", "negative", "undo_redo", "save_reopen", "determinism" ], "dependsOn": [ "wasm-source-build", "web-build", "authoring-lint" ], "timeoutSeconds": 75, "continueOnFailure": true }, { "id": "chromium-remove", "argv": [ "env", "WEB_TEST_PORT=5382", "node", "node_modules/@playwright/test/cli.js", "test", "--config", "playwright.config.ts", "tests/e2e/modifier-stack-ui-production.spec.ts", "--grep", "modifier stack remove ", "--workers=1", "--max-failures=1" ], "cwd": "web", "kinds": [ "chromium", "positive", "negative", "undo_redo", "save_reopen", "determinism" ], "dependsOn": [ "wasm-source-build", "web-build", "authoring-lint" ], "timeoutSeconds": 75, "continueOnFailure": true }, { "id": "chromium-move", "argv": [ "env", "WEB_TEST_PORT=5382", "node", "node_modules/@playwright/test/cli.js", "test", "--config", "playwright.config.ts", "tests/e2e/modifier-stack-ui-production.spec.ts", "--grep", "modifier stack move ", "--workers=1", "--max-failures=1" ], "cwd": "web", "kinds": [ "chromium", "positive", "negative", "undo_redo", "save_reopen", "determinism" ], "dependsOn": [ "wasm-source-build", "web-build", "authoring-lint" ], "timeoutSeconds": 75, "continueOnFailure": true }, { "id": "chromium-parameters-bevel", "argv": [ "env", "WEB_TEST_PORT=5382", "node", "node_modules/@playwright/test/cli.js", "test", "--config", "playwright.config.ts", "tests/e2e/modifier-stack-ui-production.spec.ts", "--grep", "modifier stack parameters bevel ", "--workers=1", "--max-failures=1" ], "cwd": "web", "kinds": [ "chromium", "positive", "negative", "undo_redo", "save_reopen", "determinism" ], "dependsOn": [ "wasm-source-build", "web-build", "authoring-lint" ], "timeoutSeconds": 75, "continueOnFailure": true }, { "id": "chromium-parameters-array", "argv": [ "env", "WEB_TEST_PORT=5382", "node", "node_modules/@playwright/test/cli.js", "test", "--config", "playwright.config.ts", "tests/e2e/modifier-stack-ui-production.spec.ts", "--grep", "modifier stack parameters array ", "--workers=1", "--max-failures=1" ], "cwd": "web", "kinds": [ "chromium", "positive", "negative", "undo_redo", "save_reopen", "determinism" ], "dependsOn": [ "wasm-source-build", "web-build", "authoring-lint" ], "timeoutSeconds": 75, "continueOnFailure": true }, { "id": "chromium-parameters-mirror", "argv": [ "env", "WEB_TEST_PORT=5382", "node", "node_modules/@playwright/test/cli.js", "test", "--config", "playwright.config.ts", "tests/e2e/modifier-stack-ui-production.spec.ts", "--grep", "modifier stack parameters mirror ", "--workers=1", "--max-failures=1" ], "cwd": "web", "kinds": [ "chromium", "positive", "negative", "undo_redo", "save_reopen", "determinism" ], "dependsOn": [ "wasm-source-build", "web-build", "authoring-lint" ], "timeoutSeconds": 75, "continueOnFailure": true }, { "id": "chromium-parameters-solidify", "argv": [ "env", "WEB_TEST_PORT=5382", "node", "node_modules/@playwright/test/cli.js", "test", "--config", "playwright.config.ts", "tests/e2e/modifier-stack-ui-production.spec.ts", "--grep", "modifier stack parameters solidify ", "--workers=1", "--max-failures=1" ], "cwd": "web", "kinds": [ "chromium", "positive", "negative", "undo_redo", "save_reopen", "determinism" ], "dependsOn": [ "wasm-source-build", "web-build", "authoring-lint" ], "timeoutSeconds": 75, "continueOnFailure": true }, { "id": "chromium-parameters-subsurf", "argv": [ "env", "WEB_TEST_PORT=5382", "node", "node_modules/@playwright/test/cli.js", "test", "--config", "playwright.config.ts", "tests/e2e/modifier-stack-ui-production.spec.ts", "--grep", "modifier stack parameters subsurf ", "--workers=1", "--max-failures=1" ], "cwd": "web", "kinds": [ "chromium", "positive", "negative", "undo_redo", "save_reopen", "determinism" ], "dependsOn": [ "wasm-source-build", "web-build", "authoring-lint" ], "timeoutSeconds": 75, "continueOnFailure": true } ], "cases": [ { "id": "modifier-add-positive", "kind": "positive", "checkId": "chromium-add", "receipt": "unallocated/add-positive.json", "unitIds": [ "web-command:addModifier" ] }, { "id": "modifier-add-negative", "kind": "negative", "checkId": "chromium-add", "receipt": "unallocated/add-negative.json", "unitIds": [ "web-command:addModifier" ] }, { "id": "modifier-add-undo_redo", "kind": "undo_redo", "checkId": "chromium-add", "receipt": "unallocated/add-undo_redo.json", "unitIds": [ "web-command:addModifier" ] }, { "id": "modifier-add-save_reopen", "kind": "save_reopen", "checkId": "chromium-add", "receipt": "unallocated/add-save_reopen.json", "unitIds": [ "web-command:addModifier" ] }, { "id": "modifier-add-determinism", "kind": "determinism", "checkId": "chromium-add", "receipt": "unallocated/add-determinism.json", "unitIds": [ "web-command:addModifier" ] }, { "id": "modifier-remove-positive", "kind": "positive", "checkId": "chromium-remove", "receipt": "unallocated/remove-positive.json", "unitIds": [ "web-command:removeModifier" ] }, { "id": "modifier-remove-negative", "kind": "negative", "checkId": "chromium-remove", "receipt": "unallocated/remove-negative.json", "unitIds": [ "web-command:removeModifier" ] }, { "id": "modifier-remove-undo_redo", "kind": "undo_redo", "checkId": "chromium-remove", "receipt": "unallocated/remove-undo_redo.json", "unitIds": [ "web-command:removeModifier" ] }, { "id": "modifier-remove-save_reopen", "kind": "save_reopen", "checkId": "chromium-remove", "receipt": "unallocated/remove-save_reopen.json", "unitIds": [ "web-command:removeModifier" ] }, { "id": "modifier-remove-determinism", "kind": "determinism", "checkId": "chromium-remove", "receipt": "unallocated/remove-determinism.json", "unitIds": [ "web-command:removeModifier" ] }, { "id": "modifier-move-positive", "kind": "positive", "checkId": "chromium-move", "receipt": "unallocated/move-positive.json", "unitIds": [ "web-command:moveModifier" ] }, { "id": "modifier-move-negative", "kind": "negative", "checkId": "chromium-move", "receipt": "unallocated/move-negative.json", "unitIds": [ "web-command:moveModifier" ] }, { "id": "modifier-move-undo_redo", "kind": "undo_redo", "checkId": "chromium-move", "receipt": "unallocated/move-undo_redo.json", "unitIds": [ "web-command:moveModifier" ] }, { "id": "modifier-move-save_reopen", "kind": "save_reopen", "checkId": "chromium-move", "receipt": "unallocated/move-save_reopen.json", "unitIds": [ "web-command:moveModifier" ] }, { "id": "modifier-move-determinism", "kind": "determinism", "checkId": "chromium-move", "receipt": "unallocated/move-determinism.json", "unitIds": [ "web-command:moveModifier" ] }, { "id": "modifier-parameters-bevel-positive", "kind": "positive", "checkId": "chromium-parameters-bevel", "receipt": "unallocated/parameters-bevel-positive.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-bevel-negative", "kind": "negative", "checkId": "chromium-parameters-bevel", "receipt": "unallocated/parameters-bevel-negative.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-bevel-undo_redo", "kind": "undo_redo", "checkId": "chromium-parameters-bevel", "receipt": "unallocated/parameters-bevel-undo_redo.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-bevel-save_reopen", "kind": "save_reopen", "checkId": "chromium-parameters-bevel", "receipt": "unallocated/parameters-bevel-save_reopen.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-bevel-determinism", "kind": "determinism", "checkId": "chromium-parameters-bevel", "receipt": "unallocated/parameters-bevel-determinism.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-array-positive", "kind": "positive", "checkId": "chromium-parameters-array", "receipt": "unallocated/parameters-array-positive.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-array-negative", "kind": "negative", "checkId": "chromium-parameters-array", "receipt": "unallocated/parameters-array-negative.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-array-undo_redo", "kind": "undo_redo", "checkId": "chromium-parameters-array", "receipt": "unallocated/parameters-array-undo_redo.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-array-save_reopen", "kind": "save_reopen", "checkId": "chromium-parameters-array", "receipt": "unallocated/parameters-array-save_reopen.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-array-determinism", "kind": "determinism", "checkId": "chromium-parameters-array", "receipt": "unallocated/parameters-array-determinism.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-mirror-positive", "kind": "positive", "checkId": "chromium-parameters-mirror", "receipt": "unallocated/parameters-mirror-positive.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-mirror-negative", "kind": "negative", "checkId": "chromium-parameters-mirror", "receipt": "unallocated/parameters-mirror-negative.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-mirror-undo_redo", "kind": "undo_redo", "checkId": "chromium-parameters-mirror", "receipt": "unallocated/parameters-mirror-undo_redo.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-mirror-save_reopen", "kind": "save_reopen", "checkId": "chromium-parameters-mirror", "receipt": "unallocated/parameters-mirror-save_reopen.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-mirror-determinism", "kind": "determinism", "checkId": "chromium-parameters-mirror", "receipt": "unallocated/parameters-mirror-determinism.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-solidify-positive", "kind": "positive", "checkId": "chromium-parameters-solidify", "receipt": "unallocated/parameters-solidify-positive.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-solidify-negative", "kind": "negative", "checkId": "chromium-parameters-solidify", "receipt": "unallocated/parameters-solidify-negative.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-solidify-undo_redo", "kind": "undo_redo", "checkId": "chromium-parameters-solidify", "receipt": "unallocated/parameters-solidify-undo_redo.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-solidify-save_reopen", "kind": "save_reopen", "checkId": "chromium-parameters-solidify", "receipt": "unallocated/parameters-solidify-save_reopen.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-solidify-determinism", "kind": "determinism", "checkId": "chromium-parameters-solidify", "receipt": "unallocated/parameters-solidify-determinism.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-subsurf-positive", "kind": "positive", "checkId": "chromium-parameters-subsurf", "receipt": "unallocated/parameters-subsurf-positive.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-subsurf-negative", "kind": "negative", "checkId": "chromium-parameters-subsurf", "receipt": "unallocated/parameters-subsurf-negative.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-subsurf-undo_redo", "kind": "undo_redo", "checkId": "chromium-parameters-subsurf", "receipt": "unallocated/parameters-subsurf-undo_redo.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-subsurf-save_reopen", "kind": "save_reopen", "checkId": "chromium-parameters-subsurf", "receipt": "unallocated/parameters-subsurf-save_reopen.json", "unitIds": [ "web-command:setModifierParameters" ] }, { "id": "modifier-parameters-subsurf-determinism", "kind": "determinism", "checkId": "chromium-parameters-subsurf", "receipt": "unallocated/parameters-subsurf-determinism.json", "unitIds": [ "web-command:setModifierParameters" ] } ] } }