The on-chain AI court · live on Somnia Shannon

Disputes settled by deterministic AI verdicts.

Verdikt is a dispute-resolution primitive any contract can call. A panel of validator LLM agents must converge byte-identically before a verdict exists — then it settles funds and enters an on-chain precedent ledger. No human in the loop.

0% agreement with human verdicts 0% byte-identical consensus 0 successful prompt injections
determinism · 12-case benchmark
0%

agreement with human-expected verdicts across the public 12-case benchmark — every panel converging byte-identically.

0% byte-identical consensus, 12 of 12 panels
0 tests passing across 27 suites
0 protocols settling on one shared court
· rulings on the live precedent ledger
the gap

Smart contracts hold value. They can't judge intent.

Escrows, insurance pools, SLAs, and agent-to-agent commerce all end the same way: a subjective dispute that code alone can't decide. Today that means trusted human arbitrators, multisig committees, or stalemate. Verdikt replaces them with a court that is itself a contract — callable, deterministic, and auditable down to the prompt that decided each case.

the primitive

One call in. One verdict out.

A consumer contract opens a case; the court convenes a panel of Somnia validator LLM agents and only accepts a ruling when every juror returns the same bytes.

01 · openCase()

Dispute filed

Both parties' evidence is sanitized, fenced, and combined — attested facts ride above untrusted claims.

02 · panel

Jury convenes

3–5 validator LLM agents are convened on-chain, model pinned per case, under an on-chain versioned prompt.

03 · consensus

Byte-identical or nothing

Jurors must converge on the exact same bytes. Divergence means no verdict — never a coin flip.

04 · onVerdict()

Funds settle

The verdict — including graded splits — settles through pull-payments. No party can brick the court.

05 · record()

Precedent recorded

Every final ruling enters a queryable on-chain ledger, citable as precedent in future cases.

the platform

Four pieces. One court.

why the verdict holds

A verdict you can re-run.

Every claim below is reproducible against the live chain — the gates were run on real panels, and the results are recorded in the repo's deployment manifest.

Injection-resistant by construction

Evidence is sanitized and fenced; a live red-team probe with an embedded "rule PAYEE" injection ruled against the injector, 5/5.

The law is on-chain

The court's prompts are versioned, append-only state — every case snapshots the prompt version that decided it.

The model is pinned

Each case records the exact inference agent that judged it. Appeals re-run on the same model — verdicts are auditable against both law and judge.

Abstention over guesswork

When evidence is genuinely insufficient, the court can return UNDECIDABLE and settle to the safe default instead of inventing a winner.

12-case public benchmark live panels · Shannon
PAYEE cases
4/4
PAYER cases
4/4
SPLIT cases
3/4
Convergence
12/12
The one miss: a defensible PAYEE on a correct-but-late delivery. Full methodology in the benchmark report.
solutions

Six protocols already settle here.

Each is a deployed consumer contract routing its disputes to the same shared court — escrow to insurance to autonomous agents.

live on shannon testnet

Watch the court work. Right now.

Every page below reads the live chain — real cases, real verdicts, real settlements. Nothing is mocked.

developers

Inherit the base. Implement one function.

SimpleEscrow is the complete reference consumer — a working two-party escrow on the AI jury in under 50 lines. Your contract only decides what a verdict means for its own funds.

<50 lines for a complete escrow integration
1 function to implement: _settle(ref, verdict)
0 EOAs required contracts and agents are first-class parties
src/examples/SimpleEscrow.sol solidity ^0.8.20
contract SimpleEscrow is VerdiktConsumerBase {

  function dispute(uint256 id, string calldata evidence)
    external payable
  {
    Deal storage d = deals[id];
    require(msg.sender == d.payer || msg.sender == d.payee);
    _openDispute(id, evidence, msg.sender);  // → the court
  }

  // the only function you implement: what a verdict means
  function _settle(uint256 ref, Verdict verdict)
    internal override
  {
    Deal storage d = deals[ref];
    d.settled = true;
    uint256 toPayee =
      (d.amount * _payeeShareBps(ref, verdict)) / 10000;
    pending[d.payee] += toPayee;
    pending[d.payer] += d.amount - toPayee;
  }
}
live deployment · somnia shannon

Verify everything.

The full stack is live on testnet. Click through — every claim on this page is checkable against these contracts.

verdikt

Give your protocol a court.

Settle the disputes your code can't — with a verdict that is deterministic, auditable, and final.