Skip to content

Configuration reference

FileWhat it isRead by
air.jsonThe AIR catalog wiring (dev/test)AirCatalogService via the AIR CLI
air.production.jsonSame, for the in-image catalog (prod/staging)ditto
roots.jsonAgent root definitionsAgentRootsConfig
mcp.jsonMCP server registryServersConfig
skills/skills.jsonSkill indexSkillsConfig
plugins/plugins.jsonPlugin indexPluginsConfig
hooks/hooks.jsonHook indexHooksConfig
references/references.jsonReference indexReferencesConfig
config/goals.jsonGoal / stop-condition catalogGoalsConfig

config/goals.json is the exception — it’s a plain static file that GoalsConfig reads directly, outside AIR.

VarPurposeSet by the shipped deploy?
SECRET_KEY_BASERails secret✅ (Terraform)
DATABASE_HOST / _PORT / _USERNAME / _PASSWORD / _SSLMODEPostgres
REDIS_URLCache
RAILS_MASTER_KEYRails credentials❌ not set
API_KEYSREST API auth❌ not set — the API 401s on everything
APP_HOSTMCP OAuth redirect URI❌ not set — every OAuth flow points at localhost:3000
VarPurpose
ANTHROPIC_API_KEYClaude Code, when not using OAuth
ANTHROPIC_BASE_URLTest-only; triggers reading the OAuth token off disk and passing it as an API key
CODEX_HOMECodex config dir. Default ~/.codex
CLAUDE_CONFIG_DIRLogin isolation only (a scratch dir during the login flow)
AIR_CONFIGWhich air.json to resolve. Always wins over the per-environment default.
AIR_CATALOG_REFStaging-only catalog pinning
VarDefault
AGENT_CLONES_DIR~/.agent-orchestrator/clones
AGENT_SCRATCH_DIRper-session durable scratch
REPO_BASE_PATHtmp/repos (bare repos)
EXECUTION_REPOS_DIR

WEB_CONCURRENCY, RAILS_MAX_THREADS, GOOD_JOB_MAX_THREADS, REDIS_POOL_SIZE, RAILS_LOG_LEVEL, PIDFILE, PROCESS_*.

SENTRY_DSN_BACKEND, OTEL_SERVICE_NAME, OTEL_LOGS_EXPORTER_ENDPOINT, OTEL_LOGS_EXPORTER_BEARER_TOKEN.

Consumed as ${VAR} placeholders in mcp.json, resolved by SecretsLoader at prepare time: FLY_IO_API_TOKEN, OP_SERVICE_ACCOUNT_TOKEN, PULSEMCP_SUBREGISTRY_API_KEY, …

SecretsLoader resolves in this order: XOauthTokenVendor → Rails credentials (mcp_secrets) → ENV.

/settings writes to a single AppSetting row:

  • Default runtime (claude_code | codex) and default model.
  • Extension toggles — the extension_states JSONB map. See Extensions.
  • Catalog refresh controls.
LimitValue
Prompt max length500,000 chars
Session notes max50,000 chars
Search query max1,000 chars
MCP servers per session50
Skills / hooks per session100 each
Plugins per session50
API paginationdefault 25, max 100
MCP server startup timeout180,000 ms (3 min)
Elicitation expiry10 minutes
needs_input push debounce60 seconds
Trash retention (dirty clones)4 days
Large-prompt stream-json threshold100 KB