The action
.github/workflows/crust.yml
The action lives on
master. baseline is a branch in your repository and is unrelated to it -
set it to whatever your pull requests target.What fails without configuration
Once a comparable baseline exists, no budget file is required for strict regressions:- a route became less static
- a new uncached read appeared
- a route stopped emitting a static shell
crust ci exits non-zero when one is detected.
New routes are not regressions. A transition involving
unknown is reported but not assigned a
direction. Different bundlers, Next.js majors, or snapshot schemas are not compared.Add project-specific ceilings
Create.perf/budgets.json at the workspace root for limits crust cannot choose for you:
.perf/budgets.json
allowRegression exempts only automatic rendering-mode, cache, and shell-disappearance checks for
the named route. Explicit byte, growth, and shell-ratio ceilings still apply.The comment
<!-- crust-report --> marker so the action updates the existing one
instead of stacking a new comment on every push. It leads with the decision and attribution
coverage. Improvements get their own visible section, and packages, client boundaries, barrels, and
shared call sites are grouped once with their route blast radius. Additional neutral route movement
stays behind a disclosure. If the builds are incomparable, no route deltas are printed.
Measure whether authors agree
Every blocking breach is appended to.perf/findings.jsonl before the action publishes history.
Reviewers can mark the occurrence locally after fetching history:
rate reports disputed / (agreed + disputed). Open findings are unfinished measurement and do not
enter the denominator; with no reviewed findings the rate remains unmeasured rather than appearing
as 0%. The pre-ownership-routing target is fewer than 1 in 10 reviewed findings disputed.
The import chain, one click away
Cause and Introduced by answer what broke and where. The chain behind them answers how it got
into this route, which is a different question, so it is folded rather than inlined - on a deep
import path it would push the verdict off the screen:
verified states its evidence level and the segment
crust could not follow.
Configuration is reported apart from code
Build configuration moves for reasons no pull request caused, so it is never mixed into the route deltas:dynamic, revalidate, runtime, or fetchCache still fails, with the
declaration named beside the mode drop:
crust ci exits non-zero on a breach.
Snapshot history
A fresh CI checkout has no.perf/ directory, so the baseline lives on an orphan branch:
git log or complicating rebases.
Run the check without the action
--comment writes Markdown only; posting it is the CI
provider’s responsibility.