Chio/Docs

Pricing a Finding

Bound a buyer's bid for a finding by its own re-derivation cost, and see how seller collateral prices dishonesty.

Concept chio@5f63e6e

On this page

A buyer agent can pay for a finding instead of repeating the work, and spend no more than repeating it would have cost.

The buyer prices its own alternative: re-deriving the result under the same context and recipe. The seller posts one price on its signed listing, and collateral sized to every open sale backs what the finding claims. The running example is the shared basic_discount test vector, which turns a 4,200-unit estimate into a 1,890-unit ceiling.

The bid ceiling is the buyer's estimate, discounted three times

The buyer starts from what repeating the work would cost it, 4,200 USD minor units ($42), and discounts it by how likely that spend was.

Finding lifecycleChoose a stage.
φsubmitρverifyBpriceKrevealχchallengeσretractre-derivation estimate4,200would have run× 0.602,520sibling overlap× 0.751,890guarantee× 1.001,890bid ceiling1,890 = min(1,890, 10,000)φρBpriceKχσre-derivation estimate4,200× 0.60 would have run2,520× 0.75 sibling overlap1,890× 1.00 guarantee1,890bid ceiling1,890 = min(1,890, 10,000)

The bid ceiling discounts the buyer's own estimate

The buyer starts from its own re-derivation estimate of 4,200 minor units, keeps 60% for the chance it would rerun the work, 75% after overlap with sibling findings, and 100% for deterministic replay: 1,890. The bid ceiling is the smaller of that and the 10,000 remaining budget, 1,890 minor units or USD 18.90. Pricing a finding.

The lifecycle of one chio.finding.v1 finding, from admission to retraction; challenge and retraction run only when a finding is disputed. The bid figures are the basic_discount vector in USD minor units; fee arithmetic, audit sampling, and the hosted profile are left out.The cognition market

Each factor is a basis-point share of the line above. A 60 percent chance the buyer would have run the work at all leaves 2,520. Overlap with sibling findings it already holds removes a quarter, leaving 1,890. A deterministic_replay guarantee keeps the full multiplier, so the discounted estimate stays 1,890. The ceiling is the smaller of that and the 10,000-unit remaining budget: 1,890 minor units, or USD 18.90.

The helper, finding_bid_ceiling(), computes floor(estimate * would_run * (10000 - redundancy) * guarantee / 10000^3) with checked u128 intermediates, rounds down exactly once, and caps the result at policy.budget_remaining_units. The ceiling rises with the estimate and falls as sibling_redundancy_bps grows. It bounds a bid and assigns the finding no objective value; a price within it still goes through purchase admission at the kernel.

Read more in Paid reveal, where the accepted price becomes a hold.

A sale clears only below the buyer's private ceiling

A finding's value to a buyer is a counterfactual it cannot compute. The market prices the buyer's outside option instead: the cost of re-deriving the same result, discounted for how likely it was to try, what a sibling finding already covers, and how strong the seller's guarantee is.

valuation.txttext
value      = P(would have attempted) x cost-if-attempted
             x P(would have hit the same dead end)
             x redundancy-across-siblings x decay

clears     0 < price <= buyer_local_ceiling

Re-derivation is a meterable action, so the buyer builds the estimate from its own metering history or from a fresh quote for the same context and recipe. That estimate is buyer-local policy. A MeteredBillingQuote rides on GovernedTransactionIntent.metered_billing as caller-carried data, and the kernel checks its shape, time, and currency consistency; it carries no issuer signature, no binding to a finding context or replay recipe, and no proof of who derived the number or how, so it supplies no market-wide substitute price.

The seller posts a unilateral price, ListingPricingHint.price_per_call, on the signed pricing hint at publish time. The marketplace checks currency equality first, then refuses a buyer's max_price_per_call below the posted price with BiddingError::BidCeilingTooLow. Production cost sets no floor: it is sunk, marginal delivery cost is near zero, and a seller recovers it only when enough buyers' private ceilings sit above its ask.

  • What the bid reveals. The signed BidRequest carries only max_price_per_call. An operator can audit that the ceiling was enforced; the estimate, would_have_run_bps, and sibling_redundancy_bps stay private planner policy.
  • How price forms. There is no auction, order book, counter-offer, or per-buyer price discrimination. Sellers price against recent_receipts_volume, a demand signal the provider advertises on the hint without independent proof.

Each guarantee class discounts by how far a buyer can re-check it

guarantee_class_bps reads off the three-class taxonomy every finding is sold under. The suggested multipliers are policy defaults, and an operator retunes all three per namespace.

Guarantee classSuggested bpsWhat a buyer can re-check
deterministic_replay10000The claim, by running the committed recipe
metered_attested5000Execution, cost, and digest, as attested
asserted500Nothing beyond the seller's bond

The metered_attested discount is the buyer's self-insurance against honest-cost fabrication: a seller can meter a run truthfully and still be wrong about what the run proves. The multipliers follow the reputation-tier discount idiom, TIER_DISCOUNT_PER_HUNDRED. One rule holds in every namespace: an asserted claim stays asserted until independently re-verified, the never-upgrade discipline that property P10 carries for status reporting in the Lean obligations report_truthfulness_asserted_not_verified and report_truthfulness_observed_not_verified.

Collateral sized to every open sale prices dishonesty

Seller revenue finalizes at capture. The purchase takes a short-lived reversible hold before delivery and captures it right after a matched delivery, so no post-sale window holds the money; the collateral carries that risk instead.

exposure-cap.txttext
encumbrance_per_sale = k * accepted_price                  k >= 1

base_finding_stake + sum(open_encumbrances)
    <= min(locked_amount - slashed_amount, listing_requirement.required_amount)

sum(open_encumbrances) <= maximum_sale_exposure

Admission resolves an unspent seller-collateral allocation from a trusted bond authority and binds it to the seller key, listing, finding, schedule requirement and version, class, currency, amount, and expiry. Admission and every purchase then reserve the per-sale encumbrance atomically, in checked arithmetic and exact currency. Exposure counts concurrent accepted or finalized sales inside the detection horizon and falls only when that predeclared horizon closes without an actionable event. A hard cap covers every open sale; an expectation such as bond >= k x price x expected_sales would leave an uncovered tail.

Fraud reaches this collateral only through the challenge lane. An upheld finding challenge maps to OpenMarketAbuseClass::FraudulentListing, and its penalty is arithmetic: min(live_allocated_collateral, computed_exposure), where computed_exposure is the base stake plus the open encumbrances. An exposure above the signed listing requirement rejects instead of clamping. Proceeds go to harmed buyers pro rata by purchase amount, with any remainder to the registered community fund, and impairment waits for appeal finality.

Read more in Challenges and liability, which follows an upheld challenge to settlement.

Random audits make fabrication a losing bet

A buyer challenge catches a fabrication somebody already bought. The venue audits listed deterministic_replay findings at random, running the committed recipe on the bondless venue-audit branch, at a rate sized per listing class.

audit-deterrence.txttext
audit_rate x slash_amount >= expected_fabrication_profit

Here expected_fabrication_profit ~= price x expected_sales_in_window. Below that line, fabricating has positive expected value. Each audit epoch publishes the eligible-listing snapshot, the class-specific rate, the deterministic selection algorithm, and a committed randomness source the venue cannot choose after seeing the snapshot. Signed selection, attempt, completion, and missed-deadline receipts let anyone recompute the sample and detect an omitted listing.

Ground-truth re-execution is the mechanism because, under costly evaluation, schemes that reward agents for matching each other's reports admit low-effort and collusive equilibria. That result narrows where peer prediction applies; it is not an impossibility result. Peer and market signals may add a separately disclosed risk-weighted sample, and they never alter the committed random sample or settle an outcome.

A finding that was honestly derived and is wrong has no adjudication lane: it carries no digest mismatch, no invalid evidence receipt, and, without a replay recipe, nothing to contradict. Collateral, the guarantee-class discount, and reputation price that risk.

Bid-ceiling input, refusals, and penalty rules

Bid-ceiling input

finding_bid_ceiling() in crates/economy/chio-open-market/src/finding_bid_policy.rs is the reference helper, mirrored by the TypeScript and Python SDKs against shared golden vectors. It takes one FindingBidCeilingInput, which nests the buyer's estimate and the buyer's own discount policy. Every integer field is a canonical decimal string, and every struct carries deny_unknown_fields and camelCase serde names.

crates/economy/chio-open-market/src/finding_bid_policy.rs:23-58rust
/// One buyer-carried estimate of the cost of re-deriving a finding.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct BuyerFindingEstimate {
    pub units: String,
    pub currency: String,
    pub provenance: String,
    pub source_sha256: String,
    pub context_sha256: String,
    pub replay_recipe_sha256: String,
    pub observed_at_unix_ms: String,
    pub valid_until_unix_ms: String,
}

/// Buyer-owned discount and remaining-budget policy.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct FindingBidCeilingPolicy {
    pub budget_remaining_units: String,
    pub currency: String,
    pub would_have_run_bps: String,
    pub sibling_redundancy_bps: String,
    pub guarantee_class_bps: String,
}

/// Complete input to [`finding_bid_ceiling`].
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct FindingBidCeilingInput {
    pub estimate: BuyerFindingEstimate,
    pub policy: FindingBidCeilingPolicy,
    pub expected_source_sha256: String,
    pub expected_context_sha256: String,
    pub expected_replay_recipe_sha256: String,
    pub now_unix_ms: String,
}

The three expected_* digests and now_unix_ms sit beside the estimate so the helper can check the estimate against what the buyer intends to buy. Amounts and timestamps are bounded to Rust u64, and each basis-point value to 0..=10_000. The two provenance labels, buyer_metering_history_v1 and buyer_fresh_metered_quote_v1, are caller-carried and unsigned.

Bid-ceiling refusals

FindingBidCeilingError fails closed: the helper returns a ceiling or a named reason, never a best effort. Seven reasons name a semantic mismatch between the estimate and the purchase being priced.

RejectionCondition
CurrencyMismatch
The estimate currency and the budget currency differ, or either is not an uppercase alphanumeric code of at most sixteen bytes.
ProvenanceUnsupported
estimate.provenance is neither buyer_metering_history_v1 nor buyer_fresh_metered_quote_v1.
SourceSubstituted
estimate.source_sha256 differs from expected_source_sha256.
ContextSubstituted
estimate.context_sha256 differs from expected_context_sha256.
ReplayRecipeSubstituted
estimate.replay_recipe_sha256 differs from expected_replay_recipe_sha256.
InvalidValidityWindow
observed_at_unix_ms is at or after valid_until_unix_ms.
StaleEstimate
now_unix_ms falls before the observation instant or at or after the expiry instant.

Five more reasons guard the encoding: InvalidDecimal for a value that is not a canonical unsigned decimal integer, U64Overflow for one past the u64 boundary, BasisPointsOutOfRange above 10_000, DigestMalformed for a digest that is not canonical lowercase 64-hex, and IntermediateOverflow for a wide product that leaves u128. Each of the first four names the offending field.

The basic_discount vector

The shared golden vectors fix the cross-language answer. The first applies all three discounts to a 4200-unit estimate and expects 1890: sixty percent for wouldHaveRunBps, then seventy-five percent for siblingRedundancyBps, then the full multiplier for a deterministic_replay class.

tests/bindings/fixtures/cognition-market-finding-bid-ceiling-v1.json:5-31json
    {
      "id": "basic_discount",
      "input": {
        "estimate": {
          "units": "4200",
          "currency": "USD",
          "provenance": "buyer_metering_history_v1",
          "sourceSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "contextSha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
          "replayRecipeSha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
          "observedAtUnixMs": "1700000000000",
          "validUntilUnixMs": "1700000060000"
        },
        "policy": {
          "budgetRemainingUnits": "10000",
          "currency": "USD",
          "wouldHaveRunBps": "6000",
          "siblingRedundancyBps": "2500",
          "guaranteeClassBps": "10000"
        },
        "expectedSourceSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        "expectedContextSha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
        "expectedReplayRecipeSha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
        "nowUnixMs": "1700000001000"
      },
      "expectedCeiling": "1890"
    }

Posted-price refusal

The marketplace compares the bid's max_price_per_call with ListingPricingHint.price_per_call and refuses a lower bid with BiddingError::BidCeilingTooLow in crates/economy/chio-open-market/src/bidding.rs:389. A currency mismatch is checked first and is a separate refusal. The marketplace design, ADR-0017, lists auctions and order books among its non-goals.

Guarantee multipliers

deterministic_replay is priced at the full multiplier, 10000 bps, with no discount for guarantee strength. metered_attested, 5000 bps, attests execution, cost, and digest while claim semantics stay outside independent re-check. asserted, 500 bps, is seller-asserted, backed by the bond alone, heavily discounted, and never silently upgraded to a stronger class. The reputation-tier idiom the multipliers follow is TIER_DISCOUNT_PER_HUNDRED in crates/economy/chio-appraisal/src/marketplace_pricing.rs.

Challenge classes

chio finding challenge takes exactly one authorization branch and exactly one mechanical evidence class per filing. A buyer submission carries a dispute fee, a dispute bond, and standing, and is signed by the challenger it names; a venue audit carries none of those and is signed by the venue's pinned audit authority. The --class flag accepts three values, and the closed guarantee and evidence compatibility matrix is checked against the fetched finding before anything is signed.

ClassWhat it argues, and what it requires of the finding
digest-mismatch
The delivered content did not match the digest the buyer priced. Admits any guarantee and evidence class, because its standing is the signed failed-delivery terminal. An upheld verdict requires the committed and delivered digests to differ.
evidence-invalid
A contested receipt fails re-verification. Requires an observed or verified evidence class. Only affirmative invalidity upholds; a resolved and valid subset rejects, and unavailable inputs are indeterminate.
replay-contradiction
A re-run of the committed recipe contradicts the claim. Requires deterministic_replay and verified. The facet result maps onto the verdict directly.

Every other guarantee and evidence pairing rejects before evaluation. The verdict is exactly upheld, rejected, or indeterminate, and only upheld may enter the penalty lane. An indeterminate outcome creates no hold, sanction, liability transition, audit reward, or forfeiture.

Penalty evidence

FraudulentListing is one of the four frozen v1 OpenMarketAbuseClass variants, alongside SpamPublication, ReplayPublication, and UnverifiableListingBehavior. The finding-aware wrapper asserts that class before any penalty evaluation runs, in crates/economy/chio-open-market/src/finding_penalty.rs:127, and the registered chio.registry.market-penalty.v1 record adds no field or enum of its own.

The penalty carries exactly one external evidence reference whose reference_id equals the challenge outcome_id and whose sha256 equals the canonical signed-outcome envelope digest. A body-only digest, an absent digest, a generic or duplicated reference, a wrong abuse class, untyped evidence, and signer substitution each reject. A low reputation score or a disgruntled buyer's account of events opens nothing.

Bond requirement and slash amount

A bond requirement on the fee schedule declares a class, amount, currency, and slashable bit; live collateral is the allocation admission binds. Stale, wrong-owner, wrong-currency, and already-allocated collateral reject. An upheld outcome carries a checked penalty calculation recording the base stake, the open per-sale encumbrances, the computed exposure, the signed listing requirement, and the live allocated collateral. The penalty evaluator refuses a SlashBond whose amount exceeds the configured bond requirement with PenaltyAmountExceedsBond, and refuses it outright when the selected requirement is not slashable.

Slash distribution and reversal

validate_bond_impair_distribution enforces the exact pro rata sum. Where the bond vault runs as an on-chain rail module, contracts/src/ChioBondVault.sol repeats the cap and exact-sum check: it checks distribution shape, beneficiary count, amount bounds, and exact-sum shares, while the settlement operator derives harmed-buyer destinations from frozen purchase records and pre-sale market terms pin the community-fund identity. Challenger rewards, audit costs, operator fees, and adjudicator fees never come from the seller slash.

ReverseSlash preserves the penalty state-machine path on a successful appeal. It cannot retrieve funds an impairment transaction already distributed, which is why impairment waits for appeal finality; an appeal permitted after distribution needs a separately funded, receipt-backed restitution terminal.

Settlement finality

On an on-chain rail, ChioEscrow.releaseWithProofDetailed transfers funds on proof, and the finality inspection in chio-settle can label a transaction AwaitingDisputeWindow without reversing it. The purchase chain's pre-delivery hold is neither dispute-window custody nor a clawback.

Next: watch the accepted price become a hold