feat: guarantee stable cross-system feast identifiers (#55) #356

Merged
manlycucumber merged 1 commit from feature/55-stable-identifiers into develop 2026-07-02 04:47:47 +00:00
manlycucumber commented 2026-07-02 04:46:36 +00:00 (Migrated from github.com)

Closes #55.

The contract's id/urn (emitted since #53) are declared and guarded as a stability-guaranteed compatibility surface.

  • id is the bare ObservanceId slug — identity only, edition-invariant, independent of date or rank. It is the stable cross-system feast id: the "observance id → feast id" mapping is the identity function, so no separate registry is needed.
  • urn is that id under the platform URN scheme (introibo:observance:<id>) and round-trips through ObservanceId::parse.
  • Guarantees (documented in docs/design/output-contract.md): ids are never renamed or re-homed; later editions (1954/1955, monastic) reuse them; a renamed display name never moves the id; identity lineage (splits/merges) lives in the reserved aliases slot.

Test

StableIdentifierTest pins a representative set — temporal Sunday and feria, a sanctoral feast, a sanctoral vigil — so an accidental change to any published identifier fails loudly, and asserts each urn round-trips to its id.

Local gate: composer lint (0), composer analyse ([OK]), composer test (484 tests / 30,401 assertions).

Closes #55. The contract's `id`/`urn` (emitted since #53) are declared and guarded as a **stability-guaranteed compatibility surface**. - **`id`** is the bare `ObservanceId` slug — identity only, edition-invariant, independent of date or rank. It *is* the stable cross-system feast id: the "observance id → feast id" mapping is the identity function, so no separate registry is needed. - **`urn`** is that id under the platform URN scheme (`introibo:observance:<id>`) and round-trips through `ObservanceId::parse`. - **Guarantees** (documented in `docs/design/output-contract.md`): ids are never renamed or re-homed; later editions (1954/1955, monastic) reuse them; a renamed display name never moves the id; identity lineage (splits/merges) lives in the reserved `aliases` slot. ## Test `StableIdentifierTest` pins a representative set — temporal Sunday and feria, a sanctoral feast, a sanctoral vigil — so an accidental change to any published identifier fails loudly, and asserts each urn round-trips to its id. Local gate: `composer lint` (0), `composer analyse` ([OK]), `composer test` (484 tests / 30,401 assertions).
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Directorium/Core!356
No description provided.