The Permission Prompt Is a UX Bug: When Human-in-the-Loop Becomes Human-as-Rubber-Stamp
Watch a developer use an agentic coding tool for an hour and you will see the same gesture forty times: a dialog appears, "Allow the agent to run git status?", and a hand moves to the approve button before the eyes finish reading. By the fortieth prompt the prompt is not being read at all. It is a speed bump the user has learned to take at full speed.
This is the quiet failure of human-in-the-loop. The architecture diagram still shows a human gating every dangerous action. The audit log still records an explicit approval for every command. But the human has stopped evaluating anything. They have become a biological "yes" function wired into the control flow — present in the loop, contributing no judgment to it. The permission prompt was supposed to be a safety control. It has degraded into latency with a confirmation dialog attached.
The reason this matters is that nobody decided it. No product manager wrote "users shall rubber-stamp approvals." It emerged from the interaction between how agents behave and how human attention works under repetitive load. And because it emerged silently, it tends to be discovered only after an incident — at which point the post-mortem writes "the user approved the action" and treats that as the end of the analysis rather than the beginning.
Approval Fatigue Is Not a Discipline Problem
The first instinct, when you notice users clicking approve without reading, is to blame the users. Train them to be more careful. Add a "are you sure?" on top of the "are you sure?". This instinct is wrong, and it is wrong in a way that is well documented outside of AI.
Security operations teams have lived this for two decades under the name alert fatigue. The numbers are bleak: a typical security operations center processes around 960 alerts per day, and large enterprises see several thousand. Roughly 90% of these centers report being buried under backlogs and false positives. The 2025 SANS detection survey found false positives and alert fatigue measurably worsening year over year. The consequence is not that analysts are lazy. It is that human vigilance is a depletable resource, and a stream of mostly-benign signals depletes it on a predictable schedule.
Aviation calls the same phenomenon automation complacency — NASA's reporting system defines it as "self-satisfaction that may result in non-vigilance based on an unjustified assumption of satisfactory system state." Studies of maintenance technicians using AI diagnostic tools found that after six months of use, they accepted AI outputs without independent verification at rates exceeding safe operational thresholds. These are trained professionals in safety-critical jobs. They are not careless. They are human, and human attention does exactly this when you feed it repetitive low-stakes confirmations.
So the rubber-stamp is not a user defect to be trained away. It is the expected output of a system that asks for approval too often. If your design depends on the human staying sharp across hundreds of nearly identical prompts, your design depends on a property humans do not have. The fix has to be structural.
The Prompt Volume Is Where the Bug Lives
Here is the uncomfortable reframe: the number of approval prompts an agent fires is not a safety dial you can turn up freely. Each additional prompt does not add a marginal increment of safety. Past a fairly low threshold, each additional prompt subtracts safety, because it accelerates the user's decay into reflexive approval — and that decay applies to every prompt, including the one that actually mattered.
Think of it as a budget. A user has some finite quantity of genuine, attentive approvals in them per session — call it ten, maybe twenty before the pattern-matching takes over. Every prompt you fire spends from that budget. If the agent asks permission to read a file, list a directory, check git status, and run a test — all of which are safe and reversible — it has burned the budget on nothing, and the destructive rm -rf or the production database migration arrives to a user who is already on autopilot.
This means the design discipline is not "prompt on dangerous actions." Almost everyone already does that. The discipline is don't prompt on anything else. Safe, reversible, read-only actions should not generate a dialog at all. The agentic coding tools that get this right read project files, list directories, and run obviously-harmless commands without asking, and reserve the interrupt for the small set of actions that genuinely deserve a human: writing outside the working directory, touching secrets, deploying to production, running destructive shell commands. The goal is to make prompts rare enough that their rarity itself is a signal — when a dialog appears, the user's prior should be "this is unusual, I should look."
Risk-Tiering, and Why Trust Should Decay
Once you accept that prompts are scarce, you need a principled way to decide which actions earn one. The useful frame is to classify every action an agent can take along two axes: external effect and reversibility.
A read-only action with no external effect — inspecting code, querying a status — needs no gate. An action with external effect that is reversible — sending a draft to a staging channel, updating a non-critical record, creating a branch — can run under what is sometimes called human-on-the-loop: the agent acts, the human watches the output stream, and intervention happens after the fact if something looks wrong. Only actions that are irreversible or high-stakes — moving money, sending external communications under the company's name, mutating production — should block and wait for an explicit human yes.
Three properties make this work in practice. First, it should be enforced by a policy layer, not by the agent's own code. Rules scattered through agent logic drift out of coverage and resist auditing; a central policy engine applies the same tiering uniformly and gives you one place to inspect. Second, the prompt should show the consequence, not the command. "Allow psql -f migrate.sql?" asks the user to mentally execute SQL. "This will drop 3 columns from the users table in production" is something a tired human can actually evaluate. The diff, the blast radius, the dollar amount — that is the content of an informed approval.
Third, and most counterintuitive: trust should decay across action classes, not accumulate into a blanket. An agent that has correctly run two hundred test commands has earned the right to run tests without asking. It has earned nothing about deployment. The moment it attempts a new class of action, the gate should return, because the evidence of competence is class-specific and your safety model should be too. A system that lets good behavior in one domain silently unlock another is training the user to expect prompts to disappear — which is just a slower path back to the rubber-stamp.
Instrument the Rubber-Stamp Before It Bites
The failure mode here is invisible until an incident, which means you have to go looking for it. The good news is that rubber-stamping has a clear behavioral signature, and it is cheap to measure.
The single most telling metric is approval latency — the time between a prompt appearing and the user resolving it. Plot the distribution. A healthy distribution has weight in the multi-second range, because reading and evaluating takes seconds. A pile of sub-second resolutions is not fast users; it is users who decided before the dialog finished rendering. A sub-second approve is definitionally not an informed approve. You can alert on the fraction of approvals under, say, 800 milliseconds, and treat a rising fraction as a leading indicator of oversight collapse.
Pair that with approve-rate broken down by action type. A user who approves 100% of everything is not exercising judgment; a healthy reviewer rejects or edits something. If the approve rate is pinned at 100% across every category, the loop is decorative. Watch also for the trend within a session — if approval latency falls steadily from the first prompt to the fortieth, you are watching fatigue accumulate in real time, and that is your cue that the session is firing too many prompts.
None of these metrics tell you the agent did something wrong. They tell you that if the agent does something wrong, the human will not catch it. That is exactly the warning you want before an incident rather than after.
Human-in-the-Loop Is a UX Problem Before It Is a Safety Problem
The deepest mistake in this whole area is treating the approval gate as a safety feature that the UX team renders. It is the other way around. The safety property — "a human meaningfully evaluated this action" — exists only if the interface produced a state of mind in which evaluation was possible. If the user is fatigued, if the prompt shows a command instead of a consequence, if the dialog is the fortieth identical one, then the safety property simply does not hold, regardless of what the audit log says.
This is why "the user approved it" is not a conclusion. An approval the human could not meaningfully evaluate is not oversight; it is an audit-log alibi — a record that exists to assign blame after the fact, not a control that prevented anything. When a post-mortem stops at "approved by user," it has mistaken the existence of a click for the existence of judgment.
There is also a security edge to this, not just a reliability one. An attacker who can influence an agent's output — through prompt injection in a README, a poisoned issue, a compromised tool response — does not need to defeat your approval gate. They need to bury one malicious action in a stream of routine ones and let approval fatigue do the rest. The fortieth prompt is the attacker's best friend. A design that keeps prompts rare and consequence-legible is not just better UX; it is the thing standing between a contaminated agent and a human who still reads.
So the practical takeaway is to stop counting prompts as a measure of how careful your product is. Count them as a budget you are spending. Tier your actions so only the irreversible ones interrupt. Show consequences, not commands. Let trust decay by action class. Instrument approval latency so you can see the rubber-stamp forming. And when you write the next incident review, resist the sentence "the user approved it" — ask instead whether the interface ever made informed approval possible. If it did not, the bug was never in the loop. It was in the prompt.
- https://aipatternbook.com/approval-fatigue
- https://www.developersdigest.tech/blog/approval-fatigue-agent-security-bug
- https://www.sethserver.com/ai/human-in-the-loop-not-human-as-rubber-stamp.html
- https://www.waxell.ai/blog/human-in-the-loop-vs-human-on-the-loop-ai-agents
- https://cset.georgetown.edu/wp-content/uploads/CSET-AI-Safety-and-Automation-Bias.pdf
- https://en.wikipedia.org/wiki/Automation_bias
- https://www.stamus-networks.com/blog/what-the-2025-sans-detection-response-survey-reveals-false-positives-alert-fatigue-are-worsening
