I was on a call last year with a founder whose support agent had just issued a $1,200 refund. The customer came back two weeks later and said the agent had promised something else. The founder pulled the logs. The customer pulled a screenshot. Both were right, depending on which version you believed. That was the day I started writing the first lines of Marturia.

Existing tools already tell you what an agent did. Datadog, Langfuse, Honeycomb—they surface tokens, latency, tool calls, and prompt versions. That is enough for debugging and cost control. It is not enough when the question changes from “why was latency high?” to “can you prove this exact decision was made by this exact model on this exact tenant’s data at this exact time?” Logs can be edited, timestamps can drift, and a single compromised service account can rewrite history. Audit-grade evidence needs to survive that threat model.

I ran a simple thought experiment. What if every agent action produced a receipt that: - was signed with a key the tenant controls, - was chained to the previous receipt so nothing could be inserted or deleted, - could be verified by anyone with a public command, and - carried a Merkle root that was periodically anchored to a public ledger.

That is the narrow problem Marturia solves. Nothing more.

How it actually works

An agent calls marturia.log(decision) after it takes an action. The library hashes the decision payload, signs it with an Ed25519 key scoped to that tenant, and appends it to a per-tenant hash chain. Every N receipts the current chain head is included in a Merkle tree whose root is cosigned by a set of witnesses. The resulting receipt is returned to the caller and can also be fetched later by receipt ID.

sequenceDiagram participant Agent participant Marturia participant Witness Agent->>Marturia: log(decision) Marturia->>Marturia: sign + append to chain Marturia-->>Agent: receipt Marturia->>Witness: periodic Merkle root Witness-->>Marturia: cosignature

A customer who later disputes the action can be given the receipt ID. They (or their auditor) run:

pip install marturia-verify
marturia-verify --receipt-id abc123 --tenant-key public.pem

The command walks the hash chain, checks the signatures, and confirms the Merkle anchor. No Marturia account is required for verification.

We kept the scope small on purpose. Marturia does not store prompts, does not replay executions, and does not attempt to explain why a model chose one path over another. It only answers: “Was this decision recorded, and has the record been altered since?” If you need richer tracing, keep using the tools you already have; just emit a Marturia receipt at the points that matter for disputes.

The bet is simple. As agents move from “suggest a reply” to “refund the customer, cancel the subscription, and open a ticket with the carrier,” the cost of a disputed action rises. When that happens, cryptographically verifiable receipts stop being a nice-to-have and become the cheapest way to close the ticket.

Closed beta is open now. You can start emitting receipts in about fifteen minutes:

If the problem I described on that call sounds familiar, try it. If it does not, you probably do not need us yet. Either way, the receipts are there when the question eventually arrives.

Related Marturia resources - /docs/quickstart.html - /learn/ - /docs/