Context
ADR-006 proposed inverting the registry build — generate data/registry.yaml
from the record as an artifact, so web/ could keep consuming it — and
left the decision Proposed because the frontend’s contract had not been
checked.
Checking it turned out to be answering the wrong question. The pipeline was
research.yaml → registry.yaml → REGISTRY.md → a hand-written frontend
that fetched the YAML and rendered a table. Every stage of that exists to
turn structured data into something a reader can browse, and the record
already produces exactly that: docs/practices is the same corpus with
working links, per-topic pages, and a status column that distinguishes
records. luria site stages the whole record as a browsable vault, with the
relative links luria link --fix wrote still resolving, plus a citation
graph and backlinks that nothing here maintains by hand.
Inverting the projection would have kept three artifacts alive to feed a fourth that duplicates a view we now generate anyway.
scripts.registry.cli had also become the last thing asserting the old
model. It reads the sota: fields and emits recommendations with derived
MLR- identifiers (ADR-005), a topic_id slugged from the recommendation
text, and a status field that could only ever say standard (ADR-002) — a
generator for a schema the record replaced.
Decision
Retire the pipeline rather than invert it.
Deleted: src/scripts/registry/ and its tests, the Build Registry
workflow, the build-registry entry point, data/REGISTRY.md, the flat
registry section injected into the README, the taxonomy specification that
had sat in the LLM README templates since before ADR-003 superseded it, and
the web/ frontend with its deploy workflow.
Added: the Pages workflow, which builds luria site and publishes it.
data/research.yaml and data/registry.yaml stay, frozen, with a README
saying so. They are not a second source of truth — nothing reads them at
build time any more — but they are the import’s provenance, and
src/scripts/migration/to_record.py needs them to stay re-runnable. That
script is the only thing that makes 238 generated documents auditable
without reading all 238.
This needs one repository setting that no file here can set: Settings →
Pages → Source must be “GitHub Actions”. Until it is, the Pages build job
succeeds and the deploy job fails with “Pages is not enabled”. The previous
frontend published from a gh-pages branch, which is a different mechanism
and cannot coexist with this one.
Alternatives considered
- ADR-006 as proposed — generate
registry.yamlfrom the record and keep the frontend. Preserves a working site and a public data artifact at the cost of maintaining a projection, a generator for it, and a consumer, all to display whatdocs/practicesdisplays. Worth reversing to if the YAML artifact turns out to have consumers outside this repository, which is the one thing this decision does not know. - Keep the frontend, drop only the CLI. The frontend fetches
registry.yaml; without a generator that file freezes, and a page serving a snapshot that silently stops updating is worse than no page. - Delete
data/entirely. The record supersedes every claim in it and git history preserves it. It stays because the migration script’s value is that a reviewer can re-run it, and that is worth two frozen files.
Consequences
The published site changes shape: a Quartz vault of the record rather than a
single sortable table. That is a product change, not only an infrastructure
one, and it is the part most worth reverting if it disappoints — the frontend
is one git revert away for as long as this decision is the most recent one
touching it.
data/registry.yaml stops being regenerated, so it will drift from the
record the moment a practice is edited. It is labelled frozen for that
reason. Anything that was consuming it from outside this repository is now
consuming a snapshot; that is the risk this decision accepts.
The five “Update ML training registry” commits that motivated ADR-001’s complaint about churn cannot recur, because the thing that made them no longer exists.