# W-030 Status status: done task: 从内存读取 `.blend` ## Evidence - Reader: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp` - ABI: `web_engine_open_blend(handle, data, length)` copies an `ArrayBuffer` into WASM memory and never receives a browser or POSIX path. - Worker: `web/app/src/workers/web-engine.worker.ts` reports started/progress/completed phases and maps malformed input to `BLEND_READ_FAILED`. - Golden: `tests/golden/W-030/manifest.json` The reader accepts uncompressed, gzip and zstd Blender streams, validates the little-endian Blender header, decodes the embedded DNA1 schema and returns an empty or populated SceneIR snapshot. `empty.blend` and `basic_scene.blend` are both exercised by the WASM smoke. ## Verification ```text node tools/web/run-web-engine-smoke.mjs # empty + basic + save passed tools/web/check-dual-engine.sh # native ABI + WASM reader passed ``` ## Remaining risk The first reader is deliberately bounded to a 1 GiB block and summary export; evaluated mesh buffers are W-033.