You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
evidence: mint source-snapshot receipt identity inside Evidence #528
PR #527 correctly moved source-snapshot binding into evidence_core, but SourceSnapshotReceiptV1::from_source_artifact still accepts a caller-supplied receipt_id: EvidenceId.
That leaves receipt-record identity outside the Evidence aggregate boundary. A caller can reuse the same UUIDv7 for two receipts that bind different SourceArtifact identities/content. The current public contract test does exactly that for equal-content artifacts. The canonical receipt digests differ, but receipt_id no longer uniquely names one immutable receipt record.
Existing Evidence aggregates (SourceArtifact, DocumentRecord) mint their own EvidenceId on creation and only accept persisted IDs on wire reconstruction. SourceSnapshotReceiptV1 should preserve that boundary.
Required RED
On current #527, construct two receipts through the public creation API and require distinct receipt identities even when all caller-controlled semantic inputs except source-artifact identity are equal. A caller must not be able to choose/reuse the receipt UUID.
Causal repair
remove receipt_id from the public from_source_artifact constructor;
mint EvidenceId::new() inside Evidence;
keep wire deserialization capable of reconstructing and validating the persisted UUIDv7;
retain source_artifact_id and content digest as separate dimensions;
keep receipt binding SHA-256 dependent on the minted receipt identity;
update public tests so receipt identity uniqueness is asserted without weakening canonical UUID/wire refusal coverage.
No Projection authority, Rubin arithmetic, or production approval registry change belongs here. This is a #527 foundation repair and should remain Draft until exact-head gates/review complete.
Implemented on #527 without weakening the Evidence boundary.
RED: 4c273ef275f00baaa118bec8ff2404722cffa492 proves the previous public constructor allowed the same caller-supplied UUIDv7 to identify two independently created receipts.
Causal fix: 8c5df71660bb0907610f613d3e499c91eb17c8dd removes the public receipt-ID parameter and mints EvidenceId::new() inside evidence_core; persisted wire input still validates canonical UUIDv7.
Public contract now asserts independently created receipts have distinct receipt IDs and that each ID parses as EvidenceId.
source_artifact_id, source_snapshot_sha256, and canonical receipt binding remain separate dimensions.
#527 remains Draft; hosted exact-head gates/review are not yet GREEN, so #528 stays open until the repair is verified or fully inherited by a successor.
Activity
seonghobae commentedon Sep 15, 2026
Implemented on #527 without weakening the Evidence boundary.
4c273ef275f00baaa118bec8ff2404722cffa492proves the previous public constructor allowed the same caller-supplied UUIDv7 to identify two independently created receipts.8c5df71660bb0907610f613d3e499c91eb17c8ddremoves the public receipt-ID parameter and mintsEvidenceId::new()insideevidence_core; persisted wire input still validates canonical UUIDv7.EvidenceId.source_artifact_id,source_snapshot_sha256, and canonical receipt binding remain separate dimensions.#527 remains Draft; hosted exact-head gates/review are not yet GREEN, so #528 stays open until the repair is verified or fully inherited by a successor.