9c04f864

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

Type the paths and the errors, and refuse three ways of answering nothing

Three commands answered a question they could not answer, and said so with
an exit code of nought.

`explain` on a name no rule answers to printed its complaint on stdout and
succeeded, so a caller could not tell it from an explanation. It also told a
repository that a rule it had turned off was not in this build at all, which
sends a reader looking for a typo they did not make. It now says the rule is
off, and refuses only a name nothing answers to.

`judge` with no reports at all succeeded, so a wiring mistake that passed
nothing would go green having read nothing. Its argument is a NonEmpty now, so
the empty case is unrepresentable rather than checked.

`check` on a path that is not a directory died inside a directory walk with a
GHC backtrace, before any report had been written, which is the one thing the
producing-and-judging split exists to prevent.

Discovery's errors are a type with a renderer rather than sentences built
where they are raised, so a new way of failing is a constructor every site has
to reconsider. Paths are `path` and `path-io` throughout the library: the
report directories, the artifact trees and the choices file are typed and
resolved at the command line boundary the way source roots already were, and
existence comes from `forgivingAbsence` rather than a question asked before an
operation that answers it anyway. `-Wunused-packages` then says the library
needs neither `directory` nor `temporary`. What is left of `System.FilePath`
is two qualified uses on strings this tool did not write: GHC's recorded
source path, and Cabal's `extra-source-files` globs, both parsed into `Path`
straight after.

Every corpus number is now accounted for in plan/context.md, one at a time and
by hand, rather than two columns marked unexplained. sydtest's three non-zero
rows are one fact: `sydtest-mutation-runtime` has no gen package. centjes's 23
obligations are types with no `genValidSpec` anywhere in that repository.
Neither moves with artifacts, so they are answers rather than floors. nix-ci's
adoption debt is 25 and had been recorded as 27.

AGPL-3.0-or-later, matching marginalia, which is the sibling tool of the same
kind.