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.

ConstatVault is the platform. It runs on two engines: TruthLayer, which captures and seals the ledger, and EvidenceVault, which turns a sealed record into a certificate. The two share no trust — EvidenceVault independently re-derives every Merkle root it certifies. (Constat, from the French constat d'huissier: an official, independent record of what happened.)

Write timeCanonicalise, then sign

Every agent event is serialised deterministically so two honest implementations produce identical bytes, then Ed25519-signed at write time. The hybrid ML-DSA-65 co-signature is applied when hours and days are sealed — classical security on the hot path, lattice-based security against an adversary who records now and decrypts later, without paying the post-quantum cost on every event.

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 and evidencevault-cert-verify are MIT-licensed and published — and provenance-verify re-checks both the ledger and the certificates in a clean-room implementation that shares no code with the platform, so a bug or tamper in our code cannot slip past it. An auditor runs any of them 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 Ed25519-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.

On the roadmap: qualified electronic timestamps and seals under eIDAS 2.0, so the same record carries an EU-recognised legal presumption alongside its Bitcoin anchor. The anchor already stands on its own; this adds a second, statutory footing.

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