← Blog Security & Trust 10 September 2026 9 min read

Approval fatigue: permissions for agents you trust

A permission prompt only protects you if you read it. Most people stop reading. Here is why Luminair runs agents without popups, what it puts in their place, and how its supervisor got one switch and a short list of things it may never approve.

Fig 01  Three answers to “may the agent do this?”Schematic
A · ASK EVERY TIME A human approves each tool call Bash: npm test✓ Edit: src/app.js✓ Bash: git push✓ Bash: rm -rf build/ ../✓ ? 93% of prompts approved (Anthropic, March 2026) Safe on paper. Tiring in practice. B · A CLASSIFIER DECIDES A second model reviews each call tool call classifier auto mode allow, run block, find another way or ask the human Default in Claude Code on some plans from 14 Aug 2026. C · WALLS AND UNDO No popups. A fence, and a way back PROTECTED MODE · OPT-IN session folder writes run freely no prompts outside: read-only Hit the wall → one card: allow once, allow for the session, or deny. Every turn snapshotted first · //rewind Luminair's choice.
A schematic, not a benchmark. Column A's figure is from Anthropic's auto mode post; column B summarises the same post and Help Net Security's report on the August default; column C is drawn from Luminair's /sandbox sheet, its fence-hit card and the //rewind command.

The short version

  1. An approval prompt is a smoke alarm that beeps every time you make toast. After the tenth beep you stop getting up. Anthropic's own numbers say people approve 93% of Claude Code's permission prompts.
  2. Luminair runs its agents without approval popups. In their place: an optional OS-level fence called Protected Mode, one question only when the fence is actually hit, and a snapshot of your folder before every turn.
  3. The Solace, which tracks and checks the agents' work, started with a toggle on every session. It became one global switch on 25 July 2026.
  4. On 31 August its authority was cut back: no remote switching from the phone, no model-run shell commands in your live folder, and nothing is “confirmed” unless you confirmed it on this Mac.
02Built with Luminair

A problem we had ourselves.

Luminair is built inside Luminair, usually with several sessions running at once on different parts of the code. Clicking “approve” in six panes is not a workflow anyone keeps up for long, which is why the app took the no-popup route early. The comment at the top of the sandbox code in desktop/main.js says it plainly: “Luminair runs Claude in bypassPermissions, no approval popups. That's speed with no walls.”

Everything in this post is about that last phrase. If you take the prompts away, you owe the user something better than trust. The fixes described below were written in Luminair sessions, and Solace commits carry a Claude co-author line in git.

Luminair · three sessions side by side
Luminair desktop app in the light theme: a folder sidebar on the left and three chat sessions side by side
Several sessions at once is the normal way to work in Luminair. Multiply every approval prompt by the number of panes and the problem is obvious. (Demo workspace.)
03Nobody reads the prompt

The prompt that trains you to click yes.

The default safety model for coding agents has been simple: before the agent runs a command or edits a file, it asks. That sounds careful. The trouble is volume. A real task can fire dozens of requests, almost all of them harmless, and a person who sees “run the tests?” twenty times in a row starts approving on reflex.

Anthropic named this in October 2025, when it added sandboxing to Claude Code. Constantly clicking approve, it wrote, “can lead to ‘approval fatigue’, where users might not pay close attention to what they're approving, and in turn making development less safe.” Its answer was a fence at the operating-system level, for files and for the network, and it reported that “sandboxing safely reduces permission prompts by 84%” in internal use.

In March 2026 it went further. The post on how Claude Code auto mode was built opens with the number that frames this whole debate: “Claude Code users approve 93% of permission prompts.” Auto mode hands those decisions to model-based classifiers, which the post calls “a middle ground between manual review and no guardrails.”

In August, Help Net Security reported that auto mode would become the default for new sessions on Pro, Max and Team plans from 14 August. It relayed Anthropic's study of 1,053 paid testers, in which “human review caught just 13.6% of dangerous commands, while auto mode caught 89%.” The same report adds the honest caveat that auto mode “does not eliminate” risk, because it relies on AI to judge what is safe.

A prompt you approve 93% of the time is not a safety check. It is a speed bump.
04Walls instead of prompts

Ask only at the wall.

Luminair took the third column in Fig 01. There are no per-action popups at all. Instead there are two things a prompt never gave you: a wall the agent physically cannot cross, and a way back.

The fence

Type /sandbox in any session to open The Sandbox. The sheet describes itself as “a fence around the agent”: the run still goes full speed with no popups, but it cannot write outside the folders you allow or reach a website you have not allowed. Per session you can pick Default, Protected or Unfenced. Protected fences the run to the session's own folder, with everything else read-only and localhost allowed.

It is off by default. Briefly, from the end of August, Protected Mode was switched on for every account except the owner's; on 10 September that was reversed, and it became opt-in per session, or forced on by a Team policy. We mention it because defaults are the whole argument of this post, and we changed ours.

When a fenced run does hit the wall, you get the one question that is worth asking. A card titled Protected Mode names the blocked folder and offers three buttons: Allow once, Always for this session and Deny. The code comment above that card calls it “the end of approve-everything vs allow-everything”. It grants the folder, not the single file, and its buttons lock after one choice.

A fence is only as good as the engine

Luminair drives many engines, and they do not all support the same fence. Rather than pretend, a single file, desktop/lib/execution-policy.js, decides per engine what Protected Mode really means on each turn (added 7 September 2026):

Fig 02  What Protected Mode means on each engineFrom the code
EngineFenceIf the fence cannot hold
Built-in ClaudeAgent SDK laneenforcedpassed to the SDK's own sandbox optionNot applicable
CodexmacOS and Linuxenforcedworkspace-write, approvals set to neverA website allowlist is not supported, so it counts as unfenced
Other command-line enginesnot enforcedDefault fence: the turn runs unfenced and the pane says so. Pinned fence: the run is refused.
Goal gatestest commands you set as a goalmacOS onlyFails closed: the gate is not run
Summarised from verdict, assertCliPolicy and runProtectedGate in desktop/lib/execution-policy.js. Filled dot: the fence is applied. Dashed: it is not, and Luminair tells you rather than staying quiet.

The rule that matters is the refusal. If you pinned protection on, a quiet downgrade to an open run would be worse than no feature at all:

desktop/lib/execution-policy.jslines 31–37, long string wrapped
function assertCliPolicy(engine, sandbox, platform = process.platform) {
  const v = verdict(engine, sandbox, platform);
  if (v.mode === 'unfenced' && sandbox.required) {
    throw new Error('Protected Mode is required for this session but ' + v.reason +
      '. Use the built-in Claude engine, or turn protection off ' +
      'for this session under /sandbox.');
  }
  return v;
}

The way back

The second replacement for prompts is //rewind, which shipped with Harness v1 on 29 August 2026. Before every turn, typed on the Mac or sent from the phone, Luminair snapshots the project folder, including what shell commands later touch. //rewind opens the timeline, shows what changed since any snapshot, and restores the folder to that moment. Restoring is itself snapshotted first, so you can rewind the rewind. The command's own help text ends: “This is the undo button approval prompts never gave you.”

05One switch, not twelve

The supervisor gets one switch.

Walls cover what an agent may touch. They say nothing about whether its work is actually done. That is the job of the Solace, or MC. It keeps a ledger of what you asked for and moves each item from open to working to done as runs stream and finish. It can send a fresh, read-only AI to trace a finished feature through the code and pass or fail its wiring. Its done-enforcement gate means “tested” needs real evidence, and only you can mark an item “confirmed”.

Notice the shape. Approval prompts ask you before every step. MC asks you once, after, about the result, which is the part you can actually judge.

The switch itself went through a quick lesson. On 25 July 2026 the first build put a “Session Controller” on/off switch in the sidebar. The same afternoon, a second commit removed the per-session Controller toggle that sat on every pane's title bar, along with the switch and blinking dot in the sidebar, and left one small MC chip next to the header's // button. The commit message gives the reason in one line: “The Session Controller is ONE global switch, not per-session.”

That is the approval-fatigue lesson again, applied to our own UI. A control repeated on every pane is a control you stop looking at, and it hides the real question, which is simply “is the supervisor on?”. One chip answers it at a glance. The panel behind it then lists each MC feature with what it costs (some spend tokens, some are free) and lets you turn features off individually. A feature only runs when the master switch is on too.

06What it may not approve

Trusted inside a scope.

A supervisor that can approve things is itself something to secure. On 31 August 2026 a commit titled “Harden Solace authority boundaries” went through MC's powers one by one and removed every place where it could act more widely than the user had agreed to. A follow-up on 7 September locked its review runs down further.

Fig 03  MC's authority, before and after31 August and 7 September commits
BeforeAfter
The phone could switch MC, or any MC feature, on and offRefused with security-upgrade-required: the old relay has no command signatures or MFA
A runtime probe ran shell commands, permissions bypassed, in your live folderDisabled until probes run in a disposable sandbox
A background job's own “finished” report moved it to testedIt stops at done, with a note to verify it
A “confirmed” status arriving through cloud sync was acceptedDowngraded to tested: confirm locally with ✓
Rules MC suggested could be adopted with one tap and synced as settingsA confirm sheet, a deny list, local approval only
Review runs used a tool list the SDK does not enforce under bypassRead, Grep, Glob, LS only, inside the workspace, no MCP
Paraphrased from the code and its audit test, desktop/build/test-master-controller.js. Struck-through text is behaviour that no longer exists.

Two of these are worth a closer look.

Adopted rules. For the workspace admin, MC writes a daily report after 5pm with improvement suggestions, and the admin can adopt one as a standing rule that binds every future desktop and phone turn. That is real authority, so the path is narrow. Before anything is saved, the text is checked against a deny pattern for phrases like “bypass security”, “grant shell” or “upload credentials”, and a match is refused on the spot. If it passes, a sheet titled Adopt an absolute MC rule? spells out that the rule “cannot grant tools, permissions, credentials, or weaken security”. Only rules stamped as approved locally, from the daily review, for all sessions, are loaded back at launch.

The tool list that was not a lock. A comment in desktop/main.js, dated 21 July, records a finding from the SDK docs: under bypassPermissions, an allowed-tools list is a no-op, because bypass approves every tool before the list is consulted. A real lockdown needs dontAsk, where listed tools are pre-approved and every other tool is denied. MC's reviewers now run that way, with an extra check that refuses any read outside the workspace, even through a symlink.

The patternEvery change above moves a decision from “the system decided” to “you decided, here, on this Mac”, or to “nobody may decide this until it is isolated”. None of them adds a prompt to the normal flow of work.
07Find it in the app

Set your walls in two minutes.

  1. 1In a session, type /sandbox (a single slash). Choose Protected under This session to fence that session to its own folder, or turn the Fence on and list extra writable folders and reachable websites.
  2. 2Type //doctor. Its Protected Mode (sandbox) check, in the Security group, lists which of your engines enforce the fence and which would run unfenced.
  3. 3If a turn went wrong, type //rewind, pick the snapshot from before it, look at what changed, and restore.
  4. 4On Pro+, the Solace chip sits in the header. Flip its switch to turn Solace on; click the name to see each feature and turn parts off.
08What we checked

Checked, and not claimed.

14/14
MC deep-audit tests pass, from the 7 September permissions fix
11/11
Harness v2 fix tests pass, including the per-engine execution policy
1
Global Solace switch, since 25 July 2026, replacing one toggle per session
3
Choices on the fence-hit card: Allow once, Always for this session, Deny

What this post does not claim

  • That walls beat classifiers. We have not measured Protected Mode against auto mode, and the two can sit together.
  • That the fence covers every engine. It does not; Fig 02 lists where it holds, and the app says so on each turn where it does not.
  • That Protected Mode is on for you. It is off by default unless you or your Team policy turn it on.
  • That MC's adopted-rule deny list catches every harmful phrasing. It is a pattern, backed by a confirm sheet and your own judgement.

Sources

Fence it, then let it run

Open any session, type /sandbox, and give the agent walls instead of questions.

Download Luminair →