behalf · offline verifier
This page runs the behalf-verify verification core, compiled to
WebAssembly. The file you drop is read by JavaScript in your browser and handed
to the wasm module in memory. It is never sent anywhere — this page has no
upload code, no analytics, no fonts and no third-party requests of any kind.
run_*.jsonl in behalf.sh/export/v1 format — or pick one
Browsers block fetch() from file://. Either open the
single-file build dist/verify.html, which has the wasm inlined and
needs no server, or serve this directory:
python3 -m http.server -d verifier/web/dist.
Load the demo export — 47 receipts from a support-agent run that issues a refund
at step 31 — then break it. Each button below is one row of the tamper suite that
gates every commit to this repository (docs/export-format-v1.md §5).
leaf_hash the file declares. Nothing is re-serialised
first, so an edited byte cannot be normalised away.chain
value in the head, and the head's own signature verifies.behalf-verify log <dir> checks a
Tessera tlog-tiles directory: checkpoint note signature, entry bundles, RFC 6962
root recomputation, the stale-restore rule. That needs a filesystem and is
deliberately not in this build. Use the command-line verifier..wasm beside it, and — if you press one of the sample
buttons — the demo export from the same directory. Nothing else, from anywhere.
In the single-file build (verify.html) both are inlined, so the page
fetches nothing at all: one document request and then silence.
The wasm module here and the behalf-verify binary are built from one
Rust crate — the same verify_export, the same classes, the same exit
codes. What you see above is what the terminal prints:
$ behalf-verify run_c71e.jsonl ✔ 47/47 receipts intact chain head 7136…8958 $ echo $? 0 $ sed 's/1200.00/12.00/' run_c71e.jsonl > covered.jsonl $ behalf-verify covered.jsonl ✖ TAMPERED receipt 31: content hash mismatch (expected 66f9… computed cb44…) chain breaks at 31; receipts 32-46 unverifiable. $ echo $? 1
Exit codes are stable and documented: 0 verified, 1 tampering detected, 2 unverifiable — not a readable export.