Conversation
Rewrite the Get Started body around the single-identity narrative
("a passage has one identity, the editions that carry it are many"),
keeping the Keep reading and Live examples lists as deep-link entry
points.
Document the branching model in CONTRIBUTING.md: main is the
production source and auto-deploys; staging is a long-lived batching
branch for content edits; publish by squash-merging staging into main.
Manual workflow_dispatch from staging is available as an escape-hatch
preview that temporarily replaces production.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Updates the onboarding and contribution/deploy documentation to support a new long-lived staging branch workflow, while also adding an org-level .github repository as a git submodule.
Changes:
- Rewrites the Get Started page copy around the “single passage identity, many editions” narrative.
- Documents a
main(production) +staging(batching) branching/publishing model inCONTRIBUTING.md. - Adds a
github-profilesubmodule pointing attextrefs/.github.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
src/content/docs/get-started/index.md |
Reframes the Get Started explanation and adjusts link placement. |
CONTRIBUTING.md |
Adds branching/deploy workflow guidance for main/staging and PR targeting. |
.gitmodules |
Registers the new github-profile submodule for the org .github repo. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Fixes #3. Three buckets of false-positive errors: - grep regex truncated URLs at `)`, mangling Wikipedia disambiguation titles. Allow `)` in URLs and strip only unbalanced trailing `)`. - resolver templates with `{placeholder}` reached lychee verbatim. Filter them out. - `data/package-lock.json` contributed bot-blocked opencollective URLs. Restrict grep to YAML/MD and add opencollective to lychee excludes. Also bump the registry submodule for the Perseus license_url fix, and mirror that URL change in the how-it-works example. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- npm update: astro 6.4.3 → 6.4.4 (patch) - zod 3.25.76 → 4.4.3 (was already pulled in by astro/starlight as transitive at v4; align top-level so there's one resolved copy) Zod 4 migration in schema + validator: - z.string().url() → z.url() (Iri) - z.ZodIssueCode.custom → 'custom' string literal (superRefine calls) - validate-data reportIssue path type widened to PropertyKey[] to match zod 4's $ZodIssue['path'] GH Actions are already on current majors; no bumps needed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ssier Vorstand minimum reduced from three to two persons (Statuten Art. 11) in DE and EN; align contributing guides to frame all three review tracks (technical, expert, board reservation) as first-class, matching the governance regulation. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
§1 previously said a conforming registry MAY record dereferenceable locations. A bare identifier with no resolution path is of limited practical use, so tighten to SHOULD to nudge implementers toward providing a resolvable URL per reference. Closes #7. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace §13's compound JSON-shaped wrapper with a single JSON-LD document under @context + @graph. Each record carries full id, type, and administrative metadata so a reader can copy the example out and validate it directly against the published context and Zod schemas. The CanonicalReference id is the deterministic UUID v5 produced by the seed for `new-testament / bible-book-chapter-verse / John.3.16 / 1.0.0`, verified locally against standard/schema/. Closes #8. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…works Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
target_kind was an OPTIONAL human-readable scheme hint with no normative weight; maintaining Appendix B's enumerated label list was upkeep without payoff. Replace it with optional target.conforms_to — an IRI (or array of IRIs) typed as dcterms:conformsTo in the v1 JSON-LD context — mirroring Linked Art's conforms_to pattern. Spec, Appendix B, JSON-LD context, Zod schema, compile pipeline, in-tree fixture, registry detail pages, and get-started prose all migrated. The Astro mapping/work pages drop the scheme-label badge: the identifier IRI is authoritative and self-describing. The data/ submodule pointer moves to the matching textrefs/registry commit (target_kind→conforms_to in every data/works/*.yaml). See decisions/ADR-0001 for the rationale and alternatives considered. BREAKING CHANGE: target.target_kind is removed; downstream consumers that read it MUST migrate to target.conforms_to. Acceptable pre-v1.0.0. Closes #6. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
textrefs/registry#1 merged via squash; advance data/ pointer from the feature branch tip to the merge commit on main so the Validate workflow's "pin is on registry main" guard passes. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Starlight reads docs/404 via getEntry() for its dedicated /404 route
AND enumerates the same entry through the [...slug] catch-all,
producing a benign but noisy build warning ("Could not render /404
from route /[...slug] as it conflicts with higher priority route
/404"). draft: true excludes the entry from the catch-all in
production builds while leaving Starlight's direct-by-id lookup
intact, so dist/404.html still ships our custom hero.
The localised dist/de/404/index.html is dropped (the fallback-route
pass uses the same draft-filtered docs list); Cloudflare Pages serves
/404.html for missing pages across all locales anyway.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(ci): repair URL extraction in link-check workflow Fixes #3. Three buckets of false-positive errors: - grep regex truncated URLs at `)`, mangling Wikipedia disambiguation titles. Allow `)` in URLs and strip only unbalanced trailing `)`. - resolver templates with `{placeholder}` reached lychee verbatim. Filter them out. - `data/package-lock.json` contributed bot-blocked opencollective URLs. Restrict grep to YAML/MD and add opencollective to lychee excludes. Also bump the registry submodule for the Perseus license_url fix, and mirror that URL change in the how-it-works example. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(deps): bump astro 6.4.4 and migrate to zod 4 - npm update: astro 6.4.3 → 6.4.4 (patch) - zod 3.25.76 → 4.4.3 (was already pulled in by astro/starlight as transitive at v4; align top-level so there's one resolved copy) Zod 4 migration in schema + validator: - z.string().url() → z.url() (Iri) - z.ZodIssueCode.custom → 'custom' string literal (superRefine calls) - validate-data reportIssue path type widened to PropertyKey[] to match zod 4's $ZodIssue['path'] GH Actions are already on current majors; no bumps needed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs(association): sync statutes board size and review tracks with dossier Vorstand minimum reduced from three to two persons (Statuten Art. 11) in DE and EN; align contributing guides to frame all three review tracks (technical, expert, board reservation) as first-class, matching the governance regulation. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs(spec): tighten dereferenceable-location guidance to should (#7) §1 previously said a conforming registry MAY record dereferenceable locations. A bare identifier with no resolution path is of limited practical use, so tighten to SHOULD to nudge implementers toward providing a resolvable URL per reference. Closes #7. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs(spec): self-contained §13 example with @context (#8) Replace §13's compound JSON-shaped wrapper with a single JSON-LD document under @context + @graph. Each record carries full id, type, and administrative metadata so a reader can copy the example out and validate it directly against the published context and Zod schemas. The CanonicalReference id is the deterministic UUID v5 produced by the seed for `new-testament / bible-book-chapter-verse / John.3.16 / 1.0.0`, verified locally against standard/schema/. Closes #8. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(data): bump submodule with second resolvers on single-resolver works Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(spec)!: replace target_kind with dcterms:conformsTo (#6) target_kind was an OPTIONAL human-readable scheme hint with no normative weight; maintaining Appendix B's enumerated label list was upkeep without payoff. Replace it with optional target.conforms_to — an IRI (or array of IRIs) typed as dcterms:conformsTo in the v1 JSON-LD context — mirroring Linked Art's conforms_to pattern. Spec, Appendix B, JSON-LD context, Zod schema, compile pipeline, in-tree fixture, registry detail pages, and get-started prose all migrated. The Astro mapping/work pages drop the scheme-label badge: the identifier IRI is authoritative and self-describing. The data/ submodule pointer moves to the matching textrefs/registry commit (target_kind→conforms_to in every data/works/*.yaml). See decisions/ADR-0001 for the rationale and alternatives considered. BREAKING CHANGE: target.target_kind is removed; downstream consumers that read it MUST migrate to target.conforms_to. Acceptable pre-v1.0.0. Closes #6. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * chore(data): bump submodule to registry main (36cae56) textrefs/registry#1 merged via squash; advance data/ pointer from the feature branch tip to the merge commit on main so the Validate workflow's "pin is on registry main" guard passes. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(404): mark docs/404.mdx as draft to drop catch-all route conflict Starlight reads docs/404 via getEntry() for its dedicated /404 route AND enumerates the same entry through the [...slug] catch-all, producing a benign but noisy build warning ("Could not render /404 from route /[...slug] as it conflicts with higher priority route /404"). draft: true excludes the entry from the catch-all in production builds while leaving Starlight's direct-by-id lookup intact, so dist/404.html still ships our custom hero. The localised dist/de/404/index.html is dropped (the fallback-route pass uses the same draft-filtered docs list); Cloudflare Pages serves /404.html for missing pages across all locales anyway. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* chore(profile): bump github-profile submodule Refresh org profile README and add a top-level README in textrefs/.github. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * docs: add ORCID for Luz Christopher Seiberth Record ORCID 0000-0002-5606-0964 for the second author/creator in CITATION.cff and the project's Zenodo metadata, matching the existing ORCID entry for the first author. Checksum-verified valid. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
… tuple (ADR-0002) (#21) * feat(spec)!: seed CanonicalReference UUIDs from the semantic identity tuple Adopt ADR-0002 (fixes #15): reference UUIDs are computable offline from (work_key, citation_system_key, locator); normalization_version is removed from the data model entirely. Citation-system profiles now define canonical locator forms — non-canonical spellings are rejected at validation time, never folded — and a profile change that alters an accepted locator is a compatibility event (migration, breaking release, or new citation_system_key), not a version bump. - Zod schemas: drop normalization_version (reference + system), drop examples, add required CitationSystem.description; drop unused SemVer - compile/validate: 3-field LF-joined seed on both sides; systems emit description instead of normalization_version/examples - JSON-LD context + OpenAPI: same shape change (description = dcterms:description) - spec docs: identifier-syntax gains a purpose-of-determinism section and the canonicalization-change compatibility rule; system-profiles gains the canonical-locator-form section (relates to #13) - doc example UUIDs recomputed for the 3-field seed - data submodule → textrefs/registry#5 (systems gain description, lose normalization_version/examples) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(spec): align conformance item 6 and get-started checklist with examples removal The CitationSystem contract no longer carries examples.valid/invalid; conformance now requires description + a valid ECMAScript locator_regex. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(data): bump submodule to registry review fixes (5337e71) modified bumped on all systems for the shape change; bible description aligned with its locator_regex (Copilot review on registry#5). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(spec): align quoted bible description with updated registry text Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ADR-0003) (#23) * feat(spec): add draft lifecycle with retractable pre-promotion identity Adopt ADR-0003 (fixes #22): new draft status is an ephemeral tier below candidate. The identifier-persistence promise attaches at the promotion event (draft -> candidate, expert review), not at publication. Draft records may be corrected (identity change mints a different id) or retracted (deleted, no tombstone); a re-proposed tuple regains the same UUID by construction. All records keep deterministic v5 ids at every stage - governance §6.3/6.4 no longer prescribes generated ids for provisional objects. - specification §11/§12: promotion semantics + draft status definition - identifier-syntax: immutability scoped to candidate-or-higher - versioning: ladder, draft-retraction section, promoted-must-not-cite- draft invariant (enforcement is an ADR follow-up) - governance EN/DE §4-§6: entry via technical review, promotion via expert review, tombstones scoped to promoted records - CONTRIBUTING: review tracks + flowchart - Status enum: draft added (Zod + OpenAPI) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore(data): bump submodule to draft-demoted registry (3f6c9f2) All records enter the ADR-0003 ladder at draft; see textrefs/registry#7. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
All records demoted to draft per ADR-0003 (textrefs/registry#7); pin returns to a registry main ancestor. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…profiles (#24) Fixes the spec side of #13: system profiles MUST state their leading-zero policy (default forbidden) and canonical letter case (default case-sensitive declared casing). Seed-profile examples and the worked example follow the registry: Bekker pages from 1 without leading zeros, Stephanus likewise, Bible vocabulary pinned to case-sensitive OSIS book abbreviations. Submodule bumped to registry main d31ed0b (registry#8). Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…) (#25) - #14: RFC 9562 replaces obsoleted RFC 4122; JSON-LD siblings advertised and served as application/ld+json; alias mechanism described without the undefined aliases.json filename; undefined tombstone rationale fields dropped; UUID namespace derivation notes clarify NAMESPACE_DNS is an opaque salt. - #10 (option B): succession is provenance, not equivalence — tombstoned records carry superseded_by (dcterms:isReplacedBy); MappingAssertion stays reserved for work-level equivalence with a Work-IRI subject. New compiler invariant: superseded_by only on withdrawn/blocked records. - #11: published Work records now carry direct exactMatch/closeMatch arrays derived from accepted mappings, so skos:exactMatch/closeMatch edges exist in the JSON-LD graph alongside the reified assertions. - #12 (option 1): authored SPDX ids are emitted as canonical SPDX IRIs (https://spdx.org/licenses/{id}); dcterms:license is now IRI-typed for both license and license_url. Non-SPDX values are omitted with a compile warning (registry data already cleaned in registry#9). - data/ submodule -> registry main 2c548b3 (SPDX license cleanup). Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…26) ADR-0003 render follow-up: /id/ record pages show a draft notice and emit robots noindex while status is draft; /reg/ listing pages inherit the flag from their work/system. The tombstone banner now follows the superseded_by successor link (was: exactMatch mapping prose) and covers blocked records. Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
) (#56) CitationSystem pages listed every canonical reference expressed in the system — 27k for homer-book-line — which is both an information-model mismatch (a system is associated with works; references are individual locations) and the reason those pages ran long. The section is now "Works using this system": each associated work once, linked to its Work page, with the number of references it contributes and an empty state when a system has no works. Individual references stay reachable from Work pages (/reg/work/<key>/refs/) and /id/ref/<uuid>/. The paginated /reg/system/<key>/refs/<page>/ route is removed with it — the preview section was its only inbound link, so it would otherwise build orphan pages. Fixes #55 Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…4) (#62) * feat(standard)!: collapse record lifecycle to draft → active (ADR-0004) Remove the `candidate` record status. Promotion out of `draft` now grants both recommendation and identifier permanence in one expert-review gate, so there is no longer a state that is permanent but not recommended. - ADR-0004 records the decision; ADR-0003 is marked superseded by it. - `Status` enum drops `candidate` in `standard/schema/common.ts` and in its duplicate at `api/openapi.yaml`. - Compiler invariant comments move to the two-state vocabulary; the logic already keyed off `status !== 'draft'` and is unchanged. - Specification §11/§12 state the new ladder and add the corrections path for promoted records: never delete, never mutate identity fields, move to deprecated/withdrawn/blocked with `superseded_by`. §14 gains a validator check that no active record depends on a draft one. - Governance §4.2/§5.1/§5.2/§5.3/§6 amended in English and in the legally binding German text, in sync as ADR-0003 required. No data migration: every record in the registry is `draft`, so nothing was on `candidate`. Breaking for dump consumers reading the enum. Refs #22 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(standard): resolve ADR-0004 self-references before merge The ADR quoted its own pre-change state as if it were current: a stale line-number citation to standard/schema/common.ts (the enum moved when the lifecycle comment was added above it), and a quoted scripts/compile.ts comment that this same PR rewrites. Both go stale the moment the PR merges, since the ADR and the code change land together. Flagged by Copilot review on #62. Status flips Proposed -> Accepted per decisions/README.md's merge step, matching ADR-0001/0002 which are already Accepted while only in staging. Refs #22 --------- Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
33 tasks
…isReferencedBy (ADR-0006) (#67)
Resolves 40 of the 41 findings in the documentation consistency audit (#79) and the related-systems rework (#81), ahead of the v0.1.0 tag. - fix(standard): spec worked example, validation rules, and reference drift - fix(api): align OpenAPI with the contract and validate BCP 47 tags - docs(community): resync the mirrored contributing and roadmap files - docs(standard): fix json-ld, versioning, and index drift - docs(get-started): correct every example against the compiled registry - docs(get-started): plain-language pass - docs(get-started): group related standards by the layer they address (#81) - docs(standard): resolve review findings on the license and language rules F36 is excluded deliberately; it belongs with the statutes batch.
…) (#86) The direct `alternateOf` / `isReferencedBy` edges on `Work` excluded only `withdrawn` and `blocked` assertions. `deprecated` still projected, so a mapping the registry had taken out of use kept emitting a live edge. That contradicts the standard's own definitions. `deprecated`, `withdrawn` and `blocked` are the three states for records that have left active use (ADR-0004, `standard/schema/common.ts`), and specification §12 defines `deprecated` as "retained but no longer recommended". The edge carries no status, so it cannot say the mapping is retired. Gate the projection on the set that already means "left active use", and rename it from SUPERSEDABLE_STATUSES to RETIRED_STATUSES so it reads correctly at both call sites. TOMBSTONE_STATUSES stays: the two remaining uses are about broken resolution, and a deprecated record still resolves. The published output does not change. Every record in `data/` is `draft`, so no assertion is deprecated today and `dist/dump/works.jsonl` is byte-identical. This closes the hole before a demotion ever happens. Issue #45 also proposed an allowlist, so that `draft` assertions stop projecting too. Declined: TextRefs' guarantees attach to `CanonicalReference`, and the Work projection is enrichment that never claimed review. The docs now say so, rather than implying a promise the standard does not make. Claude-Session: https://claude.ai/code/session_017PUm3GZBhwznL6uZEpDMKg Co-authored-by: Moritz Mähr <14755525+maehr@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Every operation in the v0.1.0 contract read one record by its own identifier, so a client had to know a key before it could fetch anything. Registry discovery was a build-time privilege: only the `/reg/` browser could call `loadWorks()` and `loadSystems()`. Add two static JSON-LD collections at `/reg/works.json` and `/reg/systems.json`. Each body carries one `@context` and one `@graph`, sorted by key, in every status. Items are the records that `/id/…json` serves, without a per-item `@context`. - Add `src/lib/collection.ts` with the shared sort order, so the HTML browser and the JSON collections cannot drift. Covered by `src/lib/collection.test.ts`. - Advertise both collections from `/reg/` with `link rel="alternate"`. Each link carries a `title`, because the page also emits `hreflang` alternates. - Add `Collections` and `Bulk` tags, both collection paths, the five `/dump/` paths that the compiler already writes, and the `WorkCollection` / `SystemCollection` schemas. Declare the media types the host actually serves. The site is static, and GitHub Pages derives every `Content-Type` from the file extension and drops the header the Astro `APIRoute` sets. A `.json` body arrives as `application/json` and a `.jsonl` body as `application/octet-stream`, whatever the payload is. The contract now says so, and tells clients to parse by documented shape rather than by response header. `RegistryObject` stays unreferenced. It mirrors the exported Zod union in `standard/schema/index.ts` and is schema parity, not debris. Closes #83
) (#88) Publish the reference lookup as data. Each work gets a locator index at /reg/work/{key}/aliases.json that maps a locator to its reference UUID, grouped by citation system key, so a client resolves a passage in two fetches and needs no UUIDv5 implementation of its own. Publish the complete alias table at /dump/aliases.json, and register it in datapackage.json with a byte count and a sha256 hash. data/README.md and data/.gitignore both named that artifact already; no code wrote it. Split writeDump() into pure halves so a plain JSON resource fits beside the four JSONL ones. Sort the alias keys, so the body and its hash depend on the registry content alone. Add the new file to the release workflow, which sets fail_on_unmatched_files. Correct the four contract statements that the new artifacts falsify: the Collections tag, the Bulk tag, the datapackage resource count, and the claim that every .json body is JSON-LD by content. Largest emitted index is tanakh at 1.12 MB, under the agreed 2 MB cap, so no pagination. All 67,959 references are reachable from their work index, and the four JSONL bodies are byte-identical to staging.
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.
Release v0.1.0 — first citable baseline
Publishes
staging→mainas v0.1.0 (0.0.1 → 0.1.0: pre-1.0 breaking spec changes). This is the first tagged release; after merge,mainis taggedv0.1.0,release.ymlbuilds the dump and creates the GitHub Release, and Zenodo mints the concept DOI. Community announcement with the full story: discussion #31.Tracked in #68, which carries the merge sequence and the pre-tag checklist.
What it ships
67,959 references across 12 works and 10 citation systems, all at
status: draft— 68,005 records in total. That is up from ~39,200 when this PR was opened: the resolver review completed the New Testament (John only → 27 books) and the Tanakh (Genesis only → 39 books), so the baseline covers two complete biblical corpora rather than one book of each.references.jsonlis 53.6 MB and the alias table is 12.9 MB; the built site is 204,361 pages plus 68,019 JSON endpoints.Standard — six ADRs adopted (
decisions/)dcterms:conformsToreplacestarget_kind(target_kind: prefer a dereferenceable IRI +dct:conformsToover an enumerated scheme list #6) — mapping targets drop the curated scheme-label column; an optionalconforms_toIRI carries the conformance claim, following Linked Art practice.CanonicalReferenceUUIDs seed from the semantic identity tuple(work_key, citation_system_key, locator)— computable offline;normalization_versionremoved from the data model (adr: purpose of deterministic UUIDs (compiler reproducibility vs. offline minting) #15).draftlifecycle tier belowcandidate. The identifier-persistence promise attaches at promotion (expert review), not publication. Drafts may be corrected or retracted without tombstones (adr: review lifecycle and ephemeral draft state (retractable pre-promotion identity) #22). Superseded by ADR-0004.draft→active— promotion grants recommendation and identifier permanence in a single expert-review gate, since nothing ever treatedcandidatedifferently fromactiveexcept the recommendation.Worknames a preferred citation system, which mints the bare/cite/{work}/{locator}alias; fallback systems get qualified/cite/{work}/{system}/{locator}aliases. Closes adr: Introduce a preferred Citation system #60.prov:alternateOf(another entity denoting the same work) anddcterms:isReferencedBy(a document about the work), chosen by what the target is rather than by confidence.closeMatchis removed outright. Closes standard: owl:sameAs instead of skos:exactMatch #58 and standard: replace skos:closeMatch to link to URL pages #59.ADR-0005 and ADR-0006 both re-mint IRIs. Landing them before the first tag costs nothing — every record is
draftunder ADR-0004 and no identifier has ever been published. After the tag the same change would cost a documented migration against a baseline people may already cite. That timing argument is why they are in v0.1.0 rather than v0.2.0 (#68 §2).Registry
The
data/submodule is pinned totextrefs/registry@237e39f, carrying:Compiler and site
John→ die-bibel.de's USFMJHN) instead of forcing a second citation system into existence.toStringskips the entry instead of expandingObject.prototype's method into a published URL.Work(fix(compile): stop projecting retired mapping assertions onto Work (#45) #86, closes Mapping projection uses a denylist, so draft and deprecated mappings emit unqualified direct edges #45) — the directalternateOf/isReferencedByedges excluded onlywithdrawnandblocked, so adeprecatedmapping still emitted a live, unqualified edge, against the standard's own definition of the three states for records that have left active use. The allowlist ondraftthat Mapping projection uses a denylist, so draft and deprecated mappings emit unqualified direct edges #45 also proposed was declined: TextRefs' guarantees attach toCanonicalReference, and theWorkprojection is enrichment that never claimed review — the docs now say so rather than implying a promise the standard does not make. No published byte changes today, since every record isdraft, so this closes the hole before the first demotion rather than fixing a visible defect./reg/browser could callloadWorks()andloadSystems()./reg/works.jsonand/reg/systems.jsonnow serve one@contextand one@graphof records, sorted by key, in every status, and/reg/advertises both throughlink rel="alternate". The contract also documents the five/dump/artifacts the compiler has always written and Pages has always served but the OpenAPI never mentioned.RegistryObjectstays unreferenced on purpose: it mirrors the exported Zod union instandard/schema/index.ts, so routing the collections through it would have widened both responses to a union a client must narrow. No registry data changes./cite/meta-refresh HTML. Each work now carries a locator index at/reg/work/{key}/aliases.json, mapping locator to reference UUID grouped by citation system key, so a client resolves a passage in two fetches and parses JSON alone. The complete alias table ships at/dump/aliases.jsonand is registered indatapackage.jsonwith a byte count and asha256:hash — the artifactdata/README.mdanddata/.gitignorehave both named all along while no code wrote it. Values are bare UUIDs rather than IRIs, which halves the largest file, and the index carries no@context: it is a lookup table, not JSON-LD, and the contract says so. Largest emitted index istanakhat 1.12 MB (566 KB gzipped), under the agreed 2 MB cap, so it is not paginated — paginating would force a client to fetch every page to find one locator.writeDump()split into pure halves so a JSON resource fits beside the four JSONL ones, and the alias keys are sorted so the body and its hash depend on registry content alone rather than on the order the compiler visited the work files.release.ymlgained the matching glob:aliases.jsonmatched neither existing pattern andfail_on_unmatched_filesis set, so a tagged release would otherwise have shipped a descriptor listing a resource that was not in the release. All 67,959 references are reachable from their work index, and the four JSONL bodies are byte-identical to before. No registry data changes.Documentation
Consistency audit (docs: resolve the consistency audit before v0.1.0 (#79) #80, resolves 40 of the 41 findings in docs: consistency audit — 41 findings across the standard, get-started, and mirrored root docs #79) — every documentation file checked against the schemas, the compiler, the published context, the OpenAPI contract and the compiled registry output. Four findings would otherwise have frozen wrong statements into a citable baseline: §13's flagship
Workexample was invalid againstWork.safeParsefor want ofpreferred_citation_system_key, the OpenAPI document described the advertised<link rel="alternate">type asapplication/jsonwhere the HTML emitsapplication/ld+jsonand omittedWork.creators, and §14 required BCP 47 validation that all three schema layers implemented asminLength: 2. That last one is now a sharedLanguageTag(RFC 5646 langtag + privateuse), mirrored as an OpenAPIpattern.The audit's media-type finding touched only that prose. The response media types stayed
application/json, and feat(api): add works and systems collection endpoints (#83) #87 confirmed that this is the correct declaration rather than an oversight: the site is static, so GitHub Pages derives everyContent-Typefrom the file extension and discards the header the AstroAPIRoutesets. On the live site/id/work/plato.republic.jsonreturnsapplication/json; charset=utf-8and/dump/works.jsonlreturnsapplication/octet-stream. Declaringapplication/ld+jsonwould have described a response no client receives. The contract now states the rule and tells clients to parse by documented shape rather than by response header.The published contributing page described the wrong branching model (docs: resolve the consistency audit before v0.1.0 (#79) #80) — it told contributors to branch from and PR against
main, and omitted the branching section entirely, while the infrastructure integrates onstaging. Fixed in both halves of the mirrored pair, and the release checklist is resynced to the canonical 9 steps.Related standards and systems (docs: resolve the consistency audit before v0.1.0 (#79) #80, closes docs: add more systems like IIIF #81) — the related-systems page framed every neighbouring standard as an identifier scheme. It is now grouped by the layer each system addresses, and adds IIIF Presentation API, W3C Web Annotation, BIBFRAME, IFLA LRM, RAMEN, and URN:NBN — the last of which Appendix B already listed and the page did not.
F36 is deliberately not in this release branch yet — the legal-reservation notice missing from the English association pages ships with the statutes batch, alongside the association's founding record.
Release plumbing
CITATION.cffcarriesversionanddate-released(chore(release): v0.1.0 metadata — CITATION.cff, changelog, checklist fixes #76, closes CITATION.cff carries no version or date-released #51), and the maintainer release checklist that omitted them is fixed.CHANGELOG.mdregenerated withgit-cliff --tag v0.1.0.versioning.mdno longer claims a Frictionlessschemathe compiler does not emit; tracked in datapackage.json omits the Frictionless schema field descriptors versioning.md requires #74.astro checkrejects 7.x.github-profilesubmodule is gone (fix: release hardening before v0.1.0 (#46, #47, #49, #50) #75, closes github-profile submodule has no consumer #50), so the tag does not freeze a dependency nothing reads.Spec version vs tag
The tag is
v0.1.0; the specification stays at0.1.0-draftwithmaturity: working-draft. These are deliberately different things — ADR-0004 and ADR-0006 both declined a spec bump under the working-draft clause, and0.xreleases stayworking-draftby the maturity ladder. All registry data isdraftand carries no persistence promise until expert review promotes it.Verification
dataandlinkcheckre-run automatically asstagingmoves; both were green on0df2b27and on every tip since.github-pagesmust be dispatched onstagingfor the final SHA before merge. The ruleset requires a deployment for the SHA being merged, and Pages only auto-runs on push tomain— so this is repeated every timestagingmoves. Latest deployment is37faf37;stagingis now8bcfdca(feat(api): publish an alias index so clients resolve a locator without UUIDv5 (#84) #88). See #68, correction 2.npm run build:dataemits all six dump artifacts matchingrelease.yml's globs —works.jsonl,citation-systems.jsonl,references.jsonl,mappings.jsonl,aliases.json,datapackage.jsonat version0.1.0— andvalidate-datareports 68,005/68,005 records valid. Everybytesandsha256:in the descriptor was re-checked against the file on disk.npm testis 54/54 after feat(api): publish an alias index so clients resolve a locator without UUIDv5 (#84) #88, which added twelve cases for the locator index and seven for the dump resources; earlier updates to this description cite 35, 31, 30 and 25. The record counts are unchanged — none of docs: resolve the consistency audit before v0.1.0 (#79) #80, fix(compile): stop projecting retired mapping assertions onto Work (#45) #86, feat(api): add works and systems collection endpoints (#83) #87 or feat(api): publish an alias index so clients resolve a locator without UUIDv5 (#84) #88 touched registry data, and thedata/pin is still237e39f. A fullnpm run verifyon the merged tree builds 204,361 pages, two of them the new OpenAPI operation pages, alongside 68,019 JSON endpoints, twelve of them the new locator indexes. Astro's page count covers HTML only, so the earlier 204,359 figure moves by two rather than by fourteen.releaseevents for both repositories.