# M10-07 Status status: done task: Bounded WebGL2/Three physical compiler for the declared Shader node subset updated: 2026-08-16 America/New_York ## Scope The browser material path now compiles only the declared RGB, Value, Math, Image Texture, Normal Map, Principled, and Material Output closure. The compiler produces a schema-versioned `WEBGL2_THREE_PHYSICAL` report before a Shader Main transaction is sent to Blender. Unknown nodes, cycles, duplicate inputs, missing or blocked images, oversized graphs, and invalid constants fail closed without mutating the source graph. This task does not claim arbitrary Shader Node support, WebGPU compilation, complete color management/sampler parity, compile-key invalidation, or pipeline rollback; those remain later M10 tasks. ## Protocol and Runtime - `web/protocol/shader-compiler.ts` defines the M10-07 allowlist, fixed node/link/ depth/texture/identifier budgets, deterministic graph fingerprint fallback, scalar Math evaluation, and bounded `ShaderCompileReport`. - The Engine Worker compiles `setShaderGraph` before the native Main transaction, rejects a blocked report, and returns the report with the committed delta. - Main-thread and Offscreen viewport material creation share `createPBRMaterial`; compiled constants and declared base-color/normal texture bindings are stored in material `userData` for the texture adapter. ## Evidence - `WEB_TEST_PORT=5521 npm --prefix web run test:shader-compile`: unit 5/5 and Chromium 3/3 passed. The suite covers the real Main graph transaction, Math result and topological order, Image/Normal bindings through the shared viewport path, missing resources, cycles, duplicate inputs, oversized graphs, forged fingerprints, and source graph immutability on blocked input. - `tests/golden/M10-07/shader-compile.json` fixes the fixture digest, backend, allowlist, six Math operations, and compiler budgets. - The first attempt on the default port was rejected before browser startup because an existing process owned `127.0.0.1:5173`; it is not counted as a feature failure. ## Implementation Hashes - Compiler: `50b29c99d73c886a41bb8e10ccd2309068a1c09b23196655659b2f530d31f856`. - Engine Worker: `376efe09de20150fc32803745da7e7e55bb41d178302e45b1fd90a2fe7778b2e`. - PBR adapter: `f9c2e5ede635d11673f971c985288821af24ed81ecaadc95efefd958637672fd`. - Texture adapter: `d5e379e25e0ab8294523690c4d4c79203b6f1610b4d6a608b33a7118f51efa57`. - Unit test: `1e5d44b4f73f4ee4e4c9329f73628980df9337632dc48a3d50689f051a89b6e7`. - Chromium spec: `c59b9f349bd6ce329ffc89f64eba3fec3e1e02a528978bdc1c3793d921faabc3`. - Golden: `6bb8c07f014a0f2c1fd0e9ec16b08b99a524d8d3161bc556767acaf510c6c961`. - Package: `ea0fef34497d51448d5478f4a761bef3c4ca816c408fd8a0807eaa0b093d0df8`. ## Rollback Remove the compiler, Worker gate, shared material/texture adapter integration, M10-07 tests, golden and this status file together. Restore the M10 count to 6/15 and leave Shader Main's existing capability gate and writeback contract in place; do not retain a compiler report that is not enforced before Main mutation.