# M10-09 Status status: done task: Preserve the previous usable material pipeline on compile failure updated: 2026-08-16 America/New_York ## Scope `PBRMaterialPipeline` makes material replacement transactional. A successfully compiled candidate becomes current only after compilation; the previous material is disposed exactly once after replacement. A blocked candidate is disposed and the current material remains usable, with the failed report stored as `shaderCompileFailure` for diagnostics. This does not claim arbitrary Shader Node support or a WebGPU pipeline. The Engine Worker independently rejects blocked `setShaderGraph` requests before the Blender Main transaction, so a failed graph cannot publish a new SceneIR snapshot in addition to the viewport-side rollback. ## Evidence - `WEB_TEST_PORT=5525 npm --prefix web run test:shader-pipeline`: Chromium 1/1. The test confirms the failed candidate reports `SHADER_NODE_UNSUPPORTED`, keeps object identity and the previous compiled report, and that a later successful compile replaces the material. - `npm --prefix web run typecheck` and `npm --prefix web run lint` passed after the pipeline helper was added. - `tests/golden/M10-09/shader-pipeline.json` fixes the rollback invariants. ## Implementation Hashes - PBR adapter: `8a9cb52c8e7b1481096017cc659d93541c21724c1203d22755e37e1e3c365250`. - Chromium spec: `e6771f672e885250db199cbf97a0a3866084ab9bb3f2ad25d17f5c53edaa99af`. - Golden: `5dbb916e512935a76dacde37242b123707897f54ab10d7b99e246f57afbc94ac`. ## Rollback Remove `PBRMaterialPipeline`, its Chromium test/golden and this status file. Keep the M10-08 compile key and Engine Worker pre-transaction gate, and restore the M10 count to 8/15.