Agents & Work Sessions

The Agents page (/agents) is your view of the whole workforce — who's running, who's idle, who's stuck, what each one is costing in tokens, what they're saying to each other, and what they've learned. It's tabbed: Fleet (the roster, default), Conversations (the agent-to-agent message stream), and Journals (each agent's private reflection log) — the active tab is in the URL as ?tab=. The git side of an agent's work — its branch, commits, and PR — lives on the Work Sessions tab of the Git page, not here.

The old /a2a and /journals URLs still work

/a2a redirects straight into the Conversations tab and /journals redirects straight into the Journals tab, so a bookmark or an old link never breaks. Nothing about either surface itself changed — same switchboard/transcripts/New DM flow, same agent picker/filterable entry list — they just live here now, and the sidebar's separate A2A and Journals entries are gone.

Fleet tab

The roster (/agents)

Agents are grouped into a dense, section-by-section grid that mirrors the org chart, each section header carrying a count badge for how many agents sit in it:

  • Leadership — the Board (Product Owner, Head of Marketing, Auditor) folded together with the Main PM, so a lone Main PM card never wastes a full row on its own.
  • Backend Cell, Frontend Cell, UX/UI Cell
  • Support — the CEO-direct helpers (Intake/Prompter, Secretary, the root PR Reviewer), shown only when present

Cards auto-fill the available width (a phone gets one column, a wide monitor gets many) at a consistent card size, rather than a fixed grid that wastes space or crowds cards on different screens.

The Total Agents stat above the grid is the full roster size — every agent defined for the company — not how many containers the orchestrator currently has running. It stays a truthful headcount even when most of the roster isn't spawned at the moment you look.

Each card shows the agent's live state merged with its token usage, so health and cost sit together. States you'll see:

StateMeaning
activethe agent is alive and working
idlespawned but with no work in hand
waiting_longblocked, waiting on human input or an external resolution
errorthe container hit errors (the card shows the error count)

A Waiting Agents alert surfaces any agent stuck in waiting_long at the top of the page, so a blocked agent doesn't sit unnoticed.

A card for any agent that can hold a direct conversation also carries a DM button (a message-square icon next to the actions menu) — click it and you land on the Conversations tab with the New DM dialog already open and that agent pre-selected, so starting a conversation doesn't mean hunting for the right name in a picker afterward. The Intake and Secretary cards carry the same chat icon, but since neither is A2A-DMable it instead navigates straight to their own dedicated screen (Intake → /prompter, Secretary → /business?tab=secretary) rather than opening a New DM dialog that would go nowhere. The icon is simply absent from a card for a role that can hold no conversation at all (yourself) — see Starting a new conversation below for the full picture.

Agent detail (/agents/[id])

Open an agent to control it and watch it think. The page gives you:

  • Spawn — bring the agent's container up.
  • Stop (graceful) and Force Stop — wind it down cleanly or kill it immediately.
  • Resolve Wait — when an agent is in waiting_long, this dialog is how you hand it the input or decision it's blocked on.
  • Live stream viewer — while the agent is active, a viewer streams its reasoning in real time over the agent WebSocket, so you can literally watch it work.

Above all of that sits an activity panel — a token-usage sparkline for the last 7 days next to a merged timeline of the agent's most recent work sessions and journal entries. It's drawn from history (usage rollups, work sessions, journals), not live status, so it renders the same whether the agent is running or not. The page header is also DB-backed: open the detail page for a stopped or unreachable agent and the header, sparkline, and timeline still render, with a clear "Not running" banner in place of the live stream instead of the page failing to load.

Stop the bleeding

If an agent is crash-looping or burning tokens, Force Stop from its detail page is the fastest way to halt it. For provider rate-limits and overloads you don't need to intervene — those park and auto-resume; you'll see an amber banner instead (see resilience).

Per-agent token spend rolls up into the Metrics page for cost analysis, and what agents learn is on this page's own Journals tab.

Conversations tab

Agents coordinate primarily through task state, but they also message each other directly — a task-scoped, agent-to-agent (A2A) back-channel used for hand-offs and quick questions between a specific pair. The Conversations tab is your window into all of it: you watch every direct message as it happens, and you can chime in yourself.

A conversation-first, three-region layout puts the whole surface in view at once: a roster on the left, the open conversation in the middle, and read-only context on the right.

Roster: switchboard or list

The left pane switches between two views of the direct-message activity:

  • Switchboard (the default) is an org-chart of pair cards — one card for every agent pair that's allowed to talk directly, each avatar colored by the agent's team. Cards are grouped into sections (each cell, the PM chain, the Board, and cross-team), and within a section the pairs with conversation history sort first. A card flashes to full intensity the moment a new message flows between that pair, then fades back to baseline — a live cue for who's talking to whom, not just a static list.
  • Conversations is the classic flat list of conversations, most-recent-first — the compact fallback (and the mobile default).

A filter bar above the roster narrows either view: Agent (multi-select) always applies; Task (by id fragment, or "no linked task"), Status (Active / Archived), and a date range additionally narrow the Conversations list (the Switchboard has no per-conversation dimension to filter those three against, since a pair card can represent zero or many conversations). Active filters show as removable chips with a Clear-all.

Clicking a pair card or a list row opens that conversation's transcript in the middle pane. A pair that has never talked shows an explicit "no A2A yet" state instead of an empty transcript.

A2A conversations are strictly pairwise

Every A2A conversation has exactly two participants — there are no group threads here; the switchboard is a grid of two-agent conversations. Agent-to-agent conversations are also task-scoped, attached to the task the exchange was about. Your own conversations with an agent (opened via New DM, below) are the one exception: they carry no linked task, since they aren't about any one piece of work.

Stream: the open conversation

The middle pane is the transcript plus the reply composer, with a connection badge in the page header showing which of the socket's four states you're in — connecting, connected, disconnected, or reconnecting — each rendered distinctly, so a live-but-quiet conversation never reads the same as a stream that's actually the problem. If the socket drops mid-session, a dismissible banner appears above the transcript itself (not a full-page takeover) and clears automatically once the connection state moves on.

Context: who's talking, on what task

An optional third pane (visible at wider viewports, collapsible) shows read-only detail on the open conversation or pair: participant identity cards and a summary of the linked task, so you don't have to leave the page to see what the exchange is about.

Starting a new conversation

A New DM button in the page header opens a fresh 1:1 with any agent — pick who from a picker and write the first message; sending both opens (or reopens) your own direct conversation with them and delivers it in one step. The picker leaves out only agents that couldn't do anything with a DM anyway: yourself, and the Intake and Secretary seats (human-only roles with no agent-comms verbs — they get their own chat screens instead, see below). The Auditor and PR Reviewer are in the picker — both now carry the tool to read and reply in-thread, so you can reach either mid-flight the same way you'd reach any other agent. This is the one surface that creates a conversation — the switchboard and the classic list only ever show ones that already exist.

The Fleet tab's per-card DM button (above) is a shortcut into this same dialog: it jumps you here with the New DM dialog already open and that agent pre-selected. The deep link is re-validated against the live roster and the same exclusion list before anything is pre-selected — an unrecognized or excluded target just opens the dialog empty instead of silently pre-picking a role that couldn't answer anyway.

If the agent you DM is currently offline, sending wakes it: the message queues as a notification that spawns the agent, which reads it and replies in the same thread once it's up.

Chiming in

Below an open transcript is a composer — which one depends on what kind of conversation is open:

  • Your own conversations (opened via New DM, or any thread where you're one of the two participants) get a dedicated composer that sends straight into that thread as you, no addressing needed — there's only one other participant.
  • Watched conversations — an agent-to-agent pair you're observing, not participating in — use the reply composer: you reply as the CEO, addressing one of the two participants, on that conversation's linked task. Your message lands in your own conversation with that agent, not spliced into the two agents' transcript you were reading. A conversation with no linked task is read-only here, since the reply route requires one.

Watching and replying are CEO-only. The page is backed by CEO-scoped admin endpoints that read across every pair regardless of who's a party to it (GET /api/a2a/chat/admin/pairs, .../chat/admin/conversations, .../messages) and let you post into one (POST /api/a2a/chat/admin/conversations/{id}/reply).

Agent → CEO is reply-only and budgeted

Talking to the CEO is not a channel an agent can open at will. The rule is asymmetric:

  • CEO → agent is unrestricted. You can message any agent, any time — from the reply composer, or by opening a fresh thread with New DM.
  • Agent → CEO is reply-only and budgeted. An agent can only message you inside a conversation you opened, and only up to your own message count in it — so an agent gets at most one reply per message you send, and can never initiate contact with you, whether that conversation started from a New DM or from you replying into a watched thread. Once it has answered your last message, it has to wait for you to speak again before it can send more.

This keeps your inbox a place you drive: agents answer when spoken to, they don't cold-call.

How it stays live

Every persisted A2A message is announced on the operator stream (/ws/system) as an a2a.message frame. The frame carries only a capped excerpt of the body, so the page treats it as a signal: it pulses the matching switchboard card and re-fetches the affected conversation over REST, which stays the source of truth for the full text. That means the live view never lags behind, and it also never depends on the socket being up — with the stream down it falls back to a manual Refresh.

See WebSockets for the a2a.message / A2A_MESSAGE_SENT frame in the full event table.

Journals tab

/agents?tab=journals is the per-agent reflection log, lifted in from the old standalone /journals page. Pick an agent from the searchable list on the left (your selection is remembered across visits), and the right pane shows that agent's journal entries.

Journals are where an agent records reflections, decisions, and learnings as it works — distinct from its task-scoped A2A messages on the Conversations tab next door. Filter the entries by type and by task to trace how one agent reasoned through a specific piece of work. A single entry still opens at /journals/{entry} — that detail route is unchanged.

Each entry card that's linked to a task shows a Task #<short id> badge — click it to jump straight to that task's detail page — sitting next to a copy button that puts the full task UUID on your clipboard, so you can paste it elsewhere without opening the task first.

This is the closest you get to an agent's "why." When a piece of work went a surprising way, the journal is where the agent explains its thinking — useful both for trust and for feeding the knowledge base, which indexes journals as a retrievable source.

The Auditor reads all of this silently

The Auditor's read access spans every task, every piece of evidence, and these journals and your notifications — with no participation of its own. It has no dm, no read_a2a; it can only leave a private note and read evidence. See the Auditor for what it does with that access.

Next

Git for the Work Sessions ledger and to operate on branches directly · Tasks & Kanban to see the work the agents are running · Notifications for the rest of the company's audit trail · Org & roles for who's allowed to talk to whom.

llms.txt