Concepts
Apitomy Axiom is an event-driven orchestration platform that uses AI to automate software development workflows. It has four primary capabilities:
- Reports — AI-generated reports about your repositories and projects, produced on a schedule or on demand
- Event-driven automation — poll GitHub and Jira for activity, filter and route the resulting event stream through subscriptions, and let the AI Manager or a workflow decide what to do
- Scheduled Jobs — CRON-style automation that runs on a configurable schedule, independent of events or reports
- AI Assistant — an interactive conversational interface for arbitrary tasks, powered by customizable session templates
All four capabilities share a common set of configuration items — tools, secrets, MCP servers, and more — that give AI agents the capabilities they need. This guide explains each concept and how they relate.
Reports
Reports are AI-generated documents that summarize activity, status, or analysis across your repositories. A weekly status report, a dependency audit, a PR review summary — any recurring or ad-hoc analysis that an AI agent can produce by running shell commands and reading data from your systems.
How Reports Work
Report Definition ──► Axiom triggers AI agent ──► Agent runs tools ──► Report (Markdown)
(template) (on schedule or ad hoc) (shell, MCP) (stored + viewable)
- You create a Report Definition that describes what the report should contain
- Axiom triggers an AI agent — either on a schedule (hourly, daily, weekly, monthly) or when you click Run Now
- The agent executes the allowed tools (shell commands, MCP tools) to gather data
- The agent produces a Markdown report based on your prompt template
- The report is stored and viewable in the Axiom UI
Report generation shares the same pool of AI agents used for tasks and scheduled jobs (see AI Agents below) — an agent whose capabilities match the report is leased for the duration of the run.
Report Definitions
A report definition is the template and configuration for a recurring report. Each definition includes:
| Field | Purpose |
|---|---|
| Name | Display name for the definition and its generated reports |
| Prompt template | Instructions for the AI agent — what to analyze, how to structure the output |
| Schedule | When to run: hourly, daily, weekly, monthly, or not scheduled (ad hoc only) |
| Time window | Data range: since last run, last 24 hours, last 7 days, or last 30 days |
| Allowed tools | Shell commands and MCP tools the agent may use |
| Environment | Custom environment variables injected into the subprocess |
| Initial labels | Labels automatically applied to generated reports |
| Enabled | Whether the schedule is active |
Prompt Template Placeholders
The prompt template supports runtime placeholders that Axiom substitutes before sending to the AI agent:
| Placeholder | Value |
|---|---|
{{timeRangeStart}} |
Start of the report time window (ISO date) |
{{timeRangeEnd}} |
End of the report time window (ISO date) |
{{timeWindow}} |
Human-readable time window description (e.g. "last 7 days") |
Example
A weekly status report definition might look like:
- Schedule: Weekly (Monday at 08:00)
- Time window: Last 7 days
- Prompt template: Instructions to summarize merged PRs, open PRs, releases, and suggest next-week priorities
- Allowed tools:
Bash(gh *)to query GitHub, plus toolset references like@Report Tools
Generated Reports
Each time a report definition runs, it produces a Report — a stored Markdown document with metadata:
- Title — derived from the definition name and time range
- Status — Pending, Generating, Completed, or Failed
- Time range — the start and end dates covered
- Cost — AI token cost in USD
- Duration — how long generation took
- Labels — inherited from the definition, editable per report
Reports are browsable, filterable, and searchable in the UI.
Event-Driven Automation
The second use-case is monitoring external systems for activity and reacting automatically. Axiom polls GitHub and Jira through Connections, normalizes activity into a single Event Stream, and evaluates each event against your Subscriptions to decide what happens next.
The Event Pipeline
Connection ──► Event Stream ──► Subscription filter ──► Routing rule(s) ──► Destination
(GitHub/Jira) (normalized, (EL expression, (ordered list) (Manager, workflow,
poller) deduplicated) per subscription) or action)
- A Connection polls GitHub or Jira for new activity at a configurable interval
- New activity is normalized into typed stream events and persisted to the event stream, deduplicated by source event ID
- Every enabled Subscription is evaluated against each new event using a filter expression
- When an event matches a subscription's filter, the subscription's routing rules run in order, sending the event to one or more destinations
- A durable processing ledger tracks the result of every (event, subscription) pair, so processing survives restarts and failed routing is retried automatically
Connections
A Connection is an authenticated link to an external system. Each connection is configured with:
| Field | Purpose |
|---|---|
| ID | A URL-safe slug that identifies the connection (e.g. github-com) |
| Name | Display name |
| Source type | github or jira |
| Base URL | The human-readable URL of the system (e.g. https://github.com) |
| Repositories / Projects | Which repositories (GitHub) or projects (Jira) to watch |
| Poll interval | How often to check for new activity |
| Authentication secret | Which secret to use for API access, or fall back to a default provider secret or environment variable |
| Enabled | Whether polling is active |
You can create multiple connections of the same type — for example, one for
github.com and another for a GitHub Enterprise instance.
Event Stream
Every event a connection detects is normalized into a single, browsable stream of typed events (issue, pull request, and repository activity for GitHub; issue activity for Jira). Events are deduplicated so the same source activity is never recorded twice. You can browse the raw stream from Events > Event Stream in the UI, independent of whether any subscription has matched it yet.
Subscriptions
A Subscription is a filtered view over the event stream with configurable routing. Each subscription has:
| Field | Purpose |
|---|---|
| Name | Display name |
| Filter expression | An EL expression evaluated against each event (e.g. event.type.startsWith('pr.') && event.connectionId == 'github-com'). An empty expression matches every event. |
| Process events from | The cutoff timestamp; events that occurred before this are never evaluated against this subscription (defaults to the moment the subscription is created) |
| Routing rules | An ordered list of destinations for matched events |
| Labels | Free-form strings for organization |
| Enabled | Subscriptions must be explicitly enabled to process events |
Use Preview on the subscription editor to test a filter expression against existing events before saving.
Routing Rule Destinations
| Destination | What Happens |
|---|---|
| Manager | Sends the event to the AI Manager for triage (see AI Manager below) |
| Workflow dispatch | Offers the event to any running workflow instances parked at a receive-event node whose event-type and EL match succeed |
| Create workflow | Finds or creates a project from the event's ref URL, then starts a new instance of the specified workflow definition on that project |
| Invoke action | Finds or creates a project, then creates a task for the specified action type directly — bypassing the Manager |
A subscription with no routing rules matches events silently, which is useful for previewing matches before committing to a destination.
AI Manager
The Manager receives events routed to it and produces structured decisions. It uses the configured AI agent to analyze each event in context.
The Manager's behavior is controlled by two editable templates:
- System prompt — defines the Manager's role, personality, and output format. This is sent as system context for every evaluation.
- Prompt template — the per-event message sent to the AI. Placeholders are substituted at runtime:
| Placeholder | Value |
|---|---|
{{actionTypes}} |
Formatted list of manager-triggerable action types |
{{agents}} |
Formatted list of all configured agents |
{{source}} |
Event source type (e.g. "github") |
{{eventType}} |
Normalized event type (e.g. "issue.created", "pr.merged") |
{{ref}} |
Full URL identifying the subject of the event |
{{payload}} |
Typed event payload JSON |
{{projectContext}} |
Existing project details and recent task history, when the event matches an existing project |
Manager Decisions
The Manager produces one of these decision types for each event it evaluates:
| Decision | What Happens |
|---|---|
| create_task | A Task is created (and a Project found or created) for the chosen action type |
| script_action | Same as create_task, but for a script-mode action type |
| ignore | No action — the event is logged but nothing else happens |
| escalate | The Manager flags the event for human review without taking action |
Each decision includes a confidence score (0.0–1.0). Only decisions above the configured threshold (default 0.7) are auto-executed. Lower-confidence decisions are automatically escalated to the Inbox for human review.
Projects
A Project is a long-lived entity that tracks all work related to an issue. When the Manager (or a routing rule) creates a project for a GitHub issue or Jira ticket, Axiom:
- Creates a Project record linked to the issue's
refURL - Sets up a workspace directory for the Project
- Tracks all tasks, workflow runs, and activity related to that issue
Projects follow a lifecycle state machine:
The project detail page shows:
- Summary — status, ref, repository, labels, creation date
- Tasks — all tasks assigned within this project
- Thread — a chronological log of all activity (events, decisions, task results)
- Events — raw stream events associated with this project
- Metrics — AI cost, token usage, and disk usage for this project
Action Types
An Action Type defines a kind of work that can be performed. It is the bridge between
a Manager decision (or a direct invoke-action routing rule) and the actual execution.
Each action type specifies:
| Field | Purpose |
|---|---|
| Name | Identifies the action type (e.g. "Implement Feature", "Code Review") |
| Execution mode | agent (AI agent or human-completed task) or script (bash script) |
| Prompt template | Instructions for the AI agent (agent mode) |
| Script template | Bash script to execute (script mode) |
| Allowed tools | Which tools the AI agent may use |
| Environment | Custom environment variables for the subprocess |
| Model / Engine | Override the global AI model or agent type for this action type |
| User triggerable | Can be manually triggered from the project detail page |
| Manager triggerable | Can be selected by the AI Manager during triage |
| Emits event | Whether completing this action creates an internal event (enabling chained actions) |
Execution Modes
Agent mode — the action is executed by an AI agent. The agent receives the prompt template with placeholders substituted:
| Placeholder | Value |
|---|---|
{{managerInput}} |
Instructions/context from the Manager's decision |
{{actionType}} |
The action type name |
{{ref}} |
Full URL identifying the project's subject |
{{repository}} |
Repository, when applicable |
{{projectName}} |
Project name |
{{event}} |
Raw event payload JSON, when the task originated from an event |
{{workDir}} |
The project's workspace directory |
{{inputs.NAME}} |
A named workflow input (workflow tasks only) |
Script mode — a bash script runs directly. The script template supports the same placeholders plus additional ones:
| Placeholder | Value |
|---|---|
{{projectId}} |
Internal project ID |
{{eventId}} |
The triggering event ID |
{{taskId}} |
The task ID |
{{apiBaseUrl}} |
Axiom's own API base URL (for callbacks) |
Placeholder values are treated as literal data. In script mode each placeholder is not inlined into the script text. Instead its value is passed to the script as an environment variable and the placeholder expands to a reference to that variable — for example
echo {{managerInput}}becomesecho "${AXIOM_MANAGER_INPUT}". This means a value containing shell metacharacters ($(...), backticks,;,&&, newlines, etc.) is never executed as code. The expansion adapts to the surrounding quotes, so you can place a placeholder wherever you'd use a shell variable and values containing whitespace stay a single argument — whether it is unquoted ({{managerInput}}), inside double quotes ("Fix: {{managerInput}}"), or inside single quotes ('{{managerInput}}'). The matching environment variables —AXIOM_PROJECT_ID,AXIOM_EVENT_ID,AXIOM_TASK_ID,AXIOM_REF,AXIOM_REPOSITORY,AXIOM_PROJECT_NAME,AXIOM_MANAGER_INPUT,AXIOM_API_URL,AXIOM_WORK_DIR, andAXIOM_INPUT_<NAME>for workflow inputs — are also available directly.
Tasks
A Task is a single unit of work within a Project. Tasks are created when:
- The Manager assigns work via an action type
- A routing rule with an
invoke-actiondestination fires - A user manually triggers an action type from the project detail page
- A workflow reaches an
actionorhuman-tasknode
Each task records its assigned agent, action type, execution output, status, cost, and duration. Task statuses:
| Status | Meaning |
|---|---|
| Pending | Queued, waiting for an available agent |
| InProgress | Currently being executed |
| AwaitingInput | The task requires human input and is visible in the Inbox |
| Completed | Finished successfully |
| Failed | Execution failed |
| Cancelled | Cancelled before completion |
Tasks in AwaitingInput status appear in the Inbox — either because the Manager escalated a low-confidence decision, an AI agent asked a question, or a workflow reached a human-task node. See Navigating the UI.
AI Agents
An Agent is a configured slot in Axiom's agent pool that executes work — tasks, report generation, and agent-mode scheduled jobs all draw from the same pool. Each configured agent has:
- Name and description
- Agent type —
claude-code,opencode, orcopilot - Capabilities — glob patterns that determine which work this agent is eligible for
(e.g.
action:*,report:weekly-status, or*for anything) - Enabled — whether the agent is currently available for new work
How Work Is Matched to Agents
Each unit of work requests a capability string when it needs an agent:
| Work | Capability requested |
|---|---|
Task for action type X |
action:X |
Report definition with slug X |
report:X |
Scheduled job with slug X |
job:X |
Axiom leases the first enabled, idle agent whose capability patterns match. Each agent can execute only one unit of work at a time; if no matching agent is idle, the work stays queued until one becomes available. This means the number of configured agents — and how their capabilities are scoped — determines how much work can run in parallel and which agents are eligible for which kind of work.
Why Create Multiple Agents?
- Control concurrency — the number of agents with a matching capability determines how many units of that kind of work can run simultaneously.
- Restrict which agents handle which work — by scoping capabilities narrowly
(e.g.
action:security-reviewon a single agent,action:*on several others), you can guarantee sensitive work runs one at a time while general work runs in parallel.
Human-Completed Tasks
Not every task is executed by an AI agent. Some action types produce tasks that require a human to respond — these tasks move to AwaitingInput status and appear in the Inbox until a user completes them through the UI, at which point the task result is recorded and any downstream automation (e.g. a waiting workflow) resumes.
Scheduled Jobs
Scheduled Jobs provide CRON-style automation that runs on a configurable schedule, independent of the event pipeline or report system. Use them for recurring maintenance tasks, periodic data syncs, automated cleanups, or any work that should happen on a fixed cadence.
How Scheduled Jobs Work
Scheduled Job ──► Axiom triggers execution ──► Agent or script runs ──► Run record
(definition) (on schedule or ad hoc) (agent or bash) (stored + viewable)
- You create a Scheduled Job that defines what to do and when to do it
- Axiom triggers execution on the configured schedule, or when you click Run Now
- The job runs using the configured execution mode — an AI agent (agent mode) or a bash script (script mode)
- The result is recorded as a Run with status, output, cost, and duration
Scheduled Job Configuration
Each scheduled job includes:
| Field | Purpose |
|---|---|
| Name | Display name for the job |
| Description | What the job does |
| Schedule | When to run: hourly, daily, weekly, monthly, or none (manual only) |
| Time of day | Time to run (e.g. 08:00) |
| Day of week | For weekly schedules (e.g. monday) |
| Execution mode | agent (AI agent) or script (bash script) |
| Prompt template | Instructions for the AI agent (agent mode) |
| Script template | Bash script to execute (script mode) |
| Allowed tools | Tools the AI agent may use (agent mode) |
| Environment | Custom environment variables with ${secret:NAME} support |
| Model / Engine | Override the global AI model or agent type |
| Max steps | Optional limit on agent turns |
| Max budget | Optional cost limit in USD |
| Labels | Free-form labels for organization |
| Enabled | Whether the schedule is active |
Execution Modes
Agent mode — the job is executed by an AI agent drawn from the shared agent pool
(capability job:<slug>). The agent receives the prompt template with placeholders
substituted:
| Placeholder | Value |
|---|---|
{{jobName}} |
The scheduled job name |
{{apiBaseUrl}} |
Axiom's own API base URL |
Script mode — a bash script runs directly. The script template supports additional placeholders:
| Placeholder | Value |
|---|---|
{{jobName}} |
The scheduled job name |
{{jobId}} |
Internal job ID |
{{runId}} |
The current run ID |
{{apiBaseUrl}} |
Axiom's own API base URL |
Job Runs
Each time a scheduled job executes, it produces a Run — a record of the execution with metadata:
- Status — Pending, Running, Completed, or Failed
- Trigger — whether the run was triggered by the schedule or manually
- Output — the execution result
- Cost — AI token cost in USD (agent mode)
- Duration — how long execution took
- Execution log — full transcript for debugging
Runs are viewable from the scheduled job detail page and from Logs > Job Runs.
Differences from Reports and Action Types
Scheduled Jobs fill a gap between reports and action types:
- Unlike reports, scheduled jobs do not produce a Markdown document or use time window placeholders. They are designed for executing tasks, not generating documents.
- Unlike action types, scheduled jobs are not triggered by events or tied to projects. They run on a fixed schedule and are global to the Axiom instance.
- Like both, scheduled jobs draw from the shared agent pool and support allowed tools, environment variables, and model/engine overrides.
Workflows
Workflows let you define a multi-step automation — including branching, human approvals, waits, and event-triggered branches — as a versioned, visually authored graph of nodes. A workflow runs against a single project and drives that project's tasks.
For the full authoring and run-time reference, see Workflows.
Supporting Configuration
Reports, event-driven automation, scheduled jobs, and workflows share the following configuration items.
Tools
Tools serve two purposes:
-
Encapsulate deterministic behavior — a tool wraps a scripted operation (a shell command, an API call, a data query) into a single named unit of work. Instead of relying on the AI agent to improvise a sequence of raw commands, you define a tool that performs the operation consistently every time. This makes AI-driven tasks more reliable and repeatable.
-
Control what AI agents can do — an action type's Allowed Tools list is a strict allowlist. The AI agent can only use tools that are explicitly permitted — everything else is denied. This gives you fine-grained control over what each type of work is allowed to touch. A "code review" action type might allow read-only tools, while an "implement feature" action type might also allow write operations.
Each tool has:
- Name — a unique identifier, often matching a CLI pattern (e.g.
Bash(gh pr list *)) or an MCP tool name (e.g.mcp__axiom-tools__github_open_prs) - Description — what the tool does (helps the AI agent decide when to use it)
- Labels — for organization and filtering
Tools are referenced in the Allowed Tools list of action types and report definitions. Only tools explicitly listed are available to the agent — unlisted tools are denied.
Tool Patterns
You can use glob-style patterns for shell commands. For example, Bash(git log *)
allows any git log command. Bash(gh *) allows any GitHub CLI command.
Toolsets
A Toolset is a named collection of tools. Instead of listing every tool individually in
an action type or report definition, you can reference a toolset using the @ prefix:
When an action type includes @Report Tools in its allowed tools, all tools in that
toolset are made available to the agent. This keeps tool lists manageable and consistent
across multiple action types and report definitions.
MCP Servers
An MCP (Model Context Protocol) Server provides tools to AI agents via the MCP standard. Axiom can connect to MCP servers using two transport modes:
- stdio — Axiom launches the server as a subprocess using a configured command and arguments
- HTTP — Axiom connects to a running server at a configured URL
MCP servers extend the tool ecosystem beyond built-in shell commands. For example, you might run a custom MCP server that provides database query tools, API clients, or domain-specific analysis capabilities.
Secrets
Secrets are encrypted key-value pairs injected as environment variables into AI agent and script subprocesses. Common uses:
GH_TOKEN— GitHub API authenticationJIRA_API_TOKEN— Jira API authentication- Provider-specific tokens for other integrations
Secret values are encrypted at rest and never returned by the API. They are automatically
injected into all subprocesses by default. For fine-grained control, action types and
report definitions can specify a custom Environment that selectively references
secrets using ${secret:SECRET_NAME} syntax.
Secrets are also used by Connections for API authentication when polling.
AI Agent Pool
Axiom's AI agent support is pluggable. See AI Agents above for how work is matched to configured agents, and the AI Assistant guide for the separate interactive-session use case.
| Agent Type | CLI | Description |
|---|---|---|
| Claude Code | claude |
Anthropic's Claude Code CLI (default) |
| OpenCode | opencode |
OpenCode CLI with multi-provider support |
| GitHub Copilot CLI | copilot |
GitHub's Copilot CLI |
Individual action types, report definitions, and scheduled jobs can override the default agent type and model selection, allowing you to use different models for different types of work.
The AI Engine page in the UI shows the default agent type, health checks, and available models for each registered agent type.
Configuration Packs
Configuration Packs let you export and import bundles of configuration items as JSON files. A pack can include any combination of:
- Action types
- Tools
- Toolsets
- MCP servers
- Report definitions
- Scheduled jobs
- Session templates
- Connections
- Subscriptions
- Workflow definitions
This is useful for sharing configurations between Axiom instances, backing up configuration, or distributing pre-built setups. A configuration pack is not a full instance backup — see Upgrading and Backups for what else is needed to fully back up and restore an instance.
AI Assistant
The AI Assistant is an interactive conversational interface. You can use it for arbitrary tasks — from creating Axiom configuration items to general-purpose coding, analysis, or exploration.
Sessions are created from Session Templates, which define the assistant's system prompt, agent type, available tools, MCP servers, and working directory. Axiom ships with built-in templates (including the Configuration Assistant for creating and updating tools, action types, report definitions, scheduled jobs, toolsets, workflows, and session templates), and you can create your own templates for custom workflows.
For full details, see the AI Assistant guide.
Dashboards
Dashboards provide a customizable at-a-glance view of your Axiom instance. You can create multiple dashboards, each with a different set of widgets arranged on a drag-and-drop grid.
Widgets
Axiom ships with a catalog of built-in widgets organized by category:
| Category | Widgets |
|---|---|
| Projects | Project Status Summary, Active Projects, Project Spotlight |
| Operations | Recent Activity, Inbox, Recent Events |
| AI & Cost | AI Cost Summary, AI Cost by Project |
| Reports | Recent Reports |
| System | System Status, Event Source Health, Disk Usage Breakdown |
Each widget is self-contained — it fetches its own data and renders independently. Many widgets support per-widget configuration (e.g. time window, maximum rows, or which project to spotlight).
Dashboard Labels and Filtering
Dashboards support labels for organization. When a dashboard has labels, those labels
are passed to all its widgets as data filters. Widgets use these labels to scope
their data — for example, a dashboard labeled "team-a" would show only projects,
events, and activity associated with that label.
Default Dashboard
One dashboard can be designated as the default. The default dashboard is displayed when you navigate to the Dashboards page. If no default is set, the dashboards list is shown instead.
For details on the dashboard UI, see Navigating the UI.
How It All Fits Together
The diagram below shows how the concepts relate:
┌─────────────────────────────────────────────────────────────────────┐
│ REPORTS │
│ │
│ Report Definition ──► AI Agent ──► Report │
│ ├─ prompt template │ │
│ ├─ schedule │ uses │
│ ├─ allowed tools ────────┼──► Tools / @Toolsets / MCP Servers │
│ └─ environment ──────────┼──► Secrets │
│ │ │
│ Agent Pool (Claude Code / OpenCode / Copilot) │
│ │
├─────────────────────────────────────────────────────────────────────┤
│ EVENT-DRIVEN AUTOMATION │
│ │
│ Connection ──► Event Stream ──► Subscription ──► Routing ──► ... │
│ └─ secret │ ├─ Manager ──► Task ──► Agent
│ │ ├─ Workflow dispatch
│ │ ├─ Create workflow
│ │ └─ Invoke action ──► Task ──► Agent
│ │ │
│ Tools / @Toolsets / MCP Servers ◄──┘ │
│ Secrets ◄──────────────────────────┘ │
│ │
│ Agent Pool (Claude Code / OpenCode / Copilot) │
│ │
├─────────────────────────────────────────────────────────────────────┤
│ SCHEDULED JOBS │
│ │
│ Scheduled Job ──► AI Agent or Script ──► Run │
│ ├─ prompt / script │ │
│ ├─ schedule │ uses │
│ ├─ allowed tools ───────┼──► Tools / @Toolsets / MCP Servers │
│ └─ environment ─────────┼──► Secrets │
│ │ │
│ Agent Pool (Claude Code / OpenCode / Copilot) │
└─────────────────────────────────────────────────────────────────────┘
Shared building blocks: Tools, Toolsets, MCP Servers, Secrets, and the Agent Pool are shared across all use-cases. Configure them once and reference them from any number of report definitions, action types, scheduled jobs, and workflows.
Reports are self-contained — they only need a report definition with a prompt template, tools, and a matching agent. No connections, projects, or workflows are required.
Event-driven automation uses the full pipeline — connections feed the event
stream, subscriptions filter and route matching events, and the Manager (or a direct
invoke-action rule) creates projects and tasks that draw from the agent pool.
Scheduled Jobs are self-contained like reports — they need a job definition with a schedule and either a prompt template (agent mode) or a script template (script mode). They run independently of the event pipeline and do not produce Markdown reports.
Traces
A Trace is a hierarchical record of every step that occurred during a single manager evaluation, workflow run, scheduled job run, or report generation. While the Activity Log shows a flat timeline of events across all runs, a trace shows the tree structure of one run — which steps led to which, how long each took, and whether each succeeded or failed.
When Traces Are Created
Axiom creates a trace automatically for:
| Trace Type | Trigger |
|---|---|
manager |
A subscription routes an event to the Manager for evaluation |
workflow |
A workflow instance is triggered |
scheduled-job-execution |
A scheduled job run starts |
report-generation |
A report definition runs (scheduled or ad hoc) |
Each trace has a status (in-progress, completed, or failed), timestamps, and a
human-readable summary. Traces with asynchronous tasks (e.g. AI agent execution) remain
in-progress until all tasks complete.
Trace Nodes
Each step in a run creates a trace node — a lightweight breadcrumb that records what happened at that point. Nodes form a parent-child tree: the root node is the trigger, and child nodes represent subsequent steps such as decision processing, task creation, and tool execution.
Every node has:
- Node type — identifies the kind of step
- Status —
in-progress,completed, orfailed - Summary — a brief description of what happened
- Duration — how long the step took (calculated at completion)
- Entity reference — a pointer to a more detailed record elsewhere in the system (an activity log entry, a task, an event, a tool execution record, etc.)
The entity reference pattern keeps trace nodes small and fast to query. When you click a node in the UI, the detail is fetched from the referenced entity on demand.
Tool Call Tracing
When Axiom launches an AI agent to execute a task or generate a report, it passes trace
correlation data to the subprocess via environment variables (AXIOM_TRACE_ID and
AXIOM_PARENT_NODE_ID). MCP tool servers that Axiom generates for the agent read these
variables and call back to Axiom's API to register each tool invocation as a trace node.
This creates a detailed record of every tool the agent called, including the full JSON
input and output.
Tool call tracing is non-intrusive — if the callback fails, the tool execution continues normally. Tracing never interrupts the agent's work.
Viewing Traces
Traces are accessible from several places in the UI:
- Logs > Traces — browse and filter all traces
- Project detail page — view traces associated with the project
- Report detail page — click View Execution Trace to see the report's trace
The trace detail page renders the node tree as an interactive tree. Click any node to view its full detail, including referenced entity data. See Logging and Debugging for a full guide to reading traces.