::docs :: reference

configuration & models

config.yaml: hardware tiers and model roles, runtime and safety knobs, web/RAG/MCP/shell sections — and which settings persist.

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:

config.yaml
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:8b

planner

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

keydefaultmeaning
max_iterations16execute-pass cap per turn
auto_approveread_onlytools at or below this tier run unprompted (trust key)
num_ctxnull (auto)Ollama context window; null uses each model's declared window
llm_timeout120read timeout per model call, guards a wedged daemon
auto_compact / compact_thresholdtrue / 0.85fold older turns into a summary once the window fills
citationstrueinline [n] citations and the Sources footer
airgapfalseblock and record every network exit (trust key)
redactionoffoff / warn / redact at the network boundary (trust key)
quarantinegateoff / warn / gate for untrusted tool output (trust key)
receipttruethe trust segment on the per-answer receipt
confidencetruecapture logprobs and mark low-confidence runs
confidence_thresholdautoper-model calibrated threshold, or a pinned number
confidence_exit_thresholdderivedhysteresis exit for an open low-confidence run
grant_scopetaskhow 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 /config persist to config.yaml by default; --session keeps the change for this session.
  • Trust keys — auto_approve, airgap, quarantine, redaction, grant_scope, shell.env_scrub — and the /policy and /privacy toggles are session-only unless you pass an explicit --save. A loosened posture is never written to disk silently.
  • /policy risk overrides and the shell prefix allowlist persist in database/permissions.json. /policy allow <prefix> (the explicit command) always persists; a gate a grant follows grant_scope.
  • The live config.yaml is 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.