The Receipt Beats the Promise: Shipping an AI Fix That Proves Itself
Every AI coding assistant ends the same way: "Done! I've fixed the issue." Sometimes it has. The problem is that the sentence looks identical either way — and if you've worked with these tools long enough, you've learned that "exited successfully" and "worked" are different claims.
attune-ai 11.2.0 ships attune fix, and its design rule is one
sentence: a successful workflow exit is never sufficient proof
that a done condition was satisfied. You state the outcome and
how to verify it; the tool has to produce a receipt.
The contract
attune fix "exactly 100 units should price as bulk" \
--workflow fix \
--scope scratch_pricing \
--probe "pytest scratch_pricing/pricing_suite.py"
Three statements, all yours: the goal in your own words, the scope
the diff must stay confined to, and one or more probes — any
command whose exit code verifies the claim. Run bare, that renders
a preview of the contract and executes nothing. Add --run and the
fix executes — and then the part that matters happens.
The receipt
After the fix agent finishes, the CLI re-runs every probe itself, in a real subprocess, and takes its verdict from those exits — not from the agent:
workflow finished (success=True) — verifying independently...
🧾 Fix receipt
Changes made (attributed to this run):
- scratch_pricing/pricing.py
Probes (evaluated independently):
- [PASS] pytest scratch_pricing/pricing_suite.py (exit 0, 2902ms)
Safest next action: review the attributed diff and commit
receipt reflects independently evaluated probes — workflow exit was not trusted
Attribution is measured against a snapshot taken before the run, so your own in-flight edits are listed separately and never blamed on the agent. Scope is enforced twice — a guard denies out-of-scope edits at tool-call time, and the receipt re-checks the diff afterward. A probe that can't run records SKIPPED with a reason; it never silently counts as a pass.
The receipt lied once — and that's the good part
Two days before release I asked for a cold review of the surface: run it like a first-time user, before reading any docs. The reviewer copied the demo fixture into an untracked scratch directory — the most natural thing in the world — and got this:
Changes made (attributed to this run):
(none — this run changed no files)
Safest next action: nothing to commit — this run changed no files;
the done conditions were already satisfied before it ran
Which was false. The fix had landed; the probe had passed. The receipt — the component whose entire job is honesty — was wrong on the happy path.
The cause was a quiet git behavior: git status --porcelain
collapses an untracked directory to a single dir/ entry,
identical before and after the run, and a directory can't be
content-hashed. So inside an untracked scope directory, nothing
was attributable, and the receipt concluded nothing had happened.
Worth pausing on: our own live-fire dogfood run had passed cleanly,
because it used a scratch copy that was its own git repository —
where git lists files individually. Same command, same flags; the
only difference was where .git sat. The receipt had been proven
for one git topology and trusted for all of them.
The fix expands directories to per-file hashes at baseline and rescans them afterward, so created files are attributed too. It shipped with a regression test that seeds exactly that untracked scratch directory — and the false receipt is now impossible to reproduce.
I'm telling this story rather than burying it because it's the thesis, demonstrated on ourselves: the tool that says "trust the receipt, not the promise" had a receipt bug, and it was caught by running the real thing cold — not by the 91 unit tests that were already green. Receipts beat promises all the way down.
Composing the contract without typing paths
In a Claude Code session, the /fix skill gathers the whole
contract as one form: the goal, a scope picker derived from the
paths you've actually been changing, probe suggestions from
matching test files, and a preview-or-run choice. It shows you the
composed attune fix command before anything executes. Same
contract, same receipt — no paths from memory.
Try it
pip install -U attune-ai
attune fix --help
The full tutorial — seed a bug, preview, run, read the receipt — is in the docs. The spec, its decision log, and the receipt-bug regression test are public in the repository, receipts included.
Related Articles
Technical walkthrough of the local CSV export prototype
This companion preserves the implementation and execution record behind “Build with AI from an idea to a working feature.” It documents the original command-line exporter, its bounded replay through attune-harness and the owner-reported Numbers acceptance check. The later export-form prototype is a separate iteration described in the main article.
Three Shapes of a Prompt: A Walkthrough of Dynamic Forms and Enhanced Prompts
Every request you hand an AI coding agent is a prompt in one of three shapes: a one-shot, an XML-enhanced task, or a spec whose tasks are XML-enhanced prompts. Attune ships two features that help you write all three well. This is a hands-on walkthrough, with the actual screens.