Everything lives in one file, config.yaml, seeded on first run from the tracked template config.default.yaml. Most of it is adjustable live with /config <dotted.key> <value>; edits persist by default, --session keeps one for this session only. Trust keys are the exception — see below.
::tiers and roles
The agent references model roles, never concrete model ids. A hardware tier maps each role to a model, so swapping hardware is a one-line active_tier change:
active_tier: laptop
tiers:
laptop:
provider: ollama
roles:
planner: gemma4:e4b
tool_caller: gemma4:e4b
synthesizer: gemma4:e4b
utility: gemma4:e4b
judge: gemma4:e4b
embedder: qwen3-embedding:8b
workstation:
provider: ollama
roles:
planner: qwen3.6:27b
tool_caller: qwen3.6:27b
synthesizer: qwen3.6:27b
utility: qwen3.6:27b
judge: qwen3.6:27b
embedder: qwen3-embedding:8bplanner
drafts and redrafts the plan (structured output; keeps its hidden rationale)
tool_caller
the execute node: per-step reasoning and single-tool constrained calls
synthesizer
the final streamed answer
judge
the engine's judgment calls: rectify verdicts, the semantic write gate
utility
cheap background tasks
embedder
the RAG embedding model (separate from the roles)
The engine requires native tool-calling and structured output; capabilities: declares each model's context window and features, and /config setup warns when a bound model lacks one. /models lists installed Ollama models and rebinds a role, all roles, the embedder, or a whole tier (--session for this session only). Cloud providers are shelved: a non-Ollama binding refuses to run.
::runtime
| key | default | meaning |
|---|---|---|
max_iterations | 16 | execute-pass cap per turn |
auto_approve | read_only | tools at or below this tier run unprompted (trust key) |
num_ctx | null (auto) | Ollama context window; null uses each model's declared window |
llm_timeout | 120 | read timeout per model call, guards a wedged daemon |
auto_compact / compact_threshold | true / 0.85 | fold older turns into a summary once the window fills |
citations | true | inline [n] citations and the Sources footer |
airgap | false | block and record every network exit (trust key) |
redaction | off | off / warn / redact at the network boundary (trust key) |
quarantine | gate | off / warn / gate for untrusted tool output (trust key) |
receipt | true | the trust segment on the per-answer receipt |
confidence | true | capture logprobs and mark low-confidence runs |
confidence_threshold | auto | per-model calibrated threshold, or a pinned number |
confidence_exit_threshold | derived | hysteresis exit for an open low-confidence run |
grant_scope | task | how long a gate a grant lives: task / session / persist (trust key) |
::other sections
web.max_results
results per web_search (default 5); the backend is fixed and keyless
rag.chunk_size / chunk_overlap / k
1000 / 150 / 6 — chunking changes force a re-embed
mcp.servers / connect_timeout / call_timeout
see mcp servers
shell.timeout / shell.env_scrub
60 s per command; secret-shaped env fragments removed from children (trust key)
paths.*
database, documents, workspace, cache, memory, sessions, snapshots, permissions, exports
::what persists
- –Ordinary keys set with
/configpersist toconfig.yamlby default;--sessionkeeps the change for this session. - –Trust keys —
auto_approve,airgap,quarantine,redaction,grant_scope,shell.env_scrub— and the/policyand/privacytoggles are session-only unless you pass an explicit--save. A loosened posture is never written to disk silently. - –
/policy riskoverrides and the shell prefix allowlist persist indatabase/permissions.json./policy allow <prefix>(the explicit command) always persists; a gateagrant followsgrant_scope. - –The live
config.yamlis user data and not tracked by git, so persisted settings never dirty the repo or break/update.
note :: careful
Migration for older clone installs: pulling the change that untracked config.yaml removes an unmodified copy (recreated from the template on next launch). If you had edited it, git refuses the pull once — back the file up, git checkout -- config.yaml, pull again, and re-apply your settings.