Stop “waiting for approval”: fix permission prompts in Claude Code, Codex, and OpenCode (without going full YOLO)
A practical way to identify whether you’re blocked on a real approval, a config mismatch, or a UI/connection issue — and how to keep sessions moving safely.
- CLI
- 0.1.0
- Preview ref
- f36aa45
The most expensive way to lose time with Claude Code, Codex, or OpenCode isn’t a crash.
It’s this:
You start a session, it’s working, you step away… and when you come back it says some version of:
- “waiting for approval”
- “needs permission”
- “waiting for input”
If you’re sitting at your terminal, it’s usually a 5‑second choice.
From your phone (or after you’ve forgotten what it was doing), it’s easy to either:
- approve something you didn’t mean to approve, or
- do nothing for an hour because you didn’t notice
I wrote this guide for the middle ground I actually want:
keep sessions moving without turning approvals into “full YOLO”.
TL;DR
- First decide what kind of “approval” you’re dealing with:
- a real permission prompt (expected)
- a config not applying issue (common)
- a UI/connection issue (also common)
- If you’re using Codex, sanity-check your approval config layering and project trust.
- If you’re on a phone, the safest workflow is: open the session in a UI that shows the request in context before you approve.
- Happier is one option that helps because approvals/permission requests are durable (Inbox) and notification taps deep-link to the correct session/server.
The problem (in plain language)
Approvals are a safety boundary.
The pain isn’t “approvals exist.” The pain is when approvals become:
- invisible (you didn’t notice)
- ambiguous (you’re not sure what you’re approving)
- inconsistent (you changed config, but it still asks)
And those three problems get worse on a phone.
What I tried first (and where I bounced off)
- Turn everything off (YOLO / “never ask”): fast, but I don’t trust myself with it when I’m tired.
- Stay at the terminal until it’s done: safe, but it defeats the point of running longer sessions.
- SSH from my phone: works, but approvals are the worst thing to review in a tiny terminal.
Happier is one of the options I use when I want approvals to be explicit and reviewable from my phone.
If you’re new to Happier (what it is, and where to get it)
If you haven’t seen Happier before: it’s an open-source companion app (mobile/web/desktop) for sessions like Claude Code, Codex, and OpenCode.
The workflow is: keep the session running on a machine you trust, and use Happier from your phone to review approvals in context.
Get set up:
- How to run Happier from your phone
- GitHub: https://github.com/happier-dev/happier
- Install/download: https://github.com/happier-dev/happier#how-it-works
- Discord: https://discord.gg/W6Pb8KuHfg
Step 1: classify the “approval”
Case A: it’s a real permission prompt
This is the healthy case: the session wants to do something with side effects.
If you’re using Happier, permission modes exist specifically to control how often you’re asked:
- Default
- Read-only
- Safe YOLO (auto-allow reads; prompt before writes)
- YOLO (skip as much as the provider allows)
Not every provider supports every mode; Happier shows the effective policy.
Case B: your config is not applying (Codex is the common example)
Codex has a real config layering model.
If you changed something and nothing happened, the usual culprits are:
- you edited the wrong config file location
- the setting is being overridden by a higher-precedence layer
- the project config isn’t being loaded because the project isn’t trusted
- your org policy is enforcing constraints
In Codex’s docs, this shows up as:
- user config at
~/.codex/config.toml - project-level config and “trust” gating
- knobs like
approval_policyandsandbox_mode
A big tell: if you see people posting configs that say “never ask” and it still asks, you’re not crazy — there are environment-specific bugs that look exactly like that.
Case C: the UI is fine but you’re disconnected
Sometimes the session is waiting, but you’re looking at a stale stream.
If the machine slept or you switched networks, you can end up in a state where:
- the session is blocked
- but you don’t see the prompt
In that case, your “fix” is reconnection + opening the right session route.
Step 2: choose a workflow that matches the risk
A rule I use:
- If I’m about to approve something with real side effects (writes/installs), I want to see:
- what it’s doing
- where it’s doing it
- what changed recently
That’s why a phone-friendly UI matters.
The Happier workflow (when you want approvals to be explicit)
Happier treats “things that need your attention” as real data:
- a global Inbox
- approval requests
- permission requests
- user-action requests (like “Exit Plan Mode”)
This matters because it survives navigation. It’s not a modal you missed.
On mobile, notification routing is also strict:
- it deep-links to the correct session
- and it avoids auto-approving on unknown servers
Troubleshooting
I set approval_policy = "never" and it still asks
Treat this as one of:
- trust/config layering mismatch
- environment-specific client bug
Try:
- confirm which config layer is being loaded
- test the same session in a different environment (WSL/VM)
- update the tool (these issues often get fixed quietly)
I’m not seeing prompts on my phone
This is usually:
- notification routing/server profile mismatch, or
- you’re not opening the session that actually has the prompt
Use a single “attention list” surface (Inbox) rather than scanning multiple sessions.