Group
A shared session of at least two Bots (with no limit on members) that has its own name: whoever creates it names it, the name cannot be empty, and it is not assembled from the names of those present. When a handoff needs to be visible, use a group rather than making a person the router. A conversation with fewer than two Bots is a direct, not a group.
Avoid: channel, room, workflow, plan DAG, group member limit, using the member list as the group name
Direct
A one-to-one conversation between you and a Bot or between two Bots; your direct with a Bot is reused, while the Bots' collaboration direct belongs to the job they are working on. You read a Bot↔Bot direct, not speak as a third participant. Details: Behavior · Direct.
Behavior details
Your direct with a Bot is reused. Bot↔Bot directs remain read-only for you: viewing work and existing safety controls does not make you a third speaker. Level-3 delegation reuses a non-archived direct with exactly those two present Bots for an unordered “Bot pair × plan”; reverse handoffs on that plan reuse it, different plans do not. No new conversation type exists: a collaboration thread is still a direct, distinct from a quoted reply to one transcript message.
From level 3, ordinary messages in a delegation thread (the direct with a thread_task_id), including prose endings and mentions of the present partner, create only peer_note mail with wakes=0. An existing segment can read it; an idle Bot is not woken. A note is not a delegation result and does not satisfy a wait. Naming an absent third Bot, an unknown name or everyone in such a direct returns use_delegate before posting. Use Delegation for actual work.
A direct a Bot opens itself (ADR 0091): create_direct is offered at every level, to tell another Bot something or talk it over, not to give it work (that is delegate; several Bots, or you in it, is a group). Each call opens a fresh direct from the line that woke the turn, with its entry under that line. Such a direct has no thread_task_id, and every line a Bot posts there wakes the other side: into its inbox when it is at work on the job, else a new turn; a bare receipt answering a bare receipt with no command run in either turn wakes nobody (the same rule as levels 0–2 below), and the prompt says to end with end_turn when only a receipt is left.
Opened only where you are, reported back there (ADR 0093): create_direct is only for a conversation you are in; called from a Bot↔Bot direct or a delegation thread it answers not_a_member, telling the Bot to finish there, since the outcome goes back to where that one came from. Once such a direct goes quiet (no live turn, and 10 seconds with no other turn ending there) its opener is called back to the conversation it came from at every level, with the direct's last line, to say there how it came out; that line carries the direct's latest 20 lines under it (each clipped to 1000 characters), since the origin's transcript never shows the direct; once per stretch of new lines. The call-back hangs on the opener's own turn in the direct; if the opener never ran there (the other Bot's words reached a turn of its at work elsewhere, or nothing was said) there is no call-back. Delegation threads are not covered: from level 4 the delegation's answer and the supervisor bring the opener back.
Where you read it: the sidebar and the folded rail list no Bot↔Bot direct, pinned or not; the workbench gives it no tab, and Where windows open has no row for it. It opens only from the "opened directs" card under the line that started it, as a popup over the conversation on screen: titled with its two Bots, a "From …" line under that which goes back to the line (or, for a direct opened from another direct, to that direct), and the direct's own transcript, read-only as always. On a phone it is a page, and Back closes it first; Escape closes it too. A search hit, a notification or a link naming a Bot↔Bot direct opens the same popup, with the conversation it came from put under it first when none is on screen. Opening a file, a Bot's profile, a flow or the workspace from inside puts the popup away and opens it where it always goes. A delegation thread is reused per Bot pair × job: its card hangs under the line of the first delegation only, and its popup shows the whole thread.
Levels 0–2 retain one fresh Bot↔Bot direct per initiation, ordinary replies/messages waking the other side (with the old nod-to-nod check retained), and quiet-thread report_back. Level 3 still has report_back/plan-watch/settle, so ordinary-message non-waking semantics are not a claim that every legacy quiet-thread callback is gone there; from level 4 report_back and plan-watch give way to the ball-holder supervisor, while settle remains.
Quoted replies remain one level deep in the main transcript: replying to a Bot can mention it automatically, without duplicating existing mentions/everyone and without auto-mentioning the user; the parameter remains parent_id.
Avoid: mixing unrelated jobs in one collaboration direct, user as a speaker in a Bot↔Bot direct, every private line must wake the other side
Project session
You and a local agent (Claude Code or Codex) in a project directory, as in the agent's own desktop app; no Bot. Start one by picking a directory, or, with Claude Code, carry on a session you had in a terminal (on a branch of it, the original left as it was). The app keeps only the permission mode, the model, the thinking level, Stop and the commands typing / lists (for Codex, the few the app carries out for it and its skills), and for Claude Code also the account, plan mode and the commands, monitors and subagents it sends to the background (seen and opened in the conversation, as a Bot's work is in a direct): no jobs, flow, organizing, deliveries, reviews or holds; the agent keeps the history itself, and each run is sent only your new line. Files in the project directory can be annotated, a batch going out as a line of yours. The sidebar's Projects section groups them by directory. Out of usage, a Claude Code session moves itself to another of your plan accounts and goes on; with every account out, it picks up by itself at the reset (ADR 0110). Details: Behavior · Project sessions, ADR 0095, ADR 0098, ADR 0099.
Behavior details
(ADR 0095) You and your local Claude Code or Codex in a project directory, as in Claude's and Codex's own desktop apps, with no Bot. Below the sidebar's Bots section (group chats and your directs with Bots listed together, in the list's own order; its "+" offers New bot and New group) is a Projects section: one row per directory, in the order each got its first session, newest first, so starting a session, sending a line or reading in one directory never moves the directories (only deleting a directory's oldest session can); a row unfolds to its sessions, newest first, each led by its agent's mark (one directory can hold sessions of different agents), which its tab, its pane header and the folded sidebar's rail wear too. A session's row is the size of a Bot's and says the same: the mark where the avatar goes, its name and time, and below them what the agent is doing (Thinking, Replying, Approval, with a dot of that colour on the mark) or, when it is not running, the last line, with the unread count; the section's "+" offers one item per agent (New Claude Code session…, New Codex session…) and, below a divider, Import a terminal session…, and each directory row has its own "+" that asks which agent and starts a session right there (shown on hover with a pointer, always on a phone), with Open project folder and Open terminal in project folder below a divider. Right-clicking a directory row brings up the same menu at the pointer. Open terminal in project folder starts a shell in that directory (see Terminal): a terminal tab on a wide window, the Terminal page on a phone. Open project folder opens the directory itself in the preview: the body lists what is in it and the project directory's file tree is beside it (the same tree a file opened from a link below comes with); press a folder to go into it, a file to see it in the same preview. On a wide window a project has one preview tab, named " project folder": whichever of the directory's sessions opens it, and a file named in any of them, lands in that one tab (see File links below). On a phone it opens as the preview of one of the directory's sessions (the one on screen when it is in that directory, else the newest): that session comes up first and the preview rises over it. A phone's create button offers New in a folder… and Import a terminal session…, the agent picked in the sheet. With a mouse, hovering a session's row shows Pin and ⋯ at its right end, ⋯ being its context menu, as on a Bot's row. Pinned, it moves from its directory up to the pinned band at the top of the sidebar, in its agent's mark; a directory with no other session is not listed until you unpin it. Renaming a pinned session adds a name field under its directory for the moment; its place in the band stays. On a phone the Bots and Projects pages each show their own pins.
The two sheets: both pick the agent first (New offers Claude Code and Codex, Import Claude Code only), then list directories, the most recently active first. New lists every directory your Claude Code terminal sessions or the app's project sessions (of either agent) ran in, each starting a session there in one press, and a last row, Another directory…, for one of your own. Import lists only directories that hold terminal sessions, with the name, path and session count, one unfolding at a time.
Starting one: in the computer's window, New Claude Code session… and New Codex session… open the system folder dialog and start that agent's session in the folder you pick (with no system dialog they open the New sheet with that agent picked); a directory row's "+" starts one of the agent you pick there; in the New sheet, press a directory; or in Another directory… pick one (the system folder picker in the window, or a typed full path; a phone has neither and browses the computer's folders one level at a time instead, Use this folder in the project's directory, through GET /v1/host/tree) and press Start. The first 60 characters of your first line name the session; Rename in its context menu turns its sidebar row into a name field (Enter saves, Escape leaves it), and a renamed session is not named by your first line any more. The first run starts Claude Code (or Codex) in that directory and records its own session id (Codex's thread id); every later run carries that session on.
Carrying on a terminal session: Import a terminal session… opens the Import sheet, where an unfolded directory lists the Claude Code sessions you had in a terminal there (projects/*/*.jsonl under each account directory, the most recently changed first, eight of them until you ask for the rest; sessions the SDK started — the app's own among them — and subagents are left out), each with its title, git branch and time, and its account when they come from more than one. Pick one and press Carry on: the session opens in the original's directory, named after its title; what you said and Claude's text land at their own times (Claude Code's own notices, such as a background task finishing, are not lines of yours), with a system line at the bottom saying where it came from and how many tool calls it left out (tool calls are not imported one by one). The first run branches off the original (resume with forkSession), which stays as it was, so you can go on with it in the terminal; every later run carries the branch on. Sessions started in the app are started by the SDK, so the terminal's /resume does not list them. On first launch, the wizard's last step can carry one on the same way (see "Bot templates and first launch").
As in the terminal: Claude Code reads your user, project and local settings and CLAUDE.md, with its own system prompt and no persona or tools from the app; each run is sent only your new line and the pictures and files it carries, and it keeps the history itself. A line you send while a run is going goes into that run, read at its next step. A picture goes as an image ahead of your words, as a paste into Claude Code does; any other file, or a picture too big to go, is a line "Attached:" with its absolute path on this computer (files are kept in inbox/, not in the project directory; reading a file runs in every permission mode). Workspace paths and thread replies are refused.
The app keeps permissions, the account, the model, the thinking level and Stop: every tool goes through the app's permission mode (a project session has none of its own), decided as for a Claude Agent Bot: under ask first a change puts up an approval card, answered with Allow or Deny; under read-only a change is refused; Claude Code's own settings and credentials stay off limits, all but its memory of this project (projects/<project>/memory/ under the account's config directory, the project keyed by its git repository), which its file tools open: reads always run, writes go by the mode, and a command still cannot reach it; MCP tools from settings and tools not on the list are refused; AskUserQuestion is off. While it works it looks like a Bot at work: a working bubble at the end of the session with what it has said so far this run, the commands it ran folded into a card, and a last line with the step it is on (such as "run npm test"), that step's time and the run's; an approval it waits on is a card under the bubble. Stop is in the composer beside Send, as in a Bot's direct: it ends the run and every process it started, and you can still send while it works. What it had said by then stays in the conversation as its line, ahead of the next one you send; a run that fails keeps it too. The model is picked at the bottom of the composer, from what the session's account offers in Claude Code's own /model (such as Default (recommended), Opus 5.5, Fable 5.1, Sonnet 5.5 and Haiku 5.5, named and described as Claude Code names them), asked of Claude Code without a prompt by the daemon (GET /v1/runtime/claude-code/models, kept 10 minutes per account, no usage spent); Default is no pick, your settings decide; when it cannot be asked, the aliases sonnet, opus, haiku and fable stand in, and a full id set elsewhere stays a choice; beside it the thinking level: Default thinking follows your settings, and the levels offered are the ones the picked model takes; a model that takes none has no level to pick. Each takes effect from the next step, a run going now switches on the spot, and every later run carries it (sessions.project_model, sessions.project_effort). With more than one Claude account, the account comes first (by the email each signs in with): a change takes effect from the next run, after the session's Claude Code file and its subagents are copied to the new account's directory, where Claude Code looks for it; it cannot change while a run is going (sessions.project_config_dir). All three are the session's own and kept with it. The three are one cascading picker at the bottom of the composer: closed, it reads the model and its thinking level, with the account after them in smaller type, the first to be cut when narrow; open, it unfolds a level at a time: the accounts alone at first (the models, with one account); pointing at or clicking an account opens its models beside it (each with what Claude Code says of it under its name), and a model its thinking levels; the session's own choices are checked. Only a row with nothing under it is a pick: a thinking level, or a model that takes none, takes the choices up to it at once; a column opening never moves the ones before it. The first column sits on the composer's edge; each one after it opens beside the row it came from, its first row level with that row, moved back when it would not fit that way, at most onto the composer's edge. The arrow keys walk it too: Up and Down within a column, Right or Enter to open the next level and go in, Left back a column, Enter on the last level to take it. While a run is going another account cannot be picked, and the account column says why. On a phone it is a sheet from the bottom that goes in a level at a time: the accounts, an account's models, a model's thinking levels, the last tap taking it; the heading names the row you went into, and Back goes up a level. With a speech recognition service set up in Settings, the composer has a microphone at its bottom right as a Bot's does: what you say becomes text at the caret and is never sent by itself (ADR 0073). The composer takes pictures and files too, as a Bot's does: paste a screenshot or files, or pick them with the clip at the bottom left, and they wait above the line until it is sent; Claude Code gets a picture as an image, any other file as its path on this computer. Jobs, plans, the flow, organizing, line readings, the end contract, deliveries and reviews, the supervisor, check-backs and holds stay out; typing "stop" is just a line — Stop is the button.
Out of usage (the addendum to ADR 0110): when the plan's limit turns a Claude Code session's request away, the account is noted out (the same record Bots use) and the session moves itself to another account under "Several accounts" signed in on a Claude plan and not out: once the Claude Code before has exited, the session is copied over as picking the account in the composer does, one line says the account ran out (with its reset) and where the session goes on, and the app starts a run telling Claude Code it stopped on the limit, to carry on with what was left, quoting your lines it had not answered; no "stopped" line. The session then stays on the new account; pick another in the composer to move it back. A line you send while its account is noted out moves it first too. With every account out it stops as before, the failure line saying when it picks up by itself; a minute after that time a run starts that goes on, unless you spoke, cleared the history or deleted the session meanwhile. Codex sessions do not switch accounts, and pick up at a reset Codex reports the same way.
Plan mode (ADR 0098): the Plan switch at the bottom of the composer, or Shift+Tab in the composer (as in the terminal), turns on the session's plan mode: Claude Code looks around and writes a plan, and does the work only once you approve it. While it is on, every run starts in plan mode; turned on or off mid-run, it takes effect from the next step (sessions.project_mode). In plan mode the file tools write only the plan: it is written under plans/ in the account's config directory, in every permission mode; any other write is refused; commands go by the permission mode as with plan mode off (they run under auto and allow all, get an approval card under ask first and are refused under read-only), Claude Code's own plan mode being what keeps them to looking; reads, searches, the to-do list and subagents go on as usual. The plan arrives as a card of its own: the plan drawn as markdown, scrolling inside the card when long, with Approve and start and Keep planning under it. A button in the card's head makes it fill the window, the text at a reading width and where you were reading, the two buttons still under it; Escape or a phone's Back exits and the conversation stays where it was scrolled; approving, keeping planning or opening a file named in the plan exits first, and what to change is said in the composer after exiting. Approved, Claude Code leaves plan mode and gets to work, the switch turns off, and the app's permission mode decides from then on; Keep planning keeps it in plan mode, revising; a line you send while the card waits is what to change, and goes into the run as any other. The plans folder, like the memory, is always readable by the file tools and out of reach of commands.
Slash commands (ADR 0098): a line starting with / goes to Claude Code as it is and runs as in the terminal: /compact, /context, /clear, /review, your skills and plugin commands. Typing / lists the session's commands above the composer (GET /v1/project-sessions/:id/commands: the daemon starts Claude Code once without a prompt, under the session's account and in its directory, reading your settings, keeps the answer per account and directory for 10 minutes, and spends nothing), names or aliases starting with what you typed first, names containing it after; ↑↓ move, Tab fills in, Enter runs it, Esc closes, a click fills in. The terminal's own (doctor and the like), model and effort (the composer's picker has them) and rename (the sidebar has it) are not listed; typed, they still go out, though /model changes only the run, behind the picker's back. A command that answers nothing (/compact, /clear) leaves a system line saying it ran; while /compact works, the working line says Compacting the conversation; /clear makes Claude Code start over with an empty context, and the lines here stay. A command names no session: the name comes from the first line that is not one. A Codex session's commands are in the next paragraph.
Codex (ADR 0099): pick Codex in the New sheet and you talk to your local Codex in that directory, as in Codex's own app: each run starts a codex app-server (the one found in Settings › Agents), the first run opens a thread Codex keeps, and every later run resumes it; it reads your config.toml, AGENTS.md, MCP servers and skills, and the app adds no instructions or tools. Permissions are the app's, as for Claude Code: each command and file change of Codex's asks the app first (the thread runs with a read-only sandbox and untrusted approvals); auto and allow all let it run, ask first puts up an approval card, read-only refuses it (Codex reads files through commands too, so under read-only even reading is refused); no agent's credentials can be reached. The composer's picker lists the models Codex lists (the same list as a Bot's panel, GET /v1/runtime/agents) and the thinking levels the picked one takes; no pick is what your Codex settings say, and a change takes effect from the next turn. A line sent while a turn is going is steered into it, as Codex's own steer does. Pictures go to Codex by their path, other files as their path. Typing / lists the commands the app can carry out for Codex and its skills (Codex's app-server runs no slash command: sent /status and the like, it reads them as plain words): /compact compacts the context, the working line saying Compacting the conversation meanwhile and a system line following; /review reviews the uncommitted changes, or what you write after it, and its reply is the findings. While it reviews, Codex runs its own commands, which only look (a read-only sandbox), without asking the app, so the permission mode decides once, before it starts: under auto and allow all it starts; under ask first a card comes first and approval starts it; under read-only it does not run. While it reviews, the app's rules do not reach those commands, the one on credentials included: the sandbox stops writes, not reads, so files outside the project can be read too. /new (or /clear) opens a new Codex thread that later runs carry on, the lines here staying, and words after it are the new thread's first line; / and a skill's name uses that skill as Codex's own $name does (the list is Codex's skills/list: yours, your plugins', the project's and Codex's own, kept per directory for 10 minutes). Any other line starting with / goes to Codex as words. A command sent while Codex works does not go into that turn: it runs once the turn is over. A Codex session has no plan mode, account to pick, terminal session to carry on or task-map replay yet (the map draws its calls live only). When a run fails the session says "Codex stopped:" with Codex's own words, for instance that the model in your settings is not available to the account; then pick a listed model at the bottom of the composer.
File links: files Claude Code names in its replies show as file links, as a Bot's do, and open in the preview. It writes paths relative to where it was working, not to the app's workspace: right under the project directory, or under one repository inside it (src/lib/api.ts), or just a name (server.go). So before one opens the computer is asked where it is (GET /v1/project-sessions/:id/locate?path=): absolute or from ~/, as written; there under the project directory, that; else, level by level under the project directory, the file or folder whose path ends in it (whole names; hidden folders, node_modules and symlinked folders are not looked in; at most 20,000 entries), the shallowest one. None found, or several at the shallowest, a toast says so and no preview opens; a branch name or any word with a / can show as a link too, and pressing it says it is not in the project directory. Places found are remembered for the session; a miss is asked again on the next press. Beside the preview is the project directory's file tree, read a level at a time like the workspace explorer: the folders down to the file are open, outermost first, and the file is selected; pressing another file opens it in the same preview, and pressing a folder opens or closes it; on a phone the list button at the top of the preview reads the project directory's name. On a wide window this preview is the project's, not the session's: a file opened from any session in the directory turns the one " project folder" tab rather than opening another, and tabs a layout saved one per session fold into one when the app opens (the one nearest the keyboard stays). The tab remembers the session it was last opened from and closes when that session is deleted. Hidden folders and node_modules are not in the tree: a file inside one still opens, with no row selected. A file from outside the project directory (~/Downloads/…, /tmp/…, a picture you pasted into the conversation) opens beside the project directory's tree too (ADR 0095 decision 29), listed from its top, with no row of its own in it; whether it can be saved or annotated still goes by where it is. That is the NSH build; the messenger shows the files that line named beside it, as before.
Annotations (ADR 0095 decision 28): files in the project directory can be annotated, as in a Bot's direct: added from the preview bar, listed, sent as a batch, shown as cards in the conversation. Only the NSH build has the way in; the messenger's preview stays read-only. An annotation hangs on the file's absolute path and on one of the agent's replies: the reply the file was opened from, or, for a file reached in the tree or after opening the project folder from the sidebar, the agent's latest line in the session; before it has said anything you cannot annotate, and the preview says why. Files outside the project directory (a pasted picture, something in /tmp) cannot be annotated. A batch goes out as your line in the session, with no quote and no @; with nothing added the line is its cards alone. The agent gets your words followed by a line saying your annotations follow, then each one spelled out (path, kind, where, quote, note), with each region's crop as a picture (Codex's are written to the system's temporary folder and given by path). It has none of the app's tools, so only you mark one resolved; a changed file still shows as changed or relocated; clearing or deleting the session takes them with it.
Message index: down the conversation's left edge is the message index a Bot's conversation has: a short tick for each line loaded, yours in the accent, the agent's and the app's grey. Hovering one shows the line, who said it, when and which line it is, and pressing the tick or that card scrolls to the line; the arrow keys go line by line and Esc closes the card. The lit tick follows where you are reading, the last one while you are at the end; once you have jumped back, new lines and the agent's progress no longer pull you down. The arrow on top loads the page before. It shows with two lines or more (or an earlier page), and not when the conversation is as narrow as a phone.
Records: each run is an agent_runs row (status, the approval waiting on you, what it is doing, why it failed, its background tasks and their state); a run still going when the daemon restarts is marked interrupted. Its spend goes into the spend ledger as a line of its own, "Project sessions", and counts toward the daily cap (see Spend); the usage is still the Claude account's, shown in the usage widget. With Claude Code missing, signed out or the directory gone, the run fails and a system line in the session says why. The context menu pins it, opens its project folder or a terminal in it, renames it, clears the history, archives or deletes it; the last three first stop a run still going. After clearing the history, the next run starts a new session; deleting removes the session and its lines from the app, leaving Claude Code's own session file and the directory's files as they are. The memory lives in Claude Code's own session file: if that file is deleted, the next run fails to find the session. The phone uses the same routes (GET /v1/runtime/claude-code/sessions, POST /v1/project-sessions, GET /v1/project-sessions/:id/run, GET /v1/project-sessions/:id/locate, GET /v1/project-sessions/:id/commands, PATCH /v1/project-sessions/:id, POST /v1/agent-runs/:id/approve|deny|stop).
For the task map: each tool call sends a tool frame as it starts and as it ends (turn_id the run's id, agent_run saying which subagent, where, which model made the step, and whether it went through), never stored. GET /v1/project-sessions/:id/replay reads the whole of it back from Claude Code's own session files: each tool call's time, the agent or which subagent, place, the model that made it, whether it went through, how long, and the permission decision Claude Code wrote down (hook for the hook letting it run, user_temporary for Allow on a card, user_reject for Deny), the subagents, what you said and your answers to its questions. A place is a path relative to the project, a path outside it (~/.claude* apart), a test or type check, or git; commands, file contents and results are not carried on. Claude Code only for now.
Background tasks (ADR 0095 decision 25): in a project session Claude Code can send commands to the background, watch a command or a connection with Monitor, and send subagents off, as in the terminal; a Monitor's command goes by the permission mode like any other. These read as a Bot's work does in a direct. The working bubble stays: with only background tasks left after a reply its last line reads "N background tasks running", the sidebar and the pane read "Background tasks running", and a line you send is answered at once; when a task ends Claude Code usually says something by itself. That last line opens onto what is going on now, running commands and Monitors with their live output. A finished one joins the "N commands" card, its output opening under it; once the run is over they stay folded under the reply of the turn that started them, earlier runs' too. A subagent is as a Bot↔Bot direct is: a way in under the reply, opening a popup (a whole page on a phone) with what it was asked, what it said and each tool call, following along while it runs. Stop stays in the composer: with background tasks going its button is a stop menu, everything or one of them; a daemon restart ends them too, and they do not go on. A Codex session has none of this, and Bots still run nothing in the background.
Task map (ADR 0096): Open task map in a project session's context menu, or Map in its pane header and tab ⋯, opens a pane beside it that draws the session as an isometric town. The busiest folders are a building each (ten at most, the shape picked by the folder's name: docs a library and so on), besides the project's root, checks, git, services (MCP, one relay station for them all), Claude Code's own files and outside the project; the town is laid out when the map opens, and live calls after that join the building whose folder holds them rather than moving it (a new session with no code building yet is laid out by its first calls as they come in). Claude Code is the main character and each subagent it sends out a smaller one, there only while it works; over each character a badge carries the agent's logo, name and the step's model (such as Opus 5.5). Drag to pan, right-drag or Shift+drag to turn, scroll to zoom, swipe sideways to turn too; the dial drags, or a click faces one way. The sky keeps the replay's clock: the sun rises in the east and sets in the west, the moon and stars take the night, walls and shadows change with them, and the lamps light up after dark. A building nobody is at shows only its colour dot and visit count; hovering it, picking it or zooming in past 1.5× brings its name back. A building's plate opens what it had up to that moment — visits, by whom, failures, the files it touched last — with the visit before and after; a character, clicked, is followed. The timeline below plays (1, 4, 8 or 32×) and scrubs, one lane per character, failures as red dots; a gap over 15 minutes takes 4 seconds. The side says where it is and what it is doing, what you asked of it and the moments worth a look (a subagent sent out, a question and how long it waited on you, a long pause, a call stopped, a change you allowed on its card, failures, calls of half a minute or more, back and forth between two places), each a click away. What you asked and the moments share what the cards above them leave: a short list takes just its lines and the other the rest; both long, half each, each scrolling in its own card. While the session runs the map follows the newest step, marked Live; drag back to look earlier and press Back to live to return; a run ending and a reconnect read the replay again. Only a wide window has the map; a phone and a narrow window do not yet.
A Bot conversation's task map (ADR 0097): directs and groups have a map too, opened the same way (Open task map in the context menu, Map in the pane header and tab ⋯); the file drop does not. The app keeps where each of a Bot's tool calls worked (tool_places): a file tool's path from the workspace root, a shell command's paths from its cwd (the turn's work dir when it names none), an MCP tool at its server, and messages, questions and planning at the workspace; only the place, the file's name, the model and how it came out, never the arguments, commands or contents. A call that waits on your card is tied to it, so the ones you allow or refuse are on the map. Every Bot that worked is a main character, there from start to end at full size, each one of the mascots Pudding and Mochi grown into a character: the same body in a flavour and outfit of its own (Pudding with its antenna; Mochi in a beanie holding a mug; taro in headphones with a clipboard; sakura in a beret with palette and brush; matcha in a chef's hat with a whisk; caramel in a hard hat with a hammer; sesame in glasses with a pencil behind its ear and a book; blueberry in a wizard's hat with a wand), never two alike on a map, always facing you; a Bot whose avatar is a folk is the character on its avatar (another one when a Bot before it is that one) with that folk's eyes and mouth, any other gets Pudding's own face; a round pin on its chest carries its avatar; at work in a place each does its own work (Pudding types as its antenna picks up signals; Mochi sips its steaming coffee; taro nods to its headphones and ticks its clipboard; sakura paints, flicking strokes of colour; matcha whisks; caramel brings its hammer down, sparks flying; sesame reads, turns pages and pushes up its glasses; blueberry floats and casts with its wand), it swings its arms walking, and at a door with several each stands in front of the one on its right so the work in its hand shows; it talks while replying, hops and waves while waiting on you and frowns at a failure, blinks now and then, and darkens and warms with the map's hour; its badge leads with the avatar too, then its name, its model's source logo (the endpoint's vendor, Claude Agent's spark, a local agent's logo) and the step's model; each Bot is a card at the side, with its avatar. The map is drawn by plan, as the flow is: with none asked for, the conversation's newest work, switched above the town, and Map in the flow's header opens that plan's; its work is every call of its turns, in its group, your directs with its Bots or the Bots' directs with each other (GET /v1/tasks/:id/replay), each Bot's card says which conversation its step is in and the line it works for, each line you said is tagged with where, a Bot taking the plan up in a conversation for the first time is a moment, and the top says how many conversations; a conversation with no plan yet draws all its work. The root is called Workspace here, what lies outside it Outside and the little-used folders Elsewhere, and the town is named for the plan's folder (the workspace's, with no plan); end_turn, how a turn says it is done, is not a step, and a call that waited on your card is not a long call. GET /v1/sessions/:id/replay reads back the newest 5000 calls, what you said and your answers to the Bots' questions. Calls before this version kept no place and cannot be drawn. Deleting or clearing a conversation removes its record, and Bots cannot read it.
Avoid: calling a project session a Bot, jobs or a flow in a project session, typing "stop" as Stop, changing the terminal's original session
Task map
Work drawn as a town of folders (a project session's, or a Bot plan's): the busiest folders a building each, besides the root (the project's, or the workspace on a Bot's map), checks, git, services, Claude Code's own files and outside. In a project session the agent is the main character and each subagent it sends out a smaller one; opened from a Bot conversation it is drawn by plan (as the flow is), across groups, directs and the Bots' directs, and every Bot is a main character. Badges carry the model's source logo and the step's model. It replays and follows live, describing what happened without judging it. A workbench pane for every conversation but the file drop; a Bot's calls can be drawn from the version the app began keeping where they worked. Details: Behavior · Project sessions, ADR 0096, ADR 0097.
Behavior details
(ADR 0095) You and your local Claude Code or Codex in a project directory, as in Claude's and Codex's own desktop apps, with no Bot. Below the sidebar's Bots section (group chats and your directs with Bots listed together, in the list's own order; its "+" offers New bot and New group) is a Projects section: one row per directory, in the order each got its first session, newest first, so starting a session, sending a line or reading in one directory never moves the directories (only deleting a directory's oldest session can); a row unfolds to its sessions, newest first, each led by its agent's mark (one directory can hold sessions of different agents), which its tab, its pane header and the folded sidebar's rail wear too. A session's row is the size of a Bot's and says the same: the mark where the avatar goes, its name and time, and below them what the agent is doing (Thinking, Replying, Approval, with a dot of that colour on the mark) or, when it is not running, the last line, with the unread count; the section's "+" offers one item per agent (New Claude Code session…, New Codex session…) and, below a divider, Import a terminal session…, and each directory row has its own "+" that asks which agent and starts a session right there (shown on hover with a pointer, always on a phone), with Open project folder and Open terminal in project folder below a divider. Right-clicking a directory row brings up the same menu at the pointer. Open terminal in project folder starts a shell in that directory (see Terminal): a terminal tab on a wide window, the Terminal page on a phone. Open project folder opens the directory itself in the preview: the body lists what is in it and the project directory's file tree is beside it (the same tree a file opened from a link below comes with); press a folder to go into it, a file to see it in the same preview. On a wide window a project has one preview tab, named " project folder": whichever of the directory's sessions opens it, and a file named in any of them, lands in that one tab (see File links below). On a phone it opens as the preview of one of the directory's sessions (the one on screen when it is in that directory, else the newest): that session comes up first and the preview rises over it. A phone's create button offers New in a folder… and Import a terminal session…, the agent picked in the sheet. With a mouse, hovering a session's row shows Pin and ⋯ at its right end, ⋯ being its context menu, as on a Bot's row. Pinned, it moves from its directory up to the pinned band at the top of the sidebar, in its agent's mark; a directory with no other session is not listed until you unpin it. Renaming a pinned session adds a name field under its directory for the moment; its place in the band stays. On a phone the Bots and Projects pages each show their own pins.
The two sheets: both pick the agent first (New offers Claude Code and Codex, Import Claude Code only), then list directories, the most recently active first. New lists every directory your Claude Code terminal sessions or the app's project sessions (of either agent) ran in, each starting a session there in one press, and a last row, Another directory…, for one of your own. Import lists only directories that hold terminal sessions, with the name, path and session count, one unfolding at a time.
Starting one: in the computer's window, New Claude Code session… and New Codex session… open the system folder dialog and start that agent's session in the folder you pick (with no system dialog they open the New sheet with that agent picked); a directory row's "+" starts one of the agent you pick there; in the New sheet, press a directory; or in Another directory… pick one (the system folder picker in the window, or a typed full path; a phone has neither and browses the computer's folders one level at a time instead, Use this folder in the project's directory, through GET /v1/host/tree) and press Start. The first 60 characters of your first line name the session; Rename in its context menu turns its sidebar row into a name field (Enter saves, Escape leaves it), and a renamed session is not named by your first line any more. The first run starts Claude Code (or Codex) in that directory and records its own session id (Codex's thread id); every later run carries that session on.
Carrying on a terminal session: Import a terminal session… opens the Import sheet, where an unfolded directory lists the Claude Code sessions you had in a terminal there (projects/*/*.jsonl under each account directory, the most recently changed first, eight of them until you ask for the rest; sessions the SDK started — the app's own among them — and subagents are left out), each with its title, git branch and time, and its account when they come from more than one. Pick one and press Carry on: the session opens in the original's directory, named after its title; what you said and Claude's text land at their own times (Claude Code's own notices, such as a background task finishing, are not lines of yours), with a system line at the bottom saying where it came from and how many tool calls it left out (tool calls are not imported one by one). The first run branches off the original (resume with forkSession), which stays as it was, so you can go on with it in the terminal; every later run carries the branch on. Sessions started in the app are started by the SDK, so the terminal's /resume does not list them. On first launch, the wizard's last step can carry one on the same way (see "Bot templates and first launch").
As in the terminal: Claude Code reads your user, project and local settings and CLAUDE.md, with its own system prompt and no persona or tools from the app; each run is sent only your new line and the pictures and files it carries, and it keeps the history itself. A line you send while a run is going goes into that run, read at its next step. A picture goes as an image ahead of your words, as a paste into Claude Code does; any other file, or a picture too big to go, is a line "Attached:" with its absolute path on this computer (files are kept in inbox/, not in the project directory; reading a file runs in every permission mode). Workspace paths and thread replies are refused.
The app keeps permissions, the account, the model, the thinking level and Stop: every tool goes through the app's permission mode (a project session has none of its own), decided as for a Claude Agent Bot: under ask first a change puts up an approval card, answered with Allow or Deny; under read-only a change is refused; Claude Code's own settings and credentials stay off limits, all but its memory of this project (projects/<project>/memory/ under the account's config directory, the project keyed by its git repository), which its file tools open: reads always run, writes go by the mode, and a command still cannot reach it; MCP tools from settings and tools not on the list are refused; AskUserQuestion is off. While it works it looks like a Bot at work: a working bubble at the end of the session with what it has said so far this run, the commands it ran folded into a card, and a last line with the step it is on (such as "run npm test"), that step's time and the run's; an approval it waits on is a card under the bubble. Stop is in the composer beside Send, as in a Bot's direct: it ends the run and every process it started, and you can still send while it works. What it had said by then stays in the conversation as its line, ahead of the next one you send; a run that fails keeps it too. The model is picked at the bottom of the composer, from what the session's account offers in Claude Code's own /model (such as Default (recommended), Opus 5.5, Fable 5.1, Sonnet 5.5 and Haiku 5.5, named and described as Claude Code names them), asked of Claude Code without a prompt by the daemon (GET /v1/runtime/claude-code/models, kept 10 minutes per account, no usage spent); Default is no pick, your settings decide; when it cannot be asked, the aliases sonnet, opus, haiku and fable stand in, and a full id set elsewhere stays a choice; beside it the thinking level: Default thinking follows your settings, and the levels offered are the ones the picked model takes; a model that takes none has no level to pick. Each takes effect from the next step, a run going now switches on the spot, and every later run carries it (sessions.project_model, sessions.project_effort). With more than one Claude account, the account comes first (by the email each signs in with): a change takes effect from the next run, after the session's Claude Code file and its subagents are copied to the new account's directory, where Claude Code looks for it; it cannot change while a run is going (sessions.project_config_dir). All three are the session's own and kept with it. The three are one cascading picker at the bottom of the composer: closed, it reads the model and its thinking level, with the account after them in smaller type, the first to be cut when narrow; open, it unfolds a level at a time: the accounts alone at first (the models, with one account); pointing at or clicking an account opens its models beside it (each with what Claude Code says of it under its name), and a model its thinking levels; the session's own choices are checked. Only a row with nothing under it is a pick: a thinking level, or a model that takes none, takes the choices up to it at once; a column opening never moves the ones before it. The first column sits on the composer's edge; each one after it opens beside the row it came from, its first row level with that row, moved back when it would not fit that way, at most onto the composer's edge. The arrow keys walk it too: Up and Down within a column, Right or Enter to open the next level and go in, Left back a column, Enter on the last level to take it. While a run is going another account cannot be picked, and the account column says why. On a phone it is a sheet from the bottom that goes in a level at a time: the accounts, an account's models, a model's thinking levels, the last tap taking it; the heading names the row you went into, and Back goes up a level. With a speech recognition service set up in Settings, the composer has a microphone at its bottom right as a Bot's does: what you say becomes text at the caret and is never sent by itself (ADR 0073). The composer takes pictures and files too, as a Bot's does: paste a screenshot or files, or pick them with the clip at the bottom left, and they wait above the line until it is sent; Claude Code gets a picture as an image, any other file as its path on this computer. Jobs, plans, the flow, organizing, line readings, the end contract, deliveries and reviews, the supervisor, check-backs and holds stay out; typing "stop" is just a line — Stop is the button.
Out of usage (the addendum to ADR 0110): when the plan's limit turns a Claude Code session's request away, the account is noted out (the same record Bots use) and the session moves itself to another account under "Several accounts" signed in on a Claude plan and not out: once the Claude Code before has exited, the session is copied over as picking the account in the composer does, one line says the account ran out (with its reset) and where the session goes on, and the app starts a run telling Claude Code it stopped on the limit, to carry on with what was left, quoting your lines it had not answered; no "stopped" line. The session then stays on the new account; pick another in the composer to move it back. A line you send while its account is noted out moves it first too. With every account out it stops as before, the failure line saying when it picks up by itself; a minute after that time a run starts that goes on, unless you spoke, cleared the history or deleted the session meanwhile. Codex sessions do not switch accounts, and pick up at a reset Codex reports the same way.
Plan mode (ADR 0098): the Plan switch at the bottom of the composer, or Shift+Tab in the composer (as in the terminal), turns on the session's plan mode: Claude Code looks around and writes a plan, and does the work only once you approve it. While it is on, every run starts in plan mode; turned on or off mid-run, it takes effect from the next step (sessions.project_mode). In plan mode the file tools write only the plan: it is written under plans/ in the account's config directory, in every permission mode; any other write is refused; commands go by the permission mode as with plan mode off (they run under auto and allow all, get an approval card under ask first and are refused under read-only), Claude Code's own plan mode being what keeps them to looking; reads, searches, the to-do list and subagents go on as usual. The plan arrives as a card of its own: the plan drawn as markdown, scrolling inside the card when long, with Approve and start and Keep planning under it. A button in the card's head makes it fill the window, the text at a reading width and where you were reading, the two buttons still under it; Escape or a phone's Back exits and the conversation stays where it was scrolled; approving, keeping planning or opening a file named in the plan exits first, and what to change is said in the composer after exiting. Approved, Claude Code leaves plan mode and gets to work, the switch turns off, and the app's permission mode decides from then on; Keep planning keeps it in plan mode, revising; a line you send while the card waits is what to change, and goes into the run as any other. The plans folder, like the memory, is always readable by the file tools and out of reach of commands.
Slash commands (ADR 0098): a line starting with / goes to Claude Code as it is and runs as in the terminal: /compact, /context, /clear, /review, your skills and plugin commands. Typing / lists the session's commands above the composer (GET /v1/project-sessions/:id/commands: the daemon starts Claude Code once without a prompt, under the session's account and in its directory, reading your settings, keeps the answer per account and directory for 10 minutes, and spends nothing), names or aliases starting with what you typed first, names containing it after; ↑↓ move, Tab fills in, Enter runs it, Esc closes, a click fills in. The terminal's own (doctor and the like), model and effort (the composer's picker has them) and rename (the sidebar has it) are not listed; typed, they still go out, though /model changes only the run, behind the picker's back. A command that answers nothing (/compact, /clear) leaves a system line saying it ran; while /compact works, the working line says Compacting the conversation; /clear makes Claude Code start over with an empty context, and the lines here stay. A command names no session: the name comes from the first line that is not one. A Codex session's commands are in the next paragraph.
Codex (ADR 0099): pick Codex in the New sheet and you talk to your local Codex in that directory, as in Codex's own app: each run starts a codex app-server (the one found in Settings › Agents), the first run opens a thread Codex keeps, and every later run resumes it; it reads your config.toml, AGENTS.md, MCP servers and skills, and the app adds no instructions or tools. Permissions are the app's, as for Claude Code: each command and file change of Codex's asks the app first (the thread runs with a read-only sandbox and untrusted approvals); auto and allow all let it run, ask first puts up an approval card, read-only refuses it (Codex reads files through commands too, so under read-only even reading is refused); no agent's credentials can be reached. The composer's picker lists the models Codex lists (the same list as a Bot's panel, GET /v1/runtime/agents) and the thinking levels the picked one takes; no pick is what your Codex settings say, and a change takes effect from the next turn. A line sent while a turn is going is steered into it, as Codex's own steer does. Pictures go to Codex by their path, other files as their path. Typing / lists the commands the app can carry out for Codex and its skills (Codex's app-server runs no slash command: sent /status and the like, it reads them as plain words): /compact compacts the context, the working line saying Compacting the conversation meanwhile and a system line following; /review reviews the uncommitted changes, or what you write after it, and its reply is the findings. While it reviews, Codex runs its own commands, which only look (a read-only sandbox), without asking the app, so the permission mode decides once, before it starts: under auto and allow all it starts; under ask first a card comes first and approval starts it; under read-only it does not run. While it reviews, the app's rules do not reach those commands, the one on credentials included: the sandbox stops writes, not reads, so files outside the project can be read too. /new (or /clear) opens a new Codex thread that later runs carry on, the lines here staying, and words after it are the new thread's first line; / and a skill's name uses that skill as Codex's own $name does (the list is Codex's skills/list: yours, your plugins', the project's and Codex's own, kept per directory for 10 minutes). Any other line starting with / goes to Codex as words. A command sent while Codex works does not go into that turn: it runs once the turn is over. A Codex session has no plan mode, account to pick, terminal session to carry on or task-map replay yet (the map draws its calls live only). When a run fails the session says "Codex stopped:" with Codex's own words, for instance that the model in your settings is not available to the account; then pick a listed model at the bottom of the composer.
File links: files Claude Code names in its replies show as file links, as a Bot's do, and open in the preview. It writes paths relative to where it was working, not to the app's workspace: right under the project directory, or under one repository inside it (src/lib/api.ts), or just a name (server.go). So before one opens the computer is asked where it is (GET /v1/project-sessions/:id/locate?path=): absolute or from ~/, as written; there under the project directory, that; else, level by level under the project directory, the file or folder whose path ends in it (whole names; hidden folders, node_modules and symlinked folders are not looked in; at most 20,000 entries), the shallowest one. None found, or several at the shallowest, a toast says so and no preview opens; a branch name or any word with a / can show as a link too, and pressing it says it is not in the project directory. Places found are remembered for the session; a miss is asked again on the next press. Beside the preview is the project directory's file tree, read a level at a time like the workspace explorer: the folders down to the file are open, outermost first, and the file is selected; pressing another file opens it in the same preview, and pressing a folder opens or closes it; on a phone the list button at the top of the preview reads the project directory's name. On a wide window this preview is the project's, not the session's: a file opened from any session in the directory turns the one " project folder" tab rather than opening another, and tabs a layout saved one per session fold into one when the app opens (the one nearest the keyboard stays). The tab remembers the session it was last opened from and closes when that session is deleted. Hidden folders and node_modules are not in the tree: a file inside one still opens, with no row selected. A file from outside the project directory (~/Downloads/…, /tmp/…, a picture you pasted into the conversation) opens beside the project directory's tree too (ADR 0095 decision 29), listed from its top, with no row of its own in it; whether it can be saved or annotated still goes by where it is. That is the NSH build; the messenger shows the files that line named beside it, as before.
Annotations (ADR 0095 decision 28): files in the project directory can be annotated, as in a Bot's direct: added from the preview bar, listed, sent as a batch, shown as cards in the conversation. Only the NSH build has the way in; the messenger's preview stays read-only. An annotation hangs on the file's absolute path and on one of the agent's replies: the reply the file was opened from, or, for a file reached in the tree or after opening the project folder from the sidebar, the agent's latest line in the session; before it has said anything you cannot annotate, and the preview says why. Files outside the project directory (a pasted picture, something in /tmp) cannot be annotated. A batch goes out as your line in the session, with no quote and no @; with nothing added the line is its cards alone. The agent gets your words followed by a line saying your annotations follow, then each one spelled out (path, kind, where, quote, note), with each region's crop as a picture (Codex's are written to the system's temporary folder and given by path). It has none of the app's tools, so only you mark one resolved; a changed file still shows as changed or relocated; clearing or deleting the session takes them with it.
Message index: down the conversation's left edge is the message index a Bot's conversation has: a short tick for each line loaded, yours in the accent, the agent's and the app's grey. Hovering one shows the line, who said it, when and which line it is, and pressing the tick or that card scrolls to the line; the arrow keys go line by line and Esc closes the card. The lit tick follows where you are reading, the last one while you are at the end; once you have jumped back, new lines and the agent's progress no longer pull you down. The arrow on top loads the page before. It shows with two lines or more (or an earlier page), and not when the conversation is as narrow as a phone.
Records: each run is an agent_runs row (status, the approval waiting on you, what it is doing, why it failed, its background tasks and their state); a run still going when the daemon restarts is marked interrupted. Its spend goes into the spend ledger as a line of its own, "Project sessions", and counts toward the daily cap (see Spend); the usage is still the Claude account's, shown in the usage widget. With Claude Code missing, signed out or the directory gone, the run fails and a system line in the session says why. The context menu pins it, opens its project folder or a terminal in it, renames it, clears the history, archives or deletes it; the last three first stop a run still going. After clearing the history, the next run starts a new session; deleting removes the session and its lines from the app, leaving Claude Code's own session file and the directory's files as they are. The memory lives in Claude Code's own session file: if that file is deleted, the next run fails to find the session. The phone uses the same routes (GET /v1/runtime/claude-code/sessions, POST /v1/project-sessions, GET /v1/project-sessions/:id/run, GET /v1/project-sessions/:id/locate, GET /v1/project-sessions/:id/commands, PATCH /v1/project-sessions/:id, POST /v1/agent-runs/:id/approve|deny|stop).
For the task map: each tool call sends a tool frame as it starts and as it ends (turn_id the run's id, agent_run saying which subagent, where, which model made the step, and whether it went through), never stored. GET /v1/project-sessions/:id/replay reads the whole of it back from Claude Code's own session files: each tool call's time, the agent or which subagent, place, the model that made it, whether it went through, how long, and the permission decision Claude Code wrote down (hook for the hook letting it run, user_temporary for Allow on a card, user_reject for Deny), the subagents, what you said and your answers to its questions. A place is a path relative to the project, a path outside it (~/.claude* apart), a test or type check, or git; commands, file contents and results are not carried on. Claude Code only for now.
Background tasks (ADR 0095 decision 25): in a project session Claude Code can send commands to the background, watch a command or a connection with Monitor, and send subagents off, as in the terminal; a Monitor's command goes by the permission mode like any other. These read as a Bot's work does in a direct. The working bubble stays: with only background tasks left after a reply its last line reads "N background tasks running", the sidebar and the pane read "Background tasks running", and a line you send is answered at once; when a task ends Claude Code usually says something by itself. That last line opens onto what is going on now, running commands and Monitors with their live output. A finished one joins the "N commands" card, its output opening under it; once the run is over they stay folded under the reply of the turn that started them, earlier runs' too. A subagent is as a Bot↔Bot direct is: a way in under the reply, opening a popup (a whole page on a phone) with what it was asked, what it said and each tool call, following along while it runs. Stop stays in the composer: with background tasks going its button is a stop menu, everything or one of them; a daemon restart ends them too, and they do not go on. A Codex session has none of this, and Bots still run nothing in the background.
Task map (ADR 0096): Open task map in a project session's context menu, or Map in its pane header and tab ⋯, opens a pane beside it that draws the session as an isometric town. The busiest folders are a building each (ten at most, the shape picked by the folder's name: docs a library and so on), besides the project's root, checks, git, services (MCP, one relay station for them all), Claude Code's own files and outside the project; the town is laid out when the map opens, and live calls after that join the building whose folder holds them rather than moving it (a new session with no code building yet is laid out by its first calls as they come in). Claude Code is the main character and each subagent it sends out a smaller one, there only while it works; over each character a badge carries the agent's logo, name and the step's model (such as Opus 5.5). Drag to pan, right-drag or Shift+drag to turn, scroll to zoom, swipe sideways to turn too; the dial drags, or a click faces one way. The sky keeps the replay's clock: the sun rises in the east and sets in the west, the moon and stars take the night, walls and shadows change with them, and the lamps light up after dark. A building nobody is at shows only its colour dot and visit count; hovering it, picking it or zooming in past 1.5× brings its name back. A building's plate opens what it had up to that moment — visits, by whom, failures, the files it touched last — with the visit before and after; a character, clicked, is followed. The timeline below plays (1, 4, 8 or 32×) and scrubs, one lane per character, failures as red dots; a gap over 15 minutes takes 4 seconds. The side says where it is and what it is doing, what you asked of it and the moments worth a look (a subagent sent out, a question and how long it waited on you, a long pause, a call stopped, a change you allowed on its card, failures, calls of half a minute or more, back and forth between two places), each a click away. What you asked and the moments share what the cards above them leave: a short list takes just its lines and the other the rest; both long, half each, each scrolling in its own card. While the session runs the map follows the newest step, marked Live; drag back to look earlier and press Back to live to return; a run ending and a reconnect read the replay again. Only a wide window has the map; a phone and a narrow window do not yet.
A Bot conversation's task map (ADR 0097): directs and groups have a map too, opened the same way (Open task map in the context menu, Map in the pane header and tab ⋯); the file drop does not. The app keeps where each of a Bot's tool calls worked (tool_places): a file tool's path from the workspace root, a shell command's paths from its cwd (the turn's work dir when it names none), an MCP tool at its server, and messages, questions and planning at the workspace; only the place, the file's name, the model and how it came out, never the arguments, commands or contents. A call that waits on your card is tied to it, so the ones you allow or refuse are on the map. Every Bot that worked is a main character, there from start to end at full size, each one of the mascots Pudding and Mochi grown into a character: the same body in a flavour and outfit of its own (Pudding with its antenna; Mochi in a beanie holding a mug; taro in headphones with a clipboard; sakura in a beret with palette and brush; matcha in a chef's hat with a whisk; caramel in a hard hat with a hammer; sesame in glasses with a pencil behind its ear and a book; blueberry in a wizard's hat with a wand), never two alike on a map, always facing you; a Bot whose avatar is a folk is the character on its avatar (another one when a Bot before it is that one) with that folk's eyes and mouth, any other gets Pudding's own face; a round pin on its chest carries its avatar; at work in a place each does its own work (Pudding types as its antenna picks up signals; Mochi sips its steaming coffee; taro nods to its headphones and ticks its clipboard; sakura paints, flicking strokes of colour; matcha whisks; caramel brings its hammer down, sparks flying; sesame reads, turns pages and pushes up its glasses; blueberry floats and casts with its wand), it swings its arms walking, and at a door with several each stands in front of the one on its right so the work in its hand shows; it talks while replying, hops and waves while waiting on you and frowns at a failure, blinks now and then, and darkens and warms with the map's hour; its badge leads with the avatar too, then its name, its model's source logo (the endpoint's vendor, Claude Agent's spark, a local agent's logo) and the step's model; each Bot is a card at the side, with its avatar. The map is drawn by plan, as the flow is: with none asked for, the conversation's newest work, switched above the town, and Map in the flow's header opens that plan's; its work is every call of its turns, in its group, your directs with its Bots or the Bots' directs with each other (GET /v1/tasks/:id/replay), each Bot's card says which conversation its step is in and the line it works for, each line you said is tagged with where, a Bot taking the plan up in a conversation for the first time is a moment, and the top says how many conversations; a conversation with no plan yet draws all its work. The root is called Workspace here, what lies outside it Outside and the little-used folders Elsewhere, and the town is named for the plan's folder (the workspace's, with no plan); end_turn, how a turn says it is done, is not a step, and a call that waited on your card is not a long call. GET /v1/sessions/:id/replay reads back the newest 5000 calls, what you said and your answers to the Bots' questions. Calls before this version kept no place and cannot be drawn. Deleting or clearing a conversation removes its record, and Bots cannot read it.
Avoid: calling the task map a flow, live calls moving buildings already laid out, keeping a call's arguments in the map's record
Session
The conversation container of a direct, a group or a project session. Messages, turns, judgements, and spend all belong to it. A Bot↔Bot direct is also a session; you are not a participant in it, and you can read it in a popup but cannot post; the sidebar does not list it.
Avoid: channel, room, treating a thread as a session
Origin
The message a Bot↔Bot direct was opened from: the message that woke the opening Bot for the turn in which it opened the direct. The direct's entry hangs under that message — or, when the conversation does not show that message (a line only the Bot reads, such as a finished job's note or a check-back), under the last line it shows before it — and is the only way in: it pops the direct up over the conversation on screen, and the popup shows its origin and can be clicked to go back to it. Once the origin session is cleared or deleted, the direct has no origin and can still be read as usual.
Avoid: parent session, thread, taking the Bot's own line "I'll go ask X" as the origin
Thread
A quoted reply to one message in the main transcript, kept in that transcript rather than a new group or separate conversation. A delegation's collaboration thread reused for “two Bots × plan” is a direct, not this message-reply relationship.
Avoid: a quoted reply is a new group, replies hidden in the sidebar, auto-mentioning the user, a collaboration direct as a reply to one message
Reaction
A lightweight acknowledgment of a message, picked from a fixed set of emoji; custom ones aren't allowed. It never carries changed instructions or security decisions; those require a written reply or an approval. In v1 only you add reactions; Bots don't react.
Avoid: emoji as approval, custom emoji, ✅/❌ as allow or deny
Judgement log
The record of join-in / sit-out decisions, visible in the current conversation's settings. It does not go into the main transcript.
Avoid: treating judgements as turns, flooding the main transcript