<!-- https://zerolog.ch/docs/ultracode-approvals · Docs / Agents -->
# Ultracode approvals and status line

> Ultracode agents follow the permissions of your chat, and a status line shows their work.

**Ultracode agents follow the permissions of your chat, and a status line shows their work.** An agent runs only what the approval level of the chat would allow.

## Approvals

- The four approval settings of the chat apply: **Ask every time**, **Allowlisted commands only**, **Auto-accept edits** and **Never ask** (the bypass level). One function decides for the chat and for the workers. See [Command approval](https://zerolog.ch/docs/approval).
- A request appears in the status line with the full command and three buttons: **Allow**, **Deny** and **Allow for this run**. The last one remembers the tool for the rest of the run, also after a worker restart.
- Unanswered after five minutes, a request counts as denied. While it waits, no model is called, and Stop still works. Only the owner of the run can answer.
- A short list of protected commands asks on every setting except Never ask: recursive delete outside the work scope, hard resets and git clean, force-push, and anything touching /vault.
- Background `/goal` runs go through the same gate and ask like the chat does.

## The status line

- One fixed line above the message box, with one count, for example 2 of 6 agents active. Closed, it reads like `3 agents · Implementing · 1m 07s · $0.012`.
- Open, it lists the agents with their live log. The log shows each command in full, up to 2,000 characters, with secrets and vault values blacked out ([blackout](https://zerolog.ch/docs/redaction)). It renders Markdown, without HTML and without external images.
- Errors stay visible when the line is closed, for example a missing checking model with the attempt number.

The list of protected commands is a safety net, not a sandbox. The container and the network broker stay in place.

More on the run itself: [/ultracode](https://zerolog.ch/docs/ultracode). Checking models: [helper and checking models](https://zerolog.ch/docs/helper-models).

## What happens to one command of an Ultracode agent

Mermaid source of the diagram on this page:

```mermaid
%% Ultracode approvals: one command of one agent. Facts from server/freigabe-gate.js, routes/jobs.js (freigabe), job_freigaben.
flowchart TB
  ask["1. An agent wants to run a command"]
  gate["2. The chat's approval level decides<br/>the same gate as in the chat"]
  run["Command runs"]
  wait["3. Status line shows the full command<br/>no model is called while it waits"]:::hot
  deny["Denied<br/>the agent is told"]

  ask --> gate
  gate -->|"Run without asking, or on your list"| run
  gate -->|"Ask every time, not on the list,<br/>or a protected command"| wait
  wait -->|"Allow, or Allow for this run"| run
  wait -->|"Deny, or no answer in 5 min"| deny

  linkStyle 2 stroke:#8f7ac9

  classDef hot stroke:#8f7ac9
```
