A predictor that guesses wrong destroys trust in every number beside it. So anything not lexically
determinable is reported as unknown rather than resolved to a plausible answer.
What gets reported as unknown
- A component arriving through
children or held in a variable, outside a layout - the
layout.tsx → page.tsx relationship is resolvable by file convention, so layouts are not
flagged
- A component name defined in more than one file, where the render site cannot disambiguate
- A boundary child that resolves to no source file - usually a dependency’s component
export const dynamic = … computed at runtime rather than written as a literal
Function-level tracing with a conservative fallback
crust tracks imported bindings to exported declarations and follows resolvable first-party calls.
If a route imports cachedProduct and liveProduct from one module but calls only
cachedProduct, it does not inherit the uncached read from the unused function.
Calls become conservative at module granularity when the target is computed, read through a
namespace, passed opaquely, or otherwise cannot be narrowed to one export. The cause chain stops at
that segment, marks the evidence as unknown, and coverage reports the module as conservatively
analysed.
The conservative fallback must not condemn a component merely because its file imports something
dynamic. That mistake reported <RootLayout> as a hole on every route of a real 25-route app.
Function reachability decides what the entry actually calls; unresolved work remains visible
instead of silently becoming component blame.
Analysis coverage
The terminal and report expose the denominators behind their confidence line:
- classified routes / measurable routes
- measured emitted shells / emitted shells
- attributed client JavaScript / total client JavaScript
- unresolved component relationships
- modules that required file-granularity analysis
The first three ratios produce the displayed confidence percentage. Unresolved relationships and
conservative modules remain separate counts because they have no honest total denominator.
Rendering mode
When a route is not prerendered and no dynamic API appears in source, crust reports unknown with
the reason attached, rather than assuming DYNAMIC.
Attribution
A chunk with no source map is reported as unattributed bytes with the reason
no source map emitted for this chunk. Repeated instances collapse into one line naming the fix -
a list of 673 identical warnings buries every other warning and teaches people to skip the section.