Skip to content

Global Config Reference

Global configuration lives at ~/.no-mistakes/config.yaml. Set NM_HOME to relocate the config directory.

~/.no-mistakes/config.yaml
agent: auto
acpx_path: acpx
acp_registry_overrides:
local-gemini: node /opt/mock-acp-agent.mjs
agent_path_override:
claude: /Users/you/bin/claude
codex: /opt/homebrew/bin/codex
rovodev: /usr/local/bin/acli
opencode: /usr/local/bin/opencode
pi: /usr/local/bin/pi
copilot: /usr/local/bin/copilot
agent_args_override:
codex:
- -m
- gpt-5.4
- -c
- service_tier="priority"
- -c
- model_reasoning_effort="low"
ci_timeout: "168h"
step_quiet_warning: "10m"
daemon_connect_timeout: "3s"
log_level: info
session_reuse: true
auto_fix:
rebase: 3
review: 0
test: 3
document: 3
lint: 3
ci: 3
commit:
fix_message: "chore(no-mistakes-{{.Step}}): {{.Summary}}"
intent:
enabled: true
threshold: 0.2
slack_days: 3
disabled_readers: []
test:
evidence:
store_in_repo: false
dir: .no-mistakes/evidence

Fields

agent

Default agent for all repos and setup-wizard suggestions. Can be overridden per-repo.

Typestring or string[]
Valuesauto, claude, codex, rovodev, opencode, pi, copilot, cursor, acp:<target>
Defaultauto

auto resolves to the first supported native agent or ACP alias in this order: claude, codex, opencode, acli with rovodev support, pi, copilot, then cursor. cursor is an ACP alias for the cursor target with default command cursor-agent acp. With default paths, auto only selects it when both cursor-agent and acpx resolve; acp_registry_overrides.cursor and acpx_path replace those respective defaults during availability checks. acp:<target> uses the user-installed acpx binary to run an ACP target, for example acp:gemini; acp:cursor uses the same default command as cursor. Arbitrary acp:<target> agents are opt-in and are not considered by agent: auto. The effective agent configuration must resolve to a runnable runner before a new validation gate starts. If an explicit agent is unavailable, auto finds no native agent or ACP alias, or no fallback-list entry is available, the gate fails before its first pipeline step rather than reporting a partial command-only validation as passed. no-mistakes doctor checks the global configuration, while every run repeats resolution after applying any trusted repository-level agent override.

You can also set an ordered fallback list:

agent: [codex, claude]

The list is filtered to entries available to the daemon at run startup, and the first available entry becomes the primary agent. After resolving auto, entries that resolve to the same ACP target are deduplicated in list order, so cursor and acp:cursor provide one fallback and preserve whichever spelling appears first. If no entry is available, the gate fails before its first pipeline step. If a pipeline invocation fails because that agent process cannot start or exits with an error, no-mistakes retries that invocation with the next available fallback. Structured findings and schema/output validation problems do not trigger fallback.

acpx_path

Path to the user-installed acpx binary used for agent: acp:<target> and ACP aliases such as agent: cursor.

Typestring
Defaultacpx

acp_registry_overrides

Map an ACP target name to a raw ACP agent command. When agent: acp:<target> matches an override key, no-mistakes runs acpx --agent <command> instead of acpx <target>. ACP aliases use the same target keys. For example, agent: cursor and agent: acp:cursor resolve to the cursor target, so set cursor to override the default cursor-agent acp command. Values are trimmed; a blank or whitespace-only value behaves as no override, so an alias keeps its default command. Availability checks always resolve acpx_path. They also probe the executable named first in the effective non-blank raw command when it is a bare command name or clean absolute path. Relative, quoted, or escaped raw commands are not pre-probed; acpx executes them from the worktree. These checks do not invoke the ACP target or test its credentials.

Typemap[string]string
DefaultEmpty

Example:

agent: acp:local-gemini
acp_registry_overrides:
local-gemini: node /opt/mock-acp-agent.mjs

agent_path_override

Custom binary paths for native agents. When set, no-mistakes uses this path instead of looking up the binary on PATH. ACP agents and aliases use acpx_path for the bridge; use acp_registry_overrides to replace a raw target command such as cursor-agent acp.

Typemap[string]string
DefaultEmpty (uses default binary names)

Default native binary names when no override is set:

AgentBinary
claudeclaude
codexcodex
rovodevacli
opencodeopencode
pipi
copilotcopilot

agent_args_override

Extra CLI flags to pass to each native agent. Use this to set model selection, service tier, reasoning effort, permission mode, or any other flag the underlying agent supports.

Typemap[string][]string
Keysclaude, codex, rovodev, opencode, pi, copilot
DefaultEmpty (no extra flags)

User-supplied flags are inserted ahead of no-mistakes’ managed flags, so your choices usually take precedence. A few flags are reserved because no-mistakes depends on them to communicate with the agent - setting any of these returns a config error on load:

AgentReserved flags
claude-p, --print, --verbose, --output-format, --json-schema, -r, --resume, --session-id, -c, --continue, --fork-session
codexexec, resume, --resume, --session, --session-id, --thread, --thread-id, --last, --json, --color
rovodevrovodev, serve, --disable-session-token
opencodeserve, --hostname, --port, --print-logs
pi--mode, --no-session
copilot-p, --prompt, --output-format, --no-color

For structured codex runs, no-mistakes also appends its own --output-schema <tempfile> after your overrides. Treat that flag as managed even though config validation does not currently reject it. The Claude and Codex session-control forms are reserved so no-mistakes can keep reviewer and fixer conversations role-isolated.

Smart defaults:

  • For claude, supplying --permission-mode (or --dangerously-skip-permissions) suppresses the default --dangerously-skip-permissions.
  • For codex, supplying --ask-for-approval, --sandbox, or --dangerously-bypass-approvals-and-sandbox suppresses the default --dangerously-bypass-approvals-and-sandbox.

Permission and sandbox flags affect the underlying agent, but they do not disable no-mistakes’ pipeline prompt steering. Pipeline agents are still told to keep intentional writes inside the worktree and avoid mutating system state outside it.

Example:

agent_args_override:
claude:
- --model
- sonnet
- --permission-mode
- acceptEdits
codex:
- -m
- gpt-5.4
- -c
- service_tier="priority"
- -c
- model_reasoning_effort="low"
rovodev:
- --profile
- work
opencode:
- --model
- gpt-5
pi:
- --provider
- google

For Codex, service_tier and model_reasoning_effort tune different things: service_tier selects the speed or priority lane, while model_reasoning_effort selects reasoning depth. no-mistakes reloads global config while setting up each run, so edits made before no-mistakes axi run apply to that run. For repeatable profiles, use separately initialized NM_HOME directories; each has its own config.yaml and no-mistakes state.

ci_timeout

How long the CI step monitors an open PR, including provider CI status and on GitHub, GitLab, or Azure DevOps PR mergeability, before giving up.

Typestring (Go duration, or an unlimited keyword)
Default168h (7 days)

Accepts any Go time.ParseDuration string: 30m, 2h, 4h30m, etc.

This is an idle timeout, not an absolute deadline: every time the base branch advances, the monitor re-arms it. So an actively-updated green PR keeps its monitor no matter how long it stays open. If it later develops an actual GitHub, GitLab, or Azure DevOps merge conflict, the CI auto-fix path rebases and re-pushes it, while a clean behind PR needs no command. A genuinely idle/abandoned PR still parks at an approval gate after the timeout elapses. While that CI gate is parked, the daemon continues bounded read-only PR-state checks. If the PR is merged or closed externally, the stale gate completes automatically; an open, unknown, or temporarily unreachable PR remains parked for a user decision.

Set it to unlimited (none, off, and never are accepted aliases), 0, or any non-positive duration to monitor until the PR is merged, closed, or the run is aborted with no-mistakes axi abort --run <id>.

Legacy alias: babysit_timeout.

step_quiet_warning

How long a running or fixing step can go without recorded step-log or native-agent lifecycle activity before AXI status marks the step as quiet.

Typestring (Go duration)
Default10m

Accepts any positive Go time.ParseDuration string: 30s, 5m, 1h, etc. Non-positive values are ignored and keep the default.

This is observability only. It does not cancel the step, change auto-fix behavior, or mark the run failed. AXI renders the quiet signal in the active_steps table as part of last_activity, for example quiet 12m3s ago: codex started pid=4242. For older active runs that do not yet have activity rows, AXI falls back to the step log file’s modification time.

daemon_connect_timeout

Maximum time a CLI client waits for an existing daemon socket to accept a connection before failing instead of hanging. Guards against a daemon process that is alive but stuck or unresponsive.

Typestring (Go duration)
Default3s

Accepts any positive Go time.ParseDuration string. Overridable per-invocation with the NM_DAEMON_CONNECT_TIMEOUT environment variable; see Environment Variables.

log_level

Daemon log verbosity.

Typestring
Valuesdebug, info, warn, error
Defaultinfo

session_reuse

Per-run, per-role agent session reuse for the review loop.

Typebool
Defaulttrue

When enabled and the pipeline agent supports native session resume (claude via --resume, codex via exec resume), each run keeps one durable reviewer session across the initial full review and every full rereview, and a separate durable fixer session across review-fix turns. The roles never share a session, other pipeline steps stay session-isolated in their own cold invocations, and different runs never reuse identities. Every review turn still performs a full review of the complete branch diff; only the reviewer’s own prior context is carried. When resume is unavailable or fails, the invocation falls back to a cold run or a fresh same-role session and the fallback is recorded in the local agent_invocations performance record. Session identities are persisted only as minimum local resume metadata, never as prompts or transcripts. The daemon crash-recovery reference owns which parked gates can resume or reconcile after a restart. Set false to force every agent invocation cold.

auto_fix

Maximum follow-up auto-fix attempts per step. Set a step to 0 to disable the follow-up auto-fix loop, so findings require manual approval. The document step attempts documentation fixes during its initial pass, so unresolved documentation findings pause for approval instead of using an automatic follow-up loop. For empty commands.lint, the document step’s combined housekeeping pass also attempts safe lint fixes, and the lint step consumes its result; unresolved blocking lint findings then pause for approval instead of starting another automatic fix loop.

Typeobject
FieldTypeDefaultDescription
auto_fix.rebaseint3Rebase conflict auto-fix attempts
auto_fix.reviewint0Review finding auto-fix attempts
auto_fix.testint3Test failure auto-fix attempts
auto_fix.documentint3Not used by the automatic document pass
auto_fix.lintint3Lint issue auto-fix attempts
auto_fix.ciint3CI auto-fix attempts for CI failures, plus GitHub, GitLab, and Azure DevOps merge conflicts

Legacy alias: auto_fix.babysit.

These are global defaults. Per-repo config can override individual steps.

commit.fix_message

Template for the subject of commits created by the shared Review, Test, Document, and Lint fix path.

Typestring
Defaultno-mistakes({{.Step}}): {{.Summary}}

The template supports literal text and two Go-style placeholders:

VariableValue
{{.Step}}Pipeline step name, such as review, test, document, or lint
{{.Summary}}Sanitized one-line summary returned by the fix agent, or the step’s deterministic fallback summary

The value must be a valid UTF-8 template that renders to a non-empty, single-line commit subject. The template source is limited to 1,024 bytes and 16 placeholders. The fix-agent summary and final rendered subject are each limited to 4,096 bytes. Before rendering, no-mistakes predicts the subject size from the validated literal text and placeholders, then rejects oversized output without allocating the expanded message. Template functions, control actions, named templates, unknown placeholders, malformed syntax, control characters, unsafe Unicode format characters, and Unicode line or paragraph separators cause configuration loading to fail. The blocked format set includes every Unicode Bidi_Control code point plus U+00AD, U+180E, U+200B, U+2060 through U+2064, the deprecated bidi controls U+206A through U+206F, U+FEFF, U+FFF9 through U+FFFB, and Unicode tag characters in U+E0000 through U+E007F. Legitimate U+200C zero-width non-joiner and U+200D zero-width joiner text shaping remains allowed. The final rendered subject is validated again, so unsafe characters in an agent-provided summary are also rejected. The setting does not change commit subjects created by the Rebase, CI, or Push steps. A per-repo commit.fix_message value overrides this global setting.

intent

Transcript-based user-intent extraction settings. When enabled and no intent was supplied directly for the run, no-mistakes can read recent local agent transcripts, match the session that produced the change, summarize the author’s intent, pass that summary to rebase, review, test, document, lint, CI auto-fix, and PR prompts, and include it in generated PR descriptions.

Typeobject
FieldTypeDefaultDescription
intent.enabledbooltrueEnable transcript-based intent extraction
intent.thresholdfloat0.2Minimum raw match score for selecting a transcript session
intent.slack_daysint3Extra days to look back before the change window
intent.disabled_readersstring[]EmptyTranscript readers to disable

Valid disabled_readers values are claude, codex, opencode, rovodev, pi, and copilot.

The match score is the share of matching files mentioned in a transcript session; deleted files are ignored when the diff also contains non-deleted changes. All-deletion diffs still match against the deleted changed files. Mentioning extra files does not reduce the score. For multi-file diffs, no-mistakes still requires at least two overlapping files and an effective minimum score of 0.5. Partial matches older than 24 hours are rejected unless their raw score is at least 0.8. If exactly one accepted candidate has a raw score of at least 0.85, that decisive candidate wins before recency ranking. Otherwise, accepted candidates are ranked by confidence, which combines the raw score with a small recency boost, with ties going to the most recent matching session, and ambiguous accepted candidates may be disambiguated by the configured pipeline agent.

test.evidence

Test-step evidence storage settings. By default, evidence artifacts stay in a temporary directory keyed by run ID and are referenced by local path.

Typeobject
FieldTypeDefaultDescription
test.evidence.store_in_repoboolfalseCommit and push test evidence artifacts from inside the repo worktree
test.evidence.dirstring.no-mistakes/evidenceRepo-relative parent directory used when store_in_repo is true

When store_in_repo is true, the test step writes evidence under <dir>/<branch-slug> and the push step stages files from that directory before committing agent changes. Branch slashes become nested directories, unsafe branch characters are replaced, and an empty branch slug falls back to the run ID. If dir is absolute, escapes the worktree, points into .git, crosses a symlink, or is ignored by Git, no-mistakes falls back to temporary evidence storage for that run.

These are global defaults. Per-repo config can override either field.

Environment variables

See Environment Variables for NM_HOME, NM_DAEMON_CONNECT_TIMEOUT, Bitbucket Cloud credentials, and update-check suppression.