Proven
Reference

Settings

Every setting, its environment variable and its default.

The network mode: air-gapped

Environment variableDefaultWhat it changes
PROVEN_NETWORKpublicpublic or local. local is the air-gapped mode: a setting that names an address outside the organisation's network is refused at load, and every connection to such an address is refused when it is made
PROVEN_NETWORK_ALLOWnonein local mode, host names that count as inside the network, comma-separated, for example nightshift.corp.example. A host name is never resolved to be judged: it is allowed by this list or it is refused. A listed name is resolved only through a name server inside the network, and an answer outside it is refused

In local mode every address in the tables below is checked when it loads, the guardrail's nvidia mode is refused, and the Prover's image is never pulled (ADR-0034). docs/AIR_GAPPED.md says what to run and how to check the mode holds.

The model generator: Meterless Nightshift or NVIDIA's hosted API

Environment variableDefaultWhat it changes
PROVEN_GENERATOR_MODEnightshiftnightshift (Meterless Nightshift) or nvidia (NVIDIA's hosted API, ADR-0031)
METERLESS_RUNTIME_TOKENnone (required in nightshift mode)the runtime token sent to Nightshift. Secret: never printed. Empty: Nightshift is down and the review names it. Not read in nvidia mode
PROVEN_GENERATOR_KEYnone (required in nvidia mode)the NVIDIA API key, from build.nvidia.com. Secret: never printed. Empty: the hosted API is down and the review names it. Not read in nightshift mode
PROVEN_GENERATOR_BASE_URLhttp://127.0.0.1:8088Nightshift's address, or the root of another OpenAI-compatible API. A path is empty or ends in a version, such as /v1 or GLM's /api/paas/v4, and that path is then the API root. Read in nightshift mode only; nvidia mode never reads it
PROVEN_NVIDIA_BASE_URLhttps://integrate.api.nvidia.com/v1the hosted API's address. Read in nvidia mode only. It must be https://: any other value is refused by name, so the key is never sent over plain http. The answer's model field is trusted as the answering model only from this address (ADR-0031)
PROVEN_GENERATOR_APPproventhe application name sent with each call to Nightshift. Not sent in nvidia mode
PROVEN_GENERATOR_MODELmeterless/auto for nightshift; nvidia/nemotron-3.5-super-vl-120b-a12b for nvidiathe model asked for; Nightshift's router chooses when auto. The hosted default answers under the alias private/nvidia/nemotron-3.5-super-120b-a12b, accepted for this model only
PROVEN_GENERATOR_TIMEOUT60sthe limit for one model call
PROVEN_GENERATOR_REQUIRE_NVIDIAallwhich agents must be answered by an nvidia/* model (by Nightshift's receipt, or in nvidia mode by the model field of the hosted API's answer); all, none, or a list of agents. A non-NVIDIA answer to such an agent is refused by name
PROVEN_SKEPTIC_MODELnvidia/nemotron-3.5-super-vl-120b-a12bthe Skeptic's model (ADR-0006: another family than the finder's). In nvidia mode the finder's default is this same model, so the two share a family unless one is set, and the trace states the shared family

Which keys each mode needs (ADR-0031). nightshift (the default, ADR-0019): METERLESS_RUNTIME_TOKEN, issued by the operator of the Nightshift you run; nothing else is required. nvidia: PROVEN_GENERATOR_MODE=nvidia and PROVEN_GENERATOR_KEY, a free NVIDIA API key created at https://build.nvidia.com (sign in, open any model, choose Get API Key); the hosted API's address (PROVEN_NVIDIA_BASE_URL, https:// only) and the models have defaults, so the key is the only value needed. Each mode reads its own address: nightshift reads PROVEN_GENERATOR_BASE_URL, nvidia reads PROVEN_NVIDIA_BASE_URL and ignores the other, so the key is never sent to a Nightshift address. The guardrail has its own key in either mode (below). In nvidia mode the hosted API gives no signed receipt, so the trace says no receipt and the nvidia/* requirement is checked against the model field of its answer. A free key is rate limited; a review that meets the limit names it as a failed service. Sample mode reads none of these.

The second reviewer: any OpenAI-compatible model

Environment variableDefaultWhat it changes
PROVEN_SECOND_REVIEWER_KEYnone (empty: no second reviewer)the API key of the second reviewer. Secret: never printed. Empty: not connected, and the review has one reviewer
PROVEN_SECOND_REVIEWER_BASE_URLnone (required with the key)the address of any OpenAI-compatible chat API, for example https://api.openai.com/v1 or a local server
PROVEN_SECOND_REVIEWER_MODELnone (required with the key)the model asked for; the review names it as the second reviewer

The guardrail: NVIDIA Nemotron content safety

Environment variableDefaultWhat it changes
PROVEN_GUARDRAIL_MODEserverserver (your own model server), nvidia (NVIDIA's hosted API) or off (the trace says "no guardrail")
PROVEN_GUARDRAIL_BASE_URLhttp://127.0.0.1:8081 for server; https://integrate.api.nvidia.com/v1 for nvidiathe guardrail's address
PROVEN_GUARDRAIL_MODELnemotron-3.5-content-safety for server; nvidia/nemotron-3.5-content-safety for nvidiathe safety model. The hosted id is not yet confirmed by a live call
PROVEN_GUARDRAIL_KEYnonethe guardrail's key. Secret: never printed. Empty is not off: every model call is refused
PROVEN_GUARDRAIL_TIMEOUT5sthe limit for one check

Every prompt and every answer is checked; an unsafe verdict, or a guardrail that does not answer, stops that step by name. An empty key is not off: every model call is refused and the review names the guardrail.

Evidence: the store, and Zetaris over REST

Environment variableDefaultWhat it changes
PROVEN_EVIDENCE_STOREzetariswhich evidence store a live review uses: zetaris, local or couchdb. Empty means zetaris. The review passes a template request, and the store runs the form of its own language (sql or mango). Sample mode uses the local store and does not read this variable
PROVEN_EVIDENCE_FILEnone (required when the store is local)the one file of the local store, read only when the store is local. Empty is refused by name, and so is a path inside the repository under review. The file holds tables and no server is started
PROVEN_COUCHDB_URLnone (required when the store is couchdb)CouchDB's address; an absolute http or https URL with no user info, query or fragment. Empty: CouchDB is down and the review names it. In PROVEN_NETWORK=local an address outside the organisation's network is refused at load, and the store's client refuses to dial one
PROVEN_COUCHDB_PREFIXproven_the start of every database name. One database holds one registered table, named the prefix, then the table name in lower case with . written as -. A lower-case letter, then at most 31 lower-case letters, digits or _
PROVEN_COUCHDB_USERnone (required when the store is couchdb)the CouchDB user Proven reads as. One line of printable ASCII with no :. Empty: CouchDB is down and the review names it
PROVEN_COUCHDB_PASSWORDnone (required when the store is couchdb)that user's password. Secret: never printed. Empty: CouchDB is down and the review names it
PROVEN_COUCHDB_ROW_LIMIT100the most rows one query returns
PROVEN_COUCHDB_TIMEOUT60sthe limit for one request to CouchDB
PROVEN_COUCHDB_RECORDSnone (records are not written)the CouchDB database that holds a review's evidence records, on the server PROVEN_COUCHDB_URL names. Set: each finding of a review is written to it as one document, with the design document and the viewer page. Empty: nothing is written. A lower-case letter, then at most 63 lower-case letters, digits, _ or -
PROVEN_COUCHDB_RECORDS_USERnone (required when PROVEN_COUCHDB_RECORDS is set)the CouchDB user Proven writes the records as. It must be a different user from PROVEN_COUCHDB_USER, the read-only account the viewer is opened with. One line of printable ASCII with no :
PROVEN_COUCHDB_RECORDS_PASSWORDnone (required when PROVEN_COUCHDB_RECORDS is set)that writing user's password. Secret: never printed
PROVEN_EVIDENCE_LINK_BASE_URLnone (no evidence-record link)the address a reader reaches CouchDB at, as an absolute http or https URL with no user info, query or fragment. Set, with PROVEN_COUCHDB_RECORDS: each finding carries a link to its record in the viewer page. Empty: no link. It is never /_utils, the admin console
ZETARIS_REST_URLnone (required live)Zetaris's REST address; an absolute http or https URL with no user info, query or fragment
ZETARIS_API_KEYnone (required live)Proven's Zetaris key. Secret: never printed. Empty: Zetaris is down and the review names it
ZETARIS_ORG_IDnone (required live)the organisation id sent with each query
ZETARIS_ROW_LIMIT100the most rows one query returns
ZETARIS_TIMEOUT60sthe limit for one query
PROVEN_OSV_TABLEpx_osvfile.px_osv_pkgthe OSV package table the dependency check queries; see OSV_TABLE.md. Sample mode uses the default and does not read this variable
PROVEN_KEV_VIEWpx_evidence.px_kev_vulnsthe KEV view an advisory's CVE alias is looked up in. Sample mode uses the default and does not read this variable
PROVEN_OSV_ID_VIEWpx_evidence.px_osv_idthe OSV advisory-id view the osv-by-advisory template reads; see ZETARIS_USL.md. Sample mode uses the default and does not read this variable
PROVEN_EPSS_VIEWpx_evidence.px_epss_cve_rowsthe EPSS view a finding's CVE is scored from. Sample mode uses the default and does not read this variable
PROVEN_EVIDENCE_VIEWpx_evidence.px_kev_vulnsthe view livecheck queries to prove Zetaris answers (livecheck only)

The store is zetaris unless PROVEN_EVIDENCE_STORE says local or couchdb. The local store is one file and opens no network (ADR-0034, ADR-0047), and a review that chooses it does not read the Zetaris variables. The couchdb store reads the PROVEN_COUCHDB variables and not the Zetaris ones. A live review passes the template request, and each store runs the form of its own language: sql on Zetaris and the local store, mango on CouchDB (ADR-0047, docs/ADAPTERS.md). Sample mode uses the local store on the fixture file and reads none of these, except that it reads PROVEN_COUCHDB_RECORDS and PROVEN_EVIDENCE_LINK_BASE_URL, and, when PROVEN_COUCHDB_RECORDS is set, also the other PROVEN_COUCHDB_* variables (URL, USER, PASSWORD, PREFIX, ROW_LIMIT, TIMEOUT, RECORDS_USER, RECORDS_PASSWORD) and GITHUB_REF, and the engine switches of ADR-0053 (PROVEN_MARKOVIAN, PROVEN_MARKOVIAN_THRESHOLD, PROVEN_MARKOVIAN_STEP_UNIT, PROVEN_MARKOVIAN_CARRY_TOKENS, PROVEN_HMEM, PROVEN_WORLD_MODEL), and nothing else besides OTEL_*, so the lab's review can write its records (docs/ADAPTERS.md).

The Prover's container

Environment variableDefaultWhat it changes
PROVEN_TEST_RUNTIMEdockerthe container command line, by name or absolute path
PROVEN_TEST_IMAGEgolang:1.26the image each test runs in
PROVEN_TEST_CPUS1the CPU limit of one test run
PROVEN_TEST_MEMORY512mthe memory limit of one test run; a positive size with suffix b, k, m or g
PROVEN_TEST_TIMEOUT120sthe limit for one test run, base or change
PROVEN_TEST_MAX_WRITTEN_BYTES65536the largest test file the Prover may write
PROVEN_TEST_USER65534:65534the unprivileged user and group the test runs as, as numbers; root is refused
PROVEN_TEST_PIDS256the most processes one test run may start; at most 4096
PROVEN_TEST_TMP_SIZE512mthe size limit of the writable scratch mount; a positive size of at most 1g with suffix b, k, m or g

Each test runs with no network and no secret (ADR-0025). With no container runtime the Prover is off, and the review says so. Sample mode reads none of these.

Deterministic tools

Environment variableDefaultWhat it changes
PROVEN_TOOL_TIMEOUT120sthe limit for one side of a deterministic tool run, base or change. A run past it is named and is not evidence. Sample mode uses the default and does not read this variable
PROVEN_GOVULNCHECK_DBemptythe file URL of the local govulncheck database, inside the checkout mount, for example file:///checkout/vulndb. Empty means govulncheck is not run and Go dependency findings are not measured. A network address is refused. Sample mode does not read this variable

Each tool runs in the Prover's container with no network and no secret (ADR-0025, ADR-0040). A tool that cannot run is named. Sample mode reads none of these.

Bounded steps: Meterless's Markovian engine

Environment variableDefaultWhat it changes
PROVEN_MARKOVIANonon reviews a change above the threshold in bounded steps (ADR-0048) and gives each new attempt of a proposed fix only what failed and why; off reviews every change whole, as before. On by default (ADR-0053); its benefit is not measured yet
PROVEN_MARKOVIAN_THRESHOLD8000the size, in estimated tokens (characters / 4) of the Planner's whole prompt, above which a change is reviewed in bounded steps; at or below it the review is one whole step
PROVEN_MARKOVIAN_STEP_UNITfilewhat one step reads: file (one changed file, its base and its change) or hunk (one changed region of a file)
PROVEN_MARKOVIAN_CARRY_TOKENS800the bound, in estimated tokens, on the state carried from one step to the next (what is established, what is suspected, what awaits evidence); from 128 to 32768. When it cannot hold every claim that awaits evidence, the review stops and names itself incomplete; it never drops such a claim

ADR-0053 (superseding the "off until measured" clause of ADR-0048): on by default, switched off with PROVEN_MARKOVIAN=off. Its benefit is UNMEASURED until the corpus recordings exist. Every review's trace says whether bounded steps ran, how many, and the carried state's size at each step. A wrong value stops the review before it starts. Sample mode reads these four, so the lab's pull-request review runs bounded steps on by default and switches them off the same way.

The two stores: Meterless's H-MEM and World Model

Environment variableDefaultWhat it changes
PROVEN_HMEMonon opens H-MEM, so a finding an earlier review of the same change refuted is dropped and a landed refutation is remembered; off neither opens, reads nor writes it. On by default (ADR-0053); its benefit is not measured yet
PROVEN_WORLD_MODELonon opens the World Model and folds each finished review's trace into it; off neither opens nor writes it. With H-MEM off the World Model still folds and records no refutation. On by default (ADR-0053); its benefit is not measured yet

ADR-0053: both stores are on by default, each switched off by its own variable. A store switched off is not opened, read or written on any path: no directory is made for it, the Judge suppresses nothing from H-MEM, and with the World Model off there is no fold, so H-MEM learns nothing from the trace either. With only H-MEM off, the World Model still folds and records no refutation. Their benefit is UNMEASURED. A wrong value stops the review before it starts. Sample mode reads both, as it reads the Markovian switches.

One adapter call

Environment variableDefaultWhat it changes
PROVEN_ADAPTER_TIMEOUT5sthe limit on one adapter call when the caller set no shorter deadline. Sample mode uses the default and does not read this variable

Telemetry: OpenTelemetry (ADR-0045)

Environment variableDefaultWhat it changes
OTEL_EXPORTER_OTLP_ENDPOINTnone (telemetry is off)the base URL of an OTLP/HTTP collector, for example http://127.0.0.1:4318. Setting it turns telemetry on; the trace goes to <url>/v1/traces and the metrics to <url>/v1/metrics. Sample mode reads this variable too. In PROVEN_NETWORK=local a host outside the organisation's network is refused at load, in sample mode as well, and both exporters refuse to dial one
OTEL_EXPORTER_OTLP_TRACES_ENDPOINTnonethe full URL the trace is sent to. It wins over OTEL_EXPORTER_OTLP_ENDPOINT for the trace and, set alone, turns the trace on. In PROVEN_NETWORK=local the same network rule applies
OTEL_EXPORTER_OTLP_METRICS_ENDPOINTnonethe full URL the metrics are sent to. It wins over OTEL_EXPORTER_OTLP_ENDPOINT for the metrics and, set alone, turns the metrics on. In PROVEN_NETWORK=local the same network rule applies
OTEL_SDK_DISABLEDnonetrue turns telemetry off even when an endpoint is set
OTEL_EXPORTER_OTLP_PROTOCOLhttp/protobufthe OTLP transport. Only http/protobuf is built in; any other value is refused by name. OTEL_EXPORTER_OTLP_TRACES_PROTOCOL and OTEL_EXPORTER_OTLP_METRICS_PROTOCOL are read the same way
OTEL_SERVICE_NAMEproventhe service name a backend shows
OTEL_METRIC_EXPORT_INTERVAL60000how often the metrics are pushed, in milliseconds. The lab sets it low so a dashboard moves while a review runs

Telemetry is off unless an endpoint is set. It only observes: once a review has started it never changes what the review decides, and a collector that cannot be reached never fails a review (the export is bounded at 5 seconds, and the failure goes to stderr). The one refusal is at the start: a malformed OTEL_* setting stops Open by name, like any other setting. No secret is put in an attribute, an event or a span status: the same redactor that cleans the trace file cleans the span events and the text of every failed review and failed agent, so a status carries the redactor's marker where a configured secret stood. The headers, timeout and certificates of the exporter are the SDK's own variables (OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_CERTIFICATE), read from the process environment. Sample mode reads the OTEL_* variables and no other.

Reads of the repository under review

Environment variableDefaultWhat it changes
PROVEN_MAX_ARCHIVE_BYTES134217728the most one export reads from the repository under review: a git archive, or the tracked files of a working tree
PROVEN_MAX_FILE_BYTES8388608the largest single file, git blob or commit log read from the repository under review
PROVEN_MAX_CONFIG_BYTES1048576the largest proven.yaml Proven reads
PROVEN_MAX_RECORD_BYTES1048576the most the author record may hold, summed over the files author_record names

A read over its bound is refused by name before the review goes on; the refusal names the file and the bound, never its content. Sample mode reads none of these.

The organisation policy

Environment variableDefaultWhat it changes
PROVEN_POLICYnonea path to the organisation policy file, read before each repository's proven.yaml; see POLICY.md. A path inside the repository under review is refused, and so is a missing or unreadable file. Sample mode reads it too

A repository's proven.yaml may make a policy setting stricter, never weaker, and an exception without an owner or an expiry is refused on load (ADR-0036).

The evidence pack

Environment variableDefaultWhat it changes
PROVEN_PACK_KEYnone (required with --evidence-pack)path to the PEM file of the organisation's Ed25519 private key (PKCS #8) that signs a pack. A missing or unreadable file, or one that group or others can reach (fix: chmod 600), is named and the review does not start
PROVEN_PACK_PUBLIC_KEYnone (required by proven verify unless --public-key is given)path to the PEM file of the Ed25519 public key (PKIX) that verifies a pack

The pack holds source excerpts and query rows, so keep it where the review itself may be read. The private key is never written into it (ADR-0035). See docs/EVIDENCE_PACK.md.

H-MEM: the memory store

Environment variableDefaultWhat it changes
PROVEN_HMEM_MAX_STATE_BYTES67108864the largest H-MEM state.json that opens; above it the store refuses by name and reads nothing more (ErrStateTooLarge). A positive number of bytes, at most 1 TiB (1099511627776); a larger value is refused. Sample mode uses the default and does not read this variable
PROVEN_HMEM_QUERY_TOKENS8how many leading query tokens count when H-MEM scores a query; a positive integer up to 1024. Sample mode uses the default and does not read this variable

H-MEM reads its whole state file at open and scans every record on each query, so it is built for a small store; see the scale section of docs/ARCHITECTURE.md. A state file over the cap is refused by name with its size and the cap. Sample mode reads none of these.

The trace

Environment variableDefaultWhat it changes
PROVEN_LOG_DIR<user cache>/proven/logswhere the trace is written. The directory is created with mode 0700. An existing configured directory is narrowed to 0700. A path that resolves inside the review target, including through a symlink, is refused. A letter-case alias of the target is refused on a volume that ignores case. That check is exercised only on darwin and Windows, and the skip on other volumes is measured, not assumed. Each file written in that directory, trace.jsonl, hmem.jsonl and world.jsonl, is refused when it is a symlink (wherever it points) or has more than one name. The link count is read on every OS. Sample mode reads this

The default is the user cache directory, with proven/logs under it, created so only that user can read it. An existing configured directory is narrowed to 0700. A path that resolves inside the repository under review is refused when Proven loads, and the refusal names PROVEN_LOG_DIR and the target. The link count of each file written in that directory is read on every OS. Sample mode reads this setting.