Claims Lifecycle
Follow a covered loss through evidence submission, signed adjudication records, and an approved payout or explicit denial.
On this page
When agent work causes a covered loss, the claim becomes a chain of signed records that the claimant, the provider, and an adjudicator each verify. Every record embeds the signed record before it, so the final settlement receipt carries the whole history back to the bound coverage.
The running example is your DataBreach claim after the poisoned dependency in issue #415 read rows from the customers table, against coverage bound in us-ny: USD 25,000 claimed, USD 20,000 accepted, the USD 5,000 shortfall disputed, and USD 22,500 awarded, paid, and reconciled. The coverage itself is bound on Liability Coverage.
Each record embeds the signed record before it
The settlement receipt embeds the settlement instruction, which embeds the payout receipt, and so back to the claim package and the bound coverage it carries. Each validator checks the embedded record's signature before it reads a field.
The decision and the money run as separate records
Four parties write the chain, each on its own record. The claimant packages the covered loss and disputes a shortfall. The provider responds under the bound coverage. An adjudicator rules on the dispute. The payment integration executes an authorized instruction and records what the rail observed.
Each record is a SignedExportEnvelope, and each validator verifies the embedded record's signature before it reads a field. An embedded record whose signature fails stops the chain at that stage. A favorable decision is a signed ruling; the transfer is a later record of what a rail did.
Read more in Settlement Rails, which carries an authorized payout to the payee.
A claim reaches money only through a payable award
The provider responds Acknowledged, Accepted with a covered amount, or Denied with a reason. The claimant may dispute a denial, or an acceptance whose covered amount falls short of the claim amount; a full acceptance closes the dispute path.
ClaimUpheld. The claimant prevails, with an awarded amount up to the claim amount.PartialSettlement. An awarded amount strictly below the claim amount.ProviderUpheld. No award, and no payout instruction can follow.
Adjudication chooses among these fixed outcomes and never sets a new price or payee. The adjudicator must appear on a predeclared roster, and the record names the ex-ante decision rule it applied, so the ruling can be checked against rules written before the dispute.
Read more in Predeclared Settlement, which fixes terminal outcomes before a dispute begins.
A rail observation closes each money record
The payout instruction embeds the adjudication and a signed CapitalExecutionInstructionArtifact that transfers the awarded amount out of a facility commitment. The payout receipt records what the rail observed, reconciled as Matched or AmountMismatch.
An optional settlement instruction then routes the resulting position: RecoveryClearing, ReinsuranceReimbursement, or FacilityReimbursement. Its receipt reconciles as Matched, AmountMismatch, or CounterpartyMismatch. The capital book records each successful settlement as a Disburse event tied to the facility id and the bond id.
An instruction alone establishes neither the success nor the failure of a transfer; the receipt's observation does. When a payout exceeds what the bond can absorb, recovery runs the bond's loss lifecycle: ReserveSlash moves bond capital into the loss bucket, and WriteOff records the unrecoverable balance.
Read more in Credit Facilities, which defines the facility, bond, and loss-lifecycle records.
The example claim pays USD 22,500 after a partial dispute
An agent action exposes data in a way that meets the DataBreach coverage class of an active USD coverage bound in us-ny. The eight records, in order:
- Package. The operator submits a
LiabilityClaimPackageArtifactwith the bound coverage, the agent's exposure ledger, the active bond, and the loss-lifecycle event for the underlying delinquency, claiming USD 25,000 (2,500,000 cents). - Response. The provider accepts at USD 20,000 with a partial-coverage rationale:
LiabilityClaimResponseDisposition::Acceptedwithcovered_amountUSD 20,000. - Dispute. The operator disputes the USD 5,000 shortfall, which a partial acceptance permits.
- Adjudication. The adjudicator rules
PartialSettlementwithawarded_amountUSD 22,500. - Payout instruction. A signed
CapitalExecutionInstructionArtifacttransfers USD 22,500 out of the facility commitment, paired with the adjudication. - Payout receipt. The rail observes a USD 22,500 transfer with external reference
tx-0xabcd..., reconciledMatched. - Settlement instruction. The operator issues a
FacilityReimbursementto refill the facility commitment from operator treasury. - Settlement receipt. The rail observes the reimbursement, reconciled
Matched, and the chain closes.
The award sets the payout amount, and the payout receipt compares the rail's observation with that instruction. The later facility reimbursement carries its own instruction and receipt.
Each record is issued from the CLI and counted from the store
Each stage has one verb under chio trust liability-market. An issue command reads a signed JSON or YAML body with --input-file and persists the resulting envelope.
chio trust liability-market claim-issue --input-file package.yaml
chio trust liability-market claim-response-issue --input-file response.yaml
chio trust liability-market dispute-issue --input-file dispute.yaml
chio trust liability-market adjudication-issue --input-file adjudication.yaml
chio trust liability-market claim-payout-instruction-issue --input-file payout-instruction.yaml
chio trust liability-market claim-payout-receipt-issue --input-file payout-receipt.yaml
chio trust liability-market claim-settlement-instruction-issue --input-file settlement-instruction.yaml
chio trust liability-market claim-settlement-receipt-issue --input-file settlement-receipt.yamlclaims-list then counts the persisted chain per stage.
chio --receipt-db receipts.sqlite3 trust liability-market claims-list \
--agent-subject bff663535a5cf58658cc38595d20dc4501f6dfc076ddf07e20571d413a3ceb5a \
--jurisdiction us-ny --limit 50matching_claims: 0 returned_claims: 0 provider_responses: 0 accepted_responses: 0 denied_responses: 0 disputes: 0 adjudications: 0 payout_instructions: 0 payout_receipts: 0 matched_payouts: 0 mismatched_payouts: 0 settlement_instructions:0 settlement_receipts: 0 matched_settlements: 0 mismatched_settlements:0 counterparty_mismatch_settlements:0
You should see one counter per stage, plus the counters that pair instructions with receipts; on a store with no claims for that subject and jurisdiction, every counter reads zero. claims-list filters by --claim-id, --provider-id, --agent-subject, --jurisdiction, --policy-number, or --limit. Without --receipt-db or --control-url it exits 1 with an empty stdout, so no empty report can be mistaken for a store with no claims:
error[CHIO-CLI-RECEIPT-STORE-REQUIRED]: liability claims list needs a receipt store
help: pass --receipt-db <path>, or --control-url to read from the trust service
code: urn:chio:error:cli:receipt-store-required
docs: https://chio.computer/docs/reference/errors#error-cli-receipt-store-required- Evidence missing or unverified. Obtain and verify the supporting record before resubmitting, and check coverage class, subject, currency, event window, and unique receipt identifiers against the package rules.
- Denied or partially accepted. Dispute through the dispute and adjudication records, and keep the original response: changing its amount locally breaks the chain.
- Payout unmatched. Inspect the rail observation and the instruction before attempting another transfer.
Claim records and evidence types
Search for AmountMismatch, roster_anchor_ref, or ClaimDenialReason.
Decision records
Claim package
LiabilityClaimPackageArtifact is the operator's submission to the provider, bundling the evidence the provider needs to evaluate the loss:
pub struct LiabilityClaimPackageArtifact {
pub schema: String,
pub claim_id: String,
pub issued_at: u64,
pub bound_coverage: SignedLiabilityBoundCoverage,
pub exposure: SignedExposureLedgerReport,
pub bond: SignedCreditBond,
pub loss_event: SignedCreditLossLifecycle,
pub claimant: String,
pub claim_event_at: u64,
pub claim_amount: MonetaryAmount,
pub claim_ref: Option<String>,
pub narrative: String,
pub receipt_ids: Vec<String>,
pub evidence_refs: Vec<LiabilityClaimEvidenceReference>,
}Validation requires the claim currency to match the bound coverage currency, the claim amount to stay within the coverage amount, the claim event to fall inside the coverage effective window, a single-currency exposure book, and a bond and loss event for the same subject as the bound coverage. Receipt ids are non-empty and unique.
Claim response
The provider replies with a LiabilityClaimResponseArtifact carrying one of three dispositions:
Acknowledged: receipt of the package, with no covered amount and no denial reason.Accepted: a covered amount in the claim currency, at most the claim amount, with no denial reason.Denied: a non-empty denial reason and no covered amount.
A partial acceptance has a covered amount below the claim amount, and the claimant can dispute the remaining balance.
Claim dispute
LiabilityClaimDisputeArtifact is opened by the claimant against a Denied response, or an Accepted one whose covered amount is below the claim amount. Validation requires non-empty opened_by and reason. A fully accepted response admits no dispute.
Adjudication
LiabilityClaimAdjudicationArtifact is the adjudicator's ruling on a dispute:
ClaimUpheld: the claimant wins; an awarded amount is required and must not exceed the original claim amount.ProviderUpheld: the provider wins; no awarded amount.PartialSettlement: an awarded amount is required and must be strictly less than the claim amount.
Predeclared adjudication
Two signature-safe fields record the roster binding: decision_rule_ref, the id of the predeclared decision rule or circuit-breaker condition applied, and roster_anchor_ref, the id or hash of the signed roster record used to check the adjudicator. The validate_against_roster policy gate enforces roster membership, an allowed decision-rule set, and that the recorded anchor equals the roster applied. An awarded amount never routes to the protocol treasury; Predeclared Settlement carries the full rules.
Money records
Payout instruction
LiabilityClaimPayoutInstructionArtifact ties the adjudication to a signed CapitalExecutionInstructionArtifact for the fund movement. Validation requires:
- The capital instruction action is
TransferFunds. - The capital instruction source kind is
FacilityCommitment. - The instruction amount equals the adjudication's awarded amount.
- The capital instruction subject matches the claim subject.
- The capital instruction is unreconciled at issuance, so the payout receipt that follows references it.
Only ClaimUpheld or PartialSettlement produces a payout instruction; ProviderUpheld carries no payable amount.
Payout receipt
LiabilityClaimPayoutReceiptArtifact records that the payout executed on the selected settlement method. It carries a CapitalExecutionObservation (observed_at, external_reference_id, and the observed amount) and a reconciliation state:
Matched: the observed amount equals the payout instruction amount.AmountMismatch: the observed amount differs; the operator reconciles or opens a follow-up instruction.
The observation timestamp falls inside the capital instruction's execution window.
Settlement instruction
After a matched payout, the operator may issue a LiabilityClaimSettlementInstructionArtifact to move the resulting position through the broader capital structure. Its kind is one of:
RecoveryClearing: clearing a recovered loss back to the source.ReinsuranceReimbursement: passing through to a reinsurer.FacilityReimbursement: reimbursing the facility commitment.
The instruction includes a role topology (payer, payee, optional beneficiary) drawn from CapitalExecutionRole, an authority chain, an execution window, and a rail descriptor. Its attached capital_book is subject-coherent and in a single currency.
Settlement receipt
LiabilityClaimSettlementReceiptArtifact closes out the settlement. Its reconciliation state is one of:
Matched: observed amount, payer, and payee all match the instruction.AmountMismatch: payer and payee match, and the amount differs.CounterpartyMismatch: at least one observed counterparty differs from the topology.
Reinsurance pass-through
Reinsurance runs as LiabilityClaimSettlementKind::ReinsuranceReimbursement on the settlement instruction. The settlement instruction's payer, payee, and beneficiary roles carry the topology, routed through the configured rail, so chio-market keeps no separate reinsurance registry. The CapitalExecutionRole::Reinsurer role is available for both authority steps and topology bindings.
ClaimDecision and ClaimDenialReason
The compact file_claim path on BoundPolicy resolves to a ClaimDecision:
/// Resolution of a filed claim.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "disposition", rename_all = "snake_case")]
pub enum ClaimDecision {
/// Claim was approved; settlement has been submitted.
Approved {
/// Policy the claim was filed against.
policy_id: String,
/// Claim identifier.
claim_id: String,
/// Actual payable amount (capped at coverage limit).
payable_amount: MonetaryAmount,
/// Settlement request and reference returned by the sink. Boxed so
/// the enum stays cheap to move between the chio-market and
/// chio-kernel boundaries.
settlement: Box<ClaimSettlement>,
/// Human-readable justification for the approval.
justification: String,
},
/// Claim was denied; no settlement was submitted.
Denied {
/// Policy the claim was filed against.
policy_id: String,
/// Claim identifier.
claim_id: String,
/// Machine-readable denial reason.
reason: ClaimDenialReason,
/// Human-readable justification for the denial.
justification: String,
},
}A denial names one of nine reasons:
/// Machine-readable denial reason for a [`ClaimDecision::Denied`].
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ClaimDenialReason {
/// The policy is cancelled or expired.
PolicyNotInForce,
/// The claim currency did not match the coverage currency.
CurrencyMismatch,
/// No receipts were provided to support the claim.
InsufficientEvidence,
/// A referenced receipt is not in the receipt store.
EvidenceUnresolvable,
/// The receipt store could not answer. Distinct from
/// [`Self::EvidenceUnresolvable`] because the receipt may well exist:
/// this claim can be retried, and that one cannot.
EvidenceSourceUnavailable,
/// The receipt store understood the request and refused it. Retrying
/// reaches the same refusal, which is what separates this from
/// [`Self::EvidenceSourceUnavailable`].
EvidenceRefused,
/// The receipt store answered and its evidence did not verify.
EvidenceInvalid,
/// A referenced receipt's body digest did not match its fingerprint.
EvidenceDigestMismatch,
/// The kernel signature on a referenced receipt failed verification.
SignatureInvalid,
}The denial vocabulary fails closed: any unresolved receipt id, body-digest mismatch, or kernel-signature failure denies the claim, and approval has no implicit path. The evidence reasons also record why the store could not answer, which separates a claim worth retrying from a settled one: EvidenceSourceUnavailable carries the store's own Unavailable classification forward, while EvidenceRefused and EvidenceInvalid reach the same answer on every attempt (crates/economy/chio-market/src/insurance_flow.rs:386-402).
ClaimEvidence
pub struct ClaimEvidence {
/// Stable claim identifier chosen by the filer.
pub claim_id: String,
/// Policy this claim is filed against.
pub policy_id: String,
/// Amount the filer is requesting (may exceed the coverage limit;
/// payouts are capped at the policy's coverage limit).
pub requested_amount: MonetaryAmount,
/// Human-readable description of the incident.
pub incident_description: String,
/// Receipts that support the claim. Each one is re-verified against
/// the kernel's signing key before approval.
pub supporting_receipts: Vec<ReceiptFingerprint>,
/// Chain id the settlement should be dispatched on. The insurance
/// flow itself is chain-agnostic; the settle runtime routes
/// according to this value.
pub settlement_chain_id: String,
}Each supporting receipt is named by a fingerprint as well as its id:
pub struct ReceiptFingerprint {
/// Stable receipt id (matches the kernel receipt store key).
pub receipt_id: String,
/// SHA-256 of the canonical receipt body. Used for tamper-evidence
/// in the evidence bundle.
pub body_sha256: String,
}Each fingerprint is re-verified against the kernel signing key through the caller-supplied ReceiptEvidenceSource trait before approval. The requested_amount may exceed the coverage limit; payouts cap at the limit.
ClaimSettlement and the settlement sink
On approval, the helper builds a ClaimSettlementRequest, field-compatible with chio_settle::SettlementCommitment:
pub struct ClaimSettlementRequest {
/// Chain identifier the settlement should be dispatched on.
pub chain_id: String,
/// Settlement lane. Claim-payout dispatches use
/// [`INSURANCE_CLAIM_LANE_KIND`].
pub lane_kind: String,
/// Capability / policy commitment (the policy id).
pub capability_commitment: String,
/// Receipt the claim is anchored to.
pub receipt_reference: String,
/// Operator identity dispatching the settlement.
pub operator_identity: String,
/// Amount to settle, in minor units + currency.
pub settlement_amount: MonetaryAmount,
}The approval path fills those fields from the evidence and the bound policy: the chain id from evidence.settlement_chain_id, the lane from INSURANCE_CLAIM_LANE_KIND, the commitment from the policy id, the reference from the first supporting receipt, and the identity as chio-market:insurance-flow:<agent_id> (crates/economy/chio-market/src/insurance_flow.rs:451-463). The sink returns the reference that completes the settlement record:
pub struct ClaimSettlement {
/// The request submitted to the settlement sink.
pub request: ClaimSettlementRequest,
/// Reference returned by the settlement sink (for example, a tx hash).
pub settlement_reference: String,
}The caller implements ClaimSettlementSink to bridge into chio-settle; the six fields on ClaimSettlementRequest map one to one to SettlementCommitment (crates/economy/chio-settle/src/lib.rs:141-148).
Evidence requirements by coverage class
Each provider declares its expected evidence on every jurisdiction policy through required_evidence, a vector of LiabilityEvidenceRequirement, in place of class-specific evidence menus in the Rust types. Operators read the policy reference embedded in the quote request to know what to attach; Liability Coverage lists the requirement vocabulary.
Implementation sources
The package, response, dispute, and adjudication record types live in chio-market/src/claim.rs; the payout and settlement record types live in chio-market/src/settlement.rs. The compact in-process flow is BoundPolicy::file_claim in chio-market/src/insurance_flow.rs. All three share the same denial-reason vocabulary and the same handling of unverified evidence.