feat(web): classify and route complete Blender inventory
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/WBV2-P1422-001.md",
|
||||
"sha256": "2c66f1acb30ee99695ca515098745f26d0d88329a3e7251584669b38a3008d18"
|
||||
"sha256": "90f6a980eee4c0ef1f1d781e17a64167fd6017c8315835e455350e8934ab0cb7"
|
||||
},
|
||||
"plan": {
|
||||
"path": "tests/golden/WBV2-P1422-000/product-implementation-plan.json",
|
||||
@@ -36,5 +36,5 @@
|
||||
"sha256": "935832fa685b703cd9f886b022db7d629e1a4e32d66c9facb3dc08bacfb41146"
|
||||
}
|
||||
},
|
||||
"nextTask": null
|
||||
"nextTask": "WBV2-P1423-000"
|
||||
}
|
||||
|
||||
26
tests/golden/WBV2-P1423-000/manifest.json
Normal file
26
tests/golden/WBV2-P1423-000/manifest.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P1423-000",
|
||||
"parentTask": "WBV2-P1422-001",
|
||||
"operation": "AUTHORIZE_SOURCE_UNIT_ROUTE_COMPLETION",
|
||||
"status": "done",
|
||||
"nextTask": "WBV2-P1423-001",
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/WBV2-P1422-001/manifest.json",
|
||||
"sha256": "c3bb5cddeed27c1ddf7e3ad3095d1d666de21588f101184c62a73dbb8e672f63"
|
||||
},
|
||||
"backlog": {
|
||||
"path": "tests/golden/WBV2/web-product-backlog.json",
|
||||
"sha256": "3e945a60db913778b7ab178fcd37f9a6f587aa9f199a559e384794051b9643c3"
|
||||
},
|
||||
"plan": {
|
||||
"path": "tests/golden/WBV2-P1423-000/operator-route-implementation-plan.json",
|
||||
"sha256": "1ebd74f7f2738cc4f1ef377cf3f985d6c656fbd5f20b1076e4315237ef5978bd"
|
||||
},
|
||||
"routeCatalog": {
|
||||
"path": "web/app/src/capabilities/blender-feature-route-catalog.json",
|
||||
"sha256": "e056fc3a0259aebe8a672ee6fa83d28a2567c864525c3a60ad9be00a357eb48d"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P1423-000",
|
||||
"operation": "AUTHORIZE_SOURCE_UNIT_ROUTE_COMPLETION",
|
||||
"status": "PASS",
|
||||
"routeCatalog": "web/app/src/capabilities/blender-feature-route-catalog.json",
|
||||
"pendingTaskCount": 5,
|
||||
"nextTask": "WBV2-P1423-001"
|
||||
}
|
||||
53024
tests/golden/WBV2-P1423-000/operator-route-implementation-plan.json
Normal file
53024
tests/golden/WBV2-P1423-000/operator-route-implementation-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
40
tests/golden/WBV2-P1423-001/manifest.json
Normal file
40
tests/golden/WBV2-P1423-001/manifest.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P1423-001",
|
||||
"parentTask": "WBV2-P1423-000",
|
||||
"operation": "WEB_PRODUCT_IMPLEMENTATION_COMPLETE",
|
||||
"status": "done",
|
||||
"implementationComplete": true,
|
||||
"verificationDeferred": true,
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/WBV2-P1423-000/manifest.json",
|
||||
"sha256": "2d7d738a70f856bcb1d399ccdeb2c8d8f26d638ff5906efc041e84dbefa21d98"
|
||||
},
|
||||
"backlog": {
|
||||
"path": "tests/golden/WBV2/web-product-backlog.json",
|
||||
"sha256": "3e945a60db913778b7ab178fcd37f9a6f587aa9f199a559e384794051b9643c3"
|
||||
},
|
||||
"strategy": {
|
||||
"path": "docs/WEB_PRODUCT_MIGRATION_STRATEGY.md",
|
||||
"sha256": "b0086cf81a52c71b9efdd764c005d65de7fe48a8f013ce6405a76486bf2310e6"
|
||||
},
|
||||
"report": {
|
||||
"path": "tests/golden/WBV2-P1423-001/product-implementation-report.json",
|
||||
"sha256": "3cecd2dd53cb96f0b5ab09ce94677ad00b472488b38fb5fd88308bb6b9b4a99e"
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/WBV2-P1423-001.md",
|
||||
"sha256": "913a745b47569dd0ffce98be53533e6fab556bc7d3b0e3c785e07d184cd0496d"
|
||||
},
|
||||
"plan": {
|
||||
"path": "tests/golden/WBV2-P1423-000/operator-route-implementation-plan.json",
|
||||
"sha256": "1ebd74f7f2738cc4f1ef377cf3f985d6c656fbd5f20b1076e4315237ef5978bd"
|
||||
},
|
||||
"taskContext": {
|
||||
"path": "tests/golden/WBV2-P1423-001/task-context.json",
|
||||
"sha256": "e9e46f56f5538ad9865357aecbf92b475482691f1fb09ee4cf37149a1b6bc0cc"
|
||||
}
|
||||
},
|
||||
"nextTask": null
|
||||
}
|
||||
956
tests/golden/WBV2-P1423-001/product-implementation-report.json
Normal file
956
tests/golden/WBV2-P1423-001/product-implementation-report.json
Normal file
@@ -0,0 +1,956 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P1423-001",
|
||||
"operation": "WEB_PRODUCT_IMPLEMENTATION_COMPLETE",
|
||||
"status": "implemented",
|
||||
"strategy": "implementation_first_route_complete",
|
||||
"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",
|
||||
"OPERATOR-ROUTE-PALETTE",
|
||||
"FEATURE-COVERAGE-DASHBOARD"
|
||||
]
|
||||
},
|
||||
{
|
||||
"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",
|
||||
"SERVER-OPERATOR-JOB",
|
||||
"OPERATOR-MACRO-COMPOSER",
|
||||
"RNA-REFLECTION-EXTENDED"
|
||||
]
|
||||
}
|
||||
],
|
||||
"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"
|
||||
},
|
||||
{
|
||||
"id": "SERVER-OPERATOR-JOB",
|
||||
"module": "RUNTIME",
|
||||
"title": "Execute background-safe Blender operators through server jobs",
|
||||
"commands": [
|
||||
"submitServerOperatorJob",
|
||||
"cancelServerOperatorJob",
|
||||
"readServerOperatorResult"
|
||||
],
|
||||
"ownedPaths": [
|
||||
"web/protocol/server-operator-job.ts",
|
||||
"web/protocol/blender-operator.ts",
|
||||
"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",
|
||||
"tools/web/server-operator-job.py",
|
||||
"tools/web/server-job-process.mjs"
|
||||
],
|
||||
"implementation": "Add a bounded, hash-bound server operator job contract for the SERVER_NATIVE route. Run Blender background operators in an isolated workspace with typed properties, cancellation, resource budgets and result binding; reject UI/window/file-browser context.",
|
||||
"attempts": 1,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/SERVER-OPERATOR-JOB-result.json",
|
||||
"startedAt": "2026-09-06T11:50:38.732808+00:00",
|
||||
"completedAt": "2026-09-06T11:56:54.152838+00:00"
|
||||
},
|
||||
{
|
||||
"id": "OPERATOR-ROUTE-PALETTE",
|
||||
"module": "WORKSPACE",
|
||||
"title": "Expose every classified operator route in the browser palette",
|
||||
"commands": [
|
||||
"listFeatureRoutes",
|
||||
"invokeFeatureRoute"
|
||||
],
|
||||
"ownedPaths": [
|
||||
"web/protocol/blender-operator.ts",
|
||||
"web/protocol/web-engine.ts",
|
||||
"web/app/src/app/App.tsx",
|
||||
"web/app/src/engine-client/WebEngineClient.ts",
|
||||
"web/app/src/workers/web-engine.worker.ts",
|
||||
"web/app/src/capabilities/blender-feature-route-catalog.json"
|
||||
],
|
||||
"implementation": "Load the complete source-unit route catalog, merge WEB_MAIN operators with server-job and browser-equivalent entries in F3, and show an explicit route/reason badge. Invoke only typed native or server-job routes.",
|
||||
"attempts": 1,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/OPERATOR-ROUTE-PALETTE-result.json",
|
||||
"startedAt": "2026-09-06T11:56:54.153358+00:00",
|
||||
"completedAt": "2026-09-06T12:09:25.081441+00:00"
|
||||
},
|
||||
{
|
||||
"id": "OPERATOR-MACRO-COMPOSER",
|
||||
"module": "RUNTIME",
|
||||
"title": "Decompose and execute operator macros as native command plans",
|
||||
"commands": [
|
||||
"listBlenderMacros",
|
||||
"invokeBlenderMacro"
|
||||
],
|
||||
"ownedPaths": [
|
||||
"web/protocol/blender-operator.ts",
|
||||
"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"
|
||||
],
|
||||
"implementation": "Represent the 58 macro units as bounded, source-backed command plans. Reuse existing Main transactions where possible, otherwise submit a server-native plan; reject context-dependent macro steps before mutation.",
|
||||
"attempts": 2,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/OPERATOR-MACRO-COMPOSER-result.json",
|
||||
"startedAt": "2026-09-06T12:24:26.368422+00:00",
|
||||
"completedAt": "2026-09-06T12:28:41.978753+00:00"
|
||||
},
|
||||
{
|
||||
"id": "RNA-REFLECTION-EXTENDED",
|
||||
"module": "RUNTIME",
|
||||
"title": "Extend RNA reflection to arrays, enums and nested collections",
|
||||
"commands": [
|
||||
"readRNAPropertySchema",
|
||||
"setRNAArrayProperty",
|
||||
"setRNAEnumProperty",
|
||||
"readRNACollection"
|
||||
],
|
||||
"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": "Expand the bounded RNA route beyond primitive scalars to validated arrays, enums and nested collection reads/writes, keeping pointer, ID-link, context-only and arbitrary execution paths fail-closed.",
|
||||
"attempts": 1,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/RNA-REFLECTION-EXTENDED-result.json",
|
||||
"startedAt": "2026-09-06T12:28:41.979600+00:00",
|
||||
"completedAt": "2026-09-06T12:39:33.154038+00:00"
|
||||
},
|
||||
{
|
||||
"id": "FEATURE-COVERAGE-DASHBOARD",
|
||||
"module": "WORKSPACE",
|
||||
"title": "Publish complete source-unit route coverage and gap dashboard",
|
||||
"commands": [
|
||||
"featureRouteCoverage",
|
||||
"featureRouteGaps"
|
||||
],
|
||||
"ownedPaths": [
|
||||
"web/app/src/app/App.tsx",
|
||||
"web/app/src/capabilities/blender-feature-route-catalog.json",
|
||||
"my-tools/show_blender_web_scheduler.py",
|
||||
"docs/WEB_FULL_FEATURE_GAP_INVENTORY.md"
|
||||
],
|
||||
"implementation": "Add a route-aware dashboard and scheduler summary for all 3745 units, broken down by WEB_MAIN, SERVER_NATIVE, BROWSER_EQUIVALENT and UNAVAILABLE, with explicit unverified behavioral evidence and no false completion claims.",
|
||||
"attempts": 1,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/FEATURE-COVERAGE-DASHBOARD-result.json",
|
||||
"startedAt": "2026-09-06T12:39:33.154899+00:00",
|
||||
"completedAt": "2026-09-06T12:46:33.773768+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",
|
||||
"web/protocol/server-operator-job.ts",
|
||||
"tools/web/server-operator-job.py",
|
||||
"tools/web/server-job-process.mjs",
|
||||
"tests/golden/WBV2/product-migration/OPERATOR-ROUTE-PALETTE-result.json",
|
||||
"web/app/src/app/App.tsx",
|
||||
"web/app/src/capabilities/blender-feature-route-catalog.json",
|
||||
"my-tools/show_blender_web_scheduler.py",
|
||||
"docs/WEB_FULL_FEATURE_GAP_INVENTORY.md",
|
||||
"tests/golden/WBV2/product-migration/FEATURE-COVERAGE-DASHBOARD-result.json"
|
||||
],
|
||||
"sourceInventory": {
|
||||
"unitCount": 3745,
|
||||
"role": "traceability_only",
|
||||
"completionDenominator": false
|
||||
}
|
||||
}
|
||||
194
tests/golden/WBV2-P1423-001/task-context.json
Normal file
194
tests/golden/WBV2-P1423-001/task-context.json
Normal file
@@ -0,0 +1,194 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P1423-001",
|
||||
"parentTask": "WBV2-P1423-000",
|
||||
"status": "in_progress",
|
||||
"goal": "Complete execution routes for every classified Blender source unit. WEB_MAIN uses typed Main/WASM, SERVER_NATIVE uses bounded background Blender jobs, BROWSER_EQUIVALENT uses browser workflows, and UNAVAILABLE remains explicit.",
|
||||
"scope": {
|
||||
"gap": "workflow:complete source-unit route completion",
|
||||
"ownerFamily": "WEB_PRODUCT",
|
||||
"implementationClass": "PRODUCT_WORKFLOW"
|
||||
},
|
||||
"commands": [
|
||||
"node tools/web/print-task-context.mjs"
|
||||
],
|
||||
"inputPaths": [],
|
||||
"inputMetadata": {
|
||||
"docs/EXECUTION_QUEUE.md": {
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"exists": true,
|
||||
"bytes": 4030,
|
||||
"mtime_ns": "1788695403736116539",
|
||||
"sha256": "1b8e029c373ccee651d0b38c6693bddcfcf40cdaa70de2dc0a01cea219d1ea57"
|
||||
},
|
||||
"docs/tasks/WBV2-P1423-001.md": {
|
||||
"path": "docs/tasks/WBV2-P1423-001.md",
|
||||
"exists": true,
|
||||
"bytes": 1631,
|
||||
"mtime_ns": "1788695403733532446",
|
||||
"sha256": "8049ce83944a957bc2427d09637af13eddae1f36e5a2ead6717d0e408f492a8e"
|
||||
},
|
||||
"tests/golden/WBV2-P1423-000/manifest.json": {
|
||||
"path": "tests/golden/WBV2-P1423-000/manifest.json",
|
||||
"exists": true,
|
||||
"bytes": 929,
|
||||
"mtime_ns": "1788699728791887535",
|
||||
"sha256": "2d7d738a70f856bcb1d399ccdeb2c8d8f26d638ff5906efc041e84dbefa21d98"
|
||||
},
|
||||
"docs/status/WBV2-P1423-000.md": {
|
||||
"path": "docs/status/WBV2-P1423-000.md",
|
||||
"exists": true,
|
||||
"bytes": 150,
|
||||
"mtime_ns": "1788695403733601215",
|
||||
"sha256": "09f2757156819cdd026e487c170d3e90ea1e1a7f62fb3f38835b8775a9f5781a"
|
||||
}
|
||||
},
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 3164,
|
||||
"contextRemainingTokens": 789
|
||||
},
|
||||
"source": {
|
||||
"bytes": 6740,
|
||||
"tokens": 1687
|
||||
},
|
||||
"selected": [],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "web/app/src/capabilities/blender-feature-route-catalog.json",
|
||||
"bytes": 1863121,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md",
|
||||
"bytes": 4477,
|
||||
"reason": "CONTEXT_REMAINING_SPACE"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2/web-product-backlog.json",
|
||||
"bytes": 37263,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2/product-migration/*-result.json",
|
||||
"bytes": null,
|
||||
"reason": "MISSING_PATH"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P1423-001/product-implementation-report.json",
|
||||
"bytes": 39861,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 0,
|
||||
"bytes": 0,
|
||||
"tokens": 0
|
||||
}
|
||||
},
|
||||
"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-P1423-001.md",
|
||||
"taskIndex": "tests/golden/WBV2/task-index.json",
|
||||
"parentManifest": "tests/golden/WBV2-P1423-000/manifest.json",
|
||||
"parentStatus": "docs/status/WBV2-P1423-000.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/WBV2-P1423-001.md",
|
||||
"tests/golden/WBV2-P1423-000/manifest.json",
|
||||
"docs/status/WBV2-P1423-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-P1423-000",
|
||||
"parentTask": "WBV2-P1422-001",
|
||||
"status": "done",
|
||||
"nextTask": "WBV2-P1423-001",
|
||||
"artifactCount": 4
|
||||
},
|
||||
"statusSummary": [
|
||||
"# WBV2-P1423-000 status",
|
||||
"- status: `done`",
|
||||
"- nextTask: `WBV2-P1423-001`",
|
||||
"- route catalog: `web/app/src/capabilities/blender-feature-route-catalog.json`"
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1631,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 40,
|
||||
"taskTokens": 408
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 4030,
|
||||
"lines": 58,
|
||||
"tokens": 1008
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/WBV2-P1423-001.md",
|
||||
"bytes": 1631,
|
||||
"lines": 40,
|
||||
"tokens": 408
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P1423-000/manifest.json",
|
||||
"bytes": 929,
|
||||
"lines": 27,
|
||||
"tokens": 233
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P1423-000.md",
|
||||
"bytes": 150,
|
||||
"lines": 6,
|
||||
"tokens": 38
|
||||
}
|
||||
],
|
||||
"sourceTokens": 1687,
|
||||
"evidenceFiles": 0,
|
||||
"evidenceBytes": 0,
|
||||
"evidenceTokens": 0,
|
||||
"totalTokens": 1687,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 2711,
|
||||
"serializedContextTokens": 641,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "FEATURE-COVERAGE-DASHBOARD",
|
||||
"status": "implemented",
|
||||
"changedFiles": [
|
||||
"web/app/src/app/App.tsx",
|
||||
"web/app/src/capabilities/blender-feature-route-catalog.json",
|
||||
"my-tools/show_blender_web_scheduler.py",
|
||||
"docs/WEB_FULL_FEATURE_GAP_INVENTORY.md",
|
||||
"tests/golden/WBV2/product-migration/FEATURE-COVERAGE-DASHBOARD-result.json"
|
||||
],
|
||||
"summary": "Published route coverage and evidence-gap views for all 3745 classified units, including scheduler JSON/text summaries and explicit UNVERIFIED behavioral evidence."
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "OPERATOR-MACRO-COMPOSER",
|
||||
"status": "implemented",
|
||||
"changedFiles": [
|
||||
"web/protocol/blender-operator.ts",
|
||||
"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": "Added typed listBlenderMacros and invokeBlenderMacro routes with 58 bounded source-backed plans, native Main command execution, server-native plan handling, and pre-mutation rejection for context-dependent steps."
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "OPERATOR-ROUTE-PALETTE",
|
||||
"status": "implemented",
|
||||
"changedFiles": [
|
||||
"web/protocol/blender-operator.ts",
|
||||
"web/protocol/web-engine.ts",
|
||||
"web/app/src/app/App.tsx",
|
||||
"web/app/src/engine-client/WebEngineClient.ts",
|
||||
"web/app/src/workers/web-engine.worker.ts",
|
||||
"tests/golden/WBV2/product-migration/OPERATOR-ROUTE-PALETTE-result.json"
|
||||
],
|
||||
"summary": "F3 now loads the complete classified source-unit route catalog, merges native WEB_MAIN operators, displays route/reason badges, and gates invocation to typed native or SERVER_NATIVE routes."
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "RNA-REFLECTION-EXTENDED",
|
||||
"status": "implemented",
|
||||
"changedFiles": [
|
||||
"web/protocol/web-engine.ts",
|
||||
"web/protocol/scene-ir.ts",
|
||||
"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": "Extended the bounded Main/WASM RNA route with typed property schemas, validated array and enum writes, and bounded nested collection reads while keeping pointer, linked-ID, context-only, and arbitrary execution paths fail-closed."
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "SERVER-OPERATOR-JOB",
|
||||
"status": "implemented",
|
||||
"changedFiles": [
|
||||
"web/protocol/server-operator-job.ts",
|
||||
"web/protocol/blender-operator.ts",
|
||||
"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",
|
||||
"tools/web/server-operator-job.py",
|
||||
"tools/web/server-job-process.mjs"
|
||||
],
|
||||
"summary": "Added the hash-bound SERVER_NATIVE operator-job contract, Worker/client routes, native validation envelope, isolated background Blender runner, cancellation/resource budgets, and bound result metadata."
|
||||
}
|
||||
@@ -623,3 +623,5 @@
|
||||
{"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"}
|
||||
{"id":"WBV2-P1423-000","gapId":"workflow:authorize source-unit route completion","ownerFamily":"PROGRAM","sourceTask":"1423","state":"completed","targetImplementationClass":"QUEUE_ONLY"}
|
||||
{"id":"WBV2-P1423-001","gapId":"workflow:complete source-unit route completion","ownerFamily":"WEB_PRODUCT","sourceTask":"1423","state":"completed","targetImplementationClass":"PRODUCT_WORKFLOW"}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"strategy": "implementation_first_full_feature_gaps",
|
||||
"strategy": "implementation_first_route_complete",
|
||||
"verificationPolicy": "deferred_until_user_reports",
|
||||
"previousQueueTask": "WBV2-P1421-001",
|
||||
"rootTask": "WBV2-P1422-000",
|
||||
"queueTask": "WBV2-P1422-001",
|
||||
"previousQueueTask": "WBV2-P1422-001",
|
||||
"rootTask": "WBV2-P1423-000",
|
||||
"queueTask": "WBV2-P1423-001",
|
||||
"sourceInventory": {
|
||||
"unitCount": 3745,
|
||||
"role": "traceability_only",
|
||||
@@ -22,7 +22,9 @@
|
||||
"status": "implemented",
|
||||
"taskIds": [
|
||||
"NATIVE-OPERATOR-BRIDGE",
|
||||
"WEBUI-OPERATOR-PALETTE"
|
||||
"WEBUI-OPERATOR-PALETTE",
|
||||
"OPERATOR-ROUTE-PALETTE",
|
||||
"FEATURE-COVERAGE-DASHBOARD"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -139,7 +141,10 @@
|
||||
"title": "Worker, performance and modular WASM lifecycle",
|
||||
"status": "implemented",
|
||||
"taskIds": [
|
||||
"RNA-DATABLOCK-REFLECTION"
|
||||
"RNA-DATABLOCK-REFLECTION",
|
||||
"SERVER-OPERATOR-JOB",
|
||||
"OPERATOR-MACRO-COMPOSER",
|
||||
"RNA-REFLECTION-EXTENDED"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -775,7 +780,127 @@
|
||||
"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"
|
||||
},
|
||||
{
|
||||
"id": "SERVER-OPERATOR-JOB",
|
||||
"module": "RUNTIME",
|
||||
"title": "Execute background-safe Blender operators through server jobs",
|
||||
"commands": [
|
||||
"submitServerOperatorJob",
|
||||
"cancelServerOperatorJob",
|
||||
"readServerOperatorResult"
|
||||
],
|
||||
"ownedPaths": [
|
||||
"web/protocol/server-operator-job.ts",
|
||||
"web/protocol/blender-operator.ts",
|
||||
"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",
|
||||
"tools/web/server-operator-job.py",
|
||||
"tools/web/server-job-process.mjs"
|
||||
],
|
||||
"implementation": "Add a bounded, hash-bound server operator job contract for the SERVER_NATIVE route. Run Blender background operators in an isolated workspace with typed properties, cancellation, resource budgets and result binding; reject UI/window/file-browser context.",
|
||||
"attempts": 1,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/SERVER-OPERATOR-JOB-result.json",
|
||||
"startedAt": "2026-09-06T11:50:38.732808+00:00",
|
||||
"completedAt": "2026-09-06T11:56:54.152838+00:00"
|
||||
},
|
||||
{
|
||||
"id": "OPERATOR-ROUTE-PALETTE",
|
||||
"module": "WORKSPACE",
|
||||
"title": "Expose every classified operator route in the browser palette",
|
||||
"commands": [
|
||||
"listFeatureRoutes",
|
||||
"invokeFeatureRoute"
|
||||
],
|
||||
"ownedPaths": [
|
||||
"web/protocol/blender-operator.ts",
|
||||
"web/protocol/web-engine.ts",
|
||||
"web/app/src/app/App.tsx",
|
||||
"web/app/src/engine-client/WebEngineClient.ts",
|
||||
"web/app/src/workers/web-engine.worker.ts",
|
||||
"web/app/src/capabilities/blender-feature-route-catalog.json"
|
||||
],
|
||||
"implementation": "Load the complete source-unit route catalog, merge WEB_MAIN operators with server-job and browser-equivalent entries in F3, and show an explicit route/reason badge. Invoke only typed native or server-job routes.",
|
||||
"attempts": 1,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/OPERATOR-ROUTE-PALETTE-result.json",
|
||||
"startedAt": "2026-09-06T11:56:54.153358+00:00",
|
||||
"completedAt": "2026-09-06T12:09:25.081441+00:00"
|
||||
},
|
||||
{
|
||||
"id": "OPERATOR-MACRO-COMPOSER",
|
||||
"module": "RUNTIME",
|
||||
"title": "Decompose and execute operator macros as native command plans",
|
||||
"commands": [
|
||||
"listBlenderMacros",
|
||||
"invokeBlenderMacro"
|
||||
],
|
||||
"ownedPaths": [
|
||||
"web/protocol/blender-operator.ts",
|
||||
"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"
|
||||
],
|
||||
"implementation": "Represent the 58 macro units as bounded, source-backed command plans. Reuse existing Main transactions where possible, otherwise submit a server-native plan; reject context-dependent macro steps before mutation.",
|
||||
"attempts": 2,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/OPERATOR-MACRO-COMPOSER-result.json",
|
||||
"startedAt": "2026-09-06T12:24:26.368422+00:00",
|
||||
"completedAt": "2026-09-06T12:28:41.978753+00:00"
|
||||
},
|
||||
{
|
||||
"id": "RNA-REFLECTION-EXTENDED",
|
||||
"module": "RUNTIME",
|
||||
"title": "Extend RNA reflection to arrays, enums and nested collections",
|
||||
"commands": [
|
||||
"readRNAPropertySchema",
|
||||
"setRNAArrayProperty",
|
||||
"setRNAEnumProperty",
|
||||
"readRNACollection"
|
||||
],
|
||||
"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": "Expand the bounded RNA route beyond primitive scalars to validated arrays, enums and nested collection reads/writes, keeping pointer, ID-link, context-only and arbitrary execution paths fail-closed.",
|
||||
"attempts": 1,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/RNA-REFLECTION-EXTENDED-result.json",
|
||||
"startedAt": "2026-09-06T12:28:41.979600+00:00",
|
||||
"completedAt": "2026-09-06T12:39:33.154038+00:00"
|
||||
},
|
||||
{
|
||||
"id": "FEATURE-COVERAGE-DASHBOARD",
|
||||
"module": "WORKSPACE",
|
||||
"title": "Publish complete source-unit route coverage and gap dashboard",
|
||||
"commands": [
|
||||
"featureRouteCoverage",
|
||||
"featureRouteGaps"
|
||||
],
|
||||
"ownedPaths": [
|
||||
"web/app/src/app/App.tsx",
|
||||
"web/app/src/capabilities/blender-feature-route-catalog.json",
|
||||
"my-tools/show_blender_web_scheduler.py",
|
||||
"docs/WEB_FULL_FEATURE_GAP_INVENTORY.md"
|
||||
],
|
||||
"implementation": "Add a route-aware dashboard and scheduler summary for all 3745 units, broken down by WEB_MAIN, SERVER_NATIVE, BROWSER_EQUIVALENT and UNAVAILABLE, with explicit unverified behavioral evidence and no false completion claims.",
|
||||
"attempts": 1,
|
||||
"status": "implemented",
|
||||
"resultPath": "tests/golden/WBV2/product-migration/FEATURE-COVERAGE-DASHBOARD-result.json",
|
||||
"startedAt": "2026-09-06T12:39:33.154899+00:00",
|
||||
"completedAt": "2026-09-06T12:46:33.773768+00:00"
|
||||
}
|
||||
],
|
||||
"gapInventory": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md"
|
||||
"gapInventory": "docs/WEB_FULL_FEATURE_GAP_INVENTORY.md",
|
||||
"routeCatalog": "web/app/src/capabilities/blender-feature-route-catalog.json"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user