# WBV2-P2-004 status - task: `WBV2-P2-004` - parent: `WBV2-P2-003` - parity: `VIEWPORT.MAIN_OFFSCREEN` - implementationClass: `LOCAL_BOUNDED` - status: `done` - fixture: `tests/files/web/generated/WBV2-P2-004-VIEWPORT.MAIN_OFFSCREEN.blend` ## Evidence - Desktop and WASM load the same cube/camera SceneIR and preserve node, mesh, camera and scene data across save/reopen. - Chromium production dist renders nonblank pixels through both main-thread WebGL and Offscreen worker paths. - Selection and camera state are identical across backends; main-thread `WEBGL_lose_context` recovery returns ready with nonblank readback, and Offscreen disposal/reopen is exact. - Malformed blend input is rejected without mutating Main. ## Commands - `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P2-004.py -- tests/files/web/generated/WBV2-P2-004-VIEWPORT.MAIN_OFFSCREEN.blend` - `npm --prefix web run test:generated-gap -- --task WBV2-P2-004` - `node tools/web/check-generated-gap.mjs --task WBV2-P2-004` - `node tools/web/check-task-context.mjs --task WBV2-P2-004 --write` ## Handoff - nextTask: `WBV2-P2-005` - queue mutation: allowed after manifest and parent hash validation