Skip to content

Performance Budgets ​

Recorded numbers and the budgets enforced against them for R-026.

RecordPurpose
BudgetsSeparate deterministic regression gates from controlled-host timing

Measured ​

Node 24.19.0, built output, warm — one unrecorded warm-up followed by one recorded sample on the release development machine, in milliseconds. These legacy tests intentionally enforce regression ceilings rather than statistical latency claims.

NodesParsePrintSVG
1000.70.80.9
5007.02.23.6
200013.24.512.2

Each graph is fully connected in a chain, with a position and a labelled edge per node, so the numbers cover the geometry and attribute paths rather than bare declarations.

Enforced ​

Operation1005002000
Parse100 ms400 ms2000 ms
Print100 ms400 ms2000 ms
SVG200 ms600 ms3000 ms

The budgets sit far above the measurements on purpose. CI timing is noisy and a flaky budget gets deleted rather than fixed, so these are sized to catch an order-of-magnitude regression — an accidental quadratic in the id allocator, say — not to police milliseconds. Two shape assertions do the finer work: a tenfold increase in node count must cost well under a hundredfold, and a document whose labels all derive the same id must not degrade, which is the case that would expose a bad allocator.

Shared ELK and editor interaction gates (0.2.4) ​

The shared layout engine has separate 20-sample cold and warm series for connected 100, 500, and 2000-node fixtures. Both series enforce nearest-rank p95 ceilings of 500 ms, 2 s, and 10 s respectively; a 200-to-2000 warm-series growth ratio must remain below 30. A separate production Playwright path uses 500 positioned nodes and no edges, one warm-up, then 20 equivalent-state node drag and 20 zoom samples. Both input-to-double-animation-frame p95 values must remain at or below 50 ms. The controlled-machine performance gate is serial and has zero retries; GitHub-hosted shared runners are non-authoritative for these hard timing limits.

The exact fixture, raw samples, environment, and calibration rationale are in dev/archive/releases/0.2.4/slice-60/performance-calibration.md in the repository.

What is not budgeted ​

Selection, connection, waypoint, keyboard-authoring, and text-edit timing have no hard budget; their behavior stays covered by functional tests. Public viz, Node, and MCP layout remain direct calls. Only reference-editor initial/reflow layout uses the abortable worker, so this release does not imply a new public asynchronous or cancellation contract.

Run the legacy gates with npm test -w @coral-viz/language and npm test -w @coral-viz/render. Run the focused gates with the render layout-performance.test.ts and root test:e2e:performance commands on the recorded controlled release machine. Deterministic functional CI remains separate.