Commit fe2e15a
The ledger README's "Current state" table is the liveness ledger's own index —
one row per governed type, counts regenerated from the gate's --json report, a
hand-written Notes cell per row. Its heading, `## Current state — N governed
types (complete registry coverage)`, is a completeness CLAIM that nothing could
falsify: N was the count of ROWS, not of governed types, and the two agreed only
by coincidence. They stopped. `api` and `capability` were both in GOVERNED, both
had ledgers, both were counted by the gate, and neither had a row.
Same shape the file spends 500 lines warning about, one level up: `dashboard.
widgets` asserted in prose that its 22 child keys were classified in a subtree
that never existed, and survived a release because prose cannot fail a build
(#4956). Every other claim in the file became data the gate resolves; the index
was the last one riding on a human reading it.
- readme-table.mts — the fourth direction, pure and unit-tested for the same
reason as orphans.mts: on a green tree the table is complete, so a passing gate
proves nothing about whether the check can fire. Fails (not warns) on a missing
row, an orphan row, a duplicated row, or a heading N that disagrees with either
the row count or GOVERNED.length. All three heading legs, because two of them
agreeing is exactly the state this issue found.
- No new check:/gen: script — it rides inside check:liveness, which the Spec
property liveness workflow already runs on packages/spec/**. check:generated
--reconcile-only stays green with no ledger change.
- The documented regeneration snippet now reads the table back as well as the
report, so a governed type with no row prints a SKELETON row: the omission is
visible at regeneration time as well as at CI time.
- The two missing rows are back-filled from their seeding PRs' own measurements —
counts from --json, prose from what #5271/PR #5312 and #5961/PR #6540 actually
measured. The Notes cell is the one thing the gate deliberately does not check,
which is why they were filed rather than fixed on the spot.
- Also removes a stray blank line that had been splitting the table in two.
Reverse verification is pinned in CI, not just performed once: three cases in
check-liveness.test.ts drive the REAL gate against a copy of the real README with
a row deleted, the heading skewed, and an ungoverned row added, and read exit 1.
Closes #7257
Co-authored-by: Claude <noreply@anthropic.com>
1 parent a87c5cd commit fe2e15a
6 files changed
Lines changed: 663 additions & 11 deletions
File tree
- .changeset
- packages/spec
- liveness
- scripts/liveness
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
0 commit comments