spec: ratify single claim identity on the wire (AR-18)#48
Conversation
Add a normative clause to §6.1 and AR-18: the bracket id is a claim's sole serialized identity (relations, history, and cross-pack references resolve to it); the metadata block carries exactly its defined positional fields; producers MUST NOT append fields beyond position 6, and readers MUST reject (not silently drop) any trailing token. Any opaque or storage-layer identifier is non-wire (storage is non-normative; see STORAGE.md). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR updates the KP:1 core specification to normatively pin a claim’s on-wire identity to its bracket claim ID and to require fail-loud parsing when producers emit extra/undefined metadata tokens, reducing round-trip divergence across implementations.
Changes:
- Add a normative clause in §6.1 stating that the bracket ID is the sole serialized claim identity and that dense metadata must not include fields beyond position 6 (readers must reject extra non-empty tokens).
- Add AR-18 to Appendix B to ratify the same rule as an ambiguity resolution.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| Positions 1–4 are REQUIRED. Positions 5–6 are OPTIONAL. Empty interior slots are valid: `{0.85|r|E020|2026-03-10||prediction}`. | ||
|
|
||
| **Single claim identity (normative).** The bracket id (`[C001]`) is a claim's sole serialized identity — relations, history entries, and cross-pack references (AR-16) all resolve to it. The dense metadata block carries EXACTLY the positional fields defined above and no others: a producer MUST NOT append fields beyond position 6, and a conforming reader MUST treat any non-empty token past them as a malformed claim (rejecting it) rather than silently discarding it. An opaque or storage-layer identifier a system keeps for a claim (e.g. a database key) is non-wire — it is never emitted into, nor reconstructed from, the serialized claim; preserve it out-of-band if it must survive a round-trip. Storage-layer identity is a non-normative concern (see [STORAGE.md](STORAGE.md)). |
| | AR-15 | `tier` is optional. When `hub`, `sub_packs` is required. | | ||
| | AR-16 | Cross-pack references: `pack_name#section_ref`. `#` is the separator. | | ||
| | AR-17 | Blank lines are permitted between structural elements (frontmatter, headings, descriptions, sections, claims). A section MAY open with a blockquote description, mirroring the document heading. Whitespace-only lines are not blank lines. | | ||
| | AR-18 | The bracket id is a claim's sole serialized identity; relations, history, and cross-pack references (AR-16) resolve to it. A claim's metadata block (dense §6.1 or verbose §6.2) carries exactly its defined fields — producers MUST NOT add fields beyond them, and readers MUST reject a non-empty undefined/trailing token rather than silently dropping it. Opaque or storage-layer identifiers are non-wire (storage is non-normative; see STORAGE.md). | |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 86edb807ce
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| Positions 1–4 are REQUIRED. Positions 5–6 are OPTIONAL. Empty interior slots are valid: `{0.85|r|E020|2026-03-10||prediction}`. | ||
|
|
||
| **Single claim identity (normative).** The bracket id (`[C001]`) is a claim's sole serialized identity — relations, history entries, and cross-pack references (AR-16) all resolve to it. The dense metadata block carries EXACTLY the positional fields defined above and no others: a producer MUST NOT append fields beyond position 6, and a conforming reader MUST treat any non-empty token past them as a malformed claim (rejecting it) rather than silently discarding it. An opaque or storage-layer identifier a system keeps for a claim (e.g. a database key) is non-wire — it is never emitted into, nor reconstructed from, the serialized claim; preserve it out-of-band if it must survive a round-trip. Storage-layer identity is a non-normative concern (see [STORAGE.md](STORAGE.md)). |
There was a problem hiding this comment.
Preserve section targets for cross-pack refs
When this normative sentence says cross-pack references all resolve to the bracket id, it contradicts §9/AR-16's pack_name#section_ref contract and existing valid references such as typical-fixture#Findings in the maximal fixture. In implementations that adopt AR-18 literally, valid cross-pack ↔pack#section links would be rejected or rewritten as claim IDs, breaking current fixtures and authored packs; this clause should limit the claim-id identity rule to local claim references/history, or explicitly keep section refs valid for cross-pack see_also.
Useful? React with 👍 / 👎.
Summary
Adds a normative clause to §6.1 (and appendix rule AR-18) clarifying that a claim's bracket id is its sole serialized identity, and that the metadata block carries exactly its defined positional fields — a producer MUST NOT append fields beyond them, and a conforming reader MUST reject (not silently drop) any non-empty undefined or trailing token.
Why
The grammar defines positions 1–6 for the dense metadata block but did not state how a reader must treat extra trailing tokens. Independent implementations diverged: some silently discarded tokens past the defined positions, which can quietly drop or alter claim data on a round-trip (e.g. a producer encoding an out-of-band identifier as a trailing token that a reader then drops, collapsing a claim's identity to its display alias). This clause closes the ambiguity in favor of fail-loud rejection, and states explicitly that opaque or storage-layer identifiers are non-wire — never emitted into, nor reconstructed from, the serialized claim (consistent with
STORAGE.mdbeing non-normative).Scope
Spec/documentation only —
spec/CORE.md(+3 lines: the §6.1 clause and the AR-18 appendix row). No change to the defined fields themselves; this ratifies the intended reading and aligns reader behavior across implementations.🤖 Generated with Claude Code