Skip to content

Config reference

Every field of the configuration file, its default, and what it changes. See Write a config for how to use them together.

Top level

Field Type Default Meaning
name string required Lowercase letters, digits, ., -, _; 2 to 64 characters. Names the index directory, the calibration record and the report
corpus path required Directory of source documents, resolved against the file's directory
golden path required The golden set JSONL
description string "" Free text; excluded from the configuration hash

ingest

Field Type Default Meaning
chunker.name string sentence_window fixed, sentence_window or structure
chunker.params mapping {window: 6, overlap: 2} Passed to the chunker's constructor
include list ["**/*.md", "**/*.txt", "**/*.html", "**/*.pdf", "**/*.docx"] Glob patterns to parse
exclude list [] Glob patterns to skip

Chunker parameters: fixed takes size (800) and overlap (120) in characters; sentence_window takes window (6) and overlap (2) in sentences; structure takes none.

embedding

Field Type Default Meaning
name string hashing hashing, sentence_transformers or openai
params mapping {dim: 512} hashing takes dim; the others take model

hashing is deterministic and needs no download, which is why it is what CI runs. sentence_transformers needs the local extra, openai the openai extra.

index

Field Type Default Meaning
backend string numpy numpy, faiss or qdrant
dir path .cairn/index Parent directory; the index lands in <dir>/<name>
params mapping {} Backend specific, for example a server URL

retrieval

Field Type Default Meaning
mode string hybrid dense, bm25 or hybrid
k int 1 to 50 8 Passages handed to generation
candidates int 1 to 500 40 Pulled from each index before fusion
rrf_k int 60 Reciprocal rank fusion constant; larger flattens the influence of rank
rewrite.enabled bool false Expand the question into several phrasings and fuse the results
rewrite.n int 1 to 8 3 How many phrasings
rewrite.provider component generation provider A cheaper model for rewriting
rerank component none cross_encoder or lexical
rerank.enabled bool true Present but disabled, for an ablation without deleting the block
rerank.top int candidates How many candidates to rerank

generation

Field Type Default Meaning
provider.name string stub stub, ollama, openai or anthropic
provider.params mapping {} For example {model: llama3.2}
max_tokens int >= 16 600 Output cap per answer
temperature float 0 to 2 0.0 Zero, so a run is reproducible
abstain_text string see below The sentence an abstention returns

The documents do not support an answer to this question. The closest passages are attached.

calibration

Field Type Default Meaning
alpha float 0 to 1 0.10 Target error rate among answered questions
split float 0 to 1 0.4 Share of the golden set held out to fit the threshold
seed int 7 Fixes the stratified split
dir path .cairn/calibration Where the record is written, as <dir>/<name>.json

judge

Field Type Default Meaning
name string stub stub (mechanical, free) or llm (the versioned rubric)
params.provider component generation provider A dedicated judging model
params.model string provider default Override the model

confidence

Field Type Default
name string weighted
params.w_retrieval float 0.4
params.w_rerank float 0.3
params.w_self float 0.2
params.w_citation float 0.1

Weights are renormalised over the signals actually present, so removing the reranker does not silently shrink the confidence scale.

budget

Field Type Default Meaning
max_cost_per_question_usd float none Recorded in the report's notes as cost_within_budget
max_p95_latency_ms int none Recorded as p95_within_budget

Advisory. The enforcing comparison is the gate's.

Paths and identity

Relative paths resolve against the directory the configuration file lives in.

Derived locations:

Accessor Value
corpus_dir() <file dir>/<corpus>
golden_path() <file dir>/<golden>
index_dir() <file dir>/<index.dir>/<name>
calibration_path() <file dir>/<calibration.dir>/<name>.json

content_hash() is a sha256 over the configuration with the paths, the description and the directories excluded, so the same experiment on two machines hashes the same. It appears on every report and every calibration record.

Shipped configurations

File Retrieval Embedder Provider Needs
default.yaml hybrid hashing stub nothing; what CI runs
bm25.yaml bm25 hashing stub nothing
dense-hashing.yaml dense hashing stub nothing
hybrid-hashing.yaml hybrid hashing stub nothing
hybrid-local.yaml hybrid, cross-encoder rerank sentence_transformers stub local
hybrid-local-rewrite.yaml as above, plus rewriting sentence_transformers stub local
hybrid-ollama.yaml hybrid, cross-encoder rerank sentence_transformers ollama local, a local daemon
hybrid-openai.yaml hybrid openai openai openai, a key
hybrid-anthropic.yaml hybrid, cross-encoder rerank sentence_transformers anthropic local, anthropic, a key

The first four differ only in how candidates are combined, which is what makes them an ablation rather than a collection.