This document explains the verifiable registry that indexes every spec in this monorepo, and how it is wired into the live automation so that documentation drift becomes a detected, routed finding instead of something noticed sixty days later.
The registry is the machine half of the front door. If you are arriving here:
-
Human? Start at README.adoc.
-
Agent? Start at 0-AI-MANIFEST.a2ml.
-
Want the raw index? Read
.machine_readable/REGISTRY.a2ml.
.machine_readable/REGISTRY.a2ml is a
generated A2ML file with one block per standard. Each block records:
| Field | Meaning |
|---|---|
|
Stable short identifier. |
|
Human-readable name. |
|
One of |
|
The canonical directory the spec lives in (verified to exist). |
|
The single doc to read first for that spec. |
|
|
|
One-line "go here if you want X". |
The registry is honest by construction: the generator only emits a spec
whose home directory actually exists, and reports a missing home to stderr
rather than inventing one.
Some specs are language/service-coupled: their source-of-truth deliberately
lives in another repo whose release cadence this monorepo must not own. The
clearest example is the AffineScript v2 standards — .affine (faces / source
documents), .affex (face-interop manifest) and .affmap (provenance) — whose
SSOT is hyperpolymath/affinescript. For these the registry holds a verified
pointer, never a copy; duplicating the normative text would create two sources
of truth and guarantee drift.
External entries carry kind = "external" and, in place of a local home:
| Field | Meaning |
|---|---|
|
|
|
The repo that authors + versions the spec. |
|
The upstream source-of-truth document (what HYP-S006 fetches). |
|
The upstream version/tag this pointer is pinned to. |
|
The recorded upstream hash, or the sentinel |
|
|
|
Provenance fields, consistent with the lineage convention. |
|
Only for regenerable artefacts (e.g. |
Because the generator is offline and deterministic, an external entry’s
source_hash is recorded in the EXTERNAL_SPECS table in the generator and
emitted verbatim, so --check stays a pure function of the committed tree. The
network-side verification (re-fetching canonical_url) is HYP-S006’s job, and
re-pinning a pointer is capped to :review — an owner decision, never an
auto-regen. (.affcite.a2ml is a CodeCite-profile A2ML artefact in the
AffineScript repo, not a separate registry pointer.)
git ls-files -s <home> lists every tracked file under a home together with
its blob SHA and path. Hashing that listing yields a fingerprint that changes
whenever any tracked file under the spec changes — content, addition, or
removal. Recording it in the registry means a later recompute can prove
whether a spec has moved underneath its documentation. (For external pointers,
the recorded hash is instead checked against a fresh fetch of canonical_url.)
The registry and the derived topology map are produced by one generator:
just registry # writes .machine_readable/REGISTRY.a2ml + TOPOLOGY.md
just registry-check # verify-only; non-zero exit on driftBoth .machine_readable/REGISTRY.a2ml and TOPOLOGY.md are
generated files — do not edit by hand. The single source of truth is the
SPECS table in scripts/build-registry.sh.
Add a spec there and the hash, the registry entry, and the topology row all
follow automatically. TOPOLOGY.md can therefore never
freeze the way the old hand-maintained version did (it sat at 2026-04-04
claiming 80% while the integration layer read 0%).
Drift is caught at two layers that share the same hash algorithm:
| Layer | What it does |
|---|---|
In-repo — |
Runs |
Estate — HYP-S006 |
Hypatia recomputes the hashes fleet-wide and emits a |
file tree + STATE.a2ml ──► scripts/build-registry.sh ──► REGISTRY.a2ml ──► TOPOLOGY.md
▲ │
│ ▼
just registry / registry-verify.yml HYP-S006 (registry-staleness)
(fails the build on drift) emits doc.drift → routerWhen HYP-S006 fires, the hybrid automation router decides what happens to
the finding. Its strategy is declared in the rule’s @router block:
-
Default:
auto_execute— regenerating a derived file from the file tree is mechanical and safe, so the router may run therebuild-registryrecipe. -
Hard cap: any drift whose content overlaps a licence/SPDX token (
SPDX-License-Identifier,PMPL,MPL-2.0,AGPL,Palimpsest,licen[cs]e) is demoted to:reviewand never auto-applied.
This cap mirrors the estate Manual-Only licence guardrail
(.claude/CLAUDE.md) and Hypatia’s own
license_finding_strategy/0: agents flag licence drift, the owner edits it
(the rule that closed neurophone#99). Downstream pipelines MUST honour the
cap.
-
Edit the
SPECStable inscripts/build-registry.sh. -
Run
just registry. -
Commit the regenerated
REGISTRY.a2ml+TOPOLOGY.mdalongside your change.
CI will reject the PR if you change a spec’s home without regenerating.