Corobate

Nuts and Bolts

How a receipt actually gets built

Who hands in what, which parts come from an AI, what arithmetic runs on the numbers, and how all of it turns into one of three answers: hold, fold, or go forward. Written so a tenth grader can follow it, with the real tables underneath.

What's on this page

  1. The one idea, in a paragraph
  2. Who puts data in — including the AI
  3. How each one hands its data over
  4. The math, step by step, with real numbers
  5. Tables of tools and operations
  6. Hold, fold, or go forward
  7. How the patent claims line up with the product

01The one idea, in a paragraph

Imagine you are about to spend four million dollars on a shipment, and seven facts have to be true for that to be a good idea. Some of those facts come from a testing lab that measured them. Some come from a computer model that estimated them. Some come from the seller, who has an obvious reason to sound confident. And some are just… missing, though a summary written by an AI made it look like they were covered.

Corobate does one thing: it makes you label where every fact came from, scores each one, and then refuses to let the whole decision look stronger than its weakest necessary fact. Then it seals that record so nobody — including you — can quietly change it afterward, and so anyone else can re-run the same arithmetic on their own computer and get the identical answer. The output is a receipt. Not a log entry that says "approved." A receipt that shows the work.

Plain-language version A chain is only as strong as its weakest link. Corobate finds the weakest link, writes its name on the receipt, and won't let you pretend the chain is stronger than that link. Then it puts a tamper-evident seal on the whole thing and stamps it with a clock that isn't yours.

02Who puts data in — including the AI

Every input on a receipt carries an originator id. You can always tell who or what produced a number, and what class of trust that origin is allowed to earn.

OriginatorID recorded on the receiptWhat it contributesBest class it can earnWhy it's capped there
The human decision-maker
(a buyer, an underwriter, a compliance lead)
actor:human:dokoro@meridiangrid.example The question being decided, which fields are required, the pass/caution thresholds, and any judgment note seller-asserted for their own claims You do not get to grade your own homework. A person can set the policy but cannot self-certify a fact.
An AI model
(a sourcing copilot, a document-extraction model, an LLM summarizer)
actor:ai:sourcing-copilot/v4 · prompt_sha256:9f2c… Values pulled out of PDFs, draft summaries, suggested classifications, risk narratives modeled — never verified A model produces a plausible answer, which is not the same as a measured one. Confident wording earns nothing.
An accredited test lab actor:org:LAB-DE-0447 · report:TR-88214 Measured values plus a report number that can be looked up in the accreditation register verified Someone independent physically measured it and put their accreditation behind the number.
A certification body
(e.g. an ISO 14067 verifier)
actor:org:TUV-SUD-0036 · cert:CFV-2026-1188 A verification statement, keyed to a certificate ID verifiedonly if the ID checks out The certificate number is checked against the issuer's public register. No register hit, no verified class.
The seller or supplier actor:org:VOLTCORE-DE-8812 Declared specifications, datasheet values, self-reported percentages seller-asserted They may well be telling the truth. They also have an interest in the answer. The receipt says so out loud.
A government or registry feed actor:sys:eu-eprtr · fetched:2026-07-07T14:12Z Published datasets, filings, registration status verified Public, addressable, re-fetchable by the person checking your work.
A sensor or telemetry stream actor:sys:bms-fleet-telemetry · device:BMS-7741-Q2 Directly measured readings with their own timestamps verified while fresh A real measurement — but a real measurement from eleven months ago is a memory, not a reading. Age caps it.
Nobody Nothing. The field is empty. missing A blank is recorded as a blank, with a reliability of zero. It is never quietly skipped.
The anti-hallucination rule This is the part people ask about most. An AI's output is admitted as MODELED and nothing better — no matter how certain it sounds. If the AI cites a certificate, a report number, or a regulation, the receipt records whether that citation was independently resolved against the issuing register. A citation that doesn't resolve doesn't quietly become evidence; it becomes a named gap. That is how a fabricated "third-party verified" line stops being the reason a four-million-dollar order shipped.

03How each one hands its data over

Five delivery paths. All five end in the same place: a labeled, timestamped input record.

PathUsed byWhat it looks likeWhat the engine records
1. Intake formHumansA web grid: one row per required fact, with a value box, a class dropdown, an evidence-source box, and a dateThe typed value, who typed it, when, and the class they chose (which the engine may downgrade but never upgrade)
2. Document uploadLabs, certifiers, suppliersA signed PDF or test report; values extracted, then the report/certificate number resolved against the issuer's registerThe value, the document hash, the register lookup result, and the resolution timestamp
3. Allowlisted fetchRegistries, government feeds, ERP systemsA pull from an approved URL, mapped into fields by a field map — configuration, not codeThe URL, the fetch time, the field map version, and a cache/freshness state
4. Streaming telemetrySensors, fleet systems, BMSA live feed of readings with device IDs and observation timesThe reading, the device id, the observation time, and whether it was inside the freshness window
5. In-process SDK callAI agents, host applicationsA function call from inside your own application; nothing leaves your networkThe model/agent id, the input values, and a MODELED class stamped automatically

In the live battery demo, path 1 is the editable grid you see on screen, and every row you edit is written to a visible file you can open. That is deliberate. If you cannot see the inputs, the receipt is just a different kind of black box.

04The math, step by step, with real numbers

Seven operations. Each one is arithmetic you could do on paper, which is the point — anyone can check it.

1

Give each input a starting score

Class determines the starting reliability. These are the defaults; a policy can tighten them but not loosen them past their class.

ClassStarting reliabilityStored internally asIn plain words
verified0.959500 bpSomeone independent checked it and you can go check them.
modeled0.808000 bpCalculated or estimated from other things. Good, not measured.
seller-asserted0.505000 bpAn interested party said so.
missing0.000 bpNothing there.

Why "bp"? Reliability is stored as a whole number of basis points (hundredths of a percent) rather than a decimal. Decimals drift between programming languages and processors — 0.1 + 0.2 does not equal 0.3 on most computers. Whole numbers don't drift. That is what makes a receipt built on our machine reproduce on yours.

Where it doesn't hold yet. The discipline is not applied everywhere. The canonical encoder writes a number using whatever formatting its own language produces, so Node and CPython disagree on a value like 0.000001 — and the recalibration receipts carry rounded floats, not basis points. Row sort order diverges too, when an astral-plane name meets a name in U+E000U+FFFF: JavaScript sorts by UTF-16 code unit, CPython by code point. Our CPython port matches the JavaScript one exactly on all twelve seeded parity vectors, which are built to keep those two cases apart, and would not match on either of them. Carrying every number as an integer in fixed minor units is the fix; it changes the hash of every receipt ever issued, which makes it a versioned break rather than a patch, and it has not been made. We would rather you read this here than discover it.

2

Cap anything stale

If an input is older than the freshness window for its field, its reliability is capped at 0.40 no matter how good its class was, and a named reason is written down.

Freshness capr = min( r_class , 0.40 )  when  age(input) > max_age(field)
3

Throw out anything from the future

Any input observed after the decision's cutoff time is rejected outright. This is what stops a receipt from being quietly improved later with information nobody had at the time — the single most common way "we did our diligence" turns out to be false.

Point-in-time rulereject input  if  observed_at > period_end
4

When the score comes from a track record, be honest about small samples

Sometimes reliability isn't a class default — it's earned from history: "this source has been right 9 times out of 10." Corobate does not use 9/10 = 0.90. It uses the Wilson lower bound, which asks a harder question: given only ten tries, how low could the true success rate plausibly still be?

Wilson score lower bound( p̂ + z²/2n − z·√( p̂(1−p̂)/n + z²/4n² ) ) / ( 1 + z²/n )
Track recordNaive rateWilson lower bound (95%)What it's telling you
9 right out of 100.900.60Ten tries isn't much. Don't bet like it's 90%.
90 right out of 1000.900.83Same percentage, ten times the evidence, much stronger claim.
900 right out of 10000.900.88Now the sample is big enough that the discount nearly disappears.

The plain-English version: a good record built on a handful of tries is not the same as a good record built on a thousand. Averages hide that. The Wilson bound refuses to.

5

Combine — by the weakest link, not the average

Only the inputs marked sufficiency-critical count toward the verdict. The default combining rule is the minimum. Two other rules are available, and all three share one property: adding a weaker input can never raise the score. (Mathematicians call that monotone. Everyone else calls it "no laundering.")

Here is the real battery example from the demo. Five facts are marked critical:

Critical inputClassReliabilityWhere it came from
Carbon footprintverified0.94ISO 14067 verification, certificate resolved
Hazardous substancesverified0.96Accredited lab, REACH screening
Cobalt originmodeled0.72Book-and-claim mass balance, not physical traceability
State-of-health algorithm disclosuremissing0.00Never supplied
Renewable energy share in manufacturingmissing0.00Never supplied
Minimum (default)confidence = min( 0.94, 0.96, 0.72, 0.00, 0.00 ) = 0.00
bound_by = soh_algorithm_disclosure  →  verdict withheld

Fill in the two blanks with verified evidence and re-run — nothing else changes:

After the gaps are closedconfidence = min( 0.94, 0.96, 0.72, 0.95, 0.95 ) = 0.72
bound_by = material_origin_cobalt  →  verdict caution

Then get real physical traceability on the cobalt (0.93 verified) instead of a book-and-claim allocation:

After the weakest link is fixedconfidence = min( 0.94, 0.96, 0.93, 0.95, 0.95 ) = 0.93
bound_by = carbon_footprint  →  verdict approve

Notice what just happened: the receipt told you exactly which one thing to go fix to move the verdict. That's the operational payoff. "Confidence 0.61" tells you nothing. "Bound by cobalt origin, because it's a book-and-claim allocation" tells you what to buy, ask for, or walk away from.

Combining ruleOn the same five numbersCharacterWhen you'd choose it
Minimum (default)0.72Weakest link governs; other inputs are ignored once the floor is setSafety and compliance gates, where one failure is a failure
Product0.59Strictest — every weakness compounds (0.94 × 0.96 × 0.72 × 0.95 × 0.95)Chains where each step must independently hold, like custody transfers
Soft-minimumjust under 0.72Mostly the minimum, pulled a little lower when several inputs are weak at oncePortfolio scoring where "three mediocre inputs" should rank below "one mediocre input"
6

Compare to the thresholds and name the gaps

The thresholds are written on the receipt before the answer, so nobody can move the goalposts afterward.

Verdict ruleconfidence ≥ 0.80 → approve
confidence ≥ 0.50 → caution
otherwise, or any critical input MISSING → withheld

Alongside the verdict the receipt lists every coverage gap by name, every seller-asserted claim by name, and — if it abstained — the specific reason code (stale field, excessive age, failed freshness, unverified source, source outage). Refusing to answer is a first-class result, not an error.

7

Seal it, chain it, anchor it

Now the record is frozen. Three separate mechanisms, each protecting against a different kind of after-the-fact story.

The sealcanonical_bytes = encode( receipt ) // injective, type-tagged, length-prefixed
receipt_hash = SHA-256( canonical_bytes )
entry_hash = SHA-256( prev_entry_hash ‖ content_digest )
anchor = RFC 3161 timestamp token over entry_hash
MechanismStops this storyHow you'd catch it
Canonical encoding + SHA-256"We never changed that number."Recompute the hash. One altered character changes it completely.
Hash chain"That receipt was always in the file."Every later receipt's link breaks if an earlier one is edited or reordered.
RFC 3161 anchor"We had that evidence at the time."A timestamping authority outside your control signs the chain head. Your clock isn't part of the argument. Status: the public demo ships a self-signed demonstration token, labelled as such; production anchoring is a configuration.
Cross-machine reproduction"You'd have to trust our software."The auditor re-runs the arithmetic on their own hardware, running none of our code, and gets the identical hash.

05Tables of tools and operations

The complete pipeline, in order, with the standard behind each step.

The "Written against" column names the specification passage each operation was written against, in a filed application whose claims have not been examined. It is a reading aid, not an examined claim-to-code correlation, and no inference about claim scope should be drawn from it.

#OperationTool / algorithmWritten againstWhat it prevents
1Admit & classifyFour-class provenance labeling; unlabeled inputs rejectedClaim 1, 2Unsourced numbers entering the record
2Resolve citationsRegister lookup on certificate / report IDsClaim 1 (verified class conditions)Fabricated or unresolvable references
3Freshness checkAge comparison; cap at 0.40; named reasonClaims 6, 23Stale data presented as current
4Point-in-time gateReject observed_at > period_endClaims 10, 27Hindsight quietly improving the record
5ScoreClass tier, or Wilson score lower bound on a track recordClaims 4, 26Small-sample overconfidence
6AggregateMonotone function: minimum, soft-minimum, or productClaims 3, 34Averaging a weak link out of existence
7DecideThreshold comparison, thresholds sealed in advanceClaim 29Moving the goalposts after the fact
8AbstainNamed abstention reason codesClaims 5, 6, 33Silent guessing when evidence is thin
9EncodeType-tagged, byte-length-prefixed injective encoding (attest-canon/2); integers in fixed minor unitsClaims 1, 15, 21Two different input sets producing identical bytes; float drift across machines
10HashSHA-256FIPS 180-4Undetectable edits
11ChainAppend-only hash chain (Merkle tree / authenticated dictionary also supported)Claim 7Reordering, backdating, silent deletion
12AnchorRFC 3161 time-stamp token over the chain headRFC 3161; claims 8, 25, 44Disputes about when the record existed
13Prove inclusionOrdered path of entry hashes recomputed by the verifierClaims 1, 22Having to trust the vendor's word
14Reproduce cross-machineIndependent re-derivation on a different architecture, running none of our codeClaims 1, 22, 30"It only verifies inside their system"
15RecalibratePost-hoc backtest with Benjamini–Hochberg false-discovery-rate controlClaims 38, 39Tuning your criteria to random noise
Field on the receiptWho supplies itWho derives it
decision_id, question, domainCaller
critical[] (which fields are required)Caller's policy
threshold_approve, threshold_cautionCaller's policy
inputs[].value, .provenance, .source, .observed_atCaller / originatorClass may be downgraded by the engine, never upgraded
inputs[].reliabilityEngine (class tier, freshness cap, Wilson bound)
confidence.value, bound_byEngine
verdict, reasons[], coverage_gaps[]Engine
receipt_hash, chain.entry_hash, anchorEngine + external timestamping authority

06Hold, fold, or go forward

A verdict is not a decision. It's the input to one. Here's the mapping that turns a number into an action.

Receipt saysAnd the missing evidence is…Your moveWhat it looks like in practice
withheldobtainable — the supplier has it, it just hasn't been producedhold — abstainPause the release. Issue a named evidence request with a deadline. The receipt is the request: it names exactly which field, why it failed, and what class would clear it.
withheldnot obtainable — it doesn't exist, or the counterparty won't produce itfold — walk awayRe-source. The receipt documents that you asked, what was refused, and when — which is the difference between a business decision and a later allegation of negligence.
cautionpresent but weak — modeled or seller-asserted where you wanted verifiedgo, with conditionsProceed on a smaller commitment: staged release, holdback, contractual representation naming the weak field, or an added inspection at receipt.
approvenothing critical is weakgo forwardFull commitment. And a sealed record showing the basis, so that if it goes wrong anyway, the question is "was the process sound?" — which you can answer.
The point most people miss The value isn't only in stopping bad decisions. It's that a hold and a fold become defensible, documented acts instead of invisible ones. Right now, when a manager pauses an order because something felt thin, that judgment leaves no trace — and six months later nobody can reconstruct why. A receipt makes the cautious decision as auditable as the aggressive one.

See the whole thing play out with names, dates and dollar figures in the exemplary scenario.

07How the patent claims line up with the product

U.S. Patent Application No. 19/747,068 — patent pending. Four independent claims, each covering a different way the same idea gets used. Below: what each one says, in ordinary language, and where you can see it on a receipt.

Pending claim (as filed)What it covers, plainlyWhere you see it
1
system
The whole machine: take in evidence from several different sources, force each one into a provenance class (and reject anything unclassifiable), write it down in an unforgeable format, score it so the result is capped by the weakest necessary input, seal it before the outcome is known, and let an outsider re-derive the whole thing on a different kind of computer without running any of your software.Every receipt. The inputs[] block, confidence, bound_by, and the fact that the browser verifier reproduces the hash.
22
method
The same sequence described as a set of steps rather than as a machine — so it's covered however it's deployed.The five-step process in the demo.
30
SDK
Doing all of it from inside somebody else's application, as an embedded kit that hands back the proof through an API. Claim 31 adds: without any input value ever leaving the host's network.The integration path in For Technicians.
38
flywheel
Learning from what actually happened afterward — measuring which inputs really predicted outcomes, keeping only the signals that survive a statistical test for false discoveries, and applying the new weights only going forward, so old sealed receipts still reproduce exactly as issued.Backtests and recursive improvement.

And the dependent claims that carry most of the day-to-day behavior:

Pending claim (as filed)In plain languageThe failure it addresses
3, 34The combining rule must be minimum, soft-minimum, or product — all of which are "monotone," meaning adding a weaker input can never raise the score.Averaging: three strong numbers hiding one fatal one.
4, 26Reliability earned from a track record uses the Wilson score lower bound, not the raw success rate."Nine out of ten" sounding like ninety percent certainty.
5, 23, 33Abstaining is an explicit, recorded, sealed result with a named reason — not an error and not a blank.Systems that guess rather than admit they don't know.
6The named reasons include stale field, excessive age, failed freshness, unverified source, and source outage — and the verifier reproduces the outage reason from the sealed entry.A data feed going down and the system silently substituting something older.
7, 44The tamper-evident structure can be a hash chain, a Merkle tree, or an authenticated dictionary; the anchor can be a hash-chain ledger, an RFC 3161 authority, a trusted-execution-environment attestation, or a zero-knowledge inclusion proof.Lock-in to one vendor's ledger.
8, 25The head of the chain gets timestamped by an outside authority whose token independently reproduces that head.Backdating.
9, 35The engine's version number is sealed into the record."We ran that on a newer version" — you can't, the version is in the hash.
10, 27, 40The point-in-time rule: nothing dated after the decision's cutoff may enter the record.Look-ahead. The most common way a backtest lies to you.
15, 21The encoding is injective: duplicate field names are rejected, and no value containing a delimiter can be arranged to produce the same bytes as a genuinely different set of inputs.Smuggling a different meaning into an identical-looking record.
17, 18When the engine updates itself, the update only ships if a battery of tests reproduces byte-identically against a sealed baseline manifest — otherwise it's disqualified, naming the changed files.An engine change quietly altering how past decisions would score.
29The attestation certificate carries an unqualified, qualified, or withheld opinion, and a qualified opinion is mandatory whenever a critical finding is seller-asserted, stale, or absent — naming each unverified finding.Clean-looking sign-offs resting on unverified claims.
42, 43, 45Even a cryptographically perfect computation proof (a secure-enclave attestation or zero-knowledge proof) does not lift the weakest-link cap — and only counts as verified if it actually binds to the chain head.Impressive cryptography being used to launder weak underlying data.
The through-line: every one of these claims is a refusal. Refuse unlabeled evidence. Refuse to average away a weak link. Refuse to score a small sample like a large one. Refuse information from after the cutoff. Refuse to seal after the outcome is known. Refuse to let good cryptography rescue bad data. What's left, once you've refused all of that, is a record worth showing to someone who doesn't trust you.
Run the 5-step demo → See the worked scenario → Technical version →