Reference
Configuration reference
Every field of control-center.yaml, with its type, default and meaning. The Mac app generates this file for each project; you can also write it yourself.
The file#
Everything project-specific is configuration in one YAML file, control-center.yaml. The Mac app uses the file in your repository if one exists and points at it, or generates a private one in its own data. From source, acc looks for --config, then ACC_CONFIG, then control-center.yaml or control-center.yml in the current folder.
A minimal configuration:
project:
name: example-app
repo: ~/code/example-app
checks: { test: "npm test" }
check_runtime: { mode: docker, endpoint: unix:///var/run/docker.sock, image: example-app-checks:local }
tracker: { type: local }
agents:
- { id: claude, name: "Claude Code", role: engineer, adapter: claude-headless }The fully commented example is examples/control-center.yaml. Unknown or invalid values are reported with their path, for example agents.0.metered_opt_in: …, and the daemon does not start until they are fixed.
Top level#
| Key | Required | Section |
|---|---|---|
project | yes | project |
agents | yes, at least one | agents |
tracker | no, default local | tracker |
import_sources | no | import_sources |
policies | no | policies |
knowledge | no | knowledge |
graphify | no | graphify |
code_host | no | code_host |
infra | no | infra |
server | no | server |
routing, workflow | no | Reserved |
project#
| Field | Type | Default | Meaning |
|---|---|---|---|
name | string | required | Display name, also the default Docker Compose project name |
repo | path | required | The git repository. ~ is expanded; a relative path resolves from the configuration file's folder. |
docker_project | string | name | Compose project name, if different |
integration_branch | string | integration | Where agent branches merge. Created from your production or first protected branch if missing. Must not be protected. |
protected_branches | list | [main] | Pushes are blocked by a per-worktree pre-push hook |
production_branch | string | none | The branch releases go to |
checks | map of name → command | {} | Commands the engine can run against committed source |
required_checks | list | all checks | The checks the engine re-runs after every run and at every merge |
check_runtime | object | none | Where checks run; see below. Without it, checks are unavailable and merge gates stay closed. |
categories | map of category → labels | {} | Issue labels that put an issue in a quality-floor category, e.g. schema_security: [schema, security, migration] |
release_gates | list | [] | Reserved; validated but not used yet |
check_runtime#
mode: docker runs checks offline in a local container. See Project checks in Docker.
| Field | Type | Default | Limits |
|---|---|---|---|
mode | docker | required | |
endpoint | string | required | A local Unix socket: unix:///… |
image | string | required | An installed image; resolved to its immutable ID |
binary | absolute path | docker on PATH | Pins the Docker CLI |
cpus | number | 1 | 0.1 to 8 |
memory_mb | integer | 512 | 64 to 8,192 |
pids | integer | 128 | 16 to 512 |
workspace_mb | integer | 1024 | 64 to 4,096 |
timeout_seconds | integer | 900 | 1 to 3,600 |
mode: host-fixture with an absolute fixture_repo exists only for the disposable demo and tests. It also requires an opt-in marker in that repository's Git folder. Never use it for a real project.
agents#
A list of agents. Each id must be unique.
| Field | Type | Default | Meaning |
|---|---|---|---|
id | string | required | Lowercase letters, digits and dashes, up to 32 characters |
name | string | required | Display name |
role | enum | required | lead, engineer, reviewer, qa, researcher |
adapter | enum | required | claude-headless, codex-cli, cursor-agent-cli, opencode-server, generic-cli, relay |
provider | enum | subscription | Model source: subscription, anthropic-api, openai-api, cursor-api, openrouter, ollama, ollama-cloud, lmstudio |
billing | enum | from provider | subscription, metered or local |
metered_opt_in | boolean | false | Explicit per-agent consent to per-token billing. Required by API-key providers and billing: metered. |
on_demand | boolean | false | Allows paid overage. Requires metered_opt_in. |
budget_usd_per_day | number | none | Daily stop threshold on recorded usage |
pricing | { input_per_mtok, output_per_mtok } | none | Prices per million tokens, for estimates when the provider reports no cost |
base_url | URL | provider default | Endpoint override. Local servers must be http://127.0.0.1, localhost or [::1] without credentials; the Ollama cloud API route only accepts https://ollama.com. |
ollama_route | daemon or api | daemon | ollama-cloud only: a signed-in local Ollama, or the cloud API with a Keychain key |
wire_api | responses or chat | responses | Codex wire protocol for OpenRouter |
enabled | boolean | true | false saves a draft that is never probed or dispatched |
mode | normal or coordinator-only | normal | Coordinators never take code-writing work |
model | string | newest | newest, or a literal model id |
model_family | string | none | Limits newest, e.g. opus |
allowed_models | list | none | Models this agent may use |
effort | enum | none | low, medium, high, xhigh, max |
concurrency | integer | 1 | 1 to 8 simultaneous runs |
binary | absolute path | auto | Pins one copy of the vendor CLI |
command, args | string, list | none | generic-cli only. args may use {prompt}, {model}, {cwd}, {effort}. |
stdin | prompt or none | prompt | generic-cli: write the prompt to standard input when no argument holds it |
allow_shell | boolean | true | Shell commands without per-command approval |
auto_approve_commands | list | [] | Extra shell prefixes auto-approved for agents that route approvals here |
instructions | string | empty | Up to 4,000 characters added to every assignment |
skills | list | [] | Up to 24 published skill ids |
subscription_group | string | none | Agents sharing one of your subscriptions |
subscription, vendor | string | none | Labels shown in the UI, e.g. Claude Max |
surface | enum | cli | cli, desktop-app, web-app, ide |
Which harness runs which provider#
| Provider | Harnesses (first is the default) |
|---|---|
subscription | claude-headless, codex-cli, cursor-agent-cli, generic-cli, relay |
anthropic-api | opencode-server, claude-headless |
openai-api | opencode-server, codex-cli |
cursor-api | cursor-agent-cli |
openrouter | opencode-server, codex-cli |
ollama | opencode-server, codex-cli |
ollama-cloud | opencode-server |
lmstudio | opencode-server, codex-cli (currently blocked) |
Models ending in -cloud or :cloud run on Ollama's servers and must use provider: ollama-cloud.
tracker#
| Type | Fields |
|---|---|
local | key_prefix (default LOC) |
github | repo (owner/name, required), live (false), poll_seconds (60, minimum 10), label_prefix (acc:), gh_binary |
linear | team (required), project, live (false), poll_seconds (60), state_names (category → exact state name), api_url |
Outbound trackers do nothing until live: true. See Trackers.
import_sources#
A list of read-only issue sources for Import issues. Each has id (lowercase, digits, dashes), name, type (github or linear), enabled (false), and repo for GitHub or team (and optional project) for Linear.
policies#
| Field | Type | Default | Meaning |
|---|---|---|---|
zero_extra_spend | boolean | true | Never fall back to paid usage. Cannot be removed in the app's settings editor. |
newest_model_rule | boolean | true | Pre-flight requires the newest eligible model |
quality_floor | map | {} | Category → minimum model class, e.g. code: "sonnet-class high" |
model_classes | list of { class, pattern } | built-in heuristics | Ordered patterns that classify model ids; first match wins |
allowed_models, denied_models | list | none, [] | Project-wide model allow and deny lists |
require_approval | list | push_protected, deploy, prod_db_write, migration_apply, publish, send_message | Actions that always come to you |
redact_env | list | [] | Environment variable names whose values are redacted everywhere, e.g. DATABASE_URL |
stall.no_event_minutes | number | 10 | Stall alert after this long without run events |
stall.approval_pending_minutes | number | 15 | Alert when an approval waits this long |
idle_alert_minutes | number | 5 | Alert when an agent idles this long with work queued |
auto_dispatch_next | boolean | true | Start the next queued item when Now finishes |
rules | map of rule → boolean | all on | auto_refill, stall_detection, failure_retry, usage_limit, handoff_enforcement, infra_watch |
quiet_hours | { start, end } | none | Hold notifications during these hours |
privacy.strict_mcp | boolean | true | Keep your personal MCP servers out of agent runs |
accounts.mode | personal or api-keys-only | personal | See Personal use or API keys only |
accounts.terms_max_age_days | integer | 90 | Re-confirm own-account use this often (1 to 365) |
accounts.api_key_rotation_days | integer | 90 | Remind to rotate stored keys (1 to 730) |
knowledge#
Optional. Connects an Obsidian vault or Markdown folder for shared notes and One Ask.
| Field | Type | Default | Meaning |
|---|---|---|---|
vault | path | required | The vault or Markdown folder |
folder | vault-relative path | Agent Control Center | The folder One Connect owns; each project gets a subfolder |
context_folders | list | [] | Up to 32 extra folders agents may read. Nothing else is read. |
obsidian_cli | auto, on, off | auto | Use the official Obsidian CLI for search when Obsidian is running |
obsidian_binary, vault_name | string | auto | Override the CLI path and vault name |
write.contract, write.brief, write.issues, write.handoffs, write.decisions | boolean | true | Which notes are written |
search.semantic | boolean | false | Local semantic search |
search.endpoint | URL | http://127.0.0.1:11434 | Must be http://127.0.0.1 with no credentials or path |
search.embedding_model | string | embeddinggemma | An installed embedding model |
search.answer_model | string | none | An installed local model for plain-language answers |
search.budget_chars | integer | 6000 | Source budget per answer, 1,500 to 12,000 |
graphify#
| Field | Type | Default | Meaning |
|---|---|---|---|
enabled | boolean | true | Build the code graph when Graphify is installed |
binary | path | graphify on PATH | Pins the Graphify executable |
auto_update | boolean | true | Rebuild when the integration branch moves (AST only, no cost) |
semantic | boolean | false | LLM extraction. Uses a paid API and requires semantic_opt_in: true. |
semantic_opt_in, semantic_backend | boolean, string | false, none | Consent and backend for semantic extraction |
budget | integer | 1500 | Token budget for graph queries, 100 to 20,000 |
publish_report | boolean | true | Copy the graph report into the vault |
Dictionary's own intake always uses AST extraction with LLM keys stripped, whatever semantic says.
code_host#
Optional, read-only. One of:
| Provider | Fields |
|---|---|
github | repo (owner/name) |
gitlab | project (id or path) |
Both accept activated (false), host, scopes (an activated connection needs a host and at least one scope), poll_seconds (15 to 300), finding_issues (manual or rule), an optional webhook (secret_account: github-webhook or gitlab-webhook; max_skew_seconds; replay_window_seconds) and fixture_base (a loopback URL, for tests).
infra#
Optional, read-only hosting and database probes.
| Field | Meaning |
|---|---|
finding_issues | manual (default) or rule: file problems as issues automatically |
vercel | project, plus activated, host, scopes |
supabase | project_ref, migrations_dir (default supabase/migrations), plus activated, host, scopes |
server#
| Field | Default | Meaning |
|---|---|---|
port | 7317 | Dashboard and API port on 127.0.0.1. --port and ACC_PORT override it. |
Reserved sections#
routing (work type → agents in order of preference) and workflow (methodology kanban, scrum or waterfall, auto_start, wip_limit, review, auto_merge, sprint and phases) are parsed and validated, but the current engine does not act on them yet. Use the canvas to define how work flows.
Editing settings in the app#
Settings → Project and policies edits the selected project's configuration: branches, checks and their Docker runtime, model rules, stall thresholds, code-host and infrastructure drafts, Graphify, and redaction rules.
- Review settings changes creates an exact, expiring Decision. Confirm it to save. Settings, your answer and the audit events commit together and survive a restart.
- A stale or replaced draft cannot be applied, and settings cannot change while work is running or queued.
- Protected branches, required approvals, strict connector scope and the zero-extra-spend default cannot be removed through this editor.
- Saving runs no project code, contacts no provider, pulls no image and activates no remote integration. Code-host and infrastructure drafts are activated separately in Connectors.
- Repository identity and the Docker namespace stay bound to the project registered in the Mac app.