When a user takes an action with consequences, the tool UI should transition to a receipt state that confirms what happened. This gives the user proof of their decision and something the assistant can reference later.
Without receipts, consequential actions vanish into the conversation history. The user can't verify what they chose, and the assistant can't reference specific decisions.
How would you like to handle the duplicate contacts?
Done. I merged 12 duplicate contacts. You can undo this from Settings → Contact History if needed.
The receipt shows what the user chose. The assistant's follow-up confirms the outcome and offers a way to reverse it.
Receipts describe a past decision. The copy should reflect this.
The decision label (e.g., "Approved", "Denied", "Selected") should be past tense because it describes what the user decided:
| Interactive State | Receipt State |
|---|---|
| Approve | Approved |
| Deny | Denied |
| Select | Selected |
| Confirm | Confirmed |
The action description stays in imperative form because it describes the request that was approved or denied, not the outcome:
Approved action
Denied action
The pattern is: [Past-tense decision] — [Imperative action]
Several Tool UI components support receipt states:
| Component | Receipt Prop | What It Shows |
|---|---|---|
| Approval Card | choice | The decision and action title |
| Option List | choice | Only the selected option(s) |
| Preferences Panel | choice | Summary of saved preferences |
| Progress Tracker | choice | Final status of the workflow |
| Order Summary | choice | Confirmed order details |
Use receipts for consequential decisions that:
Skip receipts for reversible controls like:
The assistant's follow-up message should reference the receipt and, when appropriate, offer a way to undo or modify the decision.