Repository navigation
adr: language tagging for preferred_label and alternative_labels #109
Description
Activity
- addedenhancementNew feature or requestNew feature or requestadrArchitecture Decision RecordArchitecture Decision RecordstandardThe published specification and schemasThe published specification and schemas
on Aug 27, 2026 - added a commit that references this issue
on Aug 27, 2026 Closed as not planned, and labelled
post-v0.1.0.This is the strongest deferral candidate of the five, so the argument is worth stating in full.
The cost of waiting is real but bounded. Typing
preferred_labelis a breaking change toWork. Theworking-draftclause permits a breaking change before 1.0, andv0.1.0is not1.0:specification.mdsays0.1.0-draftand the standard pages carrymaturity: working-draft. ADR-0004 and ADR-0006 both used that clause. This change can use it too.More important, this issue records the guarantee that makes deferral safe: no label is a UUID seed input under ADR-0002. A later change re-mints no identifier and breaks no citation. The cost is a documented migration of a non-identity field, not a persistence failure.
The work is also larger than it looks. It needs an ADR, a schema change, a data pass over every work, and an edit to the seven-tier ladder in
src/lib/find.ts. This issue asks to decide it together with #92, which has already shipped. That is a cross-repository change against a release that is green and waiting on one approval.LanguageTaginstandard/schema/common.tsstays available, so the validator is written when the ADR lands.Reopen with #92 when a client needs to select a label by language, or before the 1.0 tag, whichever comes first. After 1.0 the working-draft clause no longer applies, and the change becomes genuinely expensive.
- addedpost-v0.1.0Deferred past the v0.1.0 baseline. Revisit if the need arises.Deferred past the v0.1.0 baseline. Revisit if the need arises.
on Sep 1, 2026
Context
ADR-0007 gave
Workan optionalalternative_labelslist of plain strings, published asskos:altLabel. It considered language-tagged label objects ({ value: string, language?: string }[]) and rejected them — explicitly not on merit:It filed the follow-up:
The problem
Both label fields are bare strings today, so the registry publishes labels in several languages with no way to say which is which.
preferred_labelholds one English string per work, even where the scholarly name is not English.alternative_labelsmixes kinds and languages in one flat list: abbreviations (NE,LXX,PI), Latin and Greek titles, and translated titles.A client cannot select the label for its reader's language, and
skos:altLabelis published without the language tag SKOS expects.What exists to build on
LanguageTagis already implemented atstandard/schema/common.ts— RFC 5646 langtag plus privateuse — and mirrored as an OpenAPIpattern. The validator does not need to be written.ResolverTargetEntryalready uses it, so there is a precedent for the shape inside this codebase.Constraints
preferred_labelis required and published. Changing its type is a breaking change toWork. Under the working-draft clause that is permitted before 1.0, but it is not free after v0.1.0 is tagged and citable.src/lib/find.tsranks on a seven-tier ladder over both label fields. A shape change reaches the finder and the registry browser filter.Related, and worth deciding together
#92 asks for ranked search over alternative labels and for a way to mark an entry as an abbreviation rather than a title. An abbreviation is language-bearing too —
NEis English,ENis German for the same work. If the entry shape gains alanguage, it may as well gain akindin the same change rather than in two successive breaking changes.Links
decisions/ADR-0007-alternative-labels-for-works.md— the rejected option 3, and open question 1standard/schema/common.ts— the existingLanguageTag