Evenbead docs

Audit anchors

Every Evenbead company keeps a hash-chained audit log: each event's SHA-256 hash covers the event and the hash before it, so changing any event changes every hash after it. A chain alone cannot show that the newest events were not removed, or that the whole chain was not recomputed by whoever runs the database. Daily anchors close that gap. (Dated 2026-10-13; ADR-0066 §4.)

What happens every day

  1. Evenbead reads every company's and every firm's chain head (the last event's sequence number and hash) and re-verifies each chain.
  2. It builds a Merkle tree over the heads (leaf SHA-256(0x00 || "company:<id>:<seq>:<hash>"), inner node SHA-256(0x01 || left || right), an odd node carried up unchanged) and signs a small record (the root, the number of chains, the time, the previous anchor's hash) with an ed25519 key made only for this.
  3. The record, its signature and the heads are written to Backblaze B2 with an Object Lock in compliance mode for 400 days: nobody can change or delete them in that time, Evenbead included. A copy goes to a local append-only log.

Public keys

DeploymentKey ided25519 public key (raw, base64)
app.evenbead.com842ced0225c5c9ef/CYfX1s4j42Eag87pUeTY7tXUxvQQwxanrwQ0zfGhro=
staging (internal)62699522f360edabiHjcDfR6iVHxu5kngEOzx9rx4rv/lNBn996+dvPdZ10=

A key change is announced here with its date; anchors made with an older key keep verifying with it.

Your proofs

In the app: Settings, Audit anchors, then Download all proofs. Over the API: GET /v1/company/audit-anchors (MCP tool get_audit_anchor_proofs). Each proof holds the signed record, your chain's head at that time, and your leaf's Merkle path. It holds nothing about any other customer. Your books export also carries them (tables/audit_anchor.jsonl, tables/audit_anchor_leaf.jsonl).

To check one by hand: rebuild the leaf hash from your company id, head_seq and head_hash; fold the path into the root; check the signature over record_text with the key above; then look up event head_seq in your chain (audit/chain.jsonl in an export) and compare its hash. With the Evenbead source: bun run anchors verify --export <unzipped export> --public-key <key>.

What it proves

  • Your audit log, up to each anchored event, existed by the time of that anchor and has not been changed, reordered or shortened since. Rewriting any event at or before an anchored head changes that head; the locked copy and your downloaded proofs still show the old one.

What it does not prove

  • That what was recorded was true, or that every action was recorded.
  • Anything after the latest anchor (up to a day).
  • Anything once the 400-day lock has passed and you kept no proofs.
  • An independent time: the signature shows Evenbead made the record; the upload time is Backblaze's, not a public timestamp authority's.

After a company is deleted

The company's own chain is deleted with it. Anchors and the deletion record keep its id and its last head, so the firm's records and earlier anchors that name the company stay verifiable.