Skip to content
Lugano Labs Discuss a project

What should an agent receipt be able to prove?

We called our first agent receipt attested. Its verifier never checked the hardware evidence that word implies, so version 0.2 drops the word, and every receipt carries a signed list of what it leaves unchecked.

Lugano LabsEditor: Brian D. EvansDraft specification v0.28 min read

In short. A v0.2 pass prints ARTIFACT CHECKS PASSED, never VERIFIED, and means only that keys you chose signed these bytes in a fixed format and logged them under one root. Whether the agent did what the receipt says needs a named observer, which no format supplies by itself. Before you trust any agent receipt, ask which key signed it, whether you chose that key, and who watched the events.

What this is. A report on our own receipt format. We wrote the v0.2 specification and offline checker, reviewed them internally on synthetic fixtures, and compare them with our first draft, published standards and prior work. The code, tests and review results are on GitHub.

Contents

Our first receipt was called attested, though nothing checked hardware evidence

Our first agent receipt, a signed record of an AI agent’s work, was called attested, though its verifier never checked the hardware evidence the word implies. Its successor, Signed Agent Receipt v0.2, can prove only that keys the recipient chose signed its bytes in a fixed format and logged them under one signed root. Every statement signed under it carries a scope object that marks five properties as unchecked: [10]

  • not-implemented for attestation and observation;
  • not-measured for retention;
  • not-authenticated for time;
  • not-checked for history.

We named that first draft, v0.1, the Attested Agent Receipt and dated it 20 October 2026. Its attestation slot, for evidence a chip signs about itself, was meant for a device certificate chain or a vendor quote. [1] In the prototype’s made-up sample it held only the signer’s bare public key, and the verifier reported its vendor or manufacturer root check as not implemented. [2] [9]

The same verifier passed a signed receipt with almost every field missing. [8] In a synthetic eight-leaf tree, it also computed the wrong root for valid proofs at four of the eight positions we tested. [6] [9] Our verifier essay takes those failures apart.

By 2 November the word was gone. [10] The v0.2 README says the format isn’t called attested because it validates no hardware roots, appraises no runtime and establishes no remote-attestation result. [11]

Both versions reuse Ed25519 signatures and Certificate Transparency’s Merkle hashing rather than inventing their own. [1] [10] A related framework, in-toto, checks a software supply chain through signed steps and a signed layout. Its assumptions fit that chain, and its results stop short of an agent’s private work. [7] What a format adds is its choices about which checks run, on which bytes, and what the result says about everything else.

A v0.2 pass means keys the recipient chose signed and logged these bytes

Trust comes from the recipient, not the receipt. The recipient hands the checker two trust files, one of issuer keys and one of log keys. The offline checker reads only the files it’s handed and calls no outside service. [10] [11]

Issuer and log keys must differ, and the internal review found a bug in that rule. An early v0.2 build compared the keys as text, so one key in two encodings could pass as both issuer and log. The fixed code compares them in one canonical form and rejects the bypass we tested. [12]

Canonical JSON (RFC 8785) gives each document one byte form, yet it still tells programs to check signed input against their own rules before acting on it. [3] Version 0.2’s fixed schema is that check.

A record that repeats a JSON member name fails, even when an escape sequence disguises the repeat. Integers must travel as decimal strings, and a bare JSON number is rejected outright rather than rounded. Each set of signing bytes starts with a label naming its role, so a signature made for the issuer can’t pass as the log’s. The checker then verifies both Ed25519 signatures. [10] [11]

A pass prints ARTIFACT CHECKS PASSED, and the specification says the checker never prints VERIFIED. A pass also prints what it doesn’t establish, including whether: [10]

  • the issuer told the truth;
  • it recorded every event;
  • it used a measured runtime;
  • it deleted anything;
  • the time is trusted;
  • successive roots form one history.

Most of that list also sits in the signed scope object. The receipt’s four inventory lists may be empty, even though every field is required. So a receipt that lists nothing still passes, and the result no longer suggests otherwise. [10]

The v0.1 files and their dated failure transcripts stay unchanged. The two versions are deliberately incompatible, and no v0.1 receipt may be relabeled as v0.2. [10] [12]

An internal review, done with AI agents’ help, checked v0.2 against deterministic synthetic fixtures and a separately written set of adversarial tests. [11] [12] Its record lists the commands, the cases covered, the failures found during the review and their rechecks. No outside cryptographer has reviewed v0.2. [12]

This site publishes the specification, README and review record, not the source code, tests or raw results. So you can read the contract and the record, but you can’t rerun the tests or check their results. [12]

Every field is the issuer’s claim until something else checks it

Each field records what the issuer says happened, and checking it takes evidence from outside the receipt. The v0.1 draft proposes fields including these, in an illustrative example that comes from no customer run, public log or attestation deployment. [1]

  • the software: a runtime and its claimed binary measurement, proposed attestation evidence, and claimed model and policy hashes;
  • the tools: each tool’s artifact hash and stated preflight verdict;
  • the network: a ledger of destination hosts, byte counts and policy decisions;
  • the files: hashed paths and operations;
  • the money: payment methods, merchants and salted hashes of amounts.

A model hash names bytes the issuer says it loaded, and a preflight verdict records an earlier check, not what the tool did later. The draft never defines how to capture every event across every outside service. [1]

The retained field, the issuer’s stated count of prompt or output bytes kept after the run, is the clearest case. The draft requires zero for a conformance claim, but that zero is only the issuer’s word, with no inventory of remote providers, caches, logs or backups behind it. The v0.1 code simply checks that the supplied value is zero. [1] [2] Neither version observes an agent or proves deletion, and v0.2’s scope object marks retention not-measured. [2] [10]

Leaving data out doesn’t make the rest safe. Dropping prompts and file contents closes one route for leaks, but merchants, destinations, exact times, counts and path hashes can still identify the matter. [1] Our private-verification essay works through what these fields give away.

One signed root proves one snapshot, not time or history

Version 0.2 checks only whether this statement sits under this signed root. [10] A signed root is a snapshot of one moment, like a photo of a guest book. The photo shows your name, but not when you signed or whether a page was later torn out.

Certificate Transparency (CT) adds time and history. Each signed root in CT carries a timestamp, and CT pairs inclusion proofs with consistency proofs, which show that today’s log still holds everything yesterday’s did. [4] Our first draft copied CT’s Merkle hashing and inclusion proofs, but none of the timing or monitoring that makes CT useful. [1] [4]

A v0.2 receipt has no timestamp at all. Neither the statement nor the signed root carries one, and the scope object marks time not-authenticated. [10]

Nor can one root show that everyone saw the same history. Catching that takes consistency proofs, comparisons of signed roots and independent monitors. Our offline checker runs none of them, and the scope object marks history not-checked. [4] [10] And no log, CT’s included, can show that every run reached it, or who watched the events.

An attested receipt needs a checked chain from chip to observed action

Version 0.2 marks attestation and observation not-implemented, and we’ll call a receipt attested again only when something checks the device or runtime behind it. [10] Without a vendor or manufacturer root check, the v0.1 verifier trusted only the keys in its trust store. [1] [2] RATS, the IETF’s remote-attestation architecture, leaves three choices to the parties that appraise and rely on such evidence: the appraisal policy, the reference values and freshness. [5]

An attested receipt would need a chain of three checked links. The accepted evidence must tie to a measured component, that component to the receipt’s signing key, and the receipt to the observed action. A device can guard the signing key, but the key alone doesn’t say who collected the events or make the ledger complete.

Take one small claim, before adding any roots: a run’s only outbound request went to a permitted registry. Backing it would take four things: [5]

  • a defined event interval, and the processes and network routes it covers;
  • an observer that can challenge the issuer’s account;
  • a binding from that observer’s event record to this receipt and policy version;
  • challenge and audience rules, which stop anyone replaying old evidence.

Even then, the observer sees only part of the picture, and our private-verification essay maps what it misses. Broader claims, about execution or erasure, need broader evidence, not a stronger adjective on the same record.

Only the first of four questions has a cryptographic answer

Before you rely on an agent receipt, ours or anyone’s, ask four questions in order.

  1. Which key signed it, and did you choose that key?
  2. Which claims may that key make?
  3. Who watched the events, and what could they miss?
  4. Who else will read the fields, and what could they infer or link from them?

Only the first has a cryptographic answer, and the v0.2 checker is built to give it. The other three are human decisions, about authority, observation and disclosure. A receipt can name them but can’t make them for you. [10]

They take real engineering: getting and confirming keys outside the receipt, rules for which issuers may make which claims, rotation and revocation, and your own policy on time and scope. Someone also has to run the log, decide how long it keeps entries, check its consistency and settle conflicts between its signed versions.

On fields, our bet is that fewer is better. Each field should name who observed it and what question it serves. A record from one observer, cut to what one audit decision needs, should reveal less than a full trace and still let a reviewer catch an account that conflicts with the evidence.

The test on our proposed-studies page, designed but not yet run, could prove that bet wrong. If minimizing adds material errors a reviewer won’t accept, or fails its declared privacy measure, our field policy is wrong. Even a win would leave open whether this format beats a conventional export, minimized just as far.

Scope and limits

What we did
We wrote the v0.2 specification and checker, and tested them internally with deterministic synthetic fixtures and a separately written set of adversarial tests. The review record lists the commands, cases, failures and rechecks. We compared v0.2 with the v0.1 draft, whose example is illustrative, and with its verifier.
What we didn’t do
We haven’t published the v0.2 source code, tests or raw results, so the review can’t be rerun or inspected from this site. No outside cryptographer has reviewed v0.2; the review was internal and agent-assisted. The checker simulates no agent, and runs no log service, consistency proof or monitor.
What this can’t tell you
Whether a receipt’s events happened or its data was deleted. A pass means only that chosen keys signed these bytes in a fixed format and logged them under one root; a receipt listing nothing still passes. An observer sees only part of a run; its record must show the gaps.
Confidence
High that v0.1 failed as described; its code and transcripts are published. High that v0.2 passed its recorded cases, on our own runs that readers can’t repeat. Lower that no defects remain: no outside cryptographer has reviewed v0.2. The CT, RATS and in-toto comparisons are design reasoning, not tests.
What would change our view
An outside review finding a flaw in v0.2. The test on our proposed-studies page: if a minimized record adds material errors a reviewer won’t accept, or fails its declared privacy measure, our field policy is wrong. A win still leaves open whether this format beats an equally minimized conventional export.
Corrections
We log every correction, with its date, on How we work. Send one through a research enquiry.

The open question

Which observer, bound to the receipt in which ways, would let a receipt claim that an agent’s only outbound request went where policy allowed?

The Signed Agent Receipt v0.2 specification and the design of its offline checker, with a summary of an internal review; the checker’s code, tests and fixtures are on GitHub, under the Apache 2.0 license. The test that could change our field policy, richer against minimized records from one observer, is written up on our proposed-studies page.

Discuss this question

Source materials

These documents describe the receipt format and its checker, for closer review. The source code, tests and fixtures are on GitHub, at Lugano-AI/signed-agent-receipt. These are research artifacts, not evidence of a deployed service.

References

A selected review of published sources, with Lugano’s analysis and proposed work identified in the text. Source dates and conditions matter; historical results are not current-model rankings.

  1. 1

    Historical v0.1 — Attested Agent Receipt (AAR) v0.1

    Lugano Labs · 2026

    Proposed local receipt format, illustrative fields, verification rules, trust model and privacy limits.

    Scope. Draft material; its example is synthetic and one signed-message sentence conflicts with the canonical-body description and verifier.Back to the essay

  2. 2

    Historical v0.1 — AAR reference verifier

    Lugano Labs · 2026

    Offline Node prototype checks a supplied signature, signed tree head, inclusion proof and retained field against supplied inputs; attestation-root validation is skipped.

    Scope. Code for supplied inputs and a limited canonicalization subset; it observes no runtime, establishes no event completeness and proves no deletion.Back to the essay

  3. 3

    RFC 8785: JSON Canonicalization Scheme (JCS)

    Anders Rundgren, Bret Jordan and Samuel Erdtman · 2020

    Informational specification of deterministic JSON canonicalization and guidance on checking application data before action.

    Scope. Specifies representation, not the truth of receipt claims, key governance or runtime observation.Back to the essay

  4. 4

    RFC 9162: Certificate Transparency Version 2.0

    Ben Laurie, Eran Messeri and Rob Stradling · 2021

    Experimental protocol describing certificate transparency, signed tree heads, inclusion proofs and consistency proofs.

    Scope. Concerns certificate logs; it does not establish that a proposed receipt log is deployed or complete.Back to the essay

  5. 5

    RFC 9334: Remote ATtestation procedureS (RATS) Architecture

    Henk Birkholz et al. · 2023

    Informational architecture distinguishing attesters, verifiers, relying parties, appraisal and freshness.

    Scope. Architecture alone does not validate this prototype’s roots, measurements, event binding or runtime effects.Back to the essay

  6. 6

    Receipt verifier proof check

    Lugano Labs · 2026

    Read-only synthetic eight-leaf Merkle proof check with independently constructed tree, reproduction steps and outputs.

    Scope. A targeted synthetic check; it does not establish performance across all cases or test invalid-proof acceptance, runtime observation or a production system.Back to the essay

  7. 7

    in-toto: Providing farm-to-table guarantees for bits and bytes

    Torres-Arias et al. · 2019

    Prior art for authorized signed statements and policy-governed verification of software artifact flow.

    Scope. Different domain and threat model; not proof of private agent-event observation or erasure.Back to the essay

  8. 8

    Internal synthetic verifier artifact checks, 2 November 2026

    Lugano Labs · 2026

    Dated method/results record with a portable read-only runner and machine-readable transcript, Node version, unchanged verifier hash, explicit local-key assumptions, fixture outcomes and selected input-constraint checks.

    Scope. Internal bounded synthetic checks; no external human review, full conformance or security audit, invalid-proof acceptance study, real execution, trusted event time or retention observation.Back to the essay

  9. 9

    Synthetic verifier-check result transcript

    Lugano Labs · 2026

    Raw per-check exits and output, eight expected/actual roots, Node version and subject hash; contains no generated private keys or machine-specific paths.

    Scope. Bounded internal synthetic record; not a complete conformance/security assessment, invalid-proof acceptance study, real-run observation or external human review.Back to the essay

  10. 10

    Signed Agent Receipt Reference Profile v0.2

    Lugano Labs · 2026

    Defines the restricted canonical JSON profile, exact signing bytes, required schema, external trust, bounded Merkle inclusion, and unsupported properties.

    Scope. A format contract; it does not establish real agent execution, privacy, or a deployed service.Back to the essay

  11. 11

    Signed Agent Receipt v0.2: README and checker guide

    Lugano Labs · 2026

    Describes the offline reference checker, its command line, its four result states and exit codes, its trust boundary and its deterministic synthetic fixtures, and explains why the profile is not called attested. The source code, tests and fixtures it describes are on GitHub, at Lugano-AI/signed-agent-receipt.

    Scope. The fixtures are test inputs, not observed tasks or a completed research study. No production readiness or external audit is claimed.Back to the essay

  12. 12

    Signed Agent Receipt v0.2: internal review record

    Lugano Labs · 2026

    Commands, coverage counts, defects found and fixes from an internal implementation review and a separately authored adversarial harness. The hashes and per-case results it cites sit in files this site doesn’t publish, and rerunning the commands needs source code and tests that it doesn’t publish either.

    Scope. Agent-assisted internal review, not independent external certification, formal verification, or evidence of runtime behavior.Back to the essay

About this report. First prepared 2 November 2026; revised 4 November 2026. This artifact research essay examines a draft specification or reference prototype. The experiment that could change its view is on our experiment designs page.

Our theses, sources, interpretation and study designs may change with new evidence and are open to correction. Send a research enquiry.

Download text

Lugano Labs Start a conversation

What would you like to work on?

A short note is enough. Please leave out credentials, secrets and sensitive source material.

What brings you here?

Choose one or more.