# M10-01 Status status: done task: 从 Blender Main 读取 Geometry Nodes 图拓扑、socket 默认值、link 和稳定 node ID updated: 2026-08-16 America/New_York ## Scope The WebEngine authoritative Main reader publishes a bounded `GeometryNodeGraphIR` snapshot for every `GeometryNodeTree`. It preserves unsupported nodes as metadata, uses Blender node identifiers and socket identifiers rather than display names, and does not evaluate Geometry Nodes. The existing `web/protocol/schema-version` remains `1`: `geometryNodeGraphs` is an additive optional SceneIR field and no existing field meaning or persisted storage schema changed. ## Evidence - Fixture: `tests/files/web/modifier_geometry_nodes_scene.blend`. - Fixture SHA-256: `f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9`. - Desktop reference: `tests/golden/W-075/modifier_geometry_nodes_scene.json`. - Desktop reference SHA-256: `93c21e5158daefce10f2d4df674e636bf3f6ed3dd43e1576c45a02a8592f5886`. - Golden manifest: `tests/golden/M10-01/geometry-node-main-reader.json`. - Protocol/unit check: `node --test web/tests/unit/geometry-nodes.test.mjs` (3/3). - Native/WASM reader check: `node tools/web/check-geometry-node-main-reader.mjs`; 3 graphs, 10 nodes, 7 links, 9 defaults, stable IDs, graph hashes, desktop comparison, save/reopen and unsupported Simulation-node preservation all passed. - Chromium Worker check: `WEB_TEST_PORT=5440 npm --prefix web run test:geometry-node-main-reader` (unit 3/3, reader 1/1, Chromium 1/1). - `source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8`: passed (`ninja: no work to do`). - `npm --prefix web run typecheck`, `npm --prefix web run lint`, `npm --prefix web run build`, and `git diff --check`: passed. ## Contract - Per-graph budgets are fixed at 4,096 graphs, 4,096 nodes, 16,384 links, 65,536 node sockets, and 4,096 interface sockets. - Graphs, nodes, links, and socket arrays are deterministically ordered before the graph SHA-256 is emitted. - Socket data types and finite defaults are read from Blender's native `bNodeSocket` storage; ID-valued defaults are serialized as stable typed IDs. - `__extend__` sockets are omitted because they are UI extension sockets, not graph data. Missing/duplicate identifiers, invalid links, and budget overflow fail closed. - Unsupported node types remain in the graph and are available to the later M10-02 allowlist gate; this task does not claim Geometry Nodes evaluation. ## Rollback Remove the M10-01 reader, protocol field, golden, unit/E2E checks, package script and this status file together. Existing SceneIR consumers continue to accept snapshots without the optional `geometryNodeGraphs` field.