Spirolo

Rules

Sixteen rules in five families, each with its measured status.

Every rule runs on every check. How far to trust a finding explains which ones you see by default. None fails the build until you say so.

RuleFamilyTierTrue / decided
absence-anchorWeak testsadvisory16 / 20
fail-closed-setupMerge gateadvisory19 / 19
dead-skipMerge gateadvisory18 / 18
duplicate-testUnused testsadvisory15 / 18
gate-truthMerge gateexperimental12 / 18
unused-mockUnused testsexperimentalnone
flake-candidateFlakyexperimental3 / 6
untested-hotspotHealthexperimental5 / 16
weak-assertionWeak testshidden12 / 34
handler-driftWeak testshiddennone
data-layer-mockWeak testshiddennone
generator-walkWeak testshiddennone
redundant-testUnused testshidden0 / 12
orphan-testUnused testshidden4 / 14
stale-snapshotUnused testshiddennone
flake-observedFlakyhidden39 / 52

Weak tests

Would this test notice if the code were wrong? absence-anchor, weak-assertion, handler-drift, data-layer-mock, generator-walk. spirolo audit runs only these.

Merge gate

Does a broken test actually block the merge? fail-closed-setup, dead-skip, gate-truth. spirolo gate runs only these.

Unused tests

Which tests add nothing? duplicate-test, redundant-test, unused-mock, orphan-test, stale-snapshot. spirolo hygiene runs only these. They accept warn at most: error is a config error.

Flaky

Which tests can pass on one run and fail on the next? flake-candidate reads the code; flake-observed reads your recorded runs. spirolo flake runs only these.

Health

Where does a new test pay first? untested-hotspot ranks source modules by churn, complexity and test weakness.

On this page