Repository navigation
evidence: give source observation and availability records stable owner identities #530
Description
Finding
#527 now prevents caller-selected source availability and keeps arbitrary receipt JSON distinct from owner-issued Evidence state. A remaining lineage gap is that the two owner records that establish that trust path are not themselves addressable records.
SourceObservation currently binds SourceArtifact identity + source digest + SystemTime, but has no observation/event identity. SourceAvailability copies the artifact identity/digest/observation time and adds AvailableTime, but has neither its own identity nor the identity of the exact observation from which it was derived. SourceSnapshotReceiptV1 therefore commits the source artifact/content and two clocks, but cannot point to the exact Evidence-owned observation and availability records that authorized those clocks.
Repeated observation/availability of the same immutable source is scientifically and operationally legitimate. Timestamps are attributes, not record identities; they should not be used as a surrogate key for lineage, audit, replay, recovery, or later repository persistence.
Required RED
Through the public Evidence API:
- observe the same immutable
SourceArtifacttwice and require two distinct canonical Evidence identities while content/artifact identity remains the same; - create availability from each observation and require each availability record to have its own distinct identity and to retain the exact owning observation identity;
- mint a source-snapshot receipt and require the canonical receipt/binding to preserve both owner-record identities in addition to source-artifact identity/content digest and the two nominal clocks.
The RED must not use private field mutation, timestamps as surrogate identities, or caller-supplied UUIDs.
Minimal causal repair
Make SourceObservation and SourceAvailability first-class Evidence entities by minting UUIDv7 EvidenceId values inside the Evidence bounded context. SourceAvailability must retain source_observation_id; SourceSnapshotReceiptV1 must bind source_observation_id and source_availability_id and validate them as canonical Evidence IDs on wire import.
Keep these identities separate from:
source_artifact_id;source_snapshot_sha256;- logical
snapshot_id; - receipt identity/binding digest;
- Rubin
estimator_payload_sha256.
Do not claim signatures, external authenticity, chain of custody, or repository persistence merely because the owner records are now addressable.
Acceptance
- production callers cannot select observation/availability IDs;
- repeated observation/availability of identical source bytes produces distinct owner-record identities without changing source-artifact/content identity;
- availability binds the exact source-observation identity it follows;
- receipt canonical JSON and binding digest include both owner-record identities;
- malformed/noncanonical owner-record IDs fail closed on wire validation;
- existing
SystemTime/AvailableTimeordering and no-public-wire-to-owner promotion boundary remain intact; - exact-head Rust format/lint/test/rustdoc, authored line/branch coverage, repository/PostgreSQL/security checks and qualifying independent review remain required before feat(evidence): own immutable source snapshot receipts #527 can land.
Activity
seonghobae commentedon Sep 15, 2026
#530의 RED→causal fix를 #527의 ordinary forward history에 넣었습니다.
7cdaa414e4abd44bb019bc2cbb803fcaadcf714c: 동일 immutableSourceArtifact를 반복 관측해도SourceObservationidentity가 구분되어야 하고, 각SourceAvailability는 자체 identity와 정확한source_observation_id를 가져야 하며, 최종 receipt가 두 owner-record identity를 모두 canonical binding에 포함해야 합니다. 기존 head에서는 public accessor/type contract가 없어 compile-level RED입니다.df3ef9ec58ae555092368f4db72c008d8a6e3a15: Evidence가 observation/availability UUIDv7을 내부 mint하고, availability가 exact observation identity를 보존하며, receipt/wire/validation이source_observation_id와source_availability_id를 추가로 bind합니다. malformed/noncanonical IDs는 fail closed합니다.#527 current exact head는
df3ef9ec58ae555092368f4db72c008d8a6e3a15입니다. 이 issue는 hosted exact-head Rust/security/coverage gates와 qualifying independent review, protected-main landing까지 open으로 유지합니다. UUIDv7 도입은 addressability/lineage를 위한 것이며 signature, external authenticity, authorization, chain of custody, persistence를 주장하지 않습니다.