chore: checkpoint web Blender migration source, tools and docs
Accumulated uncommitted work: GHOST Web backend, WebGL/GPU web layer, web workflow engine and protocol, tooling, docs and task records. Large generated evidence, user-testing archives, build snapshots and imported test assets remain untracked. Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
10
tools/web/workflow-cases/B1-native-keyboard.json
Normal file
10
tools/web/workflow-cases/B1-native-keyboard.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"schemaVersion": 1, "batchId": "B1", "workflow": "New General / native WASM Console / keyboard Main history / save-reopen", "nativeSession": false, "timeoutMs": 240000,
|
||||
"sourcePaths": ["blender-5.2.0/scripts/modules/_console_python.py", "blender-5.2.0/source/blender/editors/space_console/console_ops.cc", "blender-5.2.0/source/blender/editors/undo/ed_undo.cc", "blender-5.2.0/source/blender/makesrna/intern/rna_object.cc", "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", "blender-5.2.0/source/blender/web_engine/web_engine_python.cpp", "blender-5.2.0/source/blender/web_engine/web_engine_python.hh", "blender-5.2.0/source/blender/web_engine/web_engine_python_bootstrap.py", "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", "blender-5.2.0/source/blender/makesrna/intern/rna_space.cc", "blender-5.2.0/source/blender/makesrna/intern/rna_access.cc", "blender-5.2.0/source/blender/windowmanager/message_bus/intern/wm_message_bus_rna.cc", "blender-5.2.0/source/blender/windowmanager/message_bus/intern/wm_message_bus.cc"],
|
||||
"sourceReview": "tools/web/workflow-cases/B1-source-contracts.json",
|
||||
"remainingGates": [],
|
||||
"fixtures": [
|
||||
{"kind":"minimal","path":"build_web_main_desktop/b1-context-readback-20261023/public/templates/general.blend","spec":"tests/e2e/console-wasm-keyboard-production.spec.ts","grep":"WASM Console uses native Main","scope":["New General UI and exact template bytes","WEB_MAIN CPython result and bpy mutation","keyboard Undo/Redo","negative/context recovery","Ctrl+S and reopened values","no SERVER_NATIVE fallback"]},
|
||||
{"kind":"production","path":"tests/golden/WBV2-P1424-001/glb-split-normals-20261021/1792568241901-high-normal.blend","spec":"tests/e2e/console-wasm-keyboard-production.spec.ts","grep":"WASM Console uses native Main","scope":["production fragment","WEB_MAIN CPython and bpy mutation","keyboard Undo/Redo","negative/context recovery","Ctrl+S and reopened values","no SERVER_NATIVE fallback"]}
|
||||
]
|
||||
}
|
||||
1
tools/web/workflow-cases/B1-source-contracts.json
Normal file
1
tools/web/workflow-cases/B1-source-contracts.json
Normal file
File diff suppressed because one or more lines are too long
10
tools/web/workflow-cases/B1.json
Normal file
10
tools/web/workflow-cases/B1.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"schemaVersion": 1, "batchId": "B1", "workflow": "Console, native session Main history and browser file delivery", "nativeSession": true, "timeoutMs": 180000,
|
||||
"sourcePaths": ["blender-5.2.0/source/blender/editors/space_console/console_ops.cc", "blender-5.2.0/scripts/modules/_console_python.py", "blender-5.2.0/source/blender/editors/undo/ed_undo.cc", "blender-5.2.0/source/blender/makesrna/intern/rna_object.cc", "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", "web/protocol/native-workflow.ts", "tools/web/native-session-server.mjs", "tools/web/native-session-blender.py", "tools/web/server-operator-job-server.mjs"],
|
||||
"remainingGates": ["New General project entry and intended native Console keyboard Undo/Redo workflow", "Native Console route parity; current case uses SERVER_NATIVE session plus WASM Main readback", "Current-source parity and aggregate evaluator acceptance"],
|
||||
"routes": ["SERVER_NATIVE: Console execution and Main history", "WEB_MAIN: imported Main readback", "BROWSER_EQUIVALENT: File delivery/reopen"],
|
||||
"fixtures": [
|
||||
{"kind":"minimal","path":"tests/files/web/basic_scene.blend","spec":"tests/e2e/console-main-undo-production.spec.ts","grep":"Console continuity|Browser-equivalent File menu","scope":["typed native/WASM Main values","Undo/Redo","syntax-error object state","workspace draft/namespace persistence","saved/reopened Main values","browser-equivalent File"]},
|
||||
{"kind":"production","path":"tests/golden/WBV2-P1424-001/glb-split-normals-20261021/1792568241901-high-normal.blend","spec":"tests/e2e/console-main-undo-production.spec.ts","grep":"Console continuity|Browser-equivalent File menu","scope":["retained production fragment","typed native/WASM Main values","Undo/Redo","syntax-error object state","workspace persistence","saved/reopened Main values","browser-equivalent File"]}
|
||||
]
|
||||
}
|
||||
12
tools/web/workflow-cases/B2-source-contracts.json
Normal file
12
tools/web/workflow-cases/B2-source-contracts.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{"schemaVersion":1,"batchId":"B2","status":"REVIEWED_SCOPE","verifiedUnitDelta":0,
|
||||
"bindings":[{"path":"blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp","sha256":"4b14aaa45d78b65130f630284bf5425c707e92b91a7c9c34f9efb452f9c964cc"},{"path":"blender-5.2.0/source/blender/editors/transform/transform_ops.cc","sha256":"e17e6ae6aeca0226cbbf7e5f940a04e0d75415fe3a578edacf659b4af7e7b378"},{"path":"blender-5.2.0/source/blender/web_engine/web_engine_api.cpp","sha256":"e1427f3a4352ea2b625149f777bb0e40508890c54030c67683b29ae4bf418798"},{"path":"blender-5.2.0/source/blender/editors/mesh/editmesh_select.cc","sha256":"bea08ee3ddbe5287dc1f3502eaef5f21e14c61d7dc17ac86695ad9b3f63e794b"},{"path":"blender-5.2.0/source/blender/editors/undo/ed_undo.cc","sha256":"cbbc4f69258a704396b8fc1af1b5c085641e13c55a18aac36b941efad0092618"},{"path":"blender-5.2.0/source/blender/web_engine/web_engine_gpu_ui.cpp","sha256":"f7e08675de04d05a18d4bd74984f8eb6775ece43c9d4c3a72d1b8733494cfdfc"},{"path":"web/app/src/app/WasmGPUCanvas.tsx","sha256":"492c11cf4591c796dd3bc946391b0853c97a984e2f7ba6299c6171c43aa02f6f"},{"path":"web/app/src/workers/web-engine.worker.ts","sha256":"30a914b94f625e7a9a93e8b8fe60778b9e515bee364b34632ffe8cf21c66da87"},{"path":"web/app/src/app/App.tsx","sha256":"813263854ebb574299c28aa93caa645d07d9fca3732b8ebcdcaac5d5e80a1c56"},{"path":"web/app/src/app/WasmEditorContext.tsx","sha256":"40351762be341d2f8ddef0e52e7021d94f40dcf784850ad2e9349075f3d6265f"},{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_object.cc","sha256":"de0c7ab9abe8127dd0c534e94fec469d21fdca7d33d6991c61c1c7667eee9886"},{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_workspace.cc","sha256":"8352540e252b65a3e641711f1ad3b1b9e5b5c36461e2ccfd4950f61cb6684db8"},{"path":"web/app/src/app/wasm-editors.css","sha256":"23f528d5697009849207a90a09f54eeb03faa14b23eeeb812e6ad2c0565368a5"},{"path":"web/protocol/web-engine.ts","sha256":"a66e5cebfa106e6727d2bd3c447a0c8a476c9e61d726cf915940b3c3d7dbcabe"}],
|
||||
"contracts":[
|
||||
{"id":"native-cube","scope":"createPrimitive creates a native BMesh cube, converts it into authoritative Main and tags object/scene redraw; only cube case is covered.","sourcePaths":["blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp"],"sourceLines":[14342,14367,14442],"proofStages":["opened","added"]},
|
||||
{"id":"native-grs","scope":"Translate, rotate and scale invoke native modal callbacks with OPTYPE_UNDO; G X 1, R Z 90, S 2 change actual object transforms.","sourcePaths":["blender-5.2.0/source/blender/editors/transform/transform_ops.cc"],"sourceLines":[855,882,972],"proofStages":["confirmed","rotated","scaled"]},
|
||||
{"id":"native-cancel","scope":"TRANS_CANCEL restores transform; WebEngine retains the pre-gesture Main and commits history only on net persistent change.","sourcePaths":["blender-5.2.0/source/blender/editors/transform/transform_ops.cc","blender-5.2.0/source/blender/web_engine/web_engine_api.cpp"],"sourceLines":[506,4678,4684,4701],"proofStages":["historyBeforeCancel","cancelStarted","cancelFinished","cancelled","historyAfterCancel"]},
|
||||
{"id":"native-vertex-edit","scope":"Native viewport pick resolves nearest BMesh vertex, SEL_OP_SET updates vertex selection/history, and native global Z translation moves only that selected vertex.","sourcePaths":["blender-5.2.0/source/blender/editors/mesh/editmesh_select.cc","blender-5.2.0/source/blender/editors/transform/transform_ops.cc"],"sourceLines":[2711,2906,2920,855],"proofStages":["editEntered","vertexTarget","vertexClick","vertexSelected","vertexEdited"]},
|
||||
{"id":"native-keyboard-history","scope":"Canvas forwards keycode/modifiers to native WM handlers; ED_OT_undo/redo step the native stack and refresh, restoring edit-mode vertices/selection and transform data.","sourcePaths":["web/app/src/app/WasmGPUCanvas.tsx","blender-5.2.0/source/blender/web_engine/web_engine_gpu_ui.cpp","blender-5.2.0/source/blender/editors/undo/ed_undo.cc"],"sourceLines":[560,1352,599,636,705,748],"proofStages":["undoFrame","undone","redoFrame","redone"]},
|
||||
{"id":"main-file-roundtrip","scope":"Worker serializes authoritative Main through Blender writer; browser download delivers bytes and complete memory loader reopens them after a deliberate unsaved change. OPEN/SAVE reserve the mutex after draining autosave. Native File menu and Save As remain B3.","sourcePaths":["blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp","blender-5.2.0/source/blender/web_engine/web_engine_api.cpp","web/app/src/workers/web-engine.worker.ts","web/app/src/app/App.tsx"],"sourceLines":[1807,24320,5302,3075,3941,6085],"proofStages":["finalObject","saved","unsaved","reopened"]},
|
||||
{"id":"tool-and-visible-rna","scope":"Read-only bpy/BMesh oracle reports real WorkSpaceTool idname and Object.loc; Properties renders native transform fields and all XYZ inputs must be fully in viewport with matching values after reopen.","sourcePaths":["blender-5.2.0/source/blender/makesrna/intern/rna_workspace.cc","blender-5.2.0/source/blender/makesrna/intern/rna_object.cc","web/app/src/app/WasmEditorContext.tsx","web/app/src/app/wasm-editors.css"],"sourceLines":[320,3155,2226,2247,46],"proofStages":["added","editEntered","reopened","uiLayout","reopenedUI"]},
|
||||
{"id":"native-input-transport","scope":"Canvas preserves keycode/modifiers and pointer events; gpuUI frame protocol carries them to Worker native key/event exports; gpuFrame pumps native WM and publishes Main changes. No JS transform geometry is used for the tested modal actions.","sourcePaths":["web/app/src/app/WasmGPUCanvas.tsx","web/protocol/web-engine.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_gpu_ui.cpp"],"sourceLines":[560,488,780,682,4653,1353],"proofStages":["cancelStarted","cancelFinished","confirmFinished","rotateModal","scaleModal","vertexClick","vertexModal","undoFrame","redoFrame"]}],
|
||||
"continuationNotes":"Eight source contracts reviewed for this B2 workflow only; source-unit verified delta remains0. Bind review in B2 plan, rerun minimal then production on existing candidate, then inspect proof stages/artifacts and aggregate acceptance. All B3-B6/global residuals retained."}
|
||||
10
tools/web/workflow-cases/B2.json
Normal file
10
tools/web/workflow-cases/B2.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"schemaVersion": 1, "batchId": "B2", "workflow": "Add Cube / native G-R-S and modal cancel / one vertex / Undo-Redo / Save-Reopen", "nativeSession": false, "timeoutMs": 300000,
|
||||
"sourcePaths": ["blender-5.2.0/source/blender/editors/transform/transform_ops.cc", "blender-5.2.0/source/blender/editors/transform/transform_draw_cursors.cc", "blender-5.2.0/source/blender/gpu/shaders/gpu_shader_3D_polyline_frag.glsl", "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/editors/mesh/editmesh_add.cc", "blender-5.2.0/source/blender/editors/mesh/editmesh_select.cc", "blender-5.2.0/scripts/modules/bpy_extras/view3d_utils.py", "blender-5.2.0/source/blender/makesrna/intern/rna_workspace.cc", "web/tests/fixtures/native-ui-workflow.ts"],
|
||||
"remainingGates": ["Rotate/scale", "Edit mesh vertices", "Undo/Redo", "Save/Reopen", "Main values and selection readback", "Current-source parity and aggregate evaluator acceptance"],
|
||||
"sourceReview": "tools/web/workflow-cases/B2-source-contracts.json",
|
||||
"fixtures": [
|
||||
{"kind":"minimal","path":"tests/files/web/basic_scene.blend","spec":"tests/e2e/modeling-native-modal-production.spec.ts","grep":"Native modeling closes","scope":["Add Cube and nonempty native tool ID","G-R-S and cancellation data/history","native mouse vertex selection/edit","keyboard Undo/Redo","download and reopen after unsaved change","visible UI position"]},
|
||||
{"kind":"production","path":"tests/golden/WBV2-P1424-001/glb-split-normals-20261021/1792568241901-high-normal.blend","spec":"tests/e2e/modeling-native-modal-production.spec.ts","grep":"Native modeling closes","scope":["retained production fragment","Add Cube and nonempty native tool ID","G-R-S and cancellation data/history","native mouse vertex selection/edit","keyboard Undo/Redo","download and reopen after unsaved change","visible UI position"]}
|
||||
]
|
||||
}
|
||||
1
tools/web/workflow-cases/B3.json
Normal file
1
tools/web/workflow-cases/B3.json
Normal file
@@ -0,0 +1 @@
|
||||
{"schemaVersion":1,"batchId":"B3","workflow":"Native File Save As/Open/cancel/download/reopen; then import-export/Server Operator closure","nativeSession":false,"timeoutMs":300000,"sourcePaths":["blender-5.2.0/source/blender/windowmanager/intern/wm_files.cc","blender-5.2.0/source/blender/windowmanager/intern/wm_event_system.cc","blender-5.2.0/scripts/startup/bl_ui/space_topbar.py","blender-5.2.0/scripts/presets/keyconfig/keymap_data/blender_default.py","web/app/src/workers/web-engine.worker.ts","web/app/src/engine-client/WebEngineClient.ts","blender-5.2.0/source/blender/windowmanager/intern/wm.cc","blender-5.2.0/source/blender/blenkernel/intern/screen.cc","blender-5.2.0/source/blender/editors/interface/regions/interface_region_hud.cc","blender-5.2.0/source/blender/web_engine/web_engine_api.cpp","blender-5.2.0/source/blender/blenkernel/intern/main_namemap.cc","blender-5.2.0/source/blender/blenloader/intern/writefile.cc","blender-5.2.0/source/blender/web_engine/web_engine_gpu_ui.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/windowmanager/wm_window.hh","blender-5.2.0/source/blender/makesrna/RNA_access_guard.hh","tools/web/deployment-http-server.mjs","tools/web/server-operator-job-server.mjs","tools/web/server-operator-job.py","tools/web/server-job-process.mjs","tools/web/server_operator_properties.py","tools/web/server_operator_remesh.py"],"remainingGates":["Native File/Open and Save As confirmed/cancelled file delivery","Supported format import/export with real output readback","Server Operator405 and explicit browser-equivalent routes","Server error/cancel no late successful publication","Undo/Redo and complete B3 source-contract/current-hash acceptance"],"fixtures":[{"kind":"minimal","path":"tests/files/web/basic_scene.blend","spec":"tests/e2e/file-native-saveas-production.spec.ts","grep":"Native File Save As","scope":["native File menu Save As","cancel unchanged Main/history without download","confirmed .blend download and unsaved-change discard/reopen","fully visible XYZ readback","native File Open cancel without Main/history mutation","native discard and VFS reopen after unsaved change","new Main accepts subsequent native edit"]},{"kind":"production","path":"tests/golden/WBV2-P1424-001/glb-split-normals-20261021/1792568241901-high-normal.blend","spec":"tests/e2e/file-native-saveas-production.spec.ts","grep":"Native File Save As","scope":["retained production fragment","native File Save As/cancel/download/reopen","fully visible XYZ readback","native File Open cancel without Main/history mutation","native discard and VFS reopen after unsaved change","new Main accepts subsequent native edit"]}]}
|
||||
Reference in New Issue
Block a user