Independent verification · the escalation path

Don't trust the page. Don't trust us. Trust the math.

The verdict page renders results from Rubric's endpoint — convenient, but you're taking our server's word. If your job is to not take anyone's word — you're an examiner, opposing counsel's expert, an acquirer's security team — escalate a rung.

Rung 1 · Raw data

Read what the endpoint actually returns. No rendering.

$ curl https://rubric-protocol.com/verify/v1/verify/tree/<attestation-id>

Public, no key. Every signature result, every lineage link, every ledger timestamp — machine-readable.

Rung 2 · Your machine, our code — inspected first

Run the standalone verifier. Rubric is not in the trust path.

# requires Node 18+ · source: github.com/0xsims/rubric-verify
npx @rubric-protocol/verify <attestation-id>

The tool's only baked trust is a pointer to one message on the public Hedera ledger (topic 0.0.10416909, seq 276123) that only Rubric's operator account could have written. It derives the federation's signing keys from that ledger entry, checks every ML-DSA-65 signature itself, walks the lineage, and cross-checks every record against its on-chain anchor. Hand it records from a hostile source — every cross-reference is hash-bound, so the source cannot lie undetected: --dir ./records verifies local files with the same rigor.

Read the source on GitHub →
Rung 3 · Recompute the ledger anchor from scratch

Rebuild the Merkle chain yourself. Forty lines, no Rubric code.

# requires Python 3 · no dependencies
curl -sO https://rubric-protocol.com/docs/verify-apa.py
python3 verify-apa.py proof.json

Records are anchored in two hops: leaf to batch root, batch root to the aggregate root published on Hedera. This verifier reimplements both from the published specification — it shares no code with the node that produced the anchor — then reads the on-chain value directly from Hedera's public mirror node and compares. The only Rubric input is the proof package, which anyone holding an attestation can hand you.

It also refuses to overstate. Anchors written before 2026-07-30 under tree version 2 bind the number of batches rather than their contents (RUBRIC-SEC-2026-001, found by writing this very tool). The verifier reports those as partial and exits non-zero rather than showing a green check. A verifier that cannot fail is not a verifier.

Run it against a sample anchor →
Rung 4 · The records outlive us

If Rubric disappeared tomorrow, everything still verifies.

The signing keys are committed to a public ledger. The attestations are anchored to it with consensus timestamps no operator can rewrite. The verifier is open source. Nothing in the verification path requires Rubric to exist — that is what generator-independent means, and it is the entire point.