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
- 01 · eventAgent acts. Event canonicalised and hybrid-signed at write time.
- 02 · chainEvent links to the previous one; head_index increments.
- 03 · hourHour closes. Merkle root computed over that hour's leaves.
- 04 · dayDay closes. Daily root computed over 24 hourly roots and sealed.
- 05 · anchorDaily root submitted to OpenTimestamps; Bitcoin confirms it.
- 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 rootPayloads 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.