feat(engine)!: SKIP stops outranking OK, coverage gets its own axis

A repo's `status` is now the worst JUDGED finding, and `SKIP` only when
nothing was judged. `SKIP` used to rank between `OK` and `WARN`, so one
un-runnable check spoke for every check that ran: 0 ERROR, 0 WARN and a
dozen OK headlined as "skipped". Five repos in org-ops census 05, `okr`
among them with the most OK in the org, reading as unread.

"`SKIP` is never a pass" survives in the half of the rule that carries
it — an unregistered repo, or an empty finding set, still says SKIP,
because there is nothing else to be worst of.

Fixing the status alone would have traded "clean repos look skipped" for
"skipped checks look clean". So `notChecked` rides beside it: in --json,
and as a `· N not checked` qualifier on the summary line. Absent means an
older engine, not zero.

Measured across all 21 local clones from ONE saved sweep, so before and
after come from the same findings rather than two sweeps of a moving org:
343 findings before, 343 after. 8 repos moved, every one SKIP -> OK.
1 ERROR and 3 WARN before, 1 ERROR and 3 WARN after — the counts that
decide whether a repo needs work did not move.

BREAKING: consumers reading `.status` see a changed value domain.

147 -> 154 tests.
This commit is contained in:
Kjell Tore Guttormsen 2026-08-09 21:29:08 +02:00
commit 10ad1254ab
7 changed files with 162 additions and 14 deletions

View file

@ -10,7 +10,7 @@ checks that surface in one repository and reports what it finds.
*AI-generated: all code produced by Claude Code through dialog-driven development.*
![Version](https://img.shields.io/badge/version-0.6.0-blue)
![Version](https://img.shields.io/badge/version-0.7.0-blue)
![Platform](https://img.shields.io/badge/platform-Claude_Code_Plugin-purple)
![Skills](https://img.shields.io/badge/skills-1-orange)
![License](https://img.shields.io/badge/license-MIT-lightgrey)
@ -84,6 +84,17 @@ The process exits 1 on any `ERROR`. A `SKIP` means the check could not run — a
unreachable forge, an untagged repo, a link that leaves the repository. It is
not a pass, and the output prints those separately under a heading that says so.
A repository's own `status` is the worst of the findings that were *judged*, and
`SKIP` only when nothing was. A skip is not a severity — it is the absence of a
verdict, so it cannot outrank twelve checks that did run. Coverage rides beside
it on its own axis: `notChecked` in `--json`, and a qualifier on the summary
line, so a pass that had checks it could not run never prints unqualified.
```
✓ okr [plugin] — OK · 1 not checked (repo-standard v0.7.0 @5884a64)
· stranger — SKIP · 1 not checked (repo-standard v0.7.0 @5884a64)
```
### Traits — a second axis
Class is structural. A **trait** is about what the code does, which no remote can
@ -186,7 +197,7 @@ The header and the `--json` output carry the engine's version *and* the commit
it ran from:
```
✓ voyage [plugin] — OK (repo-standard v0.6.0 @a7276e6)
✓ voyage [plugin] — OK (repo-standard v0.7.0 @a7276e6)
```
Both, because they answer different questions. A stale plugin cache once served