The build, before there is anything to build The build, and nothing that uses it yet. First of five. Each one adds a rule and exactly the machinery that rule needs, and each passes `nix flake check` on its own. ## What is here 16 files, 706 lines. - `flake.nix`: the dev shell, `release`, `hlint-check`, `weeder-check`, and the pre-commit hooks (hpack, cabal2nix, ormolu, nixpkgs-fmt). - `.hlint.yaml`: partial functions banned, an allowlist of language extensions, `Data.ByteString.Char8` refused, lazy `foldr` and `modifyIORef` refused. - `weeder.toml`, `cabal.project`, `stack.yaml`, `.envrc`, `.gitignore`. - `hopinion`: a library with one function that prints that it has no rules, and an executable that calls it. It is here so that none of the checks above is vacuous. Nothing parses Haskell. Nothing decides anything. ## The one thing worth arguing about The warnings live in `package.yaml` rather than in the overlay, so a `cabal build` in the dev shell says what a Nix build would; the overlay adds `-Werror` on top. That makes the difference between a warning and a failure a property of how it is built rather than of what it is. `-Wunused-packages` and `weeder` are in that set deliberately. They are what will keep every later PR to the machinery its rule actually needs: on the next one they removed 14 dependencies, 13 definitions and a dozen imports that had stopped being used. ## Review loop ``` nix flake check ```