5223cbb3

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

One derivation, an hlint config with reasons, and a README that is two things

makeHopinionCheck replaces checksFor, and returns a single derivation rather
than an attrset, mirroring dekking's makeCoverageReport: the product is the
project report at the output, and the judge that reads it is a buildInput, so
building it fails on a finding and leaves the report readable either way. The
per-package outputs are underneath it, pulled in by the project one, so changing
a single package still rebuilds three derivations rather than all of them.

The hlint config takes its shape from nix-ci's. Every ban now says why and what
to use instead, which is the difference between a rule and a wall. It gains the
future and use-th-quotes groups, the unsafe-IO and lazy-IORef bans, the
QuickCheck ones that keep a property test a property test, and a Char8 ban.
foldr is restricted with one exception, and the exception is what proves the
ban: removing it makes hlint report the one call site.

Two of nix-ci's are deliberately not copied. Its per-extension bans, because the
allowlist here is the stronger form of the same thing, and now the load-bearing
one: extensions moved into the modules that need them, so the allowlist is what
stops a new one arriving unremarked. And `typeApplications: required` on show,
which needs a patched hlint this flake does not carry.

README.md is now what it says on the tin and how to add the check to a project.
The 420 lines it carried were design and rationale, so they are in plan/notes.md
with the rest of the planning material, and go when plan/ goes. check-plan.sh
follows them there: the open decisions still have to be split by owner, which is
the assertion that keeps them owned rather than merely written down.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 0s 1s 1s 1s 0s
Eval 1s 15s 15s 16s 0s
Build 6s 4s 9s 15s 0s
Suite 0s 20s 16s 16s 0s

Timeline

0s10s