Skip to content

spec: ratify single claim identity on the wire (AR-18)#48

Merged
tymofiy merged 1 commit into
mainfrom
claude/bughunt-2026-06-27
Jun 27, 2026
Merged

spec: ratify single claim identity on the wire (AR-18)#48
tymofiy merged 1 commit into
mainfrom
claude/bughunt-2026-06-27

Conversation

@tymofiy

@tymofiy tymofiy commented Jun 27, 2026

Copy link
Copy Markdown
Owner

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.md being 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

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>
Copilot AI review requested due to automatic review settings June 27, 2026 16:17

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread spec/CORE.md

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)).
Comment thread spec/CORE.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). |

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread spec/CORE.md

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)).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@tymofiy tymofiy merged commit 46a5193 into main Jun 27, 2026
5 checks passed
@tymofiy tymofiy deleted the claude/bughunt-2026-06-27 branch June 27, 2026 20:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants