Chio/Docs
LOGIN · JOIN

Receipt Aggregation

Find any node’s signed receipts from one store, and see how each node commits and exports its own copy.

Concept chio@5f63e6e

On this page

The node in front of you answers for calls made anywhere in the cluster: query one, inspect its delegation, and export its proof there. Tool receipts, child receipts, and capability lineage replicate into every node's local store, and each record is verified again before it lands.

Commitments stay local. Each store orders what it holds in its own claim log, and its own signer commits contiguous ranges of it. The bounded operational profile classifies this plane as local-only: signed audit evidence and local inclusion proofs for the rows the answering node holds.

Receipts replicate between nodes, and each node commits its own copy

Node B reverifies node A's receipts, gives them positions in its own claim log, and commits a range under the key that signed them.

Local checkpointsChoose a stage.
node Anode BtoolchildtoolchildcA’s checkpointstays on Areverifiedroottool 1child 2tool 3child 4signsccheckpoint · range 1 to 4σkey KproofsEexport4 receipts imported and reverified · local entry_seq 1 to 4 · node A’s checkpoints stay on Anode Anode BtoolchildtoolchildcA’s checkpointstays on Areverifiedroottool 1child 2tool 3child 4signsccheckpoint 1 to 4σkey KproofsEexport

Imported receipts are reverified and take local positions

Node B pulls node A’s tool and child receipts, checks each signature again, and appends them through its own store. Insert triggers place both kinds in one claim log at consecutive local positions. Node A’s checkpoints describe node A’s log and stay there. Replication & Convergence.

One receiving node’s claim log, with receipts imported from a peer and committed by the receiving node’s own signer. The four-entry order and the batch size are illustrative; lineage, retention, and publication bindings are left out.

Tool and child receipts share one claim log, so a checkpoint range can hold both kinds. Every receipt in the range carries the same kernel key, and the checkpoint uses that key. Two stores holding the same receipts can still commit different roots, since each chooses its own order and batch boundaries.

Read more in Verifiable Evidence, which covers checkpoint chains and inclusion proofs.

Signed records cross between nodes, and commitments are made where they land

Each artifact has one path between peers and one treatment at the receiver.

ArtifactAcross peersAt the receiver
Tool receiptCursor-paged tool-receipt stream or snapshotSignature and action-parameter hash checked, then appended
Child receiptSeparate cursor-paged stream or snapshotSignature checked, then appended
Capability snapshotLineage deltas or a snapshotProvenance and projection compatibility checked
Claim-log entryStays on its nodeInsert triggers project both receipt kinds into one log
Kernel checkpointStays on its nodeA local signer commits a contiguous batch and its predecessor
Bilateral evidence shareThe evidence-import interfaceStored in share-specific tables

chio_tool_receipts and chio_child_receipts project into claim_receipt_log_entries through AFTER INSERT triggers. Its entry_seq is local to the receiving store, and a checkpoint range is written in that combined sequence.

An imported receipt is verified again before the store accepts it

Service-authenticated receipt and lineage writes follow the locally selected leader, write locally, and re-read for leader visibility before answering. Follower replication and checkpoint coverage come afterward, on their own schedule.

The SQLite append path verifies each receipt against the public key it carries, at ReceiptCryptoFloor::AllowHybrid, and checks a tool receipt's action-parameter hash before the commit actor is queued. The path holds no policy handle or issuer allowlist, so a valid signature establishes integrity and trusting its signer stays your decision. Durable persistence is a later commit boundary, and a checkpoint is a later artifact still.

A peer page is checked for forward progress and ascending order, then passes through the ordinary append methods. Gaps are accepted, because receipt sequences carry gaps from conflict handling and retention. Newly inserted records take local positions, a replayed record needs no second claim-log entry, and the cursor advances once the complete page applies.

Read more in Receipts, which covers what one record establishes, and Node State, which covers the local writer.

A checkpoint commits a contiguous range under one signer key

With checkpointing enabled on a store that supports it, kernel attachment installs a background signer with a default batch of 100. A trust-control process that opens a receipt store only for replication installs no signer, so give that store a kernel attachment or an explicit checkpoint operation with a key that matches its receipts.

Checkpoint status on a local receipt databasetranscript
$ chio receipt checkpoint status --receipt-db ./receipts.db
status: healthy
committed_entry_seq: 3
checkpoint_seq: none
checkpointed_entry_seq: 0
next_range: 1..=3
retention_watermark_entry_seq: none
exit 0

You should see committed_entry_seq beside checkpointed_entry_seq, then next_range. Here three records are committed and none is checkpointed. healthy means the local structure passed its checks, and a healthy store can still carry an uncheckpointed tail.

Setting checkpoint_batch_size to zero disables automatic checkpointing, and attachment refuses that setting when retention is configured, because retention needs checkpoint-covered boundaries. A store that claims checkpoint support and fails to install the requested signer is refused at attachment.

Read more in Retention & Archive, which covers how checkpoint boundaries constrain removal of the live prefix.

An export proves inclusion for the tool receipts it selects

Evidence export rebuilds the Merkle tree from the canonical bytes of a checkpoint's full claim-log batch, child leaves included, and emits an inclusion-proof row for each selected tool receipt. Selected tool receipts without a proof are listed in uncheckpointed_receipts.

That list covers tool receipts. Child inclusion has its own declared export scope, separate from committing child leaves into the tree; Evidence Export shows both the proof coverage and the child scope.

checkpoint_log_id derives local-log-… from the checkpoint's signing key, so it names a key: two stores sharing that key present the same log identity. Keep each checkpoint chain in its own context instead of merging node-local sequences into one fleet log.

Aggregation keeps every record’s evidence class

Collecting more records upgrades none of them. The bounded operational profile keeps asserted call-chain fields asserted unless observed lineage or verified provenance supports them, so a report can count a claim and keep its source. Each layer of evidence answers one question:

  1. Record integrity. The signature and the applicable body bindings. Whether the signer is trusted for a conclusion is a separate decision.
  2. Persistence. The durable receipt and claim-log state, which signing alone does not create.
  3. Checkpoint. The local range, root, signature, and predecessor chain, on the node that produced them.
  4. Export coverage. Selected records, proof rows, uncheckpointed tool receipts, child scope, and publication evidence.
  5. Fleet visibility. The answering node's replication progress and the specific records required. A local proof and a healthy rollup each describe one node.

A relationship that passes the replay-corpus signed-statement predicate binds its named parent and child, and a caller-supplied trace node beside it inherits nothing. An imported bilateral share stays in its own tables, while a later federated-delegation operation can create a local federation-parent link.

Checkpoint, query, and provenance reference

Signer compatibility

The checkpoint validator rechecks the receipt signatures in the range and requires one shared receipt signer key. It refuses a mixed receipt signer range and also refuses a checkpoint key that differs from that receipt key, for tool and child leaves alike.

An operator can collect receipts from several signers for queries, and re-signing them as one checkpoint under a collector key is refused. Validation reloads the committed range, requires a contiguous claim log and matching signer keys, and rebuilds the Merkle root, so a different root signed over an inconsistent range fails. Check the intended range and its key custody before choosing a checkpoint producer.

Checkpoint commands

Receipt audit on the same databasetranscript
$ chio receipt audit --receipt-db ./receipts.db
status: healthy
committed_entry_seq: 3
checkpoint_seq: none
checkpointed_entry_seq: 0
next_range: 1..=1
retention_watermark_entry_seq: none
exit 0

The audit reports the same state and previews a one-entry next range, so its next_range can differ from status over identical committed state. receipt checkpoint status, receipt audit, and receipt checkpoint create are local operator commands: they open an existing database file and reject --control-url. receipt checkpoint create requires an existing --kernel-seed-file, and its --max-batch defaults to 1024, as status does. Manual creation extends the local checkpoint chain, so choose the key and batch policy first.

Query surfaces

TaskSurfaceRead authority
Filter and page tool receipts
GET /v1/receipts/query; agent receipts under /v1/agents/{subject_key}/receipts
Admin or tenant-scoped principal; limits default to 50 and clamp to 1 to 200
Load one receipt by id
GET /v1/receipts/tools?receiptId=…
Admin service principal; tenant tokens receive 403
List child receipts
GET /v1/receipts/children
Admin; child rows carry no tenant attribution
Aggregate by agent, tool, or time
GET /v1/receipts/analytics
Admin, with an explicit admin context
Inspect operator rollups
GET /v1/reports/operator and /v1/reports/comptroller-surface
Admin report authority
Read capability lineage
GET /v1/lineage/{capability_id} and its /chain route
Admin service token
Export an evidence package
POST /v1/evidence/export
Admin, or a tenant principal within its authorized boundary

Receipt delta handlers use an admin read context after peer authentication; tenant read scoping applies to reader-facing queries. Receipt Query API lists the query fields, and Tenancy & Read Scoping covers principal resolution.

Analytics ratios

The analytics summary covers the matching rows on the responding node. Grouped results are bounded lists: group_limit defaults to 50 and clamps to 1 to 200 per dimension, the default time bucket is a day, and a sum over returned groups can differ from the full summary.

  • Reliability score. Allows / (allows + cancelled + incomplete). Denials are excluded from the denominator.
  • Compliance rate. (Total receipts − denials) / total receipts.
  • Budget utilization rate. Charged cost / (charged cost + attempted cost).

A zero denominator yields an absent ratio. The ratios summarize receipt fields; their names establish nothing about workflow correctness, regulatory compliance, or unrecorded spending.

Lineage evidence classes

ClassHow to read itExample in the graph ingesters
Asserted
An imported or caller-supplied claim with no verification upgrade
Tool-call and capability nodes from an OpenTelemetry frame
Observed
The ingester's observation class for supplied local or corpus evidence
Replay-corpus receipt nodes; a receipt node and its tool-call edge when a frame carries a local receipt correlation
Verified
A relationship whose statement passes the ingester's signature and binding predicate
A replay-corpus parent relationship with a matching signed lineage statement, including finding-memory-to-delivery

The classes describe the graph's ingest contract. The OpenTelemetry ingester selects Observed when the frame carries a local receipt correlation id, an assignment made without a live database lookup and covering that frame alone. A verified relationship promotes none of its neighbors.

Lineage transport provenance

ProvenanceTransport validation
SignedToken
Require a signed token; verify its schema and signature; match the snapshot's identity, scope, lifetime, parent, and delegation depth to that token.
SyntheticAnchor
Validate the unsigned federation-anchor shape and its separation from signed lineage fields. A synthetic anchor never becomes a signed capability.
LegacyProjection
Allowed only for local migration reads and rejected at the transport boundary.

An upsert stays compatible with the existing projection and keeps any conflicting signed token. A compatible upgrade from local LegacyProjection provenance moves the row above the current maximum rowid, so the next lineage delta pull carries the improved evidence. Lineage pagination permits gaps, so it proves no cross-node completeness, and receipt availability on one node says nothing about which records its peers hold. All these streams share the scheduling and recovery rules in Replication & Convergence.

Publication bindings

A signed checkpoint, an inclusion proof in it, and a trusted publication binding answer three questions. The control-plane export reads local checkpoint metadata and any persisted trust-anchor bindings, and the store validates and persists a binding an anchor backend supplies; anchor backends plug in as optional modules. A publication without its binding is reported as a transparency_preview claim, so read the returned publication state and its evidence. On-Chain Settlement covers the anchoring module.

Source locations

  • crates/platform/chio-store-sqlite/src/receipt_store/support/receipt_verify.rs: receipt signatures and action hash.
  • crates/kernel/chio-kernel/src/capability_lineage.rs: provenance-specific transport checks.
  • crates/platform/chio-store-sqlite/src/capability_lineage.rs: compatible persistence and the replication-visible provenance upgrade.
  • crates/platform/chio-store-sqlite/src/receipt_store/support/checkpoint_validate.rs and crates/platform/chio-store-sqlite/src/evidence_export.rs: local checkpoint validation and export. The tests store_checkpoint_rejects_mixed_receipt_signer_range and store_checkpoint_rejects_checkpoint_key_that_does_not_match_receipt_signer exercise the two signer refusals.
  • crates/platform/chio-store-sqlite/src/receipt_store/bootstrap/open.rs and crates/kernel/chio-kernel/src/kernel/construction.rs: claim-log triggers and checkpoint signer attachment.
  • crates/observability/chio-lineage/src/ingest_otel.rs and crates/observability/chio-lineage/src/ingest_replay_corpus.rs: graph evidence-class assignment.

Next: package the evidence for a verifier

Receipt Aggregation · Chio Docs