Skip to content

Commit 3a5c23c

Browse files
Front door: verifiable spec registry + routing + drift automation (#357)
## What this does Turns the ~7,000-file standards monorepo into something an agent or human can read as **one coherent thing** _or_ jump straight to exactly what they need — and wires it into **live drift-detection automation** so documentation rot becomes a detected, routed finding instead of something noticed 60 days later. Built on a fresh inventory (103 top-level entries, 7,026 tracked files, 28 spec homes verified to exist). ## ⚠️ OWNER REVIEW REQUIRED — read first Commit **`f805bdc`** is isolated and contains the **only** licence-touching changes: it corrects human-facing **doc badges/prose** that asserted `PMPL-1.0-or-later` to **`MPL-2.0`**, matching the actual `LICENSE` file (set owner-directed in #354). This is a documentation-accuracy fix, **not** a relicensing. - **No `LICENSE` file and no SPDX header is edited** — those stay owner-only / Manual-Only per `.claude/CLAUDE.md`. - Drop this one commit if you disagree; the rest stands alone. - Files: `README.adoc` (badge + Licensing bullet + structure line + `== License`; also dropped the "Philosophy: Palimpsest" badge since this is not a Palimpsest carve-out repo), `ROADMAP.adoc`, `QUICKSTART-MAINTAINER.adoc`, `PALIMPSEST.adoc` (added a NOTE that the doc describes PMPL generally and that **this** repo is MPL-2.0). The other commits only **remove** now-false `PMPL-1.0` claims (replaced with neutral "see LICENSE" / Manual-Only wording) — they assert no identifier. ## The two front doors | Audience | Canonical entry | |---|---| | Human | `README.adoc` — now opens with a **"Start Here"** + **"if you want X, go here"** routing table | | Agent | `0-AI-MANIFEST.a2ml` — rewritten from a generic template into the real machine entry, with routing + registry pointer + real invariants | Every other "what is this repo" doc is now a thin pointer back to these two. ## The verifiable registry (Task 3) - **`.machine_readable/REGISTRY.a2ml`** — generated index of **28 specs** across 6 streams; each `[[spec]]` has `home`, `canonical_doc`, and a content-addressed **`source_hash`** (`sha256` over `git ls-files -s <home>`). - **`scripts/build-registry.sh`** — the generator (honest by construction: only emits homes that exist; deterministic; idempotent). `just registry` / `just registry-check`. - **`REGISTRY.adoc`** — prose on the registry, how `source_hash` catches drift, and the router. ## Drift becomes a detected, routed finding (Task 3) ``` file tree + STATE.a2ml ─► build-registry.sh ─► REGISTRY.a2ml ─► TOPOLOGY.md ▲ │ │ ▼ registry-verify.yml (CI) HYP-S006 registry-staleness (fails build on drift) emits doc.drift → hybrid router ``` - **`.github/workflows/registry-verify.yml`** — in-repo half: fails the build on registry/topology drift. - **`hypatia-rules/registry-staleness.a2ml` (HYP-S006)** — estate half: recomputes hashes, emits `doc.drift`. Its `@router` defaults to `auto_execute` (regenerate) but **hard-caps any licence/SPDX-overlapping drift to `:review`**, honouring the Manual-Only guardrail and `license_finding_strategy/0`. ## Confirmed drift fixed (Task 4) - `EXPLAINME.adoc` → thin stub: drops the `ReScript`-as-Primary line (banned 2026-04-30) and the **dead** `groove-protocol/` + `palimpsest-license/` local links (both confirmed absent); defers the spec inventory to the registry. - `llm-warmup-{dev,user}.md` were **byte-identical** → now role-specific stubs. - `QUICKSTART-{DEV,USER,MAINTAINER}.adoc` — all `{{PLACEHOLDER}}` markers filled (USER re-framed for a specs repo, not an app install). - Doc badges → owner-review commit above. ## TOPOLOGY now derived (Task 5) `TOPOLOGY.md` was hand-frozen at `2026-04-04` (80% overall while integration read 0%). It is now **generated** from the registry + `STATE.a2ml` — it can't freeze. Its existing `AGPL-3.0-or-later` SPDX header is **preserved** (not touched). ## REORGANIZATION-PLAN.md superseded (Task 6) Marked **SUPERSEDED** with a banner: its premise (move content out to separate repos) predates the 2026-02-08 monorepo consolidation; discoverability/drift are now handled by the registry + automation. ## Notes for the reviewer - **New-file SPDX**: new/generated files use `AGPL-3.0-or-later` to match the repo's current per-file SPDX convention (Phase 1/2 sweeps #344/#345) and to **preserve** TOPOLOGY.md's existing header. Note the `LICENSE` file is MPL-2.0 — the LICENSE-vs-per-file-SPDX classification is an owner-only question I did **not** resolve. - `just registry-check` is green; output is deterministic (commit `83e83a6` removed a volatile timestamp that would have spuriously tripped CI). ## Out of scope (untouched) A2ML/K9 spec internals (Stream 1); AffineScript spec text (Stream 2); any `LICENSE`/SPDX edits (owner-only — flagged, not fixed). https://claude.ai/code/session_011xv3VLrqeXkpjXxUojKz82 --- _Generated by [Claude Code](https://claude.ai/code/session_011xv3VLrqeXkpjXxUojKz82)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 0b96f61 commit 3a5c23c

19 files changed

Lines changed: 1236 additions & 532 deletions
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# SPDX-License-Identifier: AGPL-3.0-or-later
2+
# registry-verify — fail the build if the spec registry or the DERIVED
3+
# topology map has drifted from the file tree. This is the in-repo half of
4+
# the drift-detection loop (the estate half is Hypatia rule HYP-S006).
5+
name: Registry Verify
6+
7+
on:
8+
push:
9+
branches: [ main, master ]
10+
pull_request:
11+
branches: [ main, master ]
12+
workflow_dispatch:
13+
14+
concurrency:
15+
group: ${{ github.workflow }}-${{ github.ref }}
16+
cancel-in-progress: true
17+
18+
permissions:
19+
contents: read
20+
21+
jobs:
22+
verify:
23+
name: Registry + topology in sync
24+
runs-on: ubuntu-latest
25+
timeout-minutes: 10
26+
steps:
27+
- name: Checkout repository
28+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
29+
with:
30+
fetch-depth: 0 # full history so `git ls-files -s` hashes are stable
31+
32+
- name: Verify registry + derived topology are current
33+
run: |
34+
bash scripts/build-registry.sh --check

.machine_readable/REGISTRY.a2ml

Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
# SPDX-License-Identifier: AGPL-3.0-or-later
2+
# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk>
3+
#
4+
# REGISTRY.a2ml — the verifiable index of every spec/standard in this monorepo.
5+
#
6+
# GENERATED FILE — DO NOT EDIT BY HAND.
7+
# Regenerate with: bash scripts/build-registry.sh (or: just registry)
8+
# Source of truth: the SPECS table in scripts/build-registry.sh + the file tree.
9+
#
10+
# Each entry's `source_hash` is a sha256 over `git ls-files -s <home>`, so it
11+
# changes whenever any tracked file under the spec's home changes. Hypatia rule
12+
# HYP-S006 (hypatia-rules/registry-staleness.a2ml) recomputes these and emits a
13+
# `doc.drift` finding (strategy :review) when a recorded hash goes stale.
14+
15+
[registry]
16+
version = "1.0.0"
17+
generator = "scripts/build-registry.sh"
18+
hash_algorithm = "sha256(git ls-files -s <home>)"
19+
entry_count = 28
20+
21+
[registry.streams]
22+
foundation = "A2ML format family + K9 + contractiles (Stream 1)"
23+
language = "AffineScript and language-policy specs (Stream 2)"
24+
protocol = "Inter-service / agent protocols"
25+
governance = "RSR, readiness grading, pre-flight gates, session standards"
26+
readiness = "ARG / FRG / CRG / TRG maturity-grading frameworks"
27+
integration = "Registry, hypatia rules, templates — the wiring (Stream 3)"
28+
29+
[[spec]]
30+
id = "a2ml"
31+
name = "A2ML — Attested Markup Language"
32+
stream = "foundation"
33+
home = "a2ml/"
34+
canonical_doc = "a2ml/README.adoc"
35+
source_hash = "sha256:b34ffe4d51c1715c4f2e51183d7a510865dc03e962fbeae121e3868fd88a718a"
36+
route = "the typed/verified machine-readable document format"
37+
38+
[[spec]]
39+
id = "k9-svc"
40+
name = "K9 Self-Validating Components"
41+
stream = "foundation"
42+
home = "k9-svc/"
43+
canonical_doc = "k9-svc/README.adoc"
44+
source_hash = "sha256:eae3b6a0f4e2da1afcfddfecf7a5c173d6c0ac090923c63fe9c14806b5a3b11b"
45+
route = "self-validating components with embedded contracts + deploy logic"
46+
47+
[[spec]]
48+
id = "contractiles"
49+
name = "Contractiles (Must/Trust/Dust/Intend)"
50+
stream = "foundation"
51+
home = "contractiles/"
52+
canonical_doc = "contractiles/README.adoc"
53+
source_hash = "sha256:628efcbff607cc7382280b52bf662c2c79801ae8f01b902f3aebe84b08dd79ad"
54+
route = "policy-enforcement primitives the K9 layer is built from"
55+
56+
[[spec]]
57+
id = "meta-a2ml"
58+
name = "META.a2ml spec"
59+
stream = "foundation"
60+
home = "meta-a2ml/"
61+
canonical_doc = "meta-a2ml/README.adoc"
62+
source_hash = "sha256:2904f47d20a79723a830674fd9dc14105bf14911b5f700586480fe3a7a424542"
63+
route = "architecture decisions / governance metadata format"
64+
65+
[[spec]]
66+
id = "state-a2ml"
67+
name = "STATE.a2ml spec"
68+
stream = "foundation"
69+
home = "state-a2ml/"
70+
canonical_doc = "state-a2ml/README.adoc"
71+
source_hash = "sha256:21d88102987bae7853cf8d642aeeba13efdeb1a105bbd4d89e7064ef15ce8b9d"
72+
route = "project-state metadata format (drives this registry's topology)"
73+
74+
[[spec]]
75+
id = "ecosystem-a2ml"
76+
name = "ECOSYSTEM.a2ml spec"
77+
stream = "foundation"
78+
home = "ecosystem-a2ml/"
79+
canonical_doc = "ecosystem-a2ml/README.adoc"
80+
source_hash = "sha256:46b529c177ddc2166bc2cdfdccc55fef8650e03f8d6b3a1ee25d70a494fb1626"
81+
route = "ecosystem-positioning metadata format"
82+
83+
[[spec]]
84+
id = "agentic-a2ml"
85+
name = "AGENTIC.a2ml spec"
86+
stream = "foundation"
87+
home = "agentic-a2ml/"
88+
canonical_doc = "agentic-a2ml/README.adoc"
89+
source_hash = "sha256:31832029e8e989e200b4022075ed0c8807bb95f55baa0cda11ce079d1bd5b900"
90+
route = "AI-agent operational gating / entropy budgets"
91+
92+
[[spec]]
93+
id = "neurosym-a2ml"
94+
name = "NEUROSYM.a2ml spec"
95+
stream = "foundation"
96+
home = "neurosym-a2ml/"
97+
canonical_doc = "neurosym-a2ml/README.adoc"
98+
source_hash = "sha256:62bbea52b4b57bb582cc79b320b97d2fced2bef41a77c33590211cbf4ddbd224"
99+
route = "symbolic semantics / proof obligations"
100+
101+
[[spec]]
102+
id = "playbook-a2ml"
103+
name = "PLAYBOOK.a2ml spec"
104+
stream = "foundation"
105+
home = "playbook-a2ml/"
106+
canonical_doc = "playbook-a2ml/README.adoc"
107+
source_hash = "sha256:b00cd658fe367314735c9f2689579820263b26d1853252dc72a0fee3d784db63"
108+
route = "executable operational runbooks"
109+
110+
[[spec]]
111+
id = "anchor-a2ml"
112+
name = "ANCHOR.a2ml spec"
113+
stream = "foundation"
114+
home = "anchor-a2ml/"
115+
canonical_doc = "anchor-a2ml/README.adoc"
116+
source_hash = "sha256:2a88233f201c3d2c05dd4d2530cc0fe33423ce9540a0fc2aa21556233074f4fb"
117+
route = "project-recalibration intervention format"
118+
119+
[[spec]]
120+
id = "0-ai-gatekeeper-protocol"
121+
name = "0-AI Gatekeeper Protocol"
122+
stream = "protocol"
123+
home = "0-ai-gatekeeper-protocol/"
124+
canonical_doc = "0-ai-gatekeeper-protocol/README.adoc"
125+
source_hash = "sha256:e1893253df97b1b989b1ba8e6926548a9a06a6582ab8b9448438da0b4b3e4428"
126+
route = "the AI-agent entry/gating protocol behind 0-AI-MANIFEST"
127+
128+
[[spec]]
129+
id = "k9-coordination-protocol"
130+
name = "K9 Coordination Protocol"
131+
stream = "protocol"
132+
home = "k9-coordination-protocol/"
133+
canonical_doc = "k9-coordination-protocol/README.adoc"
134+
source_hash = "sha256:9c856a0ed99f92ab3f8f6049df918fe023422dc6688cbc6110190c122ab28f97"
135+
route = "multi-agent coordination on top of K9"
136+
137+
[[spec]]
138+
id = "avow-protocol"
139+
name = "AVOW Protocol"
140+
stream = "protocol"
141+
home = "avow-protocol/"
142+
canonical_doc = "avow-protocol/README.adoc"
143+
source_hash = "sha256:fc6011d8531fbe3d8fbc5ba0b819cea892d8e0dee7ccb31ef0a22b7d264a8263"
144+
route = "consent-attested messaging / origin attribution"
145+
146+
[[spec]]
147+
id = "axel-protocol"
148+
name = "AXEL Protocol"
149+
stream = "protocol"
150+
home = "axel-protocol/"
151+
canonical_doc = "axel-protocol/README.adoc"
152+
source_hash = "sha256:6884bcc4f845e05cb0ff0d6d77171707e74f6069512bcf233161a5d8de8fb704"
153+
route = "age-gating + explicit-content enforcement"
154+
155+
[[spec]]
156+
id = "overlay-protocol"
157+
name = "Overlay Protocol"
158+
stream = "protocol"
159+
home = "overlay-protocol/"
160+
canonical_doc = "overlay-protocol/.machine_readable/6a2/ECOSYSTEM.a2ml"
161+
source_hash = "sha256:4e490e20401ef888930d7b72fe151bc89e4d084606252a1d6344df2c1dc904e1"
162+
route = "layered overlay composition spec"
163+
164+
[[spec]]
165+
id = "consent-aware-http"
166+
name = "Consent-Aware HTTP"
167+
stream = "protocol"
168+
home = "consent-aware-http/"
169+
canonical_doc = "consent-aware-http/README.adoc"
170+
source_hash = "sha256:e4165fa238b12e8515b985a21e7c7a9d7337627a484e74abe17fa000113a22e0"
171+
route = "consent headers / AI-usage boundaries for HTTP"
172+
173+
[[spec]]
174+
id = "adoption-readiness-grades"
175+
name = "ARG — Adoption Readiness Grades"
176+
stream = "readiness"
177+
home = "adoption-readiness-grades/"
178+
canonical_doc = "adoption-readiness-grades/README.adoc"
179+
source_hash = "sha256:036055fcb1c66320015e5dfca56438d8c87fa078c527c4c6226ec9e16803b4e0"
180+
route = "per-language adoption-maturity profile templates"
181+
182+
[[spec]]
183+
id = "foundations-readiness-grades"
184+
name = "FRG — Foundations Readiness Grades"
185+
stream = "readiness"
186+
home = "foundations-readiness-grades/"
187+
canonical_doc = "foundations-readiness-grades/README.adoc"
188+
source_hash = "sha256:a0e205de918a34d731e65d76e0a87d879dfd07b4e7cefc9b9c59cf8e81a051cb"
189+
route = "per-language foundational-maturity profile templates"
190+
191+
[[spec]]
192+
id = "component-readiness-grades"
193+
name = "CRG — Component Readiness Grades"
194+
stream = "readiness"
195+
home = "component-readiness-grades/"
196+
canonical_doc = "component-readiness-grades/README.adoc"
197+
source_hash = "sha256:47e5a756220c6f2e1c7274f6814fdbd8fe5a235b808eb638f83f80994d0843e8"
198+
route = "the X..A grading system for components"
199+
200+
[[spec]]
201+
id = "toolchain-readiness-grades"
202+
name = "TRG — Toolchain Readiness Grades"
203+
stream = "readiness"
204+
home = "toolchain-readiness-grades/"
205+
canonical_doc = "toolchain-readiness-grades/README.adoc"
206+
source_hash = "sha256:26a5399a7b83ccd95e9eee574b90c92ed238fb671f9eb0e284bd7a0b0e109f36"
207+
route = "per-toolchain readiness profile templates"
208+
209+
[[spec]]
210+
id = "rhodium-standard-repositories"
211+
name = "RSR — Rhodium Standard Repositories"
212+
stream = "governance"
213+
home = "rhodium-standard-repositories/"
214+
canonical_doc = "rhodium-standard-repositories/README.adoc"
215+
source_hash = "sha256:9e10e92598a307d3e32f8af3dc8b5cdfdbbcfd6d78069498d6797dc1f0001e62"
216+
route = "the repository-compliance standard every repo is graded against"
217+
218+
[[spec]]
219+
id = "session-management-standards"
220+
name = "Session Management Standards"
221+
stream = "governance"
222+
home = "session-management-standards/"
223+
canonical_doc = "session-management-standards/README.adoc"
224+
source_hash = "sha256:86a7739ac5cfd12aa34b1be1505c169e41b53e01bd1b3e3b7be308cd3b06d6b3"
225+
route = "continuity / verify / handover protocols"
226+
227+
[[spec]]
228+
id = "ensaid-config"
229+
name = "ENSAID Config"
230+
stream = "governance"
231+
home = "ensaid-config/"
232+
canonical_doc = "ensaid-config/README.adoc"
233+
source_hash = "sha256:f6cc431368df4cea795ca24eafb26ae42e6ff6bb17a02d8c4c3d75218709d0b1"
234+
route = "the ensaid configuration standard"
235+
236+
[[spec]]
237+
id = "accessibility"
238+
name = "Accessibility Standard"
239+
stream = "governance"
240+
home = "accessibility/"
241+
canonical_doc = "accessibility/STANDARD.a2ml"
242+
source_hash = "sha256:2286b68bb6ededf8534e90ad52f3ae5f7d25e4193f890ce5c740686171a4db2b"
243+
route = "estate accessibility requirements"
244+
245+
[[spec]]
246+
id = "publication-pre-flight"
247+
name = "Publication Pre-Flight"
248+
stream = "governance"
249+
home = "publication-pre-flight/"
250+
canonical_doc = "publication-pre-flight/ESTATE-AUDIT-BASELINE-2026-03-30.adoc"
251+
source_hash = "sha256:5bcf21e86a10248b20bf37fa8480a16d3ab3604a784f3cdb23e2ec351329975b"
252+
route = "submission gate (HOL + Zenodo checklists)"
253+
254+
[[spec]]
255+
id = "release-pre-flight"
256+
name = "Release Pre-Flight (V1 Gate)"
257+
stream = "governance"
258+
home = "release-pre-flight/"
259+
canonical_doc = "release-pre-flight/V1-GATE.adoc"
260+
source_hash = "sha256:790505e07de1cc1f3a22eed1e9ee0be0c75e28f9adbdec0aa9833253d9030a4a"
261+
route = "hard v1.0.0 audit requirements"
262+
263+
[[spec]]
264+
id = "hypatia-rules"
265+
name = "Standards Hypatia Rules"
266+
stream = "integration"
267+
home = "hypatia-rules/"
268+
canonical_doc = "hypatia-rules/README.adoc"
269+
source_hash = "sha256:707852684795e8474bc764473c36bc4d56fa139014ab3abbc0f550319637138c"
270+
route = "the dogfooding rules that scan THIS repo (incl. drift detection)"
271+
272+
[[spec]]
273+
id = "a2ml-templates"
274+
name = "A2ML Templates"
275+
stream = "integration"
276+
home = "a2ml-templates/"
277+
canonical_doc = "a2ml-templates/STATE.a2ml.v2.spec.adoc"
278+
source_hash = "sha256:5105bc72621b6214f1adecdf33a1dadf62d1d2b0afd0c2c6a48bbc5e24e9a454"
279+
route = "copy-in templates for the 7 A2ML files"
280+
281+
### End of REGISTRY.a2ml

0 commit comments

Comments
 (0)