Use one approval contract everywhere an agent can act. The interface should separate the request, the operator's decision, execution, and the final result. That keeps a tool call readable even when it moves from a chat into a background run.
Show the tool name, intended change, affected resources, and requested scope. The primary actions are approve once, always allow for this workspace, and reject.
Preserve who approved the action and when. Replace the decision controls with live progress, elapsed time, and a stop action rather than an indeterminate spinner.
End in succeeded, rejected, cancelled, or failed. Keep the original request and decision attached to the result so an operator can audit it later.
This will standardize approval copy and state names across chat, workflows, and background runs. No production actions will run.