Human-in-the-loop, done properly: approvals for AI agents
“Human in the loop” is easy to claim and easy to do badly. A confirm dialog that says “Proceed?” with no detail is a human in the loop who has been given nothing to decide with. Here is what a real approval step needs.
The approver sees the whole proposal
Not “retry job”. The operation, the exact inputs, the scope (one customer, this environment), what it will not do (no customer email goes out), who asked and why. An approval is a signature; the signer has to be able to read the document.
The approval is scoped like any other permission
Who may approve a production retry is a policy question: a manager for this pipeline, not any manager, and not the person who asked. Encode it. In GlowForm the approver’s authority is checked the same way the requester’s was — by the same decision function, against the same policy — so a person who was delegated staging cannot wave through production by being called a manager.
Approvals expire and are single-use
A yes given on Tuesday is not a yes for the same operation every Tuesday. Bind the approval to one specific proposal, let it run once, and let it lapse if nobody acts. Standing approvals are permissions wearing a costume; if you want one, grant the permission and say so.
The decision is on the record
Who approved, when, what they saw, and what then ran — in the audit log, next to the action, in the same transaction. Six months later the question will be “who allowed this?”, and the answer should take one query.
Keep most things out of the loop
If everything needs approval, approvers stop reading. The point of a permission model is that most of what people ask is allowed outright, a little needs their own confirmation, and only production-shaped and money-shaped actions need someone else. Reserve the human for the decisions that need one.