b0b055b6

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 2m09s 1s 1s 2m10s 2m09s
Eval 2m28s 17s 17s 2m45s 18s
Build 2m36s 28s 5m50s 8m27s 5m12s
Suite 2m09s 47s 6m17s 8m27s 7m39s

Timeline

0s2m10s2m30s2m40s8m8m10s8m20s