Tanilo

Engineering work

Four fixes you can inspect. Open a case for the code, test results and limits.

Case studies

Payment guard

Catch a payment on the wrong network.

The guard compares the proposed network and asset with the supplied terms before creating a payment.

79 / 79tests passedNovember 4 rerun
Evidence and limits

@tanilo/x402-guard · 0.2.0 · released 2026-10-24

Problem
In 0.1.x, a payment at the agreed price was allowed to another recipient (when the terms named no payTo), in another mapped asset or on another mapped network. Found while replaying x402 #3866.
Change
0.2.0 adds asset_match and network_match: a mismatch is contradicted and stops the payment before it is created. A binding the terms entry doesn't name is reported as not_evaluated.
Verification
12 new tests, 11 of which fail on 0.1.1 (release notes). Run on 2026-11-04: 79 of 79 pass at 543a911.
Limit
The binding checks run in the local guard and are not in the signed receipt. With the default onNotEvaluated: "allow", an undeclared recipient, asset or network does not by itself stop a payment.

Price rule

Get the same answer in two languages.

An independent Python implementation and Tanilo’s JavaScript implementation agreed on every published case.

97 / 97cases agreedNovember 4 rerun
Evidence and limits

contract-price-match/v0.1 · spec 4401b60

Problem
A price check that gives different answers in different places can't be relied on.
Change
A published rule with 97 CC0 test vectors, and an independent Python implementation contributed by another developer.
Verification
Run on 2026-11-04: JavaScript suite 97 cases, 618 assertions, 0 failed; Python implementation agrees on all 97. Rule and vectors.
Limit
It checks only the terms the caller supplies. It does not convert units or currencies, and verified does not authorize a payment.

Signing keys

Refuse a receipt signed with a test key.

Tanilo removed the public test key from its production key sets. The updated verifier refuses test keys by default.

541tests passed · 1 skippedNovember 4 rerun
Evidence and limits

tanilo-receipt-verify · 0.2.4 · 2026-10-16

Problem
A fixture key whose private key is public was listed in the production key sets, so a verifier could accept a signature anyone could make.
Change
The key was taken out of the production key sets; at 2026-10-16 19:05:02 UTC it was confirmed absent from all three. Verifier 0.2.4 refuses test keys by default.
Verification
Run on 2026-11-04: 541 passed, 1 skipped at f3f885e. Account on the trust page.
Limit
Copies of the key set downloaded before the removal still contain the key; verifiers older than 0.2.4 do not refuse it.

Claim assessment

Hold when a checker fails.

The October release requires each claim-producing checker to return a usable answer before the gate can return act.

halton checker failureOctober 28 release report
Evidence and limits

/evaluate · integrity release · 2026-10-28

Problem
Before this release, a checker that failed could be excluded from the agreement calculation, and the remaining checkers could produce act. Long input was cut to 4,000 code units without saying so, and URL input was fetched and evaluated raw.
Change
act now requires a usable answer from every claim-producing checker; otherwise the mapping returns halt. Input over 4,000 UTF-16 code units is refused with 413 input_too_long; url is refused with 422; without usage accounting the endpoint answers 503 and calls no provider.
Verification
As reported in the changelog entry for 2026-10-28. Not re-run on 2026-11-04: probing /evaluate would make model calls.
Limit
The results are model judgments. Requiring every checker to answer does not establish that the assessment is correct, and receipts issued before the release are unchanged.

Reported by others

Reruns outside Tanilo

These results were reported by other people. They were not re-run on 2026-11-04.

  • One builder reproduced our canonical receipt bytes on shared test files (spec README, implementations).
  • Two implementations have reported results on the rev9 evidence-pinning corpus (rev9 fixture README); another contributor reported rerunning both against eight proposed additional vectors (frozen results, 2026-10-07).
  • The independent Python implementation of the contract price rule was contributed by another developer; its agreement on all 97 vectors was re-run on 2026-11-04 (above).

Integration surfaces

How it connects

Published packages and endpoints. Versions as of 2026-11-04.
SurfaceWhat it isWhere
HTTP APIPOST /v1/verify-facts (deterministic) and POST /evaluate (model-based), free beta, rate-limited, no key. Inputs are validated and refused with a named error instead of being cut.Docs
MCPtanilo-mcp 3.1.0, run with npx tanilo-mcp.npm ↗
Payment guard@tanilo/x402-guard 0.2.0: price, cap, asset and network checks before an x402 payment is created; local or signed mode.Docs
Verifiertanilo-receipt-verify 0.2.4: offline Ed25519 verification; refuses test keys.PyPI ↗
Spec and vectorsReceipt format, check rules, conformance vectors and reproducible examples.GitHub ↗

The IETF Internet-Draft draft-krausz-verification-state is an individual submission. It has not been adopted or approved by the IETF. Historical benchmark figures on the benchmarks page describe earlier pipelines and are not current accuracy claims.

Tanilo · TK Collective LLC

What do you need checked?

Scope, deliverables, acceptance criteria and price are agreed in writing before any paid work starts.

Contact Tanilo