Skip to main content

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 index 19398597, 2026-07-13). Pass --tenant-pubkey (from /settings/audit or GET /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

There is no pre-built tracelane-audit binary yet. Its release workflow has never run on a tag, so releases/latest/download/tracelane-audit-… returns 404. Build from source with the command below — it is Apache-2.0 and reproducible. The signed-binary instructions further down describe how it will be distributed once that workflow runs, and do not work today.

Build from source (works today)

Pre-built binary (not yet published — see the warning above)

Four targets are built for each 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-musl
  • x86_64-apple-darwin
  • aarch64-apple-darwin
  • x86_64-pc-windows-msvc.exe
Each artefact will be Cosign-signed (keyless) + carry attested build provenance (GitHub 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

Without --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)

Sigstore Rekor v2 is a permissionless log: anyone can submit any well-formed entry and receive a real inclusion proof + checkpoint. So a “real Rekor entry” alone proves only that some body was admitted to the log — not that Tracelane admitted it. An attacker could take a tampered chain, sign it with their own ECDSA key, anchor it, and get a genuine, publicly-queryable log index. --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.rs resolver is in place; the V1.1 cleanup job will be the first caller).