Skip to content
Warrantv0.1

Verifiers

The eight clause kinds the engine can evaluate.

A verifier is a list of clauses, and a clause is one checkable assertion about the deliverable — the engine evaluates all of them and reports each one separately.

{
  "clauses": [
    { "kind": "http.status", "equals": 200 },
    { "kind": "json.schema", "schema": "invoice.v2" },
    { "kind": "data.freshness", "maxAgeSeconds": 60 }
  ]
}

The eight kinds

These are the entire registry. A clause with any other kind is rejected at the API boundary, so there is no way to open a warrant against a check the engine cannot run.

kindFieldsPasses when
http.statusequalsThe response status equals it exactly.
json.schemaschemaThe body validates against that named schema.
json.jsonpathpath, equals?The path resolves; if equals is given, it matches.
file.sha256digestThe bytes hash to that digest.
data.freshnessmaxAgeSecondsThe payload is no older than that.
uptime.windowwindowSeconds, minRatioObserved availability meets the ratio.
chain.eventtopicThe named event was seen on chain.
llm.judgerubric, minScoreA model scores the deliverable at or above the score.

Every clause is reported, not just the first failure

The engine evaluates the whole list and returns a per-clause result with a reason code. A spec with three clauses where the second fails returns three details, not one — you learn that the status was fine and the schema matched and the data was stale, which is the difference between a useful escalation and a shrug.

score is the share of clauses that passed. The policy decides what to do with it: a partial pass is exactly the grey band that partially_released and escalated exist for.

When the source cannot be reached

Every clause fails with evidence_unreachable. A timeout, a refused connection and a DNS failure are deliberately the same answer, because the useful question is not which one it was — it is that no evidence exists, and a warrant never settles in the payee's favour on an absence.

llm.judge is in the registry and is the weakest link

It is a real clause kind and the engine evaluates it, but a model's opinion is not a proof in the way a hash or a status code is. Treat it as a filter that routes borderline work to a person, not as an oracle that releases money on its own. Pair it with a minScore you would defend in an argument.

Trying one without spending anything

The verifier bench takes a pasted payload and a spec and runs the real engine against it: POST /bench/run, no key, nothing held, nothing spent. It is the fastest way to find out what a spec actually does before a warrant depends on it.