Skip to main content
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.