Skip to content

Configuration Reference

AOF uses three layers of configuration: the org chart (agent topology and routing), the AOF config (runtime behavior), and the OpenClaw plugin wiring (gateway integration). This document covers all three.


Org Chart (org-chart.yaml)

The org chart is a YAML file that defines agents, teams, organizational units, routing rules, and memory pools. It is the single source of truth for “who can do what” in your AOF deployment.

All org chart changes should go through aof config set or aof config apply for validation and atomic writes. Source: src/schemas/org-chart.ts.

Top-level Fields

FieldTypeRequiredDefaultDescription
schemaVersion1Yes—Schema version, must be 1
templatestringNo—Org template name (e.g., "swe-team", "ops-team")
agentsAgent[]Yes—List of agent definitions
teamsTeam[]No[]Team definitions (legacy; use orgUnits for P1.1+)
routingRoutingRule[]No[]Tag/priority-based routing rules (legacy; use relationships for P1.1+)
orgUnitsOrgUnit[]No[]Organizational units (department, team, squad)
groupsOrgGroup[]No[]Cross-cutting agent groups
membershipsOrgMembership[]No[]Agent-to-org-unit memberships
relationshipsOrgRelationship[]No[]Inter-agent relationships (escalation, delegation, etc.)
defaultsOrgDefaultsNo—Default policies and capabilities
memoryPoolsMemoryPoolsNo—Memory V2 pool definitions
memoryCurationMemoryCurationNo—Memory curation configuration
rolesRecord<string, RoleMapping>No—Role-based agent mapping for DAG workflows
metadataRecord<string, unknown>No{}Arbitrary metadata

Agent Definition (agents[])

Each agent represents a single autonomous entity that can receive and execute tasks.

FieldTypeRequiredDefaultDescription
idstringYes—Unique agent ID (must match OpenClaw agent ID)
openclawAgentIdstringNo—OpenClaw agent ID (e.g., "agent:main:main"). Used for drift detection
namestringYes—Human-readable display name
descriptionstringNo—Role description
teamstringNo—Team membership (legacy, use memberships for P1.1+)
reportsTostringNo—Reports-to agent ID (legacy)
canDelegatebooleanNofalseWhether this agent can delegate tasks to others
capabilitiesAgentCapabilitiesNo{}Capability tags and concurrency settings
commsAgentCommsNo{}Communication/dispatch preferences
policiesOrgPoliciesNo—Agent-specific policy overrides
activebooleanNotrueWhether the dispatcher considers this agent

Agent Capabilities

FieldTypeDefaultDescription
tagsstring[][]Capability tags used for routing (e.g., ["typescript", "backend"])
concurrencynumber1Maximum concurrent tasks this agent can handle
modelstring—Model assigned to this agent (informational)
providerstring—Provider type (informational, for cost tracking)

Agent Communication Preferences

FieldTypeDefaultDescription
preferred"spawn" | "send" | "cli""send"Preferred dispatch method
sessionKeystring—Session key for sessions_send dispatch
fallbacks("spawn" | "send" | "cli")[]["send", "cli"]Fallback methods in priority order

Team Definition (teams[])

FieldTypeRequiredDefaultDescription
idstringYes—Unique team identifier
namestringYes—Human-readable team name
descriptionstringNo—Team description
leadstringNo—Lead agent ID
orchestratorstringNo—Orchestrator agent ID (manages tasks and reviews)
technicalLeadstringNo—Technical lead agent ID
murmurMurmurConfigNo—Orchestration review configuration
dispatchTeamDispatchConfigNo—Per-team dispatch throttling overrides

Team Dispatch Throttling

FieldTypeDefaultDescription
maxConcurrentnumber—Maximum concurrent dispatches for this team (overrides global)
minIntervalMsnumber—Minimum interval between dispatches in ms (overrides global)

Murmur Orchestration

Murmur triggers orchestration reviews when specific conditions are met.

FieldTypeDescription
triggersMurmurTrigger[]At least one trigger condition
contextstring[]Context to inject: "vision", "roadmap", "taskSummary"

Trigger kinds: "queueEmpty", "completionBatch", "interval", "failureBatch"

Routing Rules (routing[])

Routing rules determine which agent receives a task based on tags and priority.

FieldTypeDefaultDescription
matchTagsstring[][]Match tasks with these capability tags
matchPrioritystring[][]Match tasks with these priorities
targetRolestring—Route to agents with this role
targetTeamstring—Route to this team
targetAgentstring—Route to this specific agent
weightnumber100Rule priority (lower = evaluated first)

Organizational Units (orgUnits[])

P1.1 extension for tree-structured org hierarchy.

FieldTypeRequiredDefaultDescription
idstringYes—Unique org unit ID
namestringYes—Human-readable name
typestringYes—Unit type (department, team, squad, etc.)
parentIdstringNo—Parent org unit ID (for tree structure)
descriptionstringNo—Description
leadIdstringNo—Lead agent ID
activebooleanNotrueWhether this unit is active
metadataRecord<string, unknown>No{}Arbitrary metadata

Relationships (relationships[])

Inter-agent relationships for escalation, delegation, and consultation.

FieldTypeRequiredDefaultDescription
fromAgentIdstringYes—Source agent ID
toAgentIdstringYes—Target agent ID
typeenumYes—"escalates_to", "delegates_to", "consults_with", or "reports_to"
activebooleanNotrueWhether this relationship is active
metadataRecord<string, unknown>No{}Arbitrary metadata

Role Mapping (roles)

Maps abstract roles to concrete agents for DAG workflows.

FieldTypeRequiredDefaultDescription
agentsstring[]Yes—Agent IDs that can fulfill this role (at least one)
descriptionstringNo—Human-readable description of responsibilities
requireHumanbooleanNo—Whether this role requires human involvement

Memory Pools (memoryPools)

Tiered memory pool definitions for the Memory V2 system.

FieldTypeRequiredDefaultDescription
hotMemoryPoolHotYes—Hot tier (always indexed)
hot.pathstringYes—Path to hot pool root
hot.descriptionstringNo—Pool description
hot.agentsstring[]No—Explicit agent list (all agents if omitted)
warmMemoryPoolWarm[]Yes—Warm tier pools (role-scoped)
warm[].idstringYes—Unique pool ID
warm[].pathstringYes—Path to warm pool root
warm[].rolesstring[]Yes—Role/agent patterns that include this pool
coldstring[]Yes—Cold tier paths
adapter"filesystem" | "lancedb"No"filesystem"Memory retrieval adapter

Policies

Policies can be set at org-chart defaults level or per-agent.

Memory Policy

FieldTypeDefaultDescription
scopestring[]—Memory scope paths (e.g., ["org/engineering", "shared/docs"])
tiers("hot" | "warm" | "cold")[]—Allowed memory tiers
readOnlybooleanfalseRead-only access

Tasking Policy

FieldTypeDefaultDescription
maxConcurrentnumber1Maximum concurrent tasks
allowSelfAssignbooleanfalseWhether agent can self-assign tasks
requiresReviewbooleanfalseWhether tasks require review
allowedPrioritiesstring[]—Allowed task priorities

Communication Policy

FieldTypeDefaultDescription
allowedChannelsstring[]—Allowed communication channels
requiresApprovalbooleanfalseWhether communication requires approval
restrictedAgentsstring[][]Agent IDs that cannot be communicated with

Context Budget Policy

Prevents context rot by limiting how much context an agent receives.

FieldTypeDescription
targetnumberTarget budget in characters (ideal context size)
warnnumberWarning threshold in characters
criticalnumberCritical threshold in characters (must truncate)

Example: Minimal Org Chart

schemaVersion: 1
agents:
- id: main
name: Main Agent
capabilities:
tags: [general]
concurrency: 1
comms:
preferred: send
teams: []
routing: []

Example: Team with Roles

schemaVersion: 1
agents:
- id: swe-backend
name: Backend Engineer
capabilities:
tags: [typescript, nodejs, apis]
concurrency: 2
comms:
preferred: send
- id: swe-frontend
name: Frontend Engineer
capabilities:
tags: [react, css, ui]
concurrency: 1
comms:
preferred: spawn
- id: swe-lead
name: Engineering Lead
capabilities:
tags: [review, architecture]
concurrency: 1
canDelegate: true
teams:
- id: engineering
name: Engineering
lead: swe-lead
roles:
backend:
agents: [swe-backend]
description: Backend implementation
frontend:
agents: [swe-frontend]
description: Frontend implementation
reviewer:
agents: [swe-lead]
description: Code review
routing:
- matchTags: [backend, api]
targetRole: backend
weight: 10
- matchTags: [frontend, ui]
targetRole: frontend
weight: 10

Example: Skill-based Routing

schemaVersion: 1
agents:
- id: agent-alpha
name: Alpha
capabilities:
tags: [python, ml, data]
concurrency: 3
- id: agent-beta
name: Beta
capabilities:
tags: [typescript, nodejs, devops]
concurrency: 2
routing:
- matchTags: [ml, data]
targetAgent: agent-alpha
weight: 1
- matchTags: [devops]
targetAgent: agent-beta
weight: 1
- matchPriority: [critical]
targetAgent: agent-alpha
weight: 0 # highest priority rule

AOF Configuration

AOF runtime configuration controls the scheduler, event logging, metrics, and communication behavior. Source: src/schemas/config.ts.

Top-level Config

FieldTypeDefaultDescription
schemaVersion1—Schema version, must be 1
dataDirstring"~/.aof/data"Root data directory for AOF runtime data
orgChartPathstring"org-chart.yaml"Path to org chart YAML file
vaultRootstring—Root directory for vault (Projects/, Resources/)
dispatcherDispatcherConfig{}Scheduler/dispatch settings
daemonDaemonConfig{}Daemon runtime settings
metricsMetricsConfig{}Prometheus metrics settings
eventLogEventLogConfig{}Event logging settings
commsCommsConfig{}Communication fallback settings
metadataRecord<string, unknown>{}Arbitrary metadata

Dispatcher Configuration

Controls how the scheduler scans for tasks and dispatches them.

FieldTypeDefaultDescription
intervalMsnumber120000 (2 min)How often the dispatcher scans for pending tasks
defaultLeaseTtlMsnumber600000 (10 min)Default lease TTL for task assignments
maxLeaseRenewalsnumber3Max lease renewals before force-expiry
dryRunbooleanfalseLog decisions without dispatching
maxConcurrentDispatchesnumber3Maximum concurrent dispatches globally
minDispatchIntervalMsnumber0Minimum interval between dispatches (0 = disabled)
maxDispatchesPerPollnumber10Maximum dispatches per poll cycle

Daemon Configuration

Controls the aof-daemon runtime. Source: src/config/registry.ts.

FieldTypeDefaultDescription
pollIntervalMsnumber30000Poll interval for the scheduler loop (ms)
socketPathstring<dataDir>/daemon.sockOverride path for the Unix-domain IPC socket. Created with mode 0600.
mode"plugin-bridge" | "standalone""standalone"Dispatch mode selector. plugin-bridge expects an OpenClaw plugin to attach via long-poll and delegates agent spawns to it; standalone falls through to the HTTP gateway adapter. Adapter selection also happens at dispatch time based on whether a plugin is currently attached — the mode value controls the “no plugin attached → hold” behavior (D-12).

Metrics Configuration

FieldTypeDefaultDescription
enabledbooleantrueEnable Prometheus metrics export
portnumber9101Port for the metrics HTTP server
pathstring"/metrics"Metrics endpoint path

Event Log Configuration

FieldTypeDefaultDescription
enabledbooleantrueEnable event logging
maxEventsPerFilenumber10000Max events per log file before rotation
maxFilesnumber30Max total log files to retain

Communication Configuration

Controls how the dispatcher communicates with agents.

FieldTypeDefaultDescription
methodPriority("spawn" | "send" | "cli")[]["send", "spawn", "cli"]Default dispatch method priority
spawnTimeoutMsnumber30000Timeout for spawn attempts
sendTimeoutMsnumber60000Timeout for send attempts
cliTimeoutMsnumber120000Timeout for CLI attempts

OpenClaw Plugin Wiring

AOF registers as an OpenClaw plugin via openclaw.plugin.json. As of v1.15, the plugin is a thin bridge: it forwards tool invocations to the daemon over daemon.sock and handles agent-spawn callbacks from the daemon via a long-poll. It no longer owns an in-process AOFService — that lives in the daemon.

This section covers the plugin manifest and the gateway configuration needed to activate AOF.

Plugin Manifest (openclaw.plugin.json)

The plugin manifest declares AOF’s identity and configuration schema. Source: openclaw.plugin.json.

FieldValueDescription
id"aof"Plugin identifier
name"AOF -- Agentic Ops Fabric"Display name
version"0.1.0"Plugin version
kind"memory"Plugin kind
main"dist/plugin.js"Entry point
configSchemaobjectJSON Schema for plugin config (see below)

Plugin Config Schema

These fields go in the plugins.aof.config section of your openclaw.json:

FieldTypeDefaultDescription
dataDirstring"~/.aof/data"AOF state directory (must match the daemon’s)
pollIntervalMsnumber30000Scheduler poll interval in milliseconds
defaultLeaseTtlMsnumber300000Default task lease TTL in milliseconds
dryRunbooleanfalseIf true, scheduler observes but does not dispatch
gatewayUrlstringauto-detectedOpenClaw gateway URL for HTTP dispatch
gatewayTokenstringauto-detectedGateway authentication token
heartbeatTtlMsnumber300000Heartbeat TTL in milliseconds
maxConcurrentDispatchesnumber3Maximum concurrent dispatched tasks (1-50)
modulesobject—Module enable/disable flags
modules.memory.enabledbooleantrueEnable memory module
modules.dispatch.enabledbooleantrueEnable dispatch module
modules.murmur.enabledbooleantrueEnable murmur orchestration module
modules.linter.enabledbooleantrueEnable linter module
memoryobject—Memory subsystem configuration
memory.embedding.provider"openai" | "ollama"—Embedding provider
memory.embedding.modelstring—Embedding model name
memory.embedding.baseUrlstring—Embedding API base URL
memory.embedding.apiKeystring—Embedding API key
memory.embedding.dimensionsnumber—Embedding dimensions
memory.search.hybridEnabledbooleantrueEnable hybrid search (vector + BM25)
memory.search.vectorWeightnumber0.7Vector search weight (0-1)
memory.search.bm25Weightnumber0.3BM25 search weight (0-1)
memory.search.maxResultsnumber10Maximum search results
memory.search.tierBoost.hotnumber1.0Score boost for hot tier results
memory.search.tierBoost.warmnumber0.8Score boost for warm tier results
memory.search.tierBoost.coldnumber0.5Score boost for cold tier results
memory.indexPathsstring[]—Additional paths to index

Gateway Configuration Example

To enable AOF in your OpenClaw gateway, add it to the plugins section of ~/.openclaw/openclaw.json:

{
"plugins": {
"aof": {
"enabled": true,
"config": {
"dataDir": "~/.aof/data",
"pollIntervalMs": 30000,
"maxConcurrentDispatches": 3,
"modules": {
"memory": { "enabled": true },
"dispatch": { "enabled": true }
},
"memory": {
"embedding": {
"provider": "openai",
"model": "text-embedding-3-small",
"dimensions": 1536
},
"search": {
"hybridEnabled": true,
"vectorWeight": 0.7,
"bm25Weight": 0.3
}
}
}
}
}
}

Note: gatewayUrl and gatewayToken are auto-detected from the OpenClaw runtime context. Only set them explicitly if auto-detection fails.

Managing Config via CLI

AOF provides CLI commands for org chart configuration management:

Terminal window
# Get a config value (dot-notation)
aof config get agents.swe-backend.active
# Set a config value (validates + atomic write)
aof config set agents.swe-backend.active true
# Preview a change without applying
aof config set agents.swe-backend.active false --dry-run
# Validate the entire org chart
aof org validate

All changes through aof config set are validated against the Zod schema and checked for referential integrity before being written atomically (write to temp file, validate, rename).