registry.json Schema
orchestration/agent/registry.json is the single source of truth for the OpenFlows agent team. Version 2
of the schema separates runtime provisioning from model routing and makes every agent role independently configurable.
This page documents every top-level field, every per-agent field, and the nested skills and mcp
structures.
The registry is read on every NEXUS poll cycle. You can change models, scale instances, swap CLI modules, add skills, or disable agents without restarting the orchestrator. The extension point is intentionally simple: edit JSON, and the next cycle picks up the new configuration.
Default registry.json
The following file is the recommended starting point. It uses the Coder workspace provider, the Claude Code CLI module by default, the Coder AI Gateway as the primary LLM path, and LiteLLM as an air-gapped fallback. The five agent roles are NEXUS, FORGE, SENTINEL, VESSEL, and LORE.
Where the file lives
orchestration/agent/registry.json relative to the OpenFlows repository root. You can
override it with the OPENFLOWS_REGISTRY_PATH environment variable or the --registry-path CLI flag.
Top-Level Fields
| Field | Type | Description |
|---|---|---|
workspace_provider | string | "coder" - tells OpenFlows to provision ephemeral Coder workspaces rather than local Git worktrees. |
coder_module | string | Default Coder Registry module that installs the code agent CLI into every workspace (e.g. "claude-code", "codex", "aider"). Overridden per-agent. |
ai_gateway | object | Routing configuration for LLM calls. See the AI Gateway table below. |
AI Gateway Fields
The ai_gateway object controls where LLM calls go. OpenFlows does not hold provider credentials; it passes
the per-agent provider and model values to the gateway, which handles authentication and audit.
| Field | Type | Description |
|---|---|---|
primary | string | "coder" - route all LLM calls through the Coder AI Gateway. API keys are managed centrally and never exposed inside workspaces. |
fallback | string | "litellm" - fall back to a LiteLLM proxy when the Gateway is unavailable. |
litellm_url | string | Optional base URL of the LiteLLM proxy (e.g. http://litellm.internal:4000). If unset, the orchestrator reads LITELLM_URL from the environment. |
timeout_ms | int | Request timeout for LLM calls. Default 120000 (2 minutes). |
Per-Agent Fields
Every key under agents is a role name. The five built-in roles are nexus, forge,
sentinel, vessel, and lore. You can add new roles if the Coder modules and skills
exist, but the built-in flow expects these five.
| Field | Type | Description |
|---|---|---|
provider | string | LLM provider slug for this agent: anthropic, openai, google, fireworks, groq, etc. Must match a provider configured in the Coder AI Gateway. |
model | string | Model identifier passed to the provider via the AI Gateway (e.g. claude-sonnet-4-20250514). |
coder_module | string | Per-agent override of the top-level coder_module. Lets FORGE run claude-code while LORE uses aider. |
active | bool | Set false to exclude the agent from orchestration entirely. |
instances | int | Number of parallel worker slots. FORGE with instances: 2 → forge-1, forge-2, each in its own Coder workspace. |
skills | array<string> | Skill directories under orchestration/plugin/skills/ that this agent should load. Optional. |
mcp | object | Per-agent MCP server registrations. Keys are server names; values are server definitions or references to central Coder MCP servers. |
Per-agent overrides
coder_module acts as a default. The per-agent coder_module overrides it. This
lets you mix CLIs across roles: FORGE can run Claude Code, SENTINEL can run Codex, and LORE can run Aider, all in the
same deployment.
Skills Array
Skills are plug-and-play knowledge packs. Each entry is a directory under orchestration/plugin/skills/ that
contains a SKILL.md manifest and any supporting files. Adding a skill to an agent does not require any code
change; the skill is symlinked into the workspace at provisioning time.
| Field | Type | Description |
|---|---|---|
name | string | Directory name of the skill under orchestration/plugin/skills/. |
enabled | bool | Whether the skill is active. Default true. |
path | string | Optional override path. Defaults to orchestration/plugin/skills/{name}/. |
A skill entry can be a simple string (the directory name, enabled by default) or an object with an explicit
enabled flag. Disabled skills are still loaded into the skill registry but are not injected into the
agent's workspace.
MCP Object
The mcp object registers Model Context Protocol servers for an agent. MCP servers can be defined locally
(command-based) or referenced from the Coder dashboard (central registration). Central servers are preferred for secrets
and versioning; local servers are useful for development and one-off tools.
| Field | Type | Description |
|---|---|---|
name | string | Human-readable server name referenced by prompts and skills. |
source | string | "local" for a command-based server, or "coder" to reference a server registered in the Coder dashboard. |
command | string | For local servers, the executable to run (e.g. "npx" or "uvx"). |
args | array<string> | Arguments passed to the command. |
env | object | Environment variables passed to the MCP server process. |
coder_server_name | string | For Coder-registered servers, the exact name shown in AI Settings → MCP Servers. |
Local MCP server security
Validation Rules
The orchestrator validates the registry at load time and on every hot reload. Invalid configurations are logged and the previous valid configuration is retained. This prevents a typo from stopping the entire team.
| Field | Constraint |
|---|---|
workspace_provider | Must be "coder" in the current version. Local worktree mode is deprecated. |
coder_module | Must be a published Coder Registry module in your deployment. |
agents.{"{role}"}.provider | Must match a provider slug configured in the Coder AI Gateway or LiteLLM proxy. |
agents.{"{role}"}.instances | Must be an integer between 1 and 32. Set to 0 or active: false to disable. |
agents.{"{role}"}.active | Must be a boolean. Inactive agents are skipped by NEXUS. |
skills | Each entry must resolve to a directory containing a SKILL.md manifest. |
mcp | Either source: "coder" with a valid coder_server_name, or a command that exists in the workspace. |
# Validate the registry without starting the orchestrator openflows doctor registry
Common Configuration Changes
Scale FORGE workers:
"forge": { "instances": 4 }
// → forge-1, forge-2, forge-3, forge-4
// Each gets its own ephemeral Coder workspace.Disable an agent:
"lore": { "active": false }
// LORE will not be invokedSwitch an agent to a different model:
"sentinel": { "provider": "google", "model": "gemini-2.5-pro" }
// SENTINEL now uses Gemini via the Coder AI GatewayUse a different CLI for one agent:
"forge": { "coder_module": "aider" }
// FORGE now uses Aider instead of Claude CodeRegister a new skill:
"forge": { "skills": ["forge-coding", "rust-patterns"] }
// The rust-patterns skill is loaded into every FORGE workspaceRecommended Model Assignments
These defaults balance reasoning quality, cost, and adversarial review. Mixing providers (Anthropic for FORGE, OpenAI for SENTINEL) creates natural adversarial review - the reviewer uses a different model family than the code writer.
| Agent | Provider / Model | CLI Module | Why |
|---|---|---|---|
FORGE | anthropic / claude-sonnet-4-20250514 | claude-code | Primary coding agent - needs deep reasoning and long context. |
NEXUS | anthropic / claude-sonnet-4-20250514 | claude-code | Orchestrator - needs reliable decision-making and reconcile logic. |
SENTINEL | openai / gpt-4.1 | codex | Adversarial review - different provider from FORGE to catch correlated failures. |
VESSEL | openai / gpt-4o | codex | CI/CD scripting and merge decisions - fast and cost-effective. |
LORE | anthropic / claude-haiku-4-20250514 | aider | Documentation and changelog - lightweight task, lightweight model. |
Hot reload behavior
registry.json is re-read on every NEXUS poll cycle. Changes to instances, model,
coder_module, active, skills, and mcp take effect without a restart.
Changes that are already in-flight (e.g. a FORGE worker running on the old model) finish their current task using the
previous configuration; new tasks use the updated configuration.