Configuration & env vars
Every runtime tunable in one place — cycle timing, concurrency, evaluation, delegation, hiring, and budget — with defaults and where to set them.
This is the single reference for every runtime knob. Most have a sensible
default, so a bare org needs none of them. Precedence throughout is CLI flag →
environment variable → file (QUORUM.md) → built-in default.
Runtime tunables
| Option | Env | Default | Meaning |
|---|---|---|---|
tickMs | TICK_MS | 10000 | cycle interval in ms |
concurrency | TASK_CONCURRENCY | 4 | max tasks run in parallel per cycle |
evaluate | EVAL=off | true | run the quality gate at all |
evalThreshold | EVAL_THRESHOLD | 60 | minimum passing score (0–100) |
maxAttempts | — | 2 | total executions per task (initial + reworks); 2 = one rework |
maxDelegations | — | 3 | subtasks one task may hand to reports |
maxDelegationDepth | — | 2 | delegate → integrate chain depth cap |
maxAgents | — | 16 | headcount ceiling for self-hiring (auto + explicit) |
idleMeetingEvery | — | 30 | cycles between idle standing check-ins |
failOpenOnUnparsedEval | — | false | auto-pass an unparseable verdict (echo/no-judge only) |
The ones with a flag or env var are also settable there; the rest are runtime constructor options.
Budget
Set as budget in QUORUM.md, by env var, or with --budget (which
maps to totalUsd). An omitted field means no cap.
| Field | Env | Behavior when hit |
|---|---|---|
totalUsd | BUDGET_TOTAL_USD | org halts for good (lifetime) |
dailyUsd | BUDGET_DAILY_USD | skip cycles until the day rolls over |
monthlyUsd | BUDGET_MONTHLY_USD | skip cycles until the month rolls over |
perCycleUsd | BUDGET_PER_CYCLE_USD | warn + halt new dispatch mid-cycle |
See Cost & budget for the full behavior.
Server
| Option | Env | Flag | Default |
|---|---|---|---|
| port | PORT | --port | 3000 |
| host | HOST | --host | 127.0.0.1 |
| enabled | — | --headless disables | on |
| webhook secret | QUORUM_TRIGGER_SECRET | — | unset (webhooks off) |
0.0.0.0 exposes an unauthenticated control plane — only bind it publicly
when you mean to. The one exception is inbound
webhook triggers: POST /api/trigger/<name> is fail-closed —
it does nothing unless QUORUM_TRIGGER_SECRET is set, and every call must present
that secret.
Brain / provider
Set per agent (or as defaults.provider). Full detail in
The brain.
| Field | Default | Meaning |
|---|---|---|
type | claude | claude, codex, opencode, cline, copilot, hermes, kimi, droid, gemini, llm, fake |
model | provider default | model id |
effort | — | low | medium | high | xhigh | max (claude) |
maxBudgetUsd | — | per-session spend ceiling (claude) |
bin | $CLAUDE_BIN / $CODEX_BIN / binary name | path to the binary |
timeoutMs | 600000 | per-call timeout (10 min) |
retries | 3 | retry count on pre-effect failure |
args | — | extra raw CLI args per call |
launch | — | launcher prefix, e.g. ollama launch claude (claude) |
oss | false | run against a local open-source model (codex) |
localProvider | — | ollama | lmstudio — target of oss (codex) |
sandbox | derived | read-only | workspace-write | danger-full-access (codex) |
mcp | — | org-owned MCP config path(s); null disables (claude) |
strictMcp | true | isolate from the operator’s own MCP servers (claude) |
settingSources | — | --setting-sources value (claude) |
pricing | — | override the cost-per-token table |
Capabilities
allow / ask / deny, resolved per-agent → org default → base. Base defaults:
allow for everything except crm (ask). See
Tools & permissions.
Example: a tuned run
TASK_CONCURRENCY=6 \
EVAL_THRESHOLD=70 \
BUDGET_DAILY_USD=5 \
BUDGET_MONTHLY_USD=100 \
quorum --tick 15000 --budget 200
# ...or persist it in QUORUM.md
- budget: { "totalUsd": 200, "dailyUsd": 5, "monthlyUsd": 100 }
- defaults: { "provider": { "type": "claude", "model": "claude-opus-4-8", "effort": "medium" } }
A note on .env
For source runs you can keep configuration in a .env file and load it with
Node’s built-in flag (node --env-file=.env ...). The fake brain used by tests
needs none of these variables.