Configuration reference
All settings live in one file: ralph_orchestrator/config.yaml, deep-merged over the
defaults in ralph_orchestrator/config.py (config.load). Every key is optional; omitted
sections fall back to the defaults shown in the tables below. The shipped file is a
fully-commented example with empty secrets.
The environment-override rule
For e-mail and the gateway key, an environment variable wins when set, then the config.yaml value, then (gateway only) the key file:
-
orch.pyfills the e-mail environment from themail:section at startup (_apply_mail_cfg) — only for variables that are still empty, so a live session’s exports always override the file. -
models.api_keyresolvesgateway.api_key_env→gateway.api_key→gateway.api_key_file.
Practical consequence: a fresh terminal needs zero exports; a long-lived session can keep
overriding the file with export SMTP_PASS=… etc. without editing anything.
project:
| Key | Default | Meaning |
|---|---|---|
|
|
the branch |
|
|
the branch all ticket branches merge into |
|
|
regression command run on the integration branch after every merge; |
|
|
glob list the agents may never change (in addition to the kit and |
orchestrator:
| Key | Default | Meaning |
|---|---|---|
|
|
upper bound for concurrent workers; the real limit is computed at runtime from pending-ticket complexity weights (orchestrator.adoc#the-run-loop) |
|
|
seconds per agent run (and per acceptance command); a timeout kills the process group (rc 124) |
|
|
per-ticket attempt budget unless the ticket sets |
|
|
global agent-run budget; the run halts with |
|
|
push the integration branch to |
|
|
remote used when |
agent:
| Key | Default | Meaning |
|---|---|---|
|
|
any shell command that edits files in its cwd; the worker sets |
|
|
npm plugins merged into the repo’s |
|
|
run the one-time global caveman OpenCode installer when missing (best-effort) |
|
|
ticket complexity → agent model id (as the agent CLI knows it) |
gateway:
| Key | Default | Meaning |
|---|---|---|
|
|
OpenAI-compatible base URL; |
|
|
name of the environment variable that wins when set |
|
|
direct key value in config.yaml (second priority) |
|
|
key file, last priority |
Resolution: api_key_env → api_key → api_key_file (see
model access).
llm:
LangChain model specs for the LLM-backed features. Each spec: {path, model, temperature?}
(path plugs into gateway.base_url, model is the model name sent to the gateway;
temperature default 0.2).
| Key | Default | Meaning |
|---|---|---|
|
|
the planning model ( |
|
3 entries: |
the consensus panel. Each entry additionally carries |
consensus:
| Key | Default | Meaning |
|---|---|---|
|
|
the review gate (Consensus review panel); |
|
|
approvals needed, capped by the number of valid votes |
|
|
diff truncation for reviewers (marked |
|
|
a model never reviews its own ticket |
collaboration:
| Key | Default | Meaning |
|---|---|---|
|
|
agents get the |
|
|
parallel waves negotiate interface contracts before launch (collaboration.adoc#contracts) |
|
|
revision rounds before the mechanical owner decision |
|
|
cap on approved follow-up fix tickets per run |
|
|
how often the run loop waits/processes (bus, completions) |
report:
| Key | Default | Meaning |
|---|---|---|
|
|
periodic status mail cadence (10 min) |
|
|
IMAP reply-poll cadence while a run is active (and the watch cycle cadence) |
mail:
| Key | Default | Env override | Meaning |
|---|---|---|---|
|
|
|
receiver(s), comma separated; empty = mail disabled |
|
|
|
e.g. |
|
|
|
587 STARTTLS / 465 SSL |
|
|
|
sender login |
|
|
|
From address (default: |
|
|
|
STARTTLS on port 587; |
|
|
|
SMTP app password (never the account password); also the IMAP password default |
|
|
|
reply loop; empty = no reply watching |
|
|
|
993 = always SSL; other ports use STARTTLS per |
|
|
|
only used when |
|
|
|
default: the sender ( |
|
|
|
default: |
|
|
|
optional Teams/Slack/ntfy URL; receives |
|
Secrets: |
The .ralph/ directory
Run state and artifacts live in .ralph/ at the target repo root (git-excluded via
info/exclude by the orchestrator and install.sh):
state.json # single source of truth (xref:data-models.adoc#state-json[])
watch.json # watch-agent heartbeat
last_report.txt # last report mail (subject, message-id, body)
inbox.json # captured operator replies
dynamic.json # change-request follow-up tickets + added deps
prompts/<id>.md # exact prompt per attempt
logs/<id>.log # agent output + guard decisions per attempt
handoff/<id>.md # what a merged ticket changed
contracts/group<k>.json|.md
bus/messages.jsonl, bus/cursor/<id>, bin/bus
wt/<id>/, wt/_integration/ # git worktrees
Reports go to out/run_report.html and out/run_report.pdf at the repo root.