Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions src/components/Tombstone.astro
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ const { status, supersededBy } = Astro.props;

// ADR-0004 and specification.md §12 make `deprecated`, `withdrawn` and `blocked`
// one tombstone category, and the compiler agrees (`RETIRED_STATUSES` in
// scripts/compile.ts). The three differ in reach, not in kind: a `deprecated`
// record is retained and still resolves, while a `withdrawn` or `blocked` record
// is additionally excluded from `Work` mapping projections. The banner therefore
// stays one presentation, and the copy below states which of the three applies.
// scripts/compile.ts). The three differ in reach, not in kind. All three leave
// the `Work` mapping projections; `scripts/compile.test.ts` asserts this for
// `deprecated` as well as for the other two. A `deprecated` record is otherwise
// retained and still resolves. A `withdrawn` or `blocked` record additionally
// may not be depended on by a live record (`TOMBSTONE_STATUSES`). The banner
// therefore stays one presentation, and the copy below states which of the
// three applies.
const isDraft = status === 'draft';
const isTombstone =
status === 'deprecated' || status === 'withdrawn' || status === 'blocked';
Expand Down
2 changes: 1 addition & 1 deletion src/content/docs/standard/specification.md
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ A `MappingAssertion` identifier MUST be generated deterministically from `subjec

The persistence promise attaches at **promotion**: the first time a record is published at status `active` ([§12](#12-administrative-metadata)). Promotion changes `status` only and MUST NOT change identity-defining fields, so the identifier survives promotion unchanged. Records at status `draft` are excluded from the persistence policy: they MAY be corrected (changing an identity field mints a different identifier; the previous one ceases to resolve) or retracted (the record is deleted) without a tombstone.

An implementation MUST NOT silently change the identity-defining fields of an existing **promoted** `CanonicalReference`. Because those fields seed the deterministic identifier, any change produces a new `CanonicalReference` with a new identifier. The prior reference MUST be retained as a tombstone (`status` `deprecated`, `withdrawn`, or `blocked`, [§12](#12-administrative-metadata)) and SHOULD carry the successor IRI in `superseded_by`. `MappingAssertion`s MUST NOT be used for succession; they are reserved for work-level relations to external identifiers ([§10](#10-mappingassertion)). The three tombstone statuses differ in reach: a `deprecated` record is retained and still resolves, while a `withdrawn` or `blocked` record is additionally excluded from `Work` mapping projections ([§6](#6-work)) and MUST NOT be depended on by a live record.
An implementation MUST NOT silently change the identity-defining fields of an existing **promoted** `CanonicalReference`. Because those fields seed the deterministic identifier, any change produces a new `CanonicalReference` with a new identifier. The prior reference MUST be retained as a tombstone (`status` `deprecated`, `withdrawn`, or `blocked`, [§12](#12-administrative-metadata)) and SHOULD carry the successor IRI in `superseded_by`. `MappingAssertion`s MUST NOT be used for succession; they are reserved for work-level relations to external identifiers ([§10](#10-mappingassertion)). The three tombstone statuses differ in reach. All three leave the `Work` mapping projections ([§6](#6-work)). A `deprecated` record is otherwise retained and still resolves. A `withdrawn` or `blocked` record additionally MUST NOT be depended on by a live record.

A conforming registry SHOULD publish each `/id/{type}/{key}` IRI at two static URLs: the canonical URL itself (HTML for browsers) and a sibling with a `.json` extension carrying the JSON-LD payload. The HTML representation SHOULD advertise the JSON-LD sibling via `<link rel="alternate" type="application/ld+json" href="…json">` in the document head. `Accept`-header content negotiation is not required.

Expand Down
11 changes: 7 additions & 4 deletions src/pages/id/ref/[uuid]/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,13 @@ const chicagoHtml = escapeHtml(chicago).replace(/\*([^*]+)\*/g, '<em>$1</em>');

// ADR-0004 and specification.md §12 make `deprecated`, `withdrawn` and `blocked`
// one tombstone category, and the compiler agrees (`RETIRED_STATUSES` in
// scripts/compile.ts). The three differ in reach, not in kind: a `deprecated`
// record is retained and still resolves, while a `withdrawn` or `blocked` record
// is additionally excluded from `Work` mapping projections. The banner therefore
// stays one presentation, and the copy below states which of the three applies.
// scripts/compile.ts). The three differ in reach, not in kind. All three leave
// the `Work` mapping projections; `scripts/compile.test.ts` asserts this for
// `deprecated` as well as for the other two. A `deprecated` record is otherwise
// retained and still resolves. A `withdrawn` or `blocked` record additionally
// may not be depended on by a live record (`TOMBSTONE_STATUSES`). The banner
// therefore stays one presentation, and the copy below states which of the
// three applies.
// Kept in step with src/components/Tombstone.astro by hand until #100 lands.
const isDraft = ref.status === 'draft';
const isTombstone =
Expand Down
Loading