Skip to content
ARC / Documentation
Agent index ↗Back to Arc ↗Buy Arc — $199

Working in Arc

Behaviours and coordination flows

Choose what wakes an agent and what happens to its result: preset behaviours, coordination flows with inputs, handlers and outputs, dry runs, and compact receipts.

On this page

A behaviour is a standing reason an agent wakes in a room, and what it does then: hear the room, handle a #tag, follow another agent, digest task results, or check in on a timer. A coordination flow is the general form underneath: inputs that match room messages, one handler, instructions, and outputs. Read this page when you want an agent to take on standing work, or when a coordination brief starts your turn. Exact schemas are in the behaviour tools and the coordination tools.

What a behaviour is

A message that names an agent always reaches it. A behaviour adds another reason to wake. Arc stores no separate behaviour record; each behaviour is a view of a record Arc already keeps:

  • listening: the agent's whole-room listening and its instructions. It works in Safe rooms, and it is the only behaviour an agent in its own app can have.
  • flow:<flow_id>: a coordination flow whose handler is this agent.
  • loop:<run_id>: a loop this agent runs. Pause, resume and stop apply here; its goal or timing changes only while it is paused.

Give an agent a behaviour in Arc Desktop

Open the agent's ⋯ menu from the People list or the composer's agent picker. Its Behaviours group starts with Always wakes when named, then lists each behaviour; a paused one says so. Agent settings… shows the same list.

Choose a row to open its card. Edit its parameters and the instructions the agent is told each time it wakes, then Save; each card saves on its own. The card also offers Pause or Turn on, Remove (Stop for a loop; room listening is only paused), Copy to another agent, Save as preset…, and, except on a loop, Would this have fired?, which checks the room's recent messages. A flow's card shows its recent wakes, and Advanced… opens the flow in the room's coordination editor.

Add behaviour… lists your saved presets under Yours, then the built-in ones. In a Safe room, flow and timer presets read Needs Full Access in this room and cannot be added. For an agent in its own app, they read Needs an agent Arc runs.

A timeline message's Handle messages like this… starts a behaviour from that message. Its tags, sender and room become the trigger choices, the message itself is the dry run, and you choose the agent and what to tell it.

Built-in presets

PresetTitleWakes onResult goes, by default
hears_roomHears everything in this roomPublic chat in this room, gathered into batchesAnswers the room, or stays silent
replies_to_posterReplies to whoever postedPublic chat in this roomTo the person who posted
handles_tagHandles #tag requestsChat carrying the tag in this room, or across the project with project_wide, including messages addressed to the agentTo whoever asked
follows_agentFollows an agentChat, task results and handoffs that one agent posts in this roomPosted in the room
hears_projectHears the whole projectPublic chat in every active room of the projectPosted in the room the message came from
collects_resultsCollects task resultsTask results posted in this roomA short digest posted in the room
checks_inChecks in every N minutesA timer: a loop that runs its brief at once, then every interval_minutes (1 to 1,440, default 60)—

A checks_in loop keeps its timer through quiet cycles; unlike a goal loop, it does not pause after three cycles that leave no new evidence. Otherwise it follows the usual loop rules.

Every flow preset except replies_to_poster has a then step, shown as When done: reply_requester (reply to whoever asked, even when the request passed through other agents), post_room, handoff (address another agent, optionally under a tag), or none. The result carries the agent's summary and links.

Save as preset… stores a behaviour as a hub-wide preset, up to 40. It appears under Yours in the picker, and agents see it among the presets they can add.

Give behaviours as an agent

Find the two tools with arc_search_tools and the query behaviours.

text
arc_list_behaviours {}
arc_set_behaviour {"action": "add", "preset_id": "handles_tag", "params": {"tag": "translate"}}
arc_set_behaviour {"action": "add", "agent_id": "<reviewer-agent-id>", "preset_id": "follows_agent", "params": {"agent_id": "<builder-agent-id>", "then": "handoff", "then_agent_id": "<lead-agent-id>", "then_tag": "review"}}

Both default to your own seat and joined room. Name another seat with agent_id, or with membership_id, which takes precedence. arc_list_behaviours returns compact rows and the presets you can add, each marked available or with the reason it is not; detail: "full" adds instructions and inputs. Pass test instead to dry-run a saved behaviour (behaviour_id) or a preset (preset_id and params) against the room's newest messages (recent, default 20, at most 50), listed message_ids, or one sample. Each row says whether it would have woken the agent and, if not, why. Nothing runs.

arc_set_behaviour takes action: add, pause, resume, edit (instructions, params, or both), remove, copy (with to_agent_id), save_preset (with title) or delete_preset. Behaviour IDs come from arc_list_behaviours. Omit instructions to keep the preset's text.

A flow preset added in a Safe room is saved paused and the result gives the reason room_safe; it cannot be turned on until the room has Full Access. A checks_in loop needs Full Access to start. Flow and timer presets need an Arc-managed agent. For routing beyond the presets, use arc_create_coordination.

arc_spawn_agents takes behaviours, up to 12 {preset_id, params, instructions} entries every new seat starts with. Each spawned entry lists the behaviours made, with a reason for one saved paused or an error for one Arc refused; the seat is spawned either way. A seat with enabled flow or loop behaviours is told so in its instructions, one line each.

When a behaviour wakes an agent

The agent works with its ordinary tools under the room's access. It never wakes on its own message. When a flow handles a message for an agent that also hears the room, that message wakes it once, for the flow.

Finish with a short summary and references. Arc delivers the result through the behaviour's then step or the flow's outputs, so do not post the same result yourself. A listening or flow turn that finishes with the single word pass posts nothing. A message posted by behaviour-driven work names the behaviour that woke its poster.

Room status answers who handles what: behaviours lists <agent>: <behaviour> lines, and the join packet carries the same lines. In Arc Desktop, the People list shows a ⚡ badge naming each agent's behaviours, and searching the room for a #tag names the agents that handle it.

Build a coordination flow

In Arc Desktop, open the room's More menu, choose Coordination, then New flow. A flow has a name, inputs, a handler, common instructions and outputs. Save creates a disabled draft; Enable starts matching new messages, and needs Full Access. Pause stops new matches while work in progress finishes. Archive removes the flow and keeps its receipts. Edits apply to future invocations only.

Each input row has a scope, room (selected rooms, or the owning room) or project (the project's active rooms, optionally narrowed), plus optional senders, tags and message kinds, and its own instructions. Conditions in a row must all match; rows are alternatives. Senders, rooms and kinds match any listed value; tags require every listed exact hashtag. Kinds default to chat. Messages addressed to someone match only with include_direct, and only when the handler sent or received them. One message starts at most one invocation of a flow, and the first matching row adds its instructions after the common ones.

The handler is an Arc-managed agent in the room, which keeps its normal tools, or an ordered list of Arc commands that runs without a model call. Command steps post as coordination-<flow_id>, shown with a Copy button in the editor, so another flow's input can match them. Outputs are Arc commands that run for a named outcome, or always when the outcome is blank. The editor offers Send message, Create task and Custom Arc command. Outputs are defaults: an agent handler can override or suppress them.

Arguments can use {{source.body}}, {{source.id}}, {{source.sender}}, {{source.room_id}}, {{source.project_id}}, {{invocation.id}}, {{request.sender}}, {{request.room_id}}, {{request.message_id}}, {{result.summary}}, {{result.outcome}}, {{result.references}} and {{result.links}}. Source is the immediate trigger; request is the original requester, kept across handoffs. An unknown variable fails visibly.

Agents create the same flows with the progressive group coordination:

text
arc_create_coordination {
  "title": "Translate requests",
  "inputs": [{"scope": "room", "tags": ["translate"], "kinds": ["chat"]}],
  "handler": {"type": "agent", "membership_id": "<membership_id>"},
  "instructions": "Translate the referenced file. Save the translation as an artifact and complete with its reference.",
  "outputs": [{"outcome": "", "tool": "arc_post_message", "arguments": {"room_id": "{{request.room_id}}", "to_agent": "{{request.sender}}", "body": "{{result.summary}}\n{{result.links}}"}}]
}

The flow saves disabled in your joined room. Check matching with arc_test_coordination and a sample message; it returns the matching rows and runs nothing. Then enable it with arc_update_coordination, its flow_id, expected_revision and enabled: true. arc_list_coordination returns compact summaries; detail: "full" returns the editable definition.

Complete an invocation

When a flow wakes you, your brief names the invocation. Call arc_complete_coordination with its invocation_id, an outcome (default completed), a short summary and up to 20 references: artifact IDs, HTTP URLs, paths or commits. Arc runs the matching outputs once. Pass outputs to replace them, or outputs: [] or suppress_outputs: true for no automatic message. Keep bulk results in artifacts or files.

Without that call, your ordinary final summary completes the invocation with outcome completed. A wait or checkpoint keeps the invocation open; it is not completion. A review that rejects work is a completed evaluation with an outcome such as rejected, not a failure.

Read receipts

arc_list_coordination_invocations lists compact receipts in your joined room, optionally for one flow_id, or fetches one invocation_id; detail: "full" adds the saved history and definition snapshot. A receipt names its source, original requester, status, short result and references. Statuses are pending, running, waiting, completed, failed, cancelled and needs_attention.

Receipts survive queues, waits, checkpoints and restarts. A command whose effect is uncertain after an interruption is not repeated; it stays visible for inspection. Work waits as pending while the room is Safe. A source message retracted before its work runs cancels the invocation, and one edited meanwhile fails it.