Recourse

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. 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. 2

    Off-chain data, content-addressed

    Registry snapshots, satellite chips, the notice corpus and every evidence bundle are files named by their hash.

  3. 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. 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. 5

    Ledger, commitments only

    Integrity state, events, dispute windows, escrows and claims on Base Sepolia. No raw data on-chain.

  6. 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.

0.46F1 pooled over the six project areas (precision 0.35, recall 0.68)
0.974ROC AUC pooled; the shuffled-label control model scores 0.48
0 of 3stable-forest control areas that triggered an event
21 Oct 2026protocol pre-registered, sha256 0xfb2e9b…6e299725
AreaPrecisionRecallF1Chance F1Detected haHansen haEvent
Kariba REDD+ Project
project area, official boundary
0.040.380.080.0012,261264fired, 0.35%
Pacajai REDD+ Project
project area, official boundary
0.600.620.610.0252,7942,713fired, 2.52%
The Russas Project
project area, official boundary
0.750.690.720.004180196no
Katingan Peatland Restoration and Conservation Project
project area, official boundary
0.070.550.130.0031,508202fired, 1.21%
Rio Anapu-Pacaja REDD Project
project area, official boundary
0.420.810.560.0143,2691,710fired, 2.06%
UNITOR REDD+ Project
project area, official boundary
0.490.770.600.006512324no
Jutaituba REDD+ Project
control: registered project, official boundary
0.020.760.040.0049,009223fired, 7.23%
Caxiuana National Forest interior (stable-forest patch)
control: stable forest, defined patch
0.000.000.000.000140no
Sebangau National Park interior (stable-forest patch)
control: stable forest, defined patch
0.000.000.000.00000no
Matusadona National Park interior (stable-woodland patch)
control: stable forest, defined patch
0.000.000.000.000260no

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.

PipelineSplitBlindDocsPrecisionRecallF1Project ID acc.Injection refused
v1evalyes470.720.280.400.7380%
v2evalno470.970.870.920.9780%
v2holdoutyes150.750.380.500.8350%
v3evalno470.971.000.990.98100%
v3holdoutno150.880.880.880.90100%
v3holdout2yes151.001.001.001.0067%
v4 (current)evalno470.971.000.990.98100%
v4 (current)holdoutno150.880.880.880.90100%
v4 (current)holdout2no151.001.001.001.0067%

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.