Architecture

Boring cryptography, composed so that lying stops being possible

Nothing here is novel — that's deliberate. Every primitive has been reviewed for a decade or more. The engineering is in the composition and in refusing every shortcut that would require you to trust us.

Write timeCanonicalise, then sign

Every agent event is serialised deterministically so two honest implementations produce identical bytes, then signed with a hybrid Ed25519 + ML-DSA-65 pair. Classical security today; lattice-based security against an adversary who records now and decrypts later.

Per agentHash-chain the sequence

Each event commits to its predecessor and carries a monotonic head_index. Deleting or reordering a single event invalidates every event after it — there is no quiet excision.

Hourly · dailyFold into Merkle roots

Events become hourly Merkle roots and hourly roots become one daily root, using RFC 6962's domain-separated construction (0x00 leaves, 0x01 nodes). Thirty-two bytes commit to millions of events.

Once a dayAnchor outside our control

The daily root is timestamped into Bitcoin via OpenTimestamps. Rewriting a sealed day would require rewriting a public chain secured by an economy — a threat model we don't have to argue about.

Any timePublish a self-contained bundle

Seals, hourly roots, reconciliation artifacts and the .ots proof ship as a single archive. It contains everything a verifier needs and nothing that identifies your payloads.

ForeverVerify without us

truthlayer-ledger-verify is MIT-licensed and published. An auditor runs it offline against the bundle. Our servers, our company and our goodwill are all irrelevant to the result.
The chain of custody

From one agent action to a Bitcoin block

  1. 01 · eventAgent acts. Event canonicalised and hybrid-signed at write time.
  2. 02 · chainEvent links to the previous one; head_index increments.
  3. 03 · hourHour closes. Merkle root computed over that hour's leaves.
  4. 04 · dayDay closes. Daily root computed over 24 hourly roots and sealed.
  5. 05 · anchorDaily root submitted to OpenTimestamps; Bitcoin confirms it.
  6. 06 · auditAnyone downloads the bundle and re-derives every step offline.

The honest boundary: ConstatVault proves what was recorded, when, and that it hasn't changed since. It does not prove that the agent's decision was correct — no cryptography can. It makes the record of that decision impossible to revise afterwards.

Integration

One SDK call at the boundary you already have

Evidence is created where the action happens, not scraped from logs later. Most teams instrument in an afternoon.

from constatvault import Vault

vault = Vault(tenant_id="tnt_acme", agent_id="agt_settlements")

vault.record(
    action="wire.transfer.approve",
    subject="INV-88213",
    authority="policy:treasury.v7",   # under whose rule it acted
    inputs={"amount": 41250.00, "ccy": "EUR"},
    outcome="approved",
)
# → signed, chained, and folded into today's Merkle root

Payloads can be hashed rather than stored, so the evidence layer never becomes a second copy of your sensitive data. What gets proven is the commitment, not the contents.

NextNow go break it — the live verifier