Skip to content

Configuration reference

Every key .nitpick.yaml accepts, generated from the configuration the binary was built with. Configuration is the same settings argued for rather than listed; this page is the index.

Regenerate with nitpick config-reference -o docs/configuration-reference.md, which make docs runs and CI checks. That check diffs this file against what the generator produces now, so a key the generator reaches cannot drift from its entry. It says nothing about a key the generator never walks to, and nothing fails when it stops short. One field it cannot walk into is fallback, a model block inside a model block: walking it does not terminate, so it is emitted as a same keys as … entry naming the block whose keys it repeats.

[] marks a list whose entries carry the keys beneath it, <name> a map whose keys you choose, and same keys as … a block that repeats the keys listed under the path it names. A default of none means the key is unset until you set it, which is not always the same as off: the prose page says which.

Every model block overlays models.default. A role, a route or an ensemble entry sets only what differs, and a key it leaves out is served by the default's value, so that is the default those entries report rather than the zero of the field's type.

Endpoint and credential keys (base_url, api_key_env, extra, allow_private_endpoint, api_key_keyring, credential_command) are withheld from a repository's own file unless NITPICK_TRUST_CONFIG_ENDPOINTS=1 is set, for every role. So is persona.custom. See Trust model.

instructions

instructions[].path

string, default none. Path is a glob matched against each changed file's repository-relative path, in the doublestar dialect, so "*/.go" reaches every directory.

instructions[].prompt

string, default none. Prompt is appended to the review prompt for a matching file.

linters

linters.auto_detect

boolean, default true. AutoDetect runs the catalog analyzers marked auto, each installed, isolated from the tree, and executing nothing from it, whenever the change contains files it reads and without being named in Enabled; nitpick linters says which those are.

linters.configs

map of string, default none. Configs names an analyzer configuration per catalog tool, keyed by the tool's name in linters.enabled, an absolute path that must resolve outside the repository, for the four keys' reasons.

linters.enabled

list of string, default [golangci-lint ruff]. Enabled lists runner names to consider.

linters.eslint_config

string, default none. ESLintConfig is an absolute path to an eslint flat config outside the repository. Empty means eslint does not run.

linters.golangci_config

string, default none. GolangciConfig is an absolute path to a .golangci.yml outside the repository. Empty runs golangci-lint under open-nitpick's own config, materialized outside the repository.

linters.max_severity

string, default critical. MaxSeverity is the highest severity a finding attributed to a deterministic analyzer is published and gated at, whatever the analyzer called it. One of: nit, info, warning, error, critical.

linters.mode

string, default auto. Mode is "auto" (run only runners detected in the repo), "strict" (error when an enabled runner is missing), or "off".

linters.only_changed_lines

boolean, default true. OnlyChangedLines drops linter findings on lines the diff did not touch.

linters.ruff_config

string, default none. RuffConfig is an absolute path to a ruff.toml or pyproject.toml outside the repository. Empty runs ruff with --isolated.

linters.semgrep_config

string, default none. SemgrepConfig is an absolute path to a rule file outside the repository, or a registry reference (p/..., r/...). Empty means semgrep does not run.

linters.timeout

duration, default 2m0s. Timeout bounds each individual runner.

linters.trusted

list of string, default none. Trusted names analyzers that EXECUTE the tree's own code in order to analyze it, cargo clippy runs build scripts and procedural macros, phpstan loads the project's autoloader, and that are therefore refused by default.

models

models.default.allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.default.api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.default.api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.default.base_url

string, default none. BaseURL points at an alternate endpoint.

models.default.credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.default.extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.default.fallback

same keys as models.default, default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.default.max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.default.max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.default.model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.default.provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.default.providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.default.reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.default.structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.default.temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.default.timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

models.embed.allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.embed.api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.embed.api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.embed.base_url

string, default none. BaseURL points at an alternate endpoint.

models.embed.credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.embed.extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.embed.fallback

same keys as models.embed, default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.embed.max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.embed.max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.embed.model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.embed.provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.embed.providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.embed.reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.embed.structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.embed.temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.embed.timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

models.ensemble[].allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.ensemble[].api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.ensemble[].api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.ensemble[].base_url

string, default none. BaseURL points at an alternate endpoint.

models.ensemble[].credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.ensemble[].extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.ensemble[].fallback

same keys as models.ensemble[], default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.ensemble[].max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.ensemble[].max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.ensemble[].model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.ensemble[].provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.ensemble[].providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.ensemble[].reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.ensemble[].structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.ensemble[].temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.ensemble[].timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

models.fix.allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.fix.api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.fix.api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.fix.base_url

string, default none. BaseURL points at an alternate endpoint.

models.fix.credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.fix.extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.fix.fallback

same keys as models.fix, default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.fix.max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.fix.max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.fix.model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.fix.provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.fix.providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.fix.reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.fix.structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.fix.temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.fix.timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

models.review.allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.review.api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.review.api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.review.base_url

string, default none. BaseURL points at an alternate endpoint.

models.review.credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.review.extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.review.fallback

same keys as models.review, default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.review.max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.review.max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.review.model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.review.provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.review.providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.review.reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.review.structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.review.temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.review.timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

models.router.allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.router.api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.router.api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.router.base_url

string, default none. BaseURL points at an alternate endpoint.

models.router.credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.router.extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.router.fallback

same keys as models.router, default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.router.max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.router.max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.router.model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.router.provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.router.providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.router.reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.router.structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.router.temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.router.timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

models.routes[].ensemble[].allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.routes[].ensemble[].api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.routes[].ensemble[].api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.routes[].ensemble[].base_url

string, default none. BaseURL points at an alternate endpoint.

models.routes[].ensemble[].credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.routes[].ensemble[].extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.routes[].ensemble[].fallback

same keys as models.routes[].ensemble[], default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.routes[].ensemble[].max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.routes[].ensemble[].max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.routes[].ensemble[].model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.routes[].ensemble[].provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.routes[].ensemble[].providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.routes[].ensemble[].reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.routes[].ensemble[].structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.routes[].ensemble[].temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.routes[].ensemble[].timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

models.routes[].match.kinds

list of string, default none. Kinds the router assigned the batch.

models.routes[].match.languages

list of string, default none. Languages the batch's files are in, by the extension map in the bundle package ("go", "python", "typescript", ...).

models.routes[].match.max_files

integer, default 0. MaxFiles bounds how many files the batch may hold. Zero is unset.

models.routes[].match.min_files

integer, default 0. MinFiles bounds how few files the batch may hold. Zero is unset.

models.routes[].name

string, default none. Name labels the route in logs and the report.

models.routes[].review.allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.routes[].review.api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.routes[].review.api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.routes[].review.base_url

string, default none. BaseURL points at an alternate endpoint.

models.routes[].review.credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.routes[].review.extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.routes[].review.fallback

same keys as models.routes[].review, default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.routes[].review.max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.routes[].review.max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.routes[].review.model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.routes[].review.provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.routes[].review.providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.routes[].review.reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.routes[].review.structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.routes[].review.temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.routes[].review.timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

models.triage.allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.triage.api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.triage.api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.triage.base_url

string, default none. BaseURL points at an alternate endpoint.

models.triage.credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.triage.extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.triage.fallback

same keys as models.triage, default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.triage.max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.triage.max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.triage.model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.triage.provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.triage.providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.triage.reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.triage.structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.triage.temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.triage.timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

models.validate.allow_private_endpoint

boolean, default false. AllowPrivateEndpoint permits base_url to use plain HTTP or resolve to a loopback or private address.

models.validate.api_key_env

string, default none. APIKeyEnv names the environment variable holding the credential.

models.validate.api_key_keyring

string, default none. APIKeyKeyring names a secret in the operating system's keystore as "service/account", for example "open-nitpick/synthetic". Empty still consults the keystore under a default name; see internal/llm/credential.go.

models.validate.base_url

string, default none. BaseURL points at an alternate endpoint.

models.validate.credential_command

list of string, default none. CredentialCommand is a command whose standard output is the credential, for a secret manager the keystore cannot reach: 1Password, AWS Secrets Manager, Vault.

models.validate.extra

map of string, default none. Extra carries provider-specific construction parameters (for example runpod's endpoint_id) straight through to the SDK.

models.validate.fallback

same keys as models.validate, default none. Fallback is the model a role escalates to when this one cannot answer: a request cut at the output cap because the model looped, or structured output that never parsed.

models.validate.max_retries

integer, default none. MaxRetries bounds two loops, not one, and they multiply.

models.validate.max_tokens

integer, default 0. MaxTokens caps the response. Zero lets the provider decide, which is the shipped behaviour, and a cap too low truncates a finding rather than dropping it.

models.validate.model

string, default none. Model is the model id as that provider spells it, which is not a name this project validates: an id the vendor does not serve fails at the call, not at load.

models.validate.provider

string, default none. Provider names the vendor or gateway the call goes to. "nitpick providers" prints the list.

models.validate.providers

list of string, default none. Providers pins a router to these upstream providers, tried in order, with no fallback beyond them.

models.validate.reasoning

string, default none. Reasoning bounds how much a reasoning model thinks before it answers: "minimal", "low", "medium", "high", or "off" to ask for none. Unset leaves the model's own default, which is the shipped behaviour and the only setting any measurement here was taken under.

models.validate.structured_output

string, default auto. StructuredOutput selects how findings are constrained to the schema: "auto" (default) prefers a JSON-Schema response format and falls back to JSON mode and then to prompt-carried text, "schema" forces the schema path, "json" forces JSON mode, "text" forces the text path, where the schema rides in the prompt and the reply is parsed leniently.

models.validate.temperature

number, default 0. Temperature is passed through unchanged. Unset leaves the role's default, which is 0 for every role here: a review that varies between runs on the same diff is one nobody can hold to a measurement.

models.validate.timeout

duration, default 10m0s. Timeout bounds one call, retries excluded.

persona

persona.address

string, default impersonal. Address selects second person ("you dropped the error") or impersonal ("the error is dropped"). One of: impersonal, author.

persona.confidence

string, default direct. Confidence controls hedging. One of: direct, hedged.

persona.custom

string, default none. Persona is a free-text overlay appended last, for teams that want a house voice the built-in axes do not cover.

persona.emoji

boolean, default true. Emoji prefixes severities with a coloured marker.

persona.nitpick

string, default normal. Nitpick sets how far beyond outright defects the reviewer ranges. One of: off, minimal, normal, pedantic.

persona.politeness

string, default neutral. Politeness controls softening language and acknowledgement. One of: blunt, neutral, warm.

persona.praise

boolean, default false. Praise permits acknowledging good work.

persona.verbosity

string, default normal. Verbosity controls how much prose accompanies each finding. One of: terse, normal, detailed.

practices

practices.boundaries[].forbid

list of string, default none. Forbid matches direct dependency import paths, with no implicit subtree match.

practices.boundaries[].from

string, default none. From matches full Go import paths using path.Match syntax; * does not cross /.

practices.boundaries[].reason

string, default none. Reason records the accepted architectural constraint behind the restriction.

practices.budget

integer, default 0. Budget limits estimated source tokens for a tree model assessment; zero leaves source selection unlimited.

practices.commits.exempt_merges

boolean, default true. ExemptMerges skips subjects only when Git records multiple parents.

practices.commits.max_description_runes

integer, default 72. MaxDescriptionRunes limits Unicode characters after the colon and space.

practices.commits.types

list of string, default [feat fix docs style refactor perf test build ci chore revert evals prompt]. Types lists allowed lowercase Conventional Commit types.

practices.exceptions[].expires

string, default none. Expires disables the exception at 00:00 UTC on this YYYY-MM-DD date; empty means no expiry.

practices.exceptions[].fingerprint

string, default none. Fingerprint binds the exception to the rule version, location and source evidence.

practices.exceptions[].reason

string, default none. Reason explains why this particular finding is accepted.

practices.exceptions[].rule

string, default none. Rule names the exact finding rule accepted by this exception.

practices.exceptions[].target

string, default none. Target identifies the exact file, commit or title represented by the finding.

practices.fail_on

map of string, default none. FailOn sets blocking severity thresholds by check ID; none disables findings gates without waiving required completion.

practices.ignore

list of string, default none. Ignore adds path exclusions to review.ignore; an empty list adds no exclusions.

practices.profile

string, default none. Profile selects engineering checks for reviews; repository-wide scans require -profile engineering.

practices.required

list of string, default [conventions linters commits slop-tells slop design]. Required names checks that must finish; finding severity is controlled separately by FailOn.

practices.required_conventions

list of string, default none. RequiredConventions enforces named probe rules even when repository adherence falls below the inference threshold.

practices.slop_rules

list of string, default none. SlopRules makes the named deterministic tells blocking independently of their density.

review

review.agent_prompt

boolean, default false. AgentPrompt adds a collapsed block under each published finding holding what a coding agent needs to act on it: the anchor, every secondary span, the class, the rationale as the reviewer wrote it, and the files the reviewer read for that batch.

review.approve.enabled

boolean, default false. Enabled submits APPROVE when the review published no findings and reviewed every file it planned to.

review.approve.require_analyzers

boolean, default false. RequireAnalyzers additionally demands that every enabled analyzer ran and covered the change, so an approval means the deterministic half happened rather than that it was absent.

review.budget.completion_ratio

number, default 0.25. CompletionRatio estimates output tokens as a fraction of prompt tokens, since what a model will write is not knowable before it writes it.

review.budget.max_spend

number, default 0. MaxSpend is the ceiling in US dollars, and zero, the default, is no ceiling and no estimation.

review.budget.min_files

integer, default 0. MinFiles is how many of the highest-ranked files are reviewed even when the estimate says they do not fit. Zero refuses to exceed the ceiling at any cost, and a diff whose cheapest file is over it is then reviewed not at all, reported rather than silent.

review.budget.overhead

number, default 1. Overhead scales the review estimate to cover the triage pass, the optional router, and validation.

review.budget.prices.input

number, default 0. Input is dollars per million prompt tokens, as you supply it.

review.budget.prices.output

number, default 0. Output is dollars per million completion tokens, on the same terms.

review.budget.scope

string, default run. Scope says what the ceiling covers. One of: run, pull_request.

review.concurrency

integer, default 4. Concurrency bounds in-flight model calls.

review.fail_on

string, default none. FailOn is the lowest severity that makes the run exit non-zero. "none" disables this finding threshold, not required stages or practice policy. One of: none, nit, info, warning, error, critical.

review.ignore

list of string, default [**/vendor/** **/node_modules/** **/testdata/** **/dist/** **/build/** **/*.pb.go **/*.gen.go **/*_generated.go **/*.min.js **/*.map **/go.sum **/package-lock.json **/pnpm-lock.yaml **/yarn.lock **/Cargo.lock **/poetry.lock **/*.snap **/*.svg **/*.png **/*.jpg **/*.gif **/*.ico **/*.pdf]. Ignore lists doublestar globs excluded from review.

review.include_full_files

boolean, default true. IncludeFullFiles sends whole changed files alongside the diff when the token budget allows.

review.incremental

boolean, default true. Incremental makes a run on a pull request this tool has reviewed before read only the files changed since that review, and withhold findings it has already posted.

review.knowledge

boolean, default false. Knowledge attaches entries from the shipped corpus that the change resembles: antipatterns and standard-library contracts a model may not carry.

review.knowledge_index

string, default none. KnowledgeIndex names an index file to retrieve from, instead of the one this build ships for the configured embedding model.

review.knowledge_min_score

number, default 0. KnowledgeMinScore drops retrieved entries below this cosine, so a change resembling nothing in the corpus gets nothing rather than its five least distant entries. Zero is off, which is what shipped.

review.knowledge_query

string, default none. KnowledgeQuery is what gets embedded to retrieve against: "batch", the changed lines of the whole batch as one query, or "file", one query per changed file whose results are merged.

review.knowledge_tokens

integer, default 0. KnowledgeTokens bounds the retrieved section, counted with its own framing. Zero is unbounded, which is what shipped: the section carries at most five entries and the ceiling below is what a measurement would tighten.

review.max_file_bytes

integer, default 262144. MaxFileBytes skips files larger than this when reading full contents.

review.max_files

integer, default 60. MaxFiles caps how many changed files are reviewed in one run.

review.max_files_per_request

integer, default 6. MaxFilesPerRequest caps how many files are batched into one call.

review.mention

string, default @open-nitpick. Mention is the handle a comment uses to talk to the reviewer: "@open-nitpick review" reviews again, "@open-nitpick resolve" closes the thread, anything else is a question answered in the thread.

review.min_severity

string, default info. MinSeverity drops findings below this severity before publishing. One of: nit, info, warning, error, critical.

review.model_notes

boolean, default true. ModelNotes adds the prompt layer addressed to the reviewing model's family (prompt.ModelGuidance).

review.related_context

boolean, default true. RelatedContext attaches, beside each changed file, the definitions it imports from elsewhere in the repository and uses on a changed line, so the model can read what a called function does instead of guessing.

review.related_context_callers

boolean, default false. RelatedContextCallers also attaches, for each exported symbol the change redefines, the untouched functions that call it, found by walking the repository's own files.

review.related_context_tokens

integer, default 16000. RelatedContextTokens bounds how much related context is attached per batch.

review.resolve_superseded

boolean, default true. ResolveSuperseded lets an incremental run resolve its own earlier comment threads when the lines they pointed at changed and the finding did not recur, with a reply saying so.

review.respond.fix.from

list of string, default [owner member collaborator]. From lists the associations allowed to ask. Empty means DefaultRespondFrom, the same set answers use.

review.respond.from

list of string, default [owner member collaborator]. From lists the associations allowed to command the reviewer. Empty means DefaultRespondFrom.

review.respond.max_per_pull_request

integer, default 0. MaxPerPullRequest caps how many comments the reviewer answers on one pull request, counting its own replies as the record of how many it has answered, and zero, the default, is no cap at all.

review.skip_generated

boolean, default true. SkipGenerated drops files carrying a generated-code marker.

review.skip_markers

list of string, default [[skip review] [skip nitpick]]. SkipMarkers are phrases that, in a pull request's title, body or head commit message, ask for no review: the run reports "skipped" and posts nothing.

review.slop

boolean, default false. Slop asks the model for, and publishes, findings in the slop class: generated-looking code that costs a reader, defined rule by rule in the prompt layer prompt.SlopGuidance.

review.standards

boolean, default false. Standards hands the reviewer the conventions this repository was measured to follow, counted at the base revision.

review.summary

boolean, default true. Summary emits a walkthrough summary alongside inline comments.

review.summary_style

string, default receipt. SummaryStyle chooses how the walkthrough at the top of a review is produced. One of: receipt, prose.

review.token_budget_per_request

integer, default 60000. TokenBudgetPerRequest bounds the context assembled for a single model call, including full file bodies.

review.triage_no_new_claims

boolean, default false. TriageNoNewClaims restores the reviewer's own words over anything triage rewrote, so triage may select, drop, group and re-anchor findings but may not author them.

standards

standards.disabled

list of string, default none. Disabled are probe IDs to skip.

standards.min_share

number, default 0. MinShare is the conforming fraction a probe needs before its rule is written down. Zero means the built-in floor.

standards.min_sites

integer, default 0. MinSites is how many places a probe must have an opinion about before a share means anything. Zero means the built-in floor.

validation

validation.classes

list of string, default none. Classes limits validation to these finding classes, so a team can validate security and skip style. Empty validates every class. One of: correctness, concurrency, security, resource, data-loss, contract, tests, maintainability, style, slop.

validation.enabled

boolean, default false. Enabled turns the pass on.

validation.targeted

boolean, default false. Targeted shows an expert the knowledge entries the reviewer had in front of it when it wrote the finding, and asks it to name the one that decided the verdict.

Anything not listed is not a key. The loader rejects an unrecognised one rather than ignoring it, so a typo fails the run instead of silently doing nothing.

That also refuses a key added to a newer nitpick than the one running, which reads exactly the same from here. Setting NITPICK_IGNORE_UNKNOWN_KEYS=1 ignores such keys instead, naming them in the log and on the pull request. It is off by default and it is an environment variable rather than a key, so a config file cannot switch off the check on its own keys.