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.