Plan mode
When you're away from the terminal, you need confidence that your agent won't go off-script. Plan mode controls how Claude Code handles permission requests t...
When you’re away from the terminal, you need confidence that your agent won’t go off-script. Plan mode controls how Claude Code handles permission requests through Untether — require manual approval from your phone, auto-approve transitions, or let Claude Code run freely.
Permission modes
| Mode | /planmode command | CLI flag | Behaviour |
|---|---|---|---|
| Plan | /planmode on | --permission-mode plan | All tool calls and plan transitions require Telegram approval |
| Auto | /planmode auto | --permission-mode plan | Tools are auto-approved; ExitPlanMode is also auto-approved (no buttons) |
| Accept edits | /planmode off | --permission-mode acceptEdits | No approval buttons — Claude Code runs without interruption |
Plan is the most interactive mode. You see every file edit, shell command, and plan transition as inline buttons.
Auto is the recommended default for most users. Tools run without interruption, but Claude Code still goes through a plan phase. ExitPlanMode is silently approved so you don’t need to tap a button for every plan-to-execution transition.
Accept edits skips permission control entirely. Use this when you trust the agent to make changes autonomously.
Setting the mode
Toggle per chat:
/planmode on # enable plan mode
/planmode auto # plan mode with auto-approved transitions
/planmode off # disable plan mode
/planmode # toggle: if currently on/auto, turn off; otherwise turn on
/planmode show # show current mode
/planmode clear # remove override, use engine config default
Mode is stored per chat and persists across sessions. New runs in the chat use the configured mode.
”Pause & Outline Plan”
When Claude Code tries to exit plan mode (ExitPlanMode), you see three buttons instead of two:
- Approve — let Claude Code proceed to execution
- Deny — block and ask Claude Code to explain
- Pause & Outline Plan — require a written plan first
Untether ▸ Permission Request [CanUseTool] - tool: ExitPlanMode
Tapping “Pause & Outline Plan” tells Claude Code to stop and write a comprehensive plan as a visible message in the chat. The plan must include:
- Every file to be created or modified (full paths)
- What changes will be made in each file
- The order and phases of execution
- Key decisions, trade-offs, and risks
- The expected end result
This is useful when you want to review the approach before Claude Code starts making changes.
Outline rendering
Outlines render as formatted Telegram text — headings, bold, code blocks, and lists display properly instead of raw markdown. This makes long outlines much easier to read on a phone.
For long outlines that span multiple messages, Approve Plan / Let’s discuss / Deny buttons appear on the last message so you don’t need to scroll back up to find them. After you act, the outline messages and their notification are automatically deleted, keeping the chat clean.
Untether Here’s my plan:
1. **Read** `src/main.py` to understand current structure
2. **Edit** `src/main.py` to refactor the `process()` function
3. **Run** tests to verify no regressions
- Tap Approve Plan to let Claude Code proceed with implementation
- Tap Deny to stop Claude Code and provide different direction
- Tap Let’s discuss to talk about the plan before deciding — Claude Code will ask what you’d like to change and wait for your reply
Progressive cooldown
After you tap “Pause & Outline Plan”, the ExitPlanMode request is held open — Claude Code stays alive while you read the outline. A cooldown window prevents Claude Code from immediately retrying:
| Click count | Cooldown |
|---|---|
| 1st | 30 seconds |
| 2nd | 60 seconds |
| 3rd | 90 seconds |
| 4th+ | 120 seconds (maximum) |
During the cooldown, any ExitPlanMode attempt is automatically denied, but Approve Plan / Let’s discuss / Deny buttons are shown in Telegram so you can act as soon as you’ve read the outline. The cooldown resets when you explicitly Approve or Deny.
This prevents the agent from bulldozing through when you’ve asked it to slow down and explain its approach, while still giving you a one-tap way to approve once you’re satisfied.
Untether ▸ Plan outlined — approve to proceed
Auto-approval after plan approval
Once you approve a plan outline (via “Approve Plan”), subsequent tool calls in the same session — Edit, Write, Bash — are auto-approved without showing individual diff preview buttons. You have already reviewed the plan, so per-tool approval is skipped.
This applies whether you approve via “Approve Plan” after an outline or by directly approving an ExitPlanMode request. Starting a new session (via /new or a new message) restores normal approval behaviour.
Per-cron override (scheduled runs) {#cron-override}
When a scheduled cron fires into a plan-mode chat, the default behaviour is to inherit the chat’s plan mode — which means the cron run pauses for an approval nobody’s awake to give. Set permission_mode = "auto" on the cron itself to override just that run:
[[triggers.crons]]
id = "daily-summary"
schedule = "0 8 * * *"
chat_id = -1001234567890
engine = "claude"
prompt = "Post yesterday's key events."
permission_mode = "auto"
Precedence: cron permission_mode > per-chat /planmode > engine config default. The rest of the chat’s interactive traffic continues to honour plan mode. See Schedule tasks — Autonomous crons for the full reference.
Related
- Interactive approval — how approval buttons and diff previews work
- Schedule tasks — per-cron permission override
- Configuration — setting default permission mode in
untether.toml