Skip to content

Configuration (~/.coro/config.json)

Coro persists operator settings in ~/.coro/config.json (override with coro start --config). The Zod schema lives in packages/runner/src/config/local-config.ts.

Dashboard first

Settings in the bundled dashboard is the primary way to edit config. Each section maps to keys below; click Save all changes to write the file. Settings → Advanced → Paths shows the resolved config path and offers Show in Finder / Open folder.

Dashboard locationConfig keys
General → Coach modecoachMode.enabled, coachMode.graduateAfterRuns (read-only counters: totalRuns, lastRunAt, graduatedAt)
General → Plan modeintake.toolsEnabled
Setup → LLM providerplugins.installed.* (executors), llm.defaultProvider, llm.aliases
Setup → Source controlplugins.installed.github / gitlab / bitbucket, legacy git.*
Setup → Issue trackerplugins.installed.jira / linear / github-issues, legacy tracker.*
Extensions → Pluginsplugins.installed.* (drop-ins), install metadata
Extensions → MCP serversmcpServers, inheritClaudeCodeMcps
Extensions → Guardrailsguardrails.enabled, guardrails.rules[]
Extensions → Overseerdecision.mode, decision.apiKey, decision.overseer, decision.sites
Advanced → Pathsintelligence.dir, intelligence.gitRemote, paths.workingDir

No dedicated dashboard UI today (edit JSON or use CLI):

KeysHow to set
tenant.overlay (localDir, explicit gitRemote block)JSON, or use Paths → Intelligence git remote for the common git-remote case
cloud.url, cloud.tokencoro login (/guides/hybrid-mode/)
proposals.routing.strategyJSON
setup.completedAt, setup.skipped[]Written by setup wizard
Loki / Tempo endpointsEnvironment variables on the runner host (/guides/observability/)

coro init bootstraps a starter config.json for scripted installs; day-to-day edits should go through Settings.


paths

FieldMeaningDashboard
workingDirJob sandboxes (working/<jobId>/…)Advanced → Paths → Working directory

Derived defaults also exist at runtime (paths.coroIntelligenceDir, paths.baseLayerDir) inside the in-memory Settings object built during bootstrap—these generally should not be hand-edited in JSON.


intelligence

FieldMeaningDashboard
dirOptional checkout used by solo operators for tenant intelligence authoringAdvanced → Paths → Intelligence directory
gitRemoteWhen tenant.overlay is absent but this is set, the resolver synthesises a gitRemote overlay sourceAdvanced → Paths → Intelligence git remote

tenant

FieldMeaningDashboard
displayNameCosmetic label for solo tenants—
overlay.kindnone | localDir | gitRemote | cloudBlob (stub)Partial: use Intelligence git remote for gitRemote; full overlay block is JSON-only

overlay declares where tenant-layer Markdown merges on top of @coro-ai/intelligence-base.


plugins.installed

Map of pluginId → { enabled, config } blobs. Executor plugins (Anthropic, OpenAI, …) store API keys / OAuth mode here; SCM + tracker plugins receive provider credentials validated by each plugin’s configSchema.

Dashboard
Setup → LLM provider, Source control, Issue tracker, and Extensions → Plugins

The runner also accepts top-level legacy git / jira blocks — legacyConfigToPlugins synthesises plugin entries when modern plugins data is missing.


llm

FieldMeaningDashboard
defaultProviderExecutor plugin id used when a workflow phase does not pin provider:Setup → LLM provider
aliasesWorkflow keys such as planning / coding → { provider, model, reasoningEffort? }Setup → LLM provider (aliases panel)

Concrete provider-specific configuration still lives under plugins.installed.<provider>.config.


git

Legacy SCM credential carrier:

FieldMeaningDashboard
providerbitbucket | github | gitlabPrefer Setup → Source control plugin cards
workspaceOrg / Bitbucket workspace slug↑
usernameService account↑
tokenPAT (never logged verbatim)↑

tracker

FieldMeaningDashboard
providernone | jira | github | linearSetup → Issue tracker
jira.*baseUrl, username, apiToken↑
linear.*apiKey, optional teamKey↑

guardrails

FieldMeaningDashboard
enabledMaster switchExtensions → Guardrails
rules[]Array of overrides matched by id — see Guardrails↑ (per-rule toggles and thresholds)

mcpServers and inheritClaudeCodeMcps

FieldMeaningDashboard
mcpServersMap of server id → { type: stdio|http|sse, …, allowedTools?, disallowedTools?, enabled? }Extensions → MCP servers (JSON editor)
inheritClaudeCodeMcpsWhen true, merge Claude Code’s own MCP config into every job↑ (toggle)

Reserved id coro is rejected — it would shadow the built-in server.


proposals

FieldMeaningDashboard
routing.strategypath (default) routes .coro/** → repo layer, everything else → tenant; agent forces explicit targetLayer on the tool callJSON only

cloud

FieldMeaningDashboard
urlControl-plane base URLcoro login (no Settings UI)
tokenRunner authentication secret (JWT / pairing token)coro login

Presence of both fields selects hybrid mode (Postgres state + cloud webhooks). Otherwise the runner stays on SQLite + polling.


setup

FieldMeaningDashboard
completedAtISO timestamp when the FTUE wizard finishedSetup wizard
skipped[]Optional deferred steps (llm, scm, tracker)Setup wizard

coachMode

Safer defaults for new operators. The runner increments totalRuns on each job dispatch; when totalRuns >= graduateAfterRuns and coach mode is still enabled, the dashboard shows a graduation prompt.

FieldMeaningDashboard
enabledWhen true, new runs default to Interactive and extra New Run guidance is shown until graduationGeneral → Coach mode
graduateAfterRunsDispatch count before the UI treats the user as graduated (default 5)↑ (implicit default)
totalRunsCumulative dispatches (runner-maintained)—
lastRunAtISO timestamp of the most recent dispatch—
graduatedAtSet when the user dismisses graduation or disables coach mode—

When coach mode is active, new runs default to Interactive until you graduate.


intake

Controls New run (home) plan mode.

FieldMeaningDashboard
toolsEnabledWhen true (default), plan mode may call read-only tracker/SCM tools (tracker_get_issue, scm_read_file, …). Never writes.General → Plan mode → Allow read-only lookups

Per-session plan-mode model overrides from the chat picker are stored on the investigation record (the durable New Run conversation), not in ~/.coro/config.json.


decision

Optional Overseer. Absent, or present without both a non-off mode and an API key, means no Jev calls. Dashboard: Extensions → Overseer. How to turn it on: Turn on Overseer.

FieldMeaningDashboard
modeoff, shadow (Observe — record only), or live (Manage — can pause an interactive job)Mode
providerDecision provider id. Default jev—
apiKeyJev API key. Redacted on GET /config. Empty falls through to CORO_DECISION_API_KEY, then TYPESAFE_API_KEYAPI key
baseUrlProvider origin. Blank uses the provider defaultBase URL
modelPinned model. Blank uses jev-1.13.0Model
timeoutMsCall timeout. Default 1500. Timeouts continue the jobTimeout (ms)
overseer.scopeall (default), campaigns, or offOverseer scope
overseer.onFlagpark (default; interactive jobs only) or flag-onlyWhen flagged
overseer.thresholds.offTrackNoulPause cutoff. Default 0.75 flags when the stored on-goal probability is 0.25 or lower. The pill’s 70 / 40 bands are not this field—
overseer.thresholds.severityScoreMinimum seriousness (0–3) before an unmet requirement can pause. Default 1.5—
overseer.thresholds.minChoiceConfidenceMinimum confidence on that unmet requirement. Default 0.5—
sitesPer-site mode override: overseer, wake-gate, lane, input-screen, review-lens. Each is off, shadow, or live. Omitted sites inherit modePer-site overrides
{
"decision": {
"mode": "shadow",
"provider": "jev",
"apiKey": "…",
"overseer": { "scope": "all", "onFlag": "park" }
}
}

  • ~/.coro/state.db — SQLite job store (local mode)
  • ~/.coro/guardrails/*.mjs — Custom script rules referenced from guardrails.rules

See Dashboard tour → Settings for screenshots of each section.