{"schemaVersion":1,"batchId":"B1","status":"REVIEWED_SCOPE","verifiedUnitDelta":0,"scope":"B1 specified core workflow on unparented Cube and SimplifyHighSphere; this does not certify complete editors or complete source units.","contracts":[{"id":"console","scope":"1+1 returns numeric display text 2 without Main mutation; command echo is visible","sourcePaths":["blender-5.2.0/scripts/startup/bl_operators/console.py","blender-5.2.0/scripts/modules/_console_python.py","blender-5.2.0/source/blender/web_engine/web_engine_python_bootstrap.py","blender-5.2.0/source/blender/web_engine/web_engine_python.cpp","blender-5.2.0/source/blender/web_engine/web_engine_api.cpp","web/app/src/engine-client/WebEngineClient.ts","web/app/src/workers/web-engine.worker.ts","web/app/src/app/WasmPythonConsole.tsx"],"proofStages":["sum"],"delivery":"BROWSER_EQUIVALENT UI; CPYTHON_WEBENGINE execution","operatorRnaMainPath":"ConsoleExec(console.execute) -> _console_python.execute reference; Web bootstrap single-mode compiler -> web_engine_python_execute -> authoritative Main"},{"id":"rna-ui","scope":"Before Python, Object Properties opens; local RNA location and visible numeric inputs agree after mutation/history/error/reopen","sourcePaths":["blender-5.2.0/source/blender/makesrna/intern/rna_object.cc","blender-5.2.0/source/blender/makesrna/intern/rna_access.cc","blender-5.2.0/source/blender/makesrna/intern/rna_space.cc","blender-5.2.0/source/blender/windowmanager/message_bus/intern/wm_message_bus.cc","blender-5.2.0/source/blender/windowmanager/message_bus/intern/wm_message_bus_rna.cc","blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp","web/app/src/app/WasmEditorContext.tsx","web/app/src/app/App.tsx"],"proofStages":["openedUI","changed","changedUI","undoneUI","redoneUI","syntaxErrorUI","reopenedUI"],"delivery":"Native RNA/Main; browser property controls","operatorRnaMainPath":"RNA_Object.location -> Object.loc / rna_Object_internal_update; context_refresh -> WM_msgbus_types_init -> WM_msgbus_create -> RNA_property_update; PropertiesValueControl consumes current value"},{"id":"history","scope":"Keyboard Undo/Redo restores actual Main location and UI while retaining the console namespace","sourcePaths":["blender-5.2.0/source/blender/editors/undo/ed_undo.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","web/app/src/app/App.tsx"],"proofStages":["undone","undoneUI","redone","redoneUI","workspace"],"delivery":"BROWSER_EQUIVALENT shortcut; native Main snapshots","operatorRnaMainPath":"ED_OT_undo/ED_OT_redo observable contract; WebEngine undo/redo -> capture_history_entry/restore_history_entry -> BLO native read/write; direct ED operator invocation is not claimed"},{"id":"context","scope":"Draft, scalar/container/function namespace and C/D aliases survive a real workspace round trip; new project and explicit reset clear namespace","sourcePaths":["blender-5.2.0/scripts/modules/_console_python.py","blender-5.2.0/source/blender/web_engine/web_engine_python.cpp","blender-5.2.0/source/blender/web_engine/web_engine_python_bootstrap.py","web/app/src/app/WasmPythonConsole.tsx","web/app/src/app/App.tsx"],"proofStages":["namespace","workspace","aliases","retainedReference","projectCleared","explicitResetAfterUndo"],"delivery":"BROWSER_EQUIVALENT Console state; native bpy bindings","operatorRnaMainPath":"_console_python.get_console retains namespace across Undo; web_engine_python_reset(preserve_namespace=true) only for history; project/reset clears sessions"},{"id":"error","scope":"Syntax error returns ERROR without changing Main nodes or visible coordinates","sourcePaths":["blender-5.2.0/scripts/modules/_console_python.py","blender-5.2.0/source/blender/web_engine/web_engine_python_bootstrap.py","blender-5.2.0/source/blender/web_engine/web_engine_api.cpp","web/app/src/workers/web-engine.worker.ts"],"proofStages":["syntaxError","syntaxErrorUI"],"delivery":"CPYTHON_WEBENGINE","operatorRnaMainPath":"single-mode compile rejects invalid syntax before exec; API compares native Main serializations and Worker publishes typed result"},{"id":"file","scope":"General opens exact pinned template bytes; Ctrl+S downloads native blend; a fresh open reads saved coordinates and resets project namespace","sourcePaths":["blender-5.2.0/source/blender/windowmanager/intern/wm_files.cc","blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp","web/app/src/engine-client/WebEngineClient.ts","web/app/src/workers/web-engine.worker.ts","web/app/src/app/App.tsx"],"proofStages":["opened","reopened","reopenedUI","projectCleared","result"],"delivery":"BROWSER_EQUIVALENT file selection/download; native blend format","operatorRnaMainPath":"WM_OT_read_homefile/WM_OT_save_mainfile desktop references; Web template/open/save routes -> BLO_read_from_memory/BLO_write_file_to_callback"}],"bindings":[{"path":"blender-5.2.0/scripts/modules/_console_python.py","sha256":"a676dfd0a7091014df8794c978549626ccb85ee22811e5b99ed225eb815b726f"},{"path":"blender-5.2.0/scripts/startup/bl_operators/console.py","sha256":"64ebeb2729ae878043887a89dcf6cb48bff5646bc20d063fc050d256bce05459"},{"path":"blender-5.2.0/source/blender/editors/undo/ed_undo.cc","sha256":"cbbc4f69258a704396b8fc1af1b5c085641e13c55a18aac36b941efad0092618"},{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_access.cc","sha256":"58792b7c0a9993d7889861937d709a37261d0993992cb13fb8b5b744e06ca131"},{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_object.cc","sha256":"de0c7ab9abe8127dd0c534e94fec469d21fdca7d33d6991c61c1c7667eee9886"},{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_space.cc","sha256":"d564f58fbdc5c8f643be093873d439f77ade184880919c119a8427d6d6defdc7"},{"path":"blender-5.2.0/source/blender/web_engine/web_engine_api.cpp","sha256":"e1427f3a4352ea2b625149f777bb0e40508890c54030c67683b29ae4bf418798"},{"path":"blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp","sha256":"728e73c119dc368f111f2cb2d907ea09c3c781d37babdfd8c0bb6a8ddc5697e0"},{"path":"blender-5.2.0/source/blender/web_engine/web_engine_python.cpp","sha256":"46c1ca63b0e978e189e806dd37ad133b303187308a5120f46aa38c47cd5ac7d7"},{"path":"blender-5.2.0/source/blender/web_engine/web_engine_python_bootstrap.py","sha256":"6d865accb6622d15d2508686cfc619da4b2dca9042957e851b74e7e39816698a"},{"path":"blender-5.2.0/source/blender/windowmanager/intern/wm_files.cc","sha256":"aeb7b820e5377aebbb1144ff474ba1317ca3e22b25d5859eba84e75f4f1edc43"},{"path":"blender-5.2.0/source/blender/windowmanager/message_bus/intern/wm_message_bus.cc","sha256":"1bb6aad5ecf127aedaf5e39bd36b4573634c9ffa917243ecfac1f4f98b0e58a1"},{"path":"blender-5.2.0/source/blender/windowmanager/message_bus/intern/wm_message_bus_rna.cc","sha256":"5d7fc639beac31a6b97fbade3b568419d2b01db27cab61f1fa98210b9a038d51"},{"path":"web/app/src/app/App.tsx","sha256":"7c7ff80db306c522295178e9e95cd6b38a0d94dc083d06ea73f9b42d3c343329"},{"path":"web/app/src/app/WasmEditorContext.tsx","sha256":"40351762be341d2f8ddef0e52e7021d94f40dcf784850ad2e9349075f3d6265f"},{"path":"web/app/src/app/WasmPythonConsole.tsx","sha256":"42337cd7d816a71b521a3203fd0ea0e30d940f4db88f57bb5113db9fe923f67f"},{"path":"web/app/src/engine-client/WebEngineClient.ts","sha256":"288f09a912dc0f853254c620fbcbda0b50610ad25da9ee481472ff6bc8742282"},{"path":"web/app/src/workers/web-engine.worker.ts","sha256":"30a914b94f625e7a9a93e8b8fe60778b9e515bee364b34632ffe8cf21c66da87"},{"path":"web/tests/e2e/console-wasm-keyboard-production.spec.ts","sha256":"9482dd5c67103895cf5163482ca2951733c5c075e736d48d60ac38da24973c20"}],"limitations":["Full Console/editor/operator parity is not claimed by these fixture-scoped contracts.","Browser file delivery is explicit; native File menu and Save As remain B3.","B2-B6 and aggregate acceptance remain open; global blockers and source-unit counts are preserved."]}