Automatic regression checks
As soon as a comparable baseline exists,crust ci fails without a budget file when:
- a route moves down the rendering-mode scale
- a new uncached-read reason appears
- a route that previously emitted a measurable shell emits none
ROUTE_HANDLER is not on this scale because a handler has no page shell. unknown is not on the
scale because placing it anywhere would turn missing evidence into a claim.
Explicit ceilings
These rules require.perf/budgets.json because crust cannot know the right limits for another
project:
- maximum first-load bytes globally or per route
- maximum percentage growth against a baseline
- minimum static-shell ratio globally or per route
When crust does not call a regression
A newly added route
Its baseline size is mathematically zero, but calling its entire bundle “growth” would make every new page a regression. New routes are reported as additions and can still breach an absolute first-load ceiling.An unknown rendering mode
If either side isunknown, the change is shown but has no direction and does not fail the
rendering-mode check.
Incomparable builds
crust does not compute enforceable deltas when any of these changed:- bundler
- Next.js major version
- snapshot schema version
Byte noise
Chunk filenames are content-hashed, so tiny byte changes can appear even when behavior did not. crust records exact totals but does not classify a first-load delta of 512 bytes or less as a regression.Intentional downgrades
UseallowRegression when making a route less static is deliberate:
.perf/budgets.json
firstLoadBytes, maxGrowth, and shell-ratio ceilings continue to apply.
How a cause is selected
For each regressed route, crust prefers evidence in this order:- a newly postponed component with a call site
- a newly introduced uncached read
- the reason for a rendering-mode drop
- the largest changed first-party module
unknown, with the missing evidence stated