refactor(coverage): one fallow config with per-function CRAP ceilings

Merged
TH
4d ago
+263-161

Summary

fallow-crap.json existed to re-enable CRAP for the Coverage job and to exempt two whole files at maxCrap: 1e12. Both jobs dissolve: the CLI's --max-crap 30 already overrides health.maxCrap: 0, and the CRAP verdict filters findings by coverage_source, so the shared config's cyclomatic/cognitive findings cannot reach it (verified against real fallow 3.32). The config file merges into .fallowrc.json, and the file-wide exemptions become function-scoped ceilings of 90 over the only 8 functions the measured map scores ≥ 30: the seven browser-evaluated audioProbe* functions (≤ 72) and png-worker's runJob (72) — the audit's 24 stale matches stop riding along. The exemption-reading subprocess goes with it: fallow's health JSON already echoes each override with the function it matched (active/insufficient/stale/no_match), so the report names its ceilings, breaches, and deletable entries from the same call. Sanitizer docstring and dropped-files wording verified accurate on Vitest 5 + the ported ast-v8-to-istanbul patch; unchanged.

Validation

Head 9e4e162: pnpm check:affected --run passed locally and CI owns Coverage. check:coverage-crap:test (real fallow): 52 pass; mutation-checked the stale/no_match branches. check:fallow --base origin/main green. Before --all: "no function(s) at or above 30" + 2 file-wide 1e12 exemptions; after: same headline + 8 named ceilings at 90.