Skip to content

cascade.yaml reference

cascade.yaml lives at the root of your repo and configures Cascade’s behavior for that project. Created automatically by cascade init.

version: 1
agent:
provider: anthropic # anthropic | openai | google | claude_code | ollama
model: claude-opus-4-7
max_iterations: 1 # 0-5; how many PR-comment iteration rounds (future use)
temperature: 0.2 # 0.0-2.0; lower is more deterministic
memory:
path: team-memory # relative to repo root
max_chars_per_call: 20000 # cap on team-memory chars per LLM call
paths:
allowed: # globs Cascade IS allowed to write
- "src/**"
- "tests/**"
- "docs/**"
disallowed: # globs Cascade is NEVER allowed to write (deny wins)
- ".github/**"
- "migrations/**"
- "cascade.yaml"
- "team-memory/**"
- "infrastructure/**"
- "secrets/**"
language: null # null = auto-detect; or python/typescript/go/rust/java/ruby/csharp/javascript
test_command: null # null = use language profile's default; or e.g. "pytest -xvs"
default_base_branch: main # branch new PRs target by default

Config schema version. Currently always 1. Cascade refuses to load configs with an unknown version, so we can evolve the schema safely.

LLM behavior for this project.

FieldTypeDefaultDescription
providerstringanthropicWhich LLM provider to use. One of: anthropic, openai, google, claude_code, ollama.
modelstringclaude-opus-4-7Model identifier. Provider-specific.
max_iterationsint1How many review-comment iteration rounds the agent will run on a PR before giving up. (Reserved for future PR-comment-loop feature; currently fixed at 1.)
temperaturefloat0.2Sampling temperature. Lower is more deterministic. 0.0 for maximum reproducibility.

Team memory layer settings. See team memory for what to put in the files.

FieldTypeDefaultDescription
pathstringteam-memoryDirectory containing the memory files. Relative to repo root.
max_chars_per_callint20000Truncates politely if memory exceeds this. Per-file proportional truncation, not just last-N-chars.

What Cascade is allowed to modify. This is your blast-radius limit.

FieldTypeDefaultDescription
allowedlist of globs["src/**", "tests/**", "docs/**"]Cascade may write to paths matching any glob.
disallowedlist of globsSee belowCascade NEVER writes to paths matching any glob. Deny wins over allow.

Default disallowed:

  • .github/** (CI workflows)
  • migrations/** (database migrations)
  • cascade.yaml (Cascade’s own config)
  • team-memory/** (Cascade’s grounding layer)

Recommended additions for any production repo:

  • infrastructure/** or terraform/**
  • secrets/** or .env*
  • package-lock.json, yarn.lock, Pipfile.lock (lockfiles; let your package manager generate them)

Optional explicit language override. If null (or omitted), Cascade auto-detects from marker files in the repo root.

Supported values: python, typescript, javascript, go, rust, java, ruby, csharp.

See languages for detection priority and per-language behavior.

Optional override for the language profile’s default test command. Useful if your project uses a non-standard test runner or specific args.

Examples:

test_command: pytest -xvs --cov
test_command: npm run test:unit
test_command: go test -race -timeout 30s ./...
test_command: cargo test --workspace --all-features

If null, Cascade uses the language profile’s default (e.g., pytest for Python, go test ./... for Go).

Optional. The branch Cascade-generated PRs target by default. Override per-call with --base-branch.

default_base_branch: develop

Defaults to main if omitted.

For each setting, Cascade resolves the value in this order (highest wins):

  1. CLI flag on the command (e.g., --language go, --base-branch develop)
  2. Project-level cascade.yaml (the file in your repo)
  3. User-level ~/.config/cascade/config.yaml (credentials and global defaults)
  4. Environment variables (ANTHROPIC_API_KEY, etc.)
  5. Hardcoded defaults
SettingBelongs inWhy
API keys, tokens~/.config/cascade/config.yaml (via cascade configure)Per-user; never in a repo (would leak via git)
Default LLM provider~/.config/cascade/config.yamlPer-user preference
Language override for this repocascade.yamlPer-repo fact
Path allowlists for this repocascade.yamlPer-repo policy
Test command for this repocascade.yamlPer-repo fact
Per-call overridesCLI flagsOne-off changes

paths.allowed and paths.disallowed use standard glob syntax:

  • * matches any sequence of characters except /
  • ** matches any sequence of characters including / (recursive)
  • ? matches any single character
  • [abc] matches any character in the set

Examples:

GlobMatches
src/**Everything under src/, recursively
tests/*.pyPython files directly in tests/, not in subdirs
docs/**/*.mdMarkdown files anywhere under docs/
.env*.env, .env.local, .env.production, etc.
*.lockAny lockfile in the repo root

Cascade validates cascade.yaml on every command start. Errors point at the field that is wrong:

error: cascade.yaml is invalid
field: agent.temperature
problem: value 3.0 is above maximum of 2.0
suggestion: use a temperature between 0.0 and 2.0; lower means more deterministic

Run cascade doctor to validate the config without running any other command.

We will bump version: when the schema changes incompatibly. Cascade refuses to load configs with an unknown version rather than guessing.

If we ever release version: 2, Cascade will also ship a cascade migrate command that updates your file in place. Until then, this is the only schema.

  • CLI reference for the commands that read this file
  • Team memory for what to put in the directory memory.path points at
  • Languages for the detection rules and per-language test commands