950b6d6f

hopinion: static analysis that enforces the code review standards

The whole repository as one commit on top of the empty initial one, so the diff
is everything there is to read.

## What it is

Static analysis that mechanically enforces the comment, style, testing and
process guides, plus a Nix layer that runs it over a repository as one check.
Three rules ship, one at each of the three levels, which is what makes the level
machinery real rather than designed. Adding a fourth is a module and one line.

## Where to start

`README.md`, then `plan/context.md` for what the current shape came from, the
invariants it stands on, and what is deliberately not built. `CLAUDE.md` has the
feedback loops in order of increasing coverage and cost.

`plan/` is scaffolding for the bootstrap and goes when the first version does.

The part to review hardest is `Hopinion.Extract`: it grows with every new fact
and never with a new rule, so a fact that is wrong there is wrong for every rule
that reads it. `Hopinion.Comment` is second, because comment attachment is what
twenty-one comment rules will stand on and it fails silently when wrong.

## What has been run

- `nix flake check`: passes, 69 checks including the end to end tests over the
  derivations.
- `cabal test hopinion-test`: 308 tests.
- `scripts/corpus-run.sh` over nix-ci, sydtest, centjes and this repository.
- The consuming repository, on its adoption branch: the check builds green over
  22 packages, with 818 modules answered for by the compiler and no complaints.

## Open, and yours to decide

- **No LICENSE.** The repository is private, so nothing forces the question yet,
  but a consumer pinning it will want an answer.
- **Two corpus numbers are unexplained**, and `CLAUDE.md` says a number the
  corpus run prints is either explained in `plan/context.md` or it is a bug.
  sydtest reports 22 unmet obligations against a survey estimate of about one,
  and centjes was in the corpus list with no numbers recorded at all. Both are
  source-only counts and therefore a floor rather than an answer; running the
  two under the Nix builders is what settles them. `plan/context.md` says so
  rather than leaving the gap silent.
- **The open decisions in `plan/context.md`**, six of which turn on preference
  or on things outside this repository.

## Known and deliberate

- Three rules is the whole shipped rule set. The value at first use is
  regression prevention plus machinery that a fourth rule costs a module.
- `packages` is named rather than discovered, so a package a repository does not
  name is not checked. That is a decision somebody writes down rather than a
  directory a walk did not reach, and the error for a name that resolves to
  nothing lists the directories that do hold a cabal file.
- `plan/modularity.md` predicted about 1,300 lines of infrastructure carrying 55
  lines of rules. It is 6,542 carrying 599, over three rules. `plan/context.md`
  says what that means and what would settle whether the per-rule cost is real.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 2m12s 1s 1s 2m13s 2m12s
Eval 2m30s 12s 12s 2m43s 16s
Build 2m38s 0s - - 0s
Suite 2m12s 14s - - 5h16m16s