Context
The old registry carried two identifiers per recommendation.
id looked like MLR-2014-Kingma001-0001: the year, an author key
numbered by order of first appearance, and a counter within the paper. It was
assigned by MLRIdentifierRegistry and persisted to a JSON side-file, which
is the part that made it work at all — the author counter is allocated in
corpus-traversal order, so inserting an earlier paper by a previously unseen
author would renumber later ones if the side-file were ever lost.
topic_id looked like
optimization/learning-rate-typically-1e-4-to: the topic, then a slug of the
recommendation’s first five words, truncated mid-phrase. It is an identity
derived from the text it identifies. Correcting a typo in a recommendation
changes its topic_id. Nothing in the repository could have told you that
had happened.
Both encode information — year, author, topic — that also lives in the record as fields. Two copies of a fact is the projection that drifts, and one of them was the primary key.
Decision
Sequential codes: SOTA-001, LIT-001. The number is assigned once, carries
the order things entered the record, and means nothing else. The filename is
the code and nothing else; the title lives in title:, where correcting it
costs an edit rather than a rename plus every link that pointed at the old
name.
Provenance that used to be encoded in the identifier is a field: source:
names the paper’s note, date: comes from the arXiv posting month, tags
carry the topic.
Alternatives considered
- Keep MLR ids as an alias. Luria supports
aka:aliases for exactly this, and the case for it is external links. There are none: the ids appear inregistry.yamlandREGISTRY.md, both of which this project generates, and nowhere else that is reachable. An alias nobody follows is a field to keep in step. - Use the arXiv id as the practice identifier. It identifies the paper,
not the recommendation, and papers produce up to four. It is right for
LIT, which is whyarxiv:is a required field there — but as a field, not as the code, so a paper with no id can still be filed and flagged. - Content-address the recommendation text. The
topic_ididea taken seriously, and it has the same defect at any hash length: the identity of a claim changes when the wording is improved.
Consequences
data/registry.yaml still contains MLR ids and still validates; nothing
about this changes it. When ADR-006 inverts the build, the generated file can emit either form, and dropping them is a decision to make then, with the frontend in front of you.
The mapping from old id to new code is not recorded anywhere, deliberately — it is recoverable from the migration script and the registry order, and a committed mapping table would be a third copy of the same fact.