Receipt Aggregation
Find any node’s signed receipts from one store, and see how each node commits and exports its own copy.
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.
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.
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.
| Artifact | Across peers | At the receiver |
|---|---|---|
| Tool receipt | Cursor-paged tool-receipt stream or snapshot | Signature and action-parameter hash checked, then appended |
| Child receipt | Separate cursor-paged stream or snapshot | Signature checked, then appended |
| Capability snapshot | Lineage deltas or a snapshot | Provenance and projection compatibility checked |
| Claim-log entry | Stays on its node | Insert triggers project both receipt kinds into one log |
| Kernel checkpoint | Stays on its node | A local signer commits a contiguous batch and its predecessor |
| Bilateral evidence share | The evidence-import interface | Stored 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.
$ chio receipt checkpoint status --receipt-db ./receipts.dbstatus: healthy committed_entry_seq: 3 checkpoint_seq: none checkpointed_entry_seq: 0 next_range: 1..=3 retention_watermark_entry_seq: none
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:
- Record integrity. The signature and the applicable body bindings. Whether the signer is trusted for a conclusion is a separate decision.
- Persistence. The durable receipt and claim-log state, which signing alone does not create.
- Checkpoint. The local range, root, signature, and predecessor chain, on the node that produced them.
- Export coverage. Selected records, proof rows, uncheckpointed tool receipts, child scope, and publication evidence.
- 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
Try mixed receipt signer range, group_limit, or SignedToken.
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
$ chio receipt audit --receipt-db ./receipts.dbstatus: healthy committed_entry_seq: 3 checkpoint_seq: none checkpointed_entry_seq: 0 next_range: 1..=1 retention_watermark_entry_seq: none
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
| Task | Surface | Read authority |
|---|---|---|
Filter and page tool receipts | GET /v1/; 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/ | Admin service principal; tenant tokens receive 403 |
List child receipts | GET /v1/ | Admin; child rows carry no tenant attribution |
Aggregate by agent, tool, or time | GET /v1/ | Admin, with an explicit admin context |
Inspect operator rollups | GET /v1/ and /v1/ | Admin report authority |
Read capability lineage | GET /v1/lineage/{capability_id} and its /chain route | Admin service token |
Export an evidence package | POST /v1/ | 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
| Class | How to read it | Example 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- |
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
| Provenance | Transport 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- |
Legacy | 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.rsandcrates/platform/chio-store-sqlite/src/evidence_export.rs: local checkpoint validation and export. The testsstore_checkpoint_rejects_mixed_receipt_signer_rangeandstore_checkpoint_rejects_checkpoint_key_that_does_not_match_receipt_signerexercise the two signer refusals.crates/platform/chio-store-sqlite/src/receipt_store/bootstrap/open.rsandcrates/kernel/chio-kernel/src/kernel/construction.rs: claim-log triggers and checkpoint signer attachment.crates/observability/chio-lineage/src/ingest_otel.rsandcrates/observability/chio-lineage/src/ingest_replay_corpus.rs: graph evidence-class assignment.