When you don't answer
What Pushary does when you leave an approval unanswered on your phone. The wait ladder for each mode, keyboard bypass, the wait action and tuning the window.
Every approval Pushary holds ends one of four ways: you approve it, you deny it, the agent's own prompt takes over, or Pushary keeps holding for your phone (with a wait rule). Which one happens, and when, is the wait ladder. Your policy for that tool decides it, and the hook enforces exactly what the policy says.
See your own ladder for every tool:
npx pushary@latest wait statusSilence never approves anything, unless you chose auto-approve as a rule's timeout action.
The ladder for each approval mode
| Mode | While you're away | If you don't answer |
|---|---|---|
push_first (When I'm out, default) | Asks your phone for pushFirstSeconds | Hands back to the agent's own prompt. An agent with no prompt of its own is handled like Every time instead (details) |
push_only (Every time) | Blocks and waits for your phone for up to timeoutSeconds | Applies the timeout action: auto-approve, auto-deny, ask in the terminal, or wait |
terminal_only (Terminal) | Sends no approval alert | The agent's own prompt decides |
notify_only (Updates) | Sends an alert that approval is needed, with no approve or deny on the phone | The agent's own prompt decides. A host with no prompt of its own refuses the action (details) |
Change how long your phone is asked first
In push_first (When I'm out), your phone buzzes when you are away. If you don't tap within the window, the agent's own prompt takes over. Set the window from the CLI, from 0 to 300 seconds:
# Ask the phone for 45s before the terminal takes over (a new site starts at 20s)
npx pushary@latest wait 45
# Reset the window to 20 seconds
npx pushary@latest wait clearpushary wait <seconds> sets the window on the * catch-all rule, which every tool without its own rule inherits. Set a window for one tool in the dashboard under Agent > Policies.
Keyboard bypass: decide at your desk
When you are typing in the terminal, a phone buzz is noise. In push_first, Pushary detects that you are at the terminal, skips the phone push and shows the agent's own prompt right away, with no wait and no notification. On a Mac running the Pushary app, the decision stays on the Mac while you are there, however long it waits, and moves to your phone when you leave. This is automatic, with nothing to turn on.
Some agents have no prompt of their own to show at the keyboard. When their hook comes from the pushary CLI or the Cursor plugin, When I'm out works like Every time for them. Your phone is asked about every gated call, even while you are at the keyboard, and it waits up to timeoutSeconds instead of pushFirstSeconds. This covers Cursor file edits and sessions started from your phone (pushary 1.9.13 or later), Antigravity CLI (1.9.14 or later), a Codex edit outside a scope you agreed (1.9.15 or later), and Codex set to never ask for approval, which is full access (1.9.17 or later). In full access, Codex refuses a call nobody answers with "No response within timeout". For every agent on this list, a call nobody answers under When I'm out is refused, even when the rule approves on timeout (pushary 1.9.24 or later, Cursor plugin 0.2.6 or later).
To keep every decision in the terminal for a while, whatever your policy says, set a mode override:
npx pushary@latest mode terminal_only --for 1h
# Check the override, or remove it
npx pushary@latest mode status
npx pushary@latest mode clearThe mode command needs a key created in the dashboard. With a key from setup or phone pairing, change the mode in the Pushary app instead: tap Phone alerts at the top of your inbox.
Hold for your phone: the wait action
Set a push_only rule's timeout action to wait and the hook holds for your phone instead of deciding on its own. At the end of the window it hands the decision to the agent's own prompt. It never auto-denies. Use it for a rule like "production deploy: I'll approve from my phone."
How long wait can hold depends on the agent's hook budget: about 590s for Claude Code, 170s for Codex and Gemini CLI, 110s for OpenCode, and 45s for Cursor and VS Code. After that the agent's own prompt takes over. A longer hold is on the roadmap. Today wait means "use the whole window for the phone, and never auto-deny."
What if Pushary cannot reach you?
The ladder always falls back to the safest approver left: you, in the agent's own prompt.
- No device connected: the hook withdraws the question without waiting and hands the decision to the agent's own prompt. The response warns you to connect a phone under Settings > Connections.
- Pushary unreachable: the hook returns no opinion, so the agent's own prompt decides. An offline agent cannot reach your phone anyway.
- The window is longer than the hook can safely wait: the hook hands the decision to the agent's own prompt. It does not apply a timeout action for a window it could not fully serve.
A host with no prompt of its own, such as a Cursor file hook, refuses the action in these cases instead.
Check your ladder with doctor
npx pushary@latest doctorDoctor prints a Wait Ladder section with your default window, any active mode override and every per-tool rule. It reads the same policy the hooks fetch. This needs @pushary/agent-hooks 0.95.7 or later.
Next steps
Set your permission policies
Pick the approval mode, timeout and timeout action for each tool.
Handle unanswered questions in your own agent
Follow handoffAction, then nextAction, when ask_user returns without an answer.