docs(catalog): audit all 13 badge-less stat axes at their pinned tags

The stat-badge gate skips any axis the plugin does not badge, so those
numbers are structurally unverifiable and rot in silence. Hand-audited
every remaining one against ground truth extracted from the pinned tag
(git archive <ref>, never the sibling working tree).

12 of 13 measured exact. The one defect: voyage's `500+ tests`, which is
832 at v5.9.1 — true as a lower bound, so the gate could never have seen
it, but a 40% understatement to a reader comparing plugin blocks.

Also corrects CLAUDE.md's own worked example: `1441 tests` was the number
the ref-defect produced by reading config-audit's working tree; 1398 is
what v5.13.0 installs. Records the two counting rules calibrated against
the badged plugins — hooks = hook command entries (events and matchers
both diverge from the badge), tests = `ℹ tests` and not `ℹ pass`.

Gate: 11 OK / 0 WARN / 0 ERROR. Tests 120/120.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D6Sy2bjLWXjh59g1WsAe4X
This commit is contained in:
Kjell Tore Guttormsen 2026-08-02 21:41:22 +02:00
commit beb48c4678
2 changed files with 15 additions and 6 deletions

View file

@ -38,15 +38,24 @@ their own Forgejo repositories under `https://git.fromaitochitta.com/open/`.
ERROR; `--strict` also fails on WARN. Pure-function core covered by ERROR; `--strict` also fails on WARN. Pure-function core covered by
`scripts/check-versions.test.mjs` (`node --test scripts/check-versions.test.mjs`). `scripts/check-versions.test.mjs` (`node --test scripts/check-versions.test.mjs`).
- **Stat-badge mirroring (part of the same gate):** each plugin block in the catalog README ends in a - **Stat-badge mirroring (part of the same gate):** each plugin block in the catalog README ends in a
stat line (`7 agents · 16 scanners · 21 commands · 1441 tests · [Full documentation →]`). The gate stat line (`7 agents · 16 scanners · 21 commands · 1398 tests · [Full documentation →]`). The gate
compares every number on that line against the plugin's own shields badge for the same axis, and compares every number on that line against the plugin's own shields badge for the same axis, and
ERRORs when they disagree — the catalog must not overstate a plugin. **The rule is per-AXIS, not ERRORs when they disagree — the catalog must not overstate a plugin. **The rule is per-AXIS, not
per-plugin:** an axis the plugin does not badge is skipped silently, so there is no exception list per-plugin:** an axis the plugin does not badge is skipped silently, so there is no exception list
to maintain. Measured 2026-08-02: 21 axis-pairs are badge-covered, and **14 axes across 8 of the 11 to maintain. Measured 2026-08-02: **24 axis-pairs badge-covered · 15 axes badge-less across 7 of
plugins are badge-less** and therefore ungated — those numbers still rot and need a human pass the 11 plugins** and therefore ungated. All 15 have now been hand-audited at their pinned tags —
(repo-mailbox's read `6 CLI scripts` / `251 selftest checks` against a true 8 / 374). `N+` in the **14 were exact**; the two defects found were repo-mailbox (`6 CLI scripts` / `251 selftest checks`
catalog is read as a lower bound, not an equality. **Never hand-edit a stat line to silence the against a true 8 / 370) and voyage (`500+ tests` against a measured 832). `N+` in the catalog is
read as a lower bound, not an equality, so `500+` was never gate-visible — ungated axes rot in
silence and need a periodic re-run of this pass. **Never hand-edit a stat line to silence the
gate** — the plugin's badge is the source for every stat number; fix the catalog to match it. gate** — the plugin's badge is the source for every stat number; fix the catalog to match it.
- **Counting rules for a badge-less axis (calibrated against the badged plugins, 2026-08-02).** When
the catalog must count an axis itself, count it the way the badges do, or the numbers stop being
comparable across plugin blocks: **hooks = hook COMMAND entries** in `hooks/hooks.json` (not
events, not matchers — the three diverge, and `commands` is what matched the badge on all 6 badged
plugins), and **tests = ` tests` from `node --test`**, not ` pass` (config-audit's badge 1398 is
its `tests` count; `pass` was 1375). Measure in an extraction of the tag
(`git archive <ref> | tar -x -C <tmp>`), never the sibling working tree.
- **The stat mirror reads the plugin README AT THE PINNED `ref`, never the sibling working tree.** - **The stat mirror reads the plugin README AT THE PINNED `ref`, never the sibling working tree.**
The catalog documents what *installs*, and that is the tag. A plugin that commits past its tag The catalog documents what *installs*, and that is the tag. A plugin that commits past its tag
without bumping its version — measured 2026-08-02 on both llm-security (scanners 23→22, tests without bumping its version — measured 2026-08-02 on both llm-security (scanners 23→22, tests

View file

@ -64,7 +64,7 @@ A six-command planning pipeline with specialized agent swarms, adversarial revie
Per-phase effort and model dialog; `/trekbrief`, `/trekplan`, and `/trekreview` render an operator-annotation HTML view you can mark up and copy back into Claude. Per-phase effort and model dialog; `/trekbrief`, `/trekplan`, and `/trekreview` render an operator-annotation HTML view you can mark up and copy back into Claude.
24 agents · 6 commands (+1 helper) · 7 hooks · 500+ tests · [Full documentation →](https://git.fromaitochitta.com/open/voyage) · [Migration guide](https://git.fromaitochitta.com/open/voyage/src/branch/main/MIGRATION.md) 24 agents · 6 commands (+1 helper) · 7 hooks · 832 tests · [Full documentation →](https://git.fromaitochitta.com/open/voyage) · [Migration guide](https://git.fromaitochitta.com/open/voyage/src/branch/main/MIGRATION.md)
--- ---