# M11-08 Status status: done task: preserve unsupported compositor graphs and block execution updated: 2026-08-17 America/New_York ## Scope The CPU compositor and cached execution entry points now preflight the complete parsed graph before evaluation or cache lookup. Any `UNSUPPORTED` node blocks with `COMPOSITOR_NODE_UNSUPPORTED`, including a disconnected node that does not contribute to the Composite output. Unsupported Blender type names are sorted and deduplicated so the failure is deterministic. The gate is pure: it does not remove nodes, rewrite links, advance Main revision, run a cancellation callback, allocate an output, or accept a previously cached result. The existing Blender 5.2 fixture preserves its Glare node name, `UNSUPPORTED` IR type, and `CompositorNodeGlare` source type before and after the failed attempt. ## Evidence - `WEB_TEST_PORT=5565 npm --prefix web run test:compositor-unsupported-gate`: unit 2/2, native Main reader, and Chromium 1/1 passed. - `WEB_TEST_PORT=5566 npm --prefix web run test:e2e -- --grep "N-020"`: 2/2 passed; the supported synthetic CPU graph still executes, while the real graph containing a disconnected Glare node now fails closed. - The first new unit run was 172/173 because an async rejection used `assert.throws`. It was corrected to `await assert.rejects`; no implementation failure was counted as evidence. The complete Node suite then passed 173/173. - Full regression passed: typecheck, lint, production build, status consistency, release evidence validation, and `git diff --check`. ## Rollback Remove the complete-graph preflight from CPU/cached execution and the M11-08 tests and golden, restore the old N-020 smoke expectation, restore M11 to 7/14, and remove the N-020 completed slice. Keep M11-07 CPU/WebGPU goldens unchanged.