Commit builds/ and modules/
One file per snapshot, never a shared append-only log. A history.jsonl would conflict every single
time two branches both record a build - exactly when history is most worth having.
Module tables are content-addressed separately because module sizes repeat almost identically
between builds; inlining them would make each snapshot 50–200 kB of near-duplicate data.
Each build snapshot also keeps cause chains, client-boundary and barrel costs, shared-cause groups,
build configuration, and the raw counts behind analysis coverage. These are stored with the build
because a future tool version must not reinterpret old evidence using newer analysis rules.
Add index.db to .gitignore. It is derived and rebuilt by scan, and publishing it just creates
conflicts between machines that built it at different times.
findings.jsonl
crust ci appends one row for every blocking breach. Each occurrence has a unique id to mark and a
content key for identical breaches. Mode and cache keys remain stable across runs; byte, growth, and
shell keys can change with the measured values included in their message:
aliases.json
Trends are keyed on the page file path, which survives URL refactors but not file moves. An alias stitches the history back together:.perf/aliases.json
overrides.json
Manual answers for specifiers no resolver can settle - computed dynamic imports, exotic plugin-resolved aliases. Maps a specifier to a workspace-relative file:.perf/overrides.json
schema.json
Records the snapshot schema version. It is bumped on any change to the stored shapes - a snapshot outlives the tool version that wrote it, and silently reinterpreting old records under new semantics is how a history feature starts lying about the past.crust diff refuses to compare across schema
versions.