Mint identities for captured records - #537
Merged
Merged
Conversation
Capture accepted an id-less record and staged it unchanged, leaving later readers unable to cite, supersede, or detect a collision for that decision. Mint a deterministic identity only after its evidence, vocabulary, and duplicate-content checks pass. The minting seed is the canonical committed trailers, and deterministic probes reserve every historical identity rather than silently adopting a colliding one. Limit: deterministic minting can reserve only identities visible in this repository; independently diverged history can still introduce a collision Ruled-out: random or clock-based identities | a retried capture would give one decision a different identity Blast: module Undo: easy Certainty: firm Verified: npm ci; typecheck clean; two builds produce byte-identical dist; 383 cases pass across capture, harvest, inject, query and capture end-to-end suites Provenance: authored Record-Id: r-mintid01
CommitLore — record lintTrailers: clean — 1 commit in Active constraints for the paths this PR touchesLimits (126)
Ruled out (282)
Truncated: 180 lines omitted — the comment hit GitHub's 65000 character limit. Trailer violations fail this check. Active constraints are informational — they are what the repository already decided, not a verdict on this PR. |
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.
Closes #535 once this reaches
main.A record captured through the full unattended pipeline landed on the commit with no identity:
Provenancewas stamped by the pipeline.Record-Idwas stamped by nothing, and its absence raised no error anywhere in prepare, verify or stage.Why this is not a drafting nit
The product's promise is: install once, work normally, and the decision is preserved without anyone remembering a step. A pipeline that needs the author to invent a well-formed unique identifier has moved one step of the workflow onto whoever writes the draft — and it is the step most likely to be skipped, because skipping it is silent.
Measured across four repositories running unattended capture:
The one repository with identities is the one whose records were hand-written by someone who knew to add them. Every repository relying on the automatic path had none.
Without an identity, supersession cannot name what it retires (SPEC §5), collision detection has no key, the injected payload renders
-where the id belongs so an agent cannot cite the constraint it is about to follow, and CDEB candidate registration (PRD §3.2) cannot reference the record at all.What it does
The pipeline mints an identity from the record's own content, beside where it already stamps
Provenance.Twelve characters, not sixty-four
The first cut used the full sha256, producing
r-1dbdf2e8fd1a1d53c9f12eee3bfef592d8c68607df3a2911e1385fae9ba56df8.That is valid under the grammar and wrong in practice. This identity is not a secret — it prints on every commit and again on every injected line, where the renderer pads it into a column. At 64 characters it dominates the payload and pushes real record content out of the injection budget, so the budget gets spent on identity instead of on what was decided.
Twelve keeps it legible beside the hand-written ids already in these histories. A repository would need on the order of a million records before a collision became likely, and the probe handles that case regardless.
End to end, nobody supplying anything
307 cases pass across the capture, harvest, inject, query and end-to-end suites; typecheck clean; two builds produce a byte-identical
dist.