tracelane-audit verifier CLI
Wraps the shipped tracelane-audit-verifier Rust crate
with an argument parser, an HTTP fetch step, and PASS/FAIL rendering.
What the verifier checks — all offline. Three independent layers, none requiring a network call: (1) the per-tenant SHA-256 hash-chain replay + Merkle-root recomputation; (2) the per-batch Ed25519 signature against the workspace’s own public key (--tenant-pubkey); (3) for anchored batches, the Sigstore Rekor v2 inclusion proof + signed checkpoint against the pinned public-log key, verified from the bundle exported with the ledger. Layers 2 and 3 are live in production (first public anchor: log index19398597, 2026-07-13). Pass--tenant-pubkey(from/settings/auditorGET /v1/audit/pubkey) to verify anchors: it is the trust root that makes a real-but-forged Rekor entry fail (see Forgery resistance). Without it, the chain + Merkle structure still verify and anchors are reported unverified.
Install
Build from source (works today)
Pre-built binary (not yet published — see the warning above)
v*-audit-cli release tag. No such tag has
been cut yet, so these artefacts are not downloadable today — build from source
(below) until the first tagged release:
x86_64-unknown-linux-muslx86_64-apple-darwinaarch64-apple-darwinx86_64-pc-windows-msvc.exe
attest-build-provenance) + a CycloneDX SBOM. A verified
SLSA Level 3 attestation is not claimed — the slsa-github-generator job exists
but its final step does not currently succeed. See
SECURITY.md.
From source
CLI surface
Exit codes
A CI gate or auditor script should treat only
0 as a pass. 3 is the honest state of a ledger nobody outside Tracelane has witnessed yet.
Usage examples
Online — typical workspace audit
Offline — verify a previously-exported NDJSON
--tenant-pubkey the anchor layer does not run at all, so a forged anchor would not be caught. The verifier therefore exits non-zero with INCOMPLETE when a ledger carries anchor records and no trusted key was supplied. Obtain the key out-of-band (dashboard Settings → Audit signing key, or GET /v1/audit/pubkey) — never from the export you are auditing.
All verification is offline from the exported bundle — Rekor anchoring
is verified from the inclusion proof + signed checkpoint carried in the
NDJSON, so no live network call to Sigstore is needed even for the
transparency-log layer. --offline additionally skips the anchor
(inclusion-proof) layer entirely, leaving only the hash-chain replay +
Merkle recomputation — use it for an air-gapped chain-integrity check
that does not, on its own, satisfy the Article 12 transparency-log
obligation. To verify anchors, pass --tenant-pubkey (the trust root);
without it the anchor layer is reported unverified.
JSON output for piping
Forgery resistance (--tenant-pubkey)
--tenant-pubkey is the trust root that closes this. It is the
workspace’s Ed25519 key, delivered out-of-band via a channel you already
trust (/settings/audit or GET /v1/audit/pubkey) — never taken
from the anchor bundle. The verifier accepts an anchor only when the
batch’s Ed25519 signature verifies against this key, and that signature
cryptographically binds the anchor’s ECDSA key, anchor state, and log
index. The published conformance vector forged-anchor.ndjson is a
genuine, publicly-queryable Rekor entry an attacker planted with their
own key over a tampered chain; run it through the verifier with the real
--tenant-pubkey and it is rejected (untrusted_tenant_key, exit
1), while the legitimately-anchored anchored.v1.ndjson passes
(anchors_included = 1). (--pinned-pubkey is a separate, legacy pin of
the log’s own signing key for self-hosted Rekor; the public-log key is
already pinned in the verifier.)
Integration patterns
CI gate: verify every release against the last 24h
Slack alert on FAIL
Troubleshooting
V1.1 follow-ups
tracelane-audit export --format pdf(regulator-ready conformance packet PDF).- Type-system-level export retention enforcement (the
audit_retention.rsresolver is in place; the V1.1 cleanup job will be the first caller).