How it works, and how well
Blockchain answers whether a record can be trusted; AI answers what the data means. Recourse puts a dispute window and a second signature at the seam between them, and publishes how accurate each model is.
Six layers, bottom to top
- 1
Sources, signed at origin
Verra's registry API responses proven with Reclaim zkTLS; Sentinel-2 reads pinned by STAC item and sha256; public notices pinned by URL and sha256.
- 2
Off-chain data, content-addressed
Registry snapshots, satellite chips, the notice corpus and every evidence bundle are files named by their hash.
- 3
AI with versioned models
A satellite forest-loss detector and an integrity-notice reader. Each output records its input hash, model hash, output hash and confidence.
- 4
Proof
EIP-712 claims attested through EAS by the oracle key, the same digest signed with ML-DSA-87, and every batch of outputs Merkle-anchored before use.
- 5
Ledger, commitments only
Integrity state, events, dispute windows, escrows and claims on Base Sepolia. No raw data on-chain.
- 6
Applications
This web app, the TypeScript SDK, the MCP server for agents and the verify CLI. All read the same contracts.
From a signal to a refund
Registry signals act at once
A zkTLS proof of Verra's response that shows On Hold, Withdrawn, Inactive or Rejected puts the project under watch immediately. RegistryOracle accepts only the pinned request (URL, method, headers, body and extraction pattern, byte for byte), from a Reclaim witness, newer than the stored proof. A reinstatement proof lifts it.
AI signals wait for a second signature
An oracle attestation opens a proposed event and the project goes under watch. A reviewer's countersign activates it; anyone may dispute it with a bond, and an arbiter decides. Undisputed events can be finalized when the window closes (14 days in production, minutes in the drill). An active event with a haircut is a recall.
The gate fails closed
CreditGate refuses a credit with a named reason when the registry status is unproven or stale, when an event is pending or active, or when the policy profile's rules are not met: CORSIA First Phase (vintage 2021–2026, letter of authorization on record), Türkiye ETS offsets (at most five years old) and VCMI claims.
The money follows
WarrantyEscrow pays the seller only for a proven retirement that matches the order and passes the gate at delivery, and keeps a holdback for the warranty period. If a recall activates inside it, the buyer collects the haircut share of the price, capped at the holdback. ClaimsLedger lets each retired tonne back one claim, and marks claims impaired instead of deleting them.
Satellite forest-loss detector
Job: detection. Gradient-boosted trees on Sentinel-2 dry-season composites (NDVI, NBR, NDMI and their changes), trained on areas outside the evaluated projects, scored against Hansen Global Forest Change at a threshold of 0.25. The protocol was hashed and anchored on-chain before the evaluation ran.
| Area | Precision | Recall | F1 | Chance F1 | Detected ha | Hansen ha | Event |
|---|---|---|---|---|---|---|---|
| Kariba REDD+ Project project area, official boundary | 0.04 | 0.38 | 0.08 | 0.001 | 2,261 | 264 | fired, 0.35% |
| Pacajai REDD+ Project project area, official boundary | 0.60 | 0.62 | 0.61 | 0.025 | 2,794 | 2,713 | fired, 2.52% |
| The Russas Project project area, official boundary | 0.75 | 0.69 | 0.72 | 0.004 | 180 | 196 | no |
| Katingan Peatland Restoration and Conservation Project project area, official boundary | 0.07 | 0.55 | 0.13 | 0.003 | 1,508 | 202 | fired, 1.21% |
| Rio Anapu-Pacaja REDD Project project area, official boundary | 0.42 | 0.81 | 0.56 | 0.014 | 3,269 | 1,710 | fired, 2.06% |
| UNITOR REDD+ Project project area, official boundary | 0.49 | 0.77 | 0.60 | 0.006 | 512 | 324 | no |
| Jutaituba REDD+ Project control: registered project, official boundary | 0.02 | 0.76 | 0.04 | 0.004 | 9,009 | 223 | fired, 7.23% |
| Caxiuana National Forest interior (stable-forest patch) control: stable forest, defined patch | 0.00 | 0.00 | 0.00 | 0.000 | 14 | 0 | no |
| Sebangau National Park interior (stable-forest patch) control: stable forest, defined patch | 0.00 | 0.00 | 0.00 | 0.000 | 0 | 0 | no |
| Matusadona National Park interior (stable-woodland patch) control: stable forest, defined patch | 0.00 | 0.00 | 0.00 | 0.000 | 26 | 0 | no |
Precision is low on Kariba, Katingan and the Jutaituba control: the model flags haze and seasonal change in cloudy composites as loss. That is why AI events never act on their own. On-chain, the Katingan and Jutaituba alarms were disputed and rejected by the arbiter because Hansen loss did not corroborate them, and the Katingan claim went through afterwards.
Hansen GFC is itself a model product (30 m Landsat); agreement is measured against it, not against ground truth.
Loss mapped in Oct-Dec 2025 is labelled 2025 by Hansen but is after the t1 dry-season composite (counts as a miss).
Pixels without enough clear observations are excluded and reported through validFraction, never counted as no-loss.
Integrity-notice reader
Job: extraction/classification: integrity events (registry, projectId, kind, haircutBps) with verbatim evidence from public notices. Model: qwen3-6-35b-a3b (3B active of 35B parameters, open weights) at temperature 0, three runs per document. A deterministic validator rejects any event whose quotes are not verbatim in the document or whose project ID does not appear in it.
| Pipeline | Split | Blind | Docs | Precision | Recall | F1 | Project ID acc. | Injection refused |
|---|---|---|---|---|---|---|---|---|
| v1 | eval | yes | 47 | 0.72 | 0.28 | 0.40 | 0.73 | 80% |
| v2 | eval | no | 47 | 0.97 | 0.87 | 0.92 | 0.97 | 80% |
| v2 | holdout | yes | 15 | 0.75 | 0.38 | 0.50 | 0.83 | 50% |
| v3 | eval | no | 47 | 0.97 | 1.00 | 0.99 | 0.98 | 100% |
| v3 | holdout | no | 15 | 0.88 | 0.88 | 0.88 | 0.90 | 100% |
| v3 | holdout2 | yes | 15 | 1.00 | 1.00 | 1.00 | 1.00 | 67% |
| v4 (current) | eval | no | 47 | 0.97 | 1.00 | 0.99 | 0.98 | 100% |
| v4 (current) | holdout | no | 15 | 0.88 | 0.88 | 0.88 | 0.90 | 100% |
| v4 (current) | holdout2 | no | 15 | 1.00 | 1.00 | 1.00 | 1.00 | 67% |
The answer keys were written and hashed before each run. Blind rounds are the honest measure: the first blind evaluation scored F1 0.40; each later pipeline was then measured on a fresh blind holdout before being re-run on earlier splits. Rows marked not blind were scored after the pipeline had been adjusted on that split. Synthetic prompt-injection documents (labelled synthetic) must yield no event; the share refused is in the last column. Scorecard: notice-scorecard.json.
Footprint
Measured where it could be measured, estimated where it could not, and labelled either way.
Satellite model
Training: 0.0050 kWh, 1.30 g CO₂eInference, 10 areas: 0.0028 kWh (0.072 g CO₂e per area)Measured with CodeCarbon on AMD Ryzen 5 5600X (6 cores), 32 GB RAM, no GPU, Windows 11; data downloaded 4.09 GB.Notice reader
All 621 model calls, every round: 7.04 Wh1,684,225 tokens processed.Estimated from active parameters and token counts on H100-class hardware with PUE 1.2; the provider does not report energy.Ledger
Base Sepolia, a proof-of-stake rollup. Only hashes, states and amounts go on-chain; every file stays off-chain and content-addressed.Framed per IEEE P7100 (AI environmental impact) as a reporting practice.Limits
Recourse cannot act inside Verra.
Deliveries and claims bind to real public retirement records, but the buyers and sellers in the demonstrations are simulated parties replaying them.
zkTLS trusts Reclaim's witnesses.
Verra's API is public but undocumented; a proof shows the response came from Verra's endpoint as signed by a Reclaim witness, not more.
Hansen GFC is a model too.
Satellite agreement is measured against another model product, not field data, and some project boundaries are approximations flagged per area.
Haircuts come from public findings.
AI proposes, people confirm, anyone can dispute. A hold or a withdrawal is evidence for review, never an accusation of fraud.
This is a testnet.
Contracts run on Base Sepolia (or a local fork of it); stable value in the escrow is test USDC or drill dUSD.
Not every project is proven yet.
Eight projects are tracked on-chain; the 290 in the impact numbers are what the watcher would cover at full scale. Untracked projects are refused, not passed.
Standards used
EAS attestations and EIP-712 typed data for every claim; FIPS 204 ML-DSA-87 signatures beside secp256k1 for records that must verify past 2030; CDOP v1.0 field names for project metadata and CAD Trust v2 unit fields for claims; the ICVCM Core Carbon Principles taxonomy of double issuance, double use and double claiming; IEEE 3218-2022 for blockchain-based carbon trading. Policy profiles follow ICAO CORSIA First Phase eligibility, Türkiye's ETS offset rules and the VCMI Claims Code.