---
title: "Status"
description: "Where each session's colour comes from: Claude Code hook events, per-tool pane rules, and how a turn is judged finished or waiting."
canonical: "https://agent-manager.dev/docs/status/"
last-updated: "2026-10-07"
section: "Documentation"
source: "agent-manager"
---

# Status

Every session's tmux pane is polled every two seconds, and each poll resolves to one state, which the row carries as a colored mark.

| Mark | State | Meaning |
| --- | --- | --- |
| ◐ | working | The agent is busy on a turn. |
| ◆ | waiting | Blocked on you: a dialog, a permission ask, or a plain-text question. |
| ● | finished | Turn ended. An alert that clears to `idle` once you enter the session, or on `.`. |
| ✕ | errored | The tool reported an error. |
| ○ | idle | Nothing running. |
| ✕ | dead | The tmux session is gone. The row stays. |
| ◌ | starting | The pane is still launching. |

## Pane rules

Detection matches per-tool regex rules against the visible pane, reads the newest turn to tell `finished` from `waiting`, and treats output that changes between polls as `working`. A turn that ends without any summary line still resolves: a `working` pane that goes quiet counts as `finished`, or `waiting` when it ended on a question.

Work that outlives the turn which started it and reports back to the agent (background agents, dynamic workflows, and an MCP call Claude Code moved to the background) is matched by `busy_line`, so a turn-end summary keeps reading as `working` while that work runs. A turn that leaves a background shell or monitor running ends like any other, and when that shell wakes the agent, the turn that follows reads `working` until it ends. A usage or rate-limit banner (`limit_line`) is `errored`. Polling continues while you are inside a session, so the statuses stay live.

## Claude Code hooks

For Claude Code the status is first-hand rather than inferred. Sessions launch with a generated `--settings` file whose [hooks](https://docs.anthropic.com/en/docs/claude-code/hooks) write the lifecycle state to a per-session status file, and the poller reads that first. The Claude Code profile sets `status_source` to `claude-hooks` for this.

A `StopFailure` of `rate_limit` writes `errored`. Pane rules still refine it, because hooks cannot see a plain-text question, an Esc interrupt or an error line, so a matching pane verdict upgrades the hook status. They take over entirely when the hook file is missing or stale.

## Reading the list

Each row carries its status and tool inline, and a folded group keeps a count per status, so a collapsed subtree still tells you whether anything under it needs you. Selecting a session shows the tail of its pane on the right, which is how a `waiting` agent's actual question reaches you without attaching. A session with messages from another agent waiting to be typed in wears `✉` and the count next to its name, and one that asked to be archived or killed once its turn ends wears `↓` or `■` until the manager does it, or until `c` cancels it.

> **Killed and archived sessions** A session with no window left shows the snapshot taken while it still had one, so the row still says what the agent was doing when it stopped.

## Notifications

When a session's status flips to `waiting` or `errored`, the manager fires one notification with the session name, tool and state: once per transition, never per poll. Settings has a `notifications` row that silences them (on by default) and a `notify on finish` row that adds `finished` transitions (off by default).

On macOS the desktop path gives waiting, finished and errored distinct sounds. Linux sends matching hints through `notify-send`. Inside Ghostty or cmux the state travels as an OSC 777 escape to the drawing terminal, which also reaches you when the manager runs on a remote host over SSH. Under WSL the banner is a native Windows toast posted through PowerShell. Other terminals use the OS desktop path, and a headless box without a desktop falls back to the terminal bell.
