Autonomic Agents

Autonomic Agents are unattended tenant workers. They wake on a schedule, webhook, or process event, run one bounded MCP tool-loop turn, then return a decision JSON object. They are not chat agents and do not appear in the in-app agent picker.

Document information
FieldValue
Canonical URL/docs/07_ai-agents-and-mcp/22_autonomic_agents
Version (published date)2026-08-18
Tagsai, agents, mcp, processflow, unattended

When to use Autonomic Agents

Use Autonomic AgentsUse Trace AI
Event-woken work that must keep going without a person in chatInteractive chat with on-demand tenant skills
A named mandate, backlog, and inspectable run historyA person asking questions and confirming HITL cards
Dispatching allowlisted ProcessFlow processes after a cognitive stepExploring the tenant live and loading skills in conversation

Trace AI stays user-initiated. Autonomic Agents run as the process-execution identity (or the agent’s identity_user_id) and cannot be started from GET /api/v1/chat/agents or /chat/*.

This feature is gated by AUTONOMIC_AGENTS_ENABLED (default off). When it is off, the Agents console returns an empty list and mutations are unavailable. Ask a platform operator to enable it for your deployment.

Create an agent

In the tenant console, open Agents. Tenant administrators can create and edit agents.

Required:

FieldMeaning
NameDisplay name. Saving compiles an owned wake ProcessFlow named [Agent] {name}.
MandateStanding instructions re-injected every turn as <autonomic_mandate>. Not stored in process step source.

Optional:

FieldMeaning
ModelCatalog model for this agent only. Empty uses the autonomic LLM context default.
SkillTenant skill_id for load_tenant_skill when the mandate needs a packaged playbook.
TriggersOn the agent Triggers tab: add a schedule (same simple/cron editor as Processes), an event trigger, or Connect Webapp / Create Webhook to link a published WebApp or Webhook. Invoking that webapp executes the owned wake process (invoke_agent), the same way a process webhook works. Status must be active for wakes to run.
Allowed process idsProcesses the agent may start with decision execute_process. Empty allowlist means no process dispatch.
Allowed peer agent idsPeer Autonomic Agents this agent may message (send_agent_message). Empty allowlist means no mailbox send.
Statusdraft (manual test run allowed), active (process wakes allowed), inactive (no runs).

Saving the agent:

  • Creates or updates the owned wake process (hidden from the default Processes list).
  • Compiles schedule subscriptions into ProcessTriggers on that wake process. Webhook subscriptions are not stored; use linked WebApps instead.
  • Seeds a sticky chat session used as the transcript for every wake.
  • Creates the working directory {tenant data}/agents/{agent_id}/ with BACKLOG.md.
  • Links any Triggers → Connect Webapp entries by setting WebApps.process_id to that wake process (not a ProcessTriggers webhook row). Invoking the published WebApp or Webhook then runs executeProcess on the wake process, same as a process webhook.

Do not assemble this process by hand in the process editor. The Agents editor is the source of truth unless you detach the process.

Working directory and backlog

Each agent has a home directory {tenant data}/agents/{agent_id}/ with BACKLOG.md. File tools may read and write anywhere under that tenant's tenantdata (same tenant-root bound as other MCP file tools). Use the agent home for BACKLOG.md and agent-owned notes; typical layout:

agents/{agent_id}/
  BACKLOG.md
  docs/
  logs/

Every turn injects the current BACKLOG.md as <autonomic_backlog>. The model must rewrite the backlog before the final JSON (update_agent_backlog or a write to that BACKLOG.md path). Decision done is rejected while open backlog items remain; the platform coerces that to continue and re-enqueues a wake until max_hops.

Runs and sticky transcript

Each wake writes an agent_runs row: status, current action, heartbeat, hop count, selected model, and the parsed decision. Open Agents → {name} → Runs to inspect them.

The agent has one sticky chat_session_id. Every wake appends messages to that session. The session is not restored in Chat with Agents or the picker. Use the agent Runs page for the transcript.

Only one run per agent may be in flight (max_concurrent_runs defaults to 1) so two turns cannot write the sticky session at once.

Decision JSON

The final assistant message must be only this object (no Markdown fence, no prose):

{
  "decision": "execute_process | emit_event | send_agent_message | continue | need_human | done",
  "target_id": "process_id or event_type or null",
  "input": {},
  "summary": "one-line audit",
  "correlation_id": "corr_…",
  "backlog_open_count": 0
}
DecisionEffect
execute_processEnqueues target_id if it is on the agent allowlist.
emit_eventWakes other processes that have an active event trigger matching target_id.
send_agent_messageDelivers a mailbox message to a peer Autonomic Agent on the peer allowlist and wakes that peer (agent.message.received).
continueRe-enqueues this agent’s wake process (counts as a hop).
need_humanStops. Tenant admins get an in-app notification. Answer from Agents → Runs to resume.
doneStops only if the backlog has no open items.

Invalid JSON fails the run.

Mailbox (peer agents)

Each agent has allowed_peer_agent_ids (UUIDs or slugs). Decision or tool send_agent_message writes to agent_messages and wakes the recipient. Incoming mail is injected as <autonomic_mailbox> on the next turn. Compile always adds an event trigger for agent.message.received.

Unattended human input

request_human_input chat cards are not used. When the model returns need_human:

  1. The run status becomes need_human. Remaining wake-process steps are skipped.
  2. An in-app notification is sent to the agent identity user (if set) and tenant admins.
  3. A tenant admin answers from the Runs page. That wakes the same agent with event: human.answered.

Limits

Limitv1 behavior
Human-in-the-looprequest_human_input is stripped. Calling it fails. Use need_human; operators resume from Runs.
agent_waitCapped at 15s per call, 30s per turn, 3 calls per turn. Durable wait belongs in ProcessFlow triggers.
HopsDefault 8 continue-wakes per correlation.
Concurrency1 in-flight run per agent.
Chat pickerHidden. No /chat/autonomic route.
MCP createInteractive Trace AI cannot create Autonomic Agents in v1.

Manual test run

Tenant administrators can enqueue a manual wake from the console (Run on the Triggers tab) or POST /api/v1/autonomic-agents/{agent_id}/run. That executes the compiled wake process asynchronously (same path as schedule and webhook wakes via invoke_agent).

Webhook triggers

Webhook wakes use the same WebApp model as Processes:

  1. Save the agent so it has a wake_process_id.
  2. On Agents → {name} → Triggers, Create webhook (or Connect an existing unlinked webhook / callback WebApp).
  3. Publish the WebApp and copy its published URL.
  4. Send GET or POST to that URL. The WebApp runtime runs the wake process, which calls invoke_agent for one bounded turn.

Do not add { type: "webhook" } entries to subscriptions; compile ignores them and strips legacy rows on the next save.

Event triggers

Event wakes use { type: "event" } subscriptions compiled to ProcessTriggers on the wake process:

  1. On Agents → {name} → Triggers, Add Trigger under Event Triggers and set an event type (for example invoice.overdue).
  2. Save the agent so compile syncs the trigger onto wake_process_id.
  3. Deliver the event explicitly — for example another agent’s emit_event decision, POST /processflow?action=fire-trigger with the compiled trigger_id, or an Event Broker process that fans out to listeners.

Peer mailbox delivery (agent.message.received) is compiled automatically; you do not add it manually.

See also