Commit 603ee56
committed
feat(ci): dashboard-check — fail the build when dashboards diverge from STATE
Structural defence against the estate's #1 recurring defect ("dashboards
that lie": a human-facing status surface claiming more than the
machine-readable STATE, e.g. the historical TOPOLOGY "100% Production
Ready" vs STATE 60%/Grade-D).
New Rust workspace crate `crates/dashboard-check` (Rust = the policy-
preferred CLI language) parses `.machine_readable/6a2/STATE.a2ml` — a2ml is
TOML, so it uses the `toml` crate, not a bespoke reader — extracts
completion-percentage / crg-grade / last-updated (tolerating januskey's
quoted "60"/"D" and other repos' bare integers), and asserts they match
TOPOLOGY.md (`OVERALL: …%`, `Grade X`) and READINESS.md (`CRG Grade: X`),
plus that the dashboard's `Last updated` is not older than STATE's. Exits
non-zero with a precise diff on divergence.
- 8 unit tests over pure extract/reconcile fns (quoted + bare parsing,
each drift class, the aligned pass case, and a prose-shadowing regression
where a note mentioning "OVERALL" must not shadow the real dashboard line).
- Verified end-to-end: passes on this repo (reconciled); catches an
injected 100%-vs-60% drift with the exact "completion mismatch" message.
- Wired as `just check-dashboard` and CI workflow `Dashboard Check`
(SPDX header, contents:read perms, SHA-pinned actions).
- TOPOLOGY.md's "source of truth" note now records that agreement is
machine-enforced.
Prototyped in januskey; designed to be vendored estate-wide (every repo
has the same STATE.a2ml + dashboard shape).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qwVESTcbfanY2iJPQNoSz1 parent 65e1376 commit 603ee56
7 files changed
Lines changed: 491 additions & 6 deletions
File tree
- .github/workflows
- crates/dashboard-check
- src
| 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 | + | |
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
34 | 38 | | |
35 | 39 | | |
36 | 40 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
60 | 63 | | |
61 | 64 | | |
62 | 65 | | |
| |||
| 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 | + | |
0 commit comments