# M10-15 Status status: done task: Browser performance, OOM-prevention and malicious-input gates for GN, Shader, NLA and Simulation updated: 2026-08-16 America/New_York ## Scope GN, Shader, NLA and Simulation now run in four isolated Chromium Worker sessions. Each session executes a representative bounded workload, rejects an over-budget input before evaluator/payload allocation, rejects a domain-specific malicious graph or manifest, and then proves that a small valid input still succeeds in the same Worker. NLA gains explicit track/strip/string budgets and exact declared-field checks. Simulation cache total/frame/range overages now return the dedicated `SIMULATION_CACHE_BUDGET_EXCEEDED` code. This is a deterministic OOM-prevention gate; it does not claim that arbitrary browser heap exhaustion is recoverable inside a domain evaluator. ## Evidence - `WEB_TEST_PORT=5536 npm --prefix web run test:m10-domain-gates`: Node 23/23 and Chromium 1/1. Measured Worker times were GN 54 ms (10 x 512 nodes), Shader 17 ms (100 compiles), NLA 62 ms (20 x 256 strips), and Simulation 2 ms (64 frame hashes), all below their 5/5/5/10 second gates. - Stable OOM/malicious codes: GN `GN_GRAPH_BUDGET_EXCEEDED`/ `GN_DEPENDENCY_CYCLE`; Shader `SHADER_NODE_UNSUPPORTED`/`SHADER_GRAPH_CYCLE`; NLA `NLA_BUDGET_EXCEEDED`/`NLA_INVALID_STACK`; Simulation `SIMULATION_CACHE_BUDGET_EXCEEDED`/`SIMULATION_CACHE_INVALID`. - Existing GN field budget (unit 6/6 + Chromium 1/1), Shader compiler (7/7 + 3/3), NLA operator (4/4 + 1/1), and Simulation lifecycle (6/6 + 1/1) all passed. - Typecheck, lint, production build (74 modules), status consistency and `git diff --check`: passed. ## Implementation Hashes - `web/protocol/error.ts`: `88119782307cb9a61e131f2d5e2e25127256c1e68a333fc7fc3206158b8a1019` - `web/protocol/nla.ts`: `96ae7cf9ca3fadbaf98ca15a38937329f203b0bc4a9c39ef685987e7f55353dd` - `web/protocol/simulation-cache.ts`: `a1302e42129420a96416e363cbc857d082d4646655685520c9e81f877ce3d9b8` - `web/tests/unit/nla.test.mjs`: `e11aa1f395970613cee5d37a9eb21c3fac3422f0080c75c78eb8777effb77adc` - `web/tests/unit/simulation-cache.test.mjs`: `2be82cdda991b47fbf8955cfbf2f92cb1fdc7b7c0debb0c8102d4f35e8fce8e3` - `web/app/src/workers/m10-domain-gate-test.worker.ts`: `bc508e1c81ca6efefd67b5c572f93c27dd71bd602319ae887c50e27f8a309a31` - `web/tests/e2e/m10-domain-browser-gates.spec.ts`: `2973a596df8613a9cfdb0bd4d300d95b71a8e818e615278a39fb777db6c5cf03` - `tests/golden/M10-15/domain-browser-gates.json`: `580051434ec6673251bac755cc189939de1f887aad088497e16a7657f3a83963` - `web/package.json`: `092931cebf9cb14814951703af26e2d0e4c5e0295c1ba4cb748bfe4ee49448c2` ## Rollback Remove the NLA stack budgets/exact-field checks, restore the former Simulation cache budget error mapping, remove the domain Worker/E2E/golden/package command and this status file, then restore M10 to 14/15. Keep all M10-01 through M10-14 behavior.