14 / 1822 min read

Receipts or It Didn’t Happen

Replace confident status language with verifiable proof.

Completion is a claim

Agents are fluent at describing success. That makes status language cheap. ‘Implemented,’ ‘fixed,’ and ‘deployed’ should be treated as claims until evidence supports them. The receipt is the observable artifact that lets another person verify the claim without trusting the worker’s confidence.

Receipts can be test output, a commit, a screenshot, a live response, a database query, a sent-message identifier, or an installed application behaving correctly. The right receipt depends on the layer of the claim.

A receipt is the difference between ‘the agent says it worked’ and ‘the system can prove it.’

The proof layers

A local build proves that source compiles in one environment. A pushed commit proves shared source exists. A successful deployment proves a runtime accepted an artifact. A live browser check proves the public surface responds. An installed-app test proves the version a person actually uses behaves correctly. These layers are related, but none substitutes for the next.

Name the layer every time. This prevents a green local command from being presented as a shipped feature and keeps debugging focused on where the chain actually broke.

  • Source proof: changed files and reviewable diff.
  • Local proof: build, tests, and preview behavior.
  • Shared proof: commit, push, or shared artifact.
  • Runtime proof: deployment identifier and health response.
  • User proof: live page or installed application behavior.

Write exit criteria first

Before the worker starts, define what must be observable at the end. A vague objective encourages a vague receipt. A precise one—‘the Book dock link opens /book, all eight chapter routes return 200, and the mobile reader has no horizontal overflow’—turns verification into part of the build.

Exit criteria should cover the happy path, the most likely failure, and the surface the user actually touches.

Case file

proving a Cloudflare deployment reaches the reader

The website compiles locally and the deployment command reports success. Those are valuable receipts, but neither proves that calugaru-os.com serves the new manuscript. The deployment could target the wrong Worker, the route could be shadowed, an asset could fail at runtime, or the live reader could be unusable on mobile.

The proof ladder begins with the source diff and production build. It continues with the Worker version returned by the deployment, HTTP checks for the landing page and a chapter route, and browser verification of the actual reading flow: open the book, search for a chapter, navigate, copy the reusable artifact, and follow the next-chapter link. A mobile viewport checks overflow and touch targets.

The completion receipt binds every layer to the same candidate and includes any untested surface. If the deployment succeeds but the live chapter fails, the task stops at runtime or user proof instead of being reported complete from the green CLI message.

Decisions made

  1. 01Define the public reading flow before implementation and preserve it as a regression path.
  2. 02Capture the deployment version and verify routes against the intended live domain.
  3. 03Use both desktop and mobile black-box checks on the rendered interface.
  4. 04Report the first missing proof layer and remaining untested risk explicitly.

Production truth is a chain. Each receipt narrows uncertainty, but only evidence from the user-facing surface supports a user-facing completion claim.

Receipts improve recovery

Receipts are not just for accountability. They shorten recovery. A deployment ID, failing command, last healthy timestamp, and changed file list tell the next worker where to begin. Without them, every incident restarts as archaeology.

The control layer should attach receipts to the task and project state so the proof remains available after the conversation ends.

Failure mode: works on my machine

A common agentic failure is a perfect local story and a broken public result. The build passed, but the wrong branch deployed. The deployment succeeded, but the domain still serves an older version. The route loads, but the user’s browser holds a stale asset. Each step needs its own receipt.

Follow the chain from source to user. Stop at the first layer that lacks current evidence. That is the real state of the work, regardless of how many earlier checks passed.

Traces, receipts, metrics, and evals

Observability artifacts answer different questions. A trace reconstructs the path: model turns, tool calls, handoffs, guardrails, timing, and errors. A receipt supports a completion claim with user-relevant evidence. A metric aggregates behavior across runs, such as latency, approval rate, cost, or failure frequency. An evaluation judges quality against an expected outcome or rubric. Treating one artifact as all four leaves blind spots.

A complete trace can still describe a bad result. A screenshot can prove the page rendered without proving that the routing logic is correct. A high task-completion rate may hide destructive retries or constant human rescue. An evaluator score can drift if the rubric is vague or the test set does not resemble production. Layer the signals so one can challenge another.

Capture enough trace detail to debug decisions without collecting private reasoning or unnecessary sensitive data. Record tool names, normalized inputs where safe, outputs or hashes, handoffs, approval events, errors, duration, cost, and the final artifact. Attach a receipt that a user can inspect, then roll the run into operational metrics and an evaluation dataset.

  • Trace: how the system moved through the task.
  • Receipt: what evidence supports the completion claim.
  • Metric: how the system behaves across many runs.
  • Evaluation: whether the behavior and result meet a defined standard.

Build a golden task suite

An agent system needs regression tests for decisions, not only code. Start with a compact suite of real tasks: common successes, ambiguous requests, missing context, tool failures, dangerous instructions, stale data, long-running work, and recovery after interruption. Freeze the inputs that matter and write the observable outcomes plus prohibited behavior.

Evaluate at several layers. Deterministic graders can verify schemas, state transitions, allowed tools, source citations, side-effect counts, and final environment state. Rubric-based graders can assess relevance, completeness, and judgment. Human review remains important for high-context work and for auditing the graders themselves. Compare both the final outcome and the trajectory when the path carries cost or risk.

Every production incident and important correction should either become a new task or improve a rubric. Run the suite when prompts, models, tools, policies, context retrieval, or orchestration change—not just when application code changes. An agent’s behavior is a property of the whole system configuration.

Black-box and white-box proof

White-box verification inspects the internals: the diff, trace, tool arguments, state transitions, logs, and database records. Black-box verification approaches the system as a user or external observer: load the public URL, submit the form, receive the message, open the installed app, or query the production API. Both are necessary because internal correctness and external behavior can diverge.

The verification plan should mirror the claim. If the claim is ‘the public book is live,’ build output and deployment logs are intermediate receipts; the decisive check is an uncached request to the public domain plus a browser interaction on the rendered page. If the claim is ‘the worker never sends without approval,’ the trace and policy events matter because a successful user outcome alone cannot reveal a hidden unauthorized attempt.

Record who or what performed the check, against which version, from which environment, and at what time. A receipt without identity and version can go stale invisibly. Verification should also state what was not checked so the next operator does not mistake a narrow test for universal proof.

Across the business

What this looks like in other departments

The engineering principle stays the same; the workflow, risk, and proof change with the domain.

Customer support

Prove the issue is resolved

Do not stop at a drafted answer; verify the account state or customer outcome, record the action taken, and state what still needs confirmation.

Finance

Prove the books closed

Link reconciliations, exceptions, approvals, posted entries, control checks, and final balances instead of treating a completed checklist as sufficient proof.

Marketing

Prove the campaign shipped

Distinguish approved assets, scheduled jobs, published pages, working links, correct audiences, tracking signals, and measured outcomes.

Operations

Prove the physical outcome

Connect system updates to observed inventory, fulfilled orders, completed service, delivery confirmation, or another real-world receipt.

Technical deep dive

The observability and evaluation matrix

Connect individual-run evidence to regression quality and production reliability without collapsing distinct signals into one score.

  1. 01InstrumentEmit structured spans for routing, retrieval, model turns, tools, handoffs, approvals, verification, and errors with task, run, version, and environment identities.
  2. 02ProveSelect receipts that directly support each claim layer, including a black-box check at the surface named by the user.
  3. 03EvaluateGrade deterministic state and artifact properties, rubric-based outcome quality, and trajectory behavior on a representative golden task suite.
  4. 04AggregateTrack success, latency, cost, approval burden, retries, recovery, incidents, and evaluator distributions by job class and system version.
  5. 05LearnTurn incidents, user corrections, novel edge cases, and grader disagreements into new cases, sharper rubrics, or stronger deterministic gates.

Reference schema

identity: task_id + run_id + system_version + environment
trace: spans + tools + handoffs + approvals + errors + cost
receipt: claim + proof_layer + artifact + observer + observed_at
evaluation: case + rubric + grader + outcome + trajectory
metric: job_class + window + numerator + denominator + distribution
incident: impact + first_failed_layer + recovery + regression_case
risk: untested_surfaces + stale_evidence + known_limitations

Try it yourself

Build a receipt ladder

Choose one feature you recently called complete and identify the proof available at every layer.

  1. 1Write the source, local, shared, runtime, and user claims.
  2. 2Attach one observable receipt to each claim.
  3. 3Mark every missing or stale receipt.
  4. 4Verify from the lowest missing layer upward.

Reusable artifact

Completion receipt

A compact handoff from worker confidence to shared proof.

Task: [stable identifier and objective]
Changed: [files, records, or external state]
Local proof: [commands and results]
Shared proof: [commit or artifact]
Runtime proof: [deployment and health]
User proof: [route, screenshot, or observed behavior]
Remaining risk: [what was not tested]

Before you move on

Receipt checklist

  • Every completion claim names its proof layer.
  • Exit criteria are written before execution.
  • The final check reaches the surface the user touches.
  • Remaining risk is stated instead of hidden.

Primary sources

Further reading

Home
Book
Blog
Calugaru Labs
GitHub
LinkedIn
Email
Theme