- Get Started

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

The default path is 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

FieldTypeDescription
workspace_providerstring"coder" - tells OpenFlows to provision ephemeral Coder workspaces rather than local Git worktrees.
coder_modulestringDefault Coder Registry module that installs the code agent CLI into every workspace (e.g. "claude-code", "codex", "aider"). Overridden per-agent.
ai_gatewayobjectRouting 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.

FieldTypeDescription
primarystring"coder" - route all LLM calls through the Coder AI Gateway. API keys are managed centrally and never exposed inside workspaces.
fallbackstring"litellm" - fall back to a LiteLLM proxy when the Gateway is unavailable.
litellm_urlstringOptional base URL of the LiteLLM proxy (e.g. http://litellm.internal:4000). If unset, the orchestrator reads LITELLM_URL from the environment.
timeout_msintRequest 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.

FieldTypeDescription
providerstringLLM provider slug for this agent: anthropic, openai, google, fireworks, groq, etc. Must match a provider configured in the Coder AI Gateway.
modelstringModel identifier passed to the provider via the AI Gateway (e.g. claude-sonnet-4-20250514).
coder_modulestringPer-agent override of the top-level coder_module. Lets FORGE run claude-code while LORE uses aider.
activeboolSet false to exclude the agent from orchestration entirely.
instancesintNumber of parallel worker slots. FORGE with instances: 2forge-1, forge-2, each in its own Coder workspace.
skillsarray<string>Skill directories under orchestration/plugin/skills/ that this agent should load. Optional.
mcpobjectPer-agent MCP server registrations. Keys are server names; values are server definitions or references to central Coder MCP servers.

Per-agent overrides

The top-level 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.

FieldTypeDescription
namestringDirectory name of the skill under orchestration/plugin/skills/.
enabledboolWhether the skill is active. Default true.
pathstringOptional 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.

FieldTypeDescription
namestringHuman-readable server name referenced by prompts and skills.
sourcestring"local" for a command-based server, or "coder" to reference a server registered in the Coder dashboard.
commandstringFor local servers, the executable to run (e.g. "npx" or "uvx").
argsarray<string>Arguments passed to the command.
envobjectEnvironment variables passed to the MCP server process.
coder_server_namestringFor Coder-registered servers, the exact name shown in AI Settings → MCP Servers.

Local MCP server security

Local command-based MCP servers run inside the workspace. Use them only for read-only or low-risk tools. High-privilege tools like GitHub should be registered centrally in the Coder dashboard so that credentials and access control are managed by Coder, not embedded in the workspace.

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.

FieldConstraint
workspace_providerMust be "coder" in the current version. Local worktree mode is deprecated.
coder_moduleMust be a published Coder Registry module in your deployment.
agents.{"{role}"}.providerMust match a provider slug configured in the Coder AI Gateway or LiteLLM proxy.
agents.{"{role}"}.instancesMust be an integer between 1 and 32. Set to 0 or active: false to disable.
agents.{"{role}"}.activeMust be a boolean. Inactive agents are skipped by NEXUS.
skillsEach entry must resolve to a directory containing a SKILL.md manifest.
mcpEither source: "coder" with a valid coder_server_name, or a command that exists in the workspace.
bash
# Validate the registry without starting the orchestrator
openflows doctor registry

Common Configuration Changes

Scale FORGE workers:

json
"forge": { "instances": 4 }
// → forge-1, forge-2, forge-3, forge-4
// Each gets its own ephemeral Coder workspace.

Disable an agent:

json
"lore": { "active": false }
// LORE will not be invoked

Switch an agent to a different model:

json
"sentinel": { "provider": "google", "model": "gemini-2.5-pro" }
// SENTINEL now uses Gemini via the Coder AI Gateway

Use a different CLI for one agent:

json
"forge": { "coder_module": "aider" }
// FORGE now uses Aider instead of Claude Code

Register a new skill:

json
"forge": { "skills": ["forge-coding", "rust-patterns"] }
// The rust-patterns skill is loaded into every FORGE workspace

Recommended 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.

AgentProvider / ModelCLI ModuleWhy
FORGEanthropic / claude-sonnet-4-20250514claude-codePrimary coding agent - needs deep reasoning and long context.
NEXUSanthropic / claude-sonnet-4-20250514claude-codeOrchestrator - needs reliable decision-making and reconcile logic.
SENTINELopenai / gpt-4.1codexAdversarial review - different provider from FORGE to catch correlated failures.
VESSELopenai / gpt-4ocodexCI/CD scripting and merge decisions - fast and cost-effective.
LOREanthropic / claude-haiku-4-20250514aiderDocumentation 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.