Home Contact
Universal Substratev1.4
/
For agents Markdown

26. Canonical record ledger, claims, evidence, and identity resolution

The canonical ledger is not a mutable vehicle row. It is an ordered set of immutable typed records whose relationships allow a policy-bound view to be reconstructed for valid time and knowledge time. Record acceptance is a transaction: either the canonical…

Concept & directionLNK

The canonical ledger is not a mutable vehicle row. It is an ordered set of immutable typed records whose relationships allow a policy-bound view to be reconstructed for valid time and knowledge time. Record acceptance is a transaction: either the canonical record, subject links, digest, idempotency binding and outbox entry commit together, or none do.

Diagram of the canonical RTracer write pipeline from strict receive and parse through normalization, validation, authorization, append, outbox publication and rebuildable projections.
Picture 7

The append is authoritative; every downstream view is versioned and rebuildable.

#26.1 Four records that must not collapse

ObjectAuthorityMutation rule
RecordCoreProducer-authored semantic content, subjects, valid time and source contextImmutable; digest excludes proofs, transport and store metadata
ProofRecordSignature/attestation over one exact RecordCore digestAdditional proofs may append without changing the core
IngestReceiptStore acceptance decision, transaction time, validator/policy lock and log positionOne or more custodians may issue receipts; producer cannot self-assert store time
ProjectionReceiptProjector code/policy/registry versions, input watermarks and output digestRebuildable; never authoritative history
Table
Integrity is not truth or authority
A valid proof establishes that a key signed particular bytes under a profile. It does not establish that the signer was authorized, the claim was accurate, the vehicle was owned, the configuration was safe or the event occurred.

#26.2 RecordCore v1

Table
Canonical producer-authored RecordCore - illustrative JSON
{
  "recordId": "018f4d6e-7db2-7e40-9a13-7d7f12f00101",
  "recordType": "rtracer.claim.assertion/v1",
  "schemaRef": {"id": "schema:rtracer.claim.assertion/v1", "digest": "sha256:..."},
  "subjects": [{"entityId": "018f...aa", "role": "subject"}],
  "validTime": {"start": "2026-07-22T09:00:00Z", "end": null},
  "authoredAt": "2026-07-22T09:00:02.700Z",
  "producer": {"principalId": "018f...10", "systemId": "018f...11"},
  "tenantScope": "018f...01",
  "truthLane": "asserted",
  "visibilityPolicyRef": "policy:owner-team/v3",
  "body": {"predicate": "vehicle:paintColor", "object": {"term": "color:blue"}},
  "extensions": []
}
Field groupRequirement
identityrecordId is opaque and immutable; recordType and schemaRef select exact semantics
subjectsone or more typed subject links; roles are schema-governed and order-independent unless declared
timevalid interval is application time; authoredAt is an issuer claim, not system transaction time
producerhuman/device/service principal, producing system, tenant and delegation chain where relevant
epistemictruth lane, knowledge state, confidence semantics, evidence coverage and verification state
policyvisibility policy, purpose restrictions, retention class and sensitive-field map
bodyclosed payload governed by recordType; extensions are explicit namespaced containers
integritycanonical core digest is computed outside the core; proofs and store receipts reference ID plus digest
correctionsupersedes/corrects/retracts/disputes/derivesFrom relations remain separate typed records
Table
Store-authored IngestReceipt v1.4 - illustrative JSON
{
  "receiptProfile": "rtracer.ingest-receipt/1.4",
  "target": {"recordId": "018f...0101", "recordDigest": "sha256:..."},
  "decision": "accepted",
  "acceptedAt": "2026-07-22T09:00:03.184Z",
  "storeId": "018f...store",
  "ledgerId": "018f...ledger",
  "logicalShardId": "ledger-03",
  "chainEpoch": "1",
  "commitSequence": "982173",
  "streamId": "018f...stream",
  "streamSequence": "185",
  "validatorSetDigest": "sha256:...",
  "registrySnapshotDigest": "sha256:...",
  "authorizationDecisionRef": "record:policy-decision",
  "previousReceiptDigest": "sha256:...",
  "canonicalAdmissionEventId": "019b...event"
}
{
  "target": {"recordId": "018f...0101", "coreDigest": "sha256:..."},
  "decision": "accepted",
  "acceptedAt": "2026-07-22T09:00:03.184Z",
  "storeId": "018f...store",
  "partition": "tenant-01/ledger-03",
  "ledgerSequence": "982173",
  "validatorSetDigest": "sha256:...",
  "registrySnapshotDigest": "sha256:...",
  "authorizationDecisionRef": "record:policy-decision",
  "previousReceiptDigest": "sha256:..."
}

#26.3 Minimal logical ledger tables

TablePrimary key / indexesPurpose
entity_rootentity_id; tenant_id, created_seqDurable opaque identity and coarse kind only
record_ledgerrecord_id; unique tenant+ledger_seq; record_type+recorded_atCanonical bytes/digest, schema lock, valid time, producer and policy
record_subjectrecord_id+ordinal; index entity_id+valid_startTyped subject/object participation without parsing payload
record_relationsource_record+relation+target_recordCorrection, derivation, dispute, corroboration and custody graph
idempotency_bindingtenant+principal+keyRequest digest, result record, status and expiry policy
evidence_artifactartifact_id; digest+byte_lengthImmutable object metadata, encryption, rights and storage locator
identifier_assertionrecord_id; namespace+normalized_valueAttributed external identifier claim and conflict lookup
outbox_eventlogical_shard+chain_epoch+commit_sequence+event_kindAtomic publication state, attempts, next retry and dead-letter reason
projection_checkpointprojection_id+tenant+logical_shard+chain_epochLast applied sequence, code/schema version, digest and rebuild state
quarantine_itemquarantine_id; received_atOriginal bytes, failure stage, reason, reviewer and disposition

The logical model does not require one relational product. It does require the uniqueness, atomicity and replay semantics shown above. Database-generated cascade updates and deletes are prohibited on canonical records.

#26.4 Claim and evidence separation

ObjectCarriesDoes not prove
Observationprocedure, phenomenon, result, sensor/operator, time, configuration and qualityCause, identity or fitness beyond its measured scope
Assertionissuer, subject, predicate, object, scope, effective interval and authority contextTruth merely because signed or repeated
DerivedClaiminput record IDs, formula/model digest, parameters, output, uncertainty and execution receiptStronger authority than its method and inputs support
EvidenceArtifactbytes/digest, capture, custody, rights, privacy, edit lineage and availabilityThat the depicted or encoded proposition occurred
Verificationchecker, method, target claim/evidence, result, time, limitations and challenge pathGlobal truth outside the verification procedure
Decisionauthorized decider, candidate claims, policy, rationale, effective scope and appealErasure of competing historical evidence

#26.5 Identity resolution is a reviewable decision

  1. Normalize each external identifier only within its issuer namespace and normalizer version; never globally.
  2. Generate candidates from exact identifiers, known relationships, configuration evidence, provenance, geometry, media or temporal proximity.
  3. Compute feature-level evidence contributions with direction, quality, independence and contradiction; do not expose one unexplained score as truth.
  4. Apply hard exclusions such as overlapping exclusive custody, incompatible manufacturing provenance, impossible time/location or explicit split decisions.
  5. Return candidate, conflict, insufficient-evidence or no-match. Automatic merge is forbidden for high-impact identity roots.
  6. Require a signed continuity/merge/split decision with reviewer, policy version, evidence set, uncertainty, consequences and appeal/reversal path.
  7. Represent an erroneous merge through superseding identity-resolution records; never rewrite the source entities or claims.

#26.6 Bitemporal query contract

Table
Deterministic bitemporal projection - pseudocode
resolve(entityId, validAt, knownAt, projectionPolicy, schemaLock):
  records = ledger.records_for(entityId)
    .where(valid_time contains validAt)
    .where(recorded_at <= knownAt)
    .where(schema is interpretable under schemaLock)
  records = apply_corrections_as_known_at(records, knownAt)
  claimSets = group_by_proposition_and_scope(records)
  decisions = evaluate_trust_policy(claimSets, projectionPolicy)
  return Projection(value_or_conflict=decisions,
                    input_record_ids=all_inputs,
                    policy_digest=projectionPolicy.digest,
                    as_of={validAt, knownAt},
                    explanation=decision_receipts)
  • validAt answers what applied in the world; knownAt answers what the system had accepted by then.
  • A correction recorded today may change today's view of last year without altering what yesterday's users could have known.
  • Projection responses include input record IDs, policy/schema versions, conflict disposition and checkpoint sequence.
  • Pagination is bound to a stable ledger snapshot; page two cannot silently observe a newer state than page one.