fix(spec): resolve normative contradictions before the v0.1.0 tag - #44
Merged
Conversation
Review of the release PR (textrefs#4) turned up four places where the shipped standard contradicts itself or the compiler, plus a published OpenAPI document that ADR-0001 never reached. - specification.md §11 still routed succession through an `exactMatch` MappingAssertion while versioning.md says MappingAssertions MUST NOT carry succession links. §11 now points at `superseded_by`. - §6 declared external identifiers "not fields on the Work itself" while the compiler emits derived `exactMatch`/`closeMatch` arrays. §6 now separates the authoring surface (MappingAssertion) from the read-only projection, and lists both fields. - §11 allowed `deprecated` tombstones but only `withdrawn` could carry a successor. The compiler guard widens to deprecated/withdrawn/blocked and §12 defines `superseded_by` once, in full. - versioning.md documented a compiler invariant that did not exist: promoted records must not depend on draft ones. Implemented in `enforceRegistryInvariants` (renamed from enforceTombstoneInvariants, which no longer describes its scope) for both references and mapping subjects; `blocked` joins TOMBSTONE_STATUSES so the two guards agree. - api/openapi.yaml drops `target_kind`, gains `conforms_to`, `superseded_by`, and the Work SKOS arrays. Also: CONTRIBUTING scoped the `vYYYY.MM.N` tag scheme to the registry repo (unresolved review thread on textrefs#4), all three ADRs move to Accepted with their follow-up checklists reconciled against what actually shipped — sitemap exclusion for drafts is called out as still open. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Jul 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Review findings from #4, fixed before the release is tagged. Everything here is a place where the standard contradicts itself, contradicts the compiler, or documents something that does not exist — cheap now, expensive once
v0.1.0is a citable baseline.Normative contradictions
specification.md§11 said the prior reference SHOULD be linked to its replacement through anexactMatchMappingAssertion;versioning.mdsaidMappingAssertions MUST NOT be used for succession links. §11 was the stale side — it now points atsuperseded_by.Work.exactMatch/closeMatchvs §6. The compiler emits derived SKOS arrays onWork, but §6 still closed with "External identifiers … are not fields on theWorkitself" and omitted both fields from its list. §6 now separates the authoring surface (MappingAssertion, authoritative, carries status and provenance) from the compiler's read-only projection.superseded_bywas unreachable fordeprecated. §11 allowed adeprecatedtombstone, §12 attached the successor field only towithdrawn, and the compiler rejected anything butwithdrawn/blocked. The guard widens todeprecated/withdrawn/blocked, and §12 now defines the field once, in full.versioning.md§ Compiler invariants claimed a promoted record MUST NOT reference adraftWork/CitationSystem;scripts/compile.tshad nodraftcheck at all (ADR-0003 listed it as an open follow-up). Now implemented for both references and mapping subjects. Moot while all data isdraft— live at the first promotion, which is exactly when nothing would have caught it.enforceTombstoneInvariantsis renamedenforceRegistryInvariantssince it no longer only handles tombstones, andblockedjoinsTOMBSTONE_STATUSESso the two guards agree on what a tombstone is.Published artifacts
api/openapi.yamlnever received ADR-0001/0003: it still declaredtarget_kind(the last occurrence in the tree outsideCHANGELOG.mdanddecisions/) and lackedconforms_to,superseded_by, and theWorkSKOS arrays. This document is published at/api/.Housekeeping
CONTRIBUTING.mdclaimedvYYYY.MM.Ntags are cut from this repo'smain, contradicting its own release checklist. This is the unresolved review thread blocking Release v0.1.0: ADR-0001/0002/0003, all data draft, spec fixes #6–#15, Astro 7 (#20) #4 from merging.ProposedtoAccepted— the implementation is merging, so the decision is made. ADR-0002 and ADR-0003 follow-up checklists are reconciled against what actually shipped; sitemap exclusion for drafts is called out as still open rather than checked off, because@astrojs/sitemapis unfiltered and drafts are insitemap-0.xml.Verification
npm run format:check,npm run check(0 errors),npm run build(78,940 pages, all internal links valid),npm run compile:data+npm run validate:data(39,250/39,250 records valid).The new invariant was proved to fire, not just to pass: promoting one work to
candidateagainst the still-draftbekkersystem produced 5,220 violations and failed the build withpromoted reference (candidate) points at draft system https://textrefs.org/id/system/bekker. Reverted afterwards; thedata/pointer is unchanged atc0a3275.Changelog regenerated with
git-cliff --tag v0.1.0— plainnpm run changelogretitles the section[Unreleased], since the release checklist regenerates before the tag exists.🤖 Generated with Claude Code