Configuration reference
Most users should configure Perseval in Settings. TOML and environment variables exist for reproducible local setups, isolated dogfood workspaces, and MCP clients.

Load order and precedence
Section titled “Load order and precedence”- Perseval starts with centralized defaults.
- It loads
PERSEVAL_CONFIGwhen set; otherwise it loads the platform configuration file. - Environment overrides replace the corresponding TOML values.
- Settings saves to the effective configuration path, but cannot rewrite an environment variable owned by the parent process.
The configuration directory is private and the TOML file is written atomically with user-only permissions on Unix. Settings → Workspace shows the effective configuration and workspace paths.
Runtime-owned changes such as workspace, receiver, storage policy, analysis, and MCP bounds take effect after restart. Settings marks pending restart state. Appearance/workbench preferences are stored separately and can update immediately.
Boolean environment values accept 1, true, yes, or on, and 0, false, no, or off, case-insensitively.
Runtime environment variables
Section titled “Runtime environment variables”| Variable | Default | Overrides | GUI equivalent / notes |
|---|---|---|---|
PERSEVAL_CONFIG | platform config path | configuration file location | Shown in Settings; the path must exist when explicitly set. |
PERSEVAL_WORKSPACE_DIR | platform app-data workspace | workspace_dir | Settings → Workspace; environment remains authoritative. |
PERSEVAL_OTLP_ENABLED | false | otlp.enabled | Settings → Collection; restart required. |
PERSEVAL_OTLP_BIND | 127.0.0.1:4318 | otlp.bind_addr | Settings → Collection; loopback only. |
PERSEVAL_REVIEWER_REF | local-human | reviewer_ref | Settings → Review identity. |
PERSEVAL_OPENAI_ENABLED | false | analysis.openai.enabled | Settings → Analysis; subfeatures still require their own opt-ins. |
PERSEVAL_MCP_READ_ENABLED | true | mcp.read_enabled | MCP client environment or Settings. |
PERSEVAL_MCP_COMPUTE_ENABLED | false | mcp.compute_enabled | Capability is unavailable and fails closed in this release. |
PERSEVAL_MCP_WRITE_ENABLED | false | mcp.write_enabled | Capability is unavailable and fails closed in this release. |
PERSEVAL_MCP_PAYLOAD_REVEAL_ENABLED | false | mcp.payload_reveal_enabled | Capability is unavailable and fails closed in this release. |
OPENAI_API_KEY | unset | hosted provider credential | Environment-only; never serialized. A key alone enables nothing. |
PERSEVAL_TRACE_FILE is a read-only development fixture mode. It cannot be combined with live OTLP and is not the normal persisted GUI path.
Perseval does not automatically load .env files. Arrange the launch environment explicitly if you use environment variables.
Complete default TOML
Section titled “Complete default TOML”All fields are versioned and unknown fields are rejected.
schema_version = 1workspace_id = "default"workspace_dir = "<platform application-data>/Perseval/workspaces/default"reviewer_ref = "local-human"
[otlp]enabled = falsebind_addr = "127.0.0.1:4318"source_id = "otlp-local"max_wire_bytes = 16777216max_decoded_bytes = 67108864max_spans_per_request = 100000max_attributes_per_span = 1024retry_after_seconds = 1
[stream]queue_batches = 64queue_bytes = 268435456microbatch_spans = 2048microbatch_bytes = 8388608microbatch_wait_ms = 25projection_retry_page = 64projection_retry_initial_ms = 100projection_retry_max_ms = 5000topology_chunk_rows = 2048pipeline_metrics_flush_ms = 1000delta_history = 4096subscriber_capacity = 256ui_max_deltas_per_frame = 512
[lifecycle]idle_ms = 30000finalization_grace_ms = 5000sweep_ms = 1000shutdown_drain_ms = 5000
[analysis]feature_similarity_enabled = falsecohort_rebuild_debounce_ms = 1000cohort_job_queue = 1024cohort_quality_sample_size = 512cohort_rebuild_new_percent = 10cohort_rebuild_new_cases = 250cohort_rebuild_novelty_percent = 25cohort_model_history = 3cohort_feature_cache_entries = 20000cohort_maximum_cases = 20000embedding_dimensions = 256maximum_clusters = 8minimum_findings = 3novelty_distance_milli = 350
[analysis.openai]enabled = falseembeddings_enabled = falsecluster_labels_enabled = falsesemantic_judge_enabled = falseembedding_model = "text-embedding-3-small"chat_model = "gpt-5-mini"embedding_batch_size = 128minimum_failure_confidence_milli = 800emit_abstentions = true
[query]max_run_page = 200max_span_page = 500cached_pages = 8blob_preview_bytes = 65536comparison_max_input_steps = 100000comparison_max_rows = 1024comparison_lookahead = 32
[blobs]inline_attribute_bytes = 4096allow_larger_local_reveal = falsemaximum_local_reveal_bytes = 16777216
[mcp]read_enabled = truecompute_enabled = falsewrite_enabled = falsepayload_reveal_enabled = falsedefault_page_size = 50maximum_page_size = 200maximum_evidence_spans = 128maximum_reveal_bytes = 4096maximum_response_bytes = 2097152cursor_ttl_seconds = 900job_poll_interval_ms = 1000Field guide
Section titled “Field guide”schema_version: must be1.workspace_id: non-empty local workspace identity.workspace_dir: control, analytics, blobs, and workbench state root.reviewer_ref: durable human reviewer reference attached to decisions.
Controls the embedded loopback receiver and hard request bounds. source_id identifies this ingestion source. Non-loopback addresses are rejected. See OTLP ingestion.
stream
Section titled “stream”Controls pre-durable queue budgets, projection microbatches, retry, topology chunks, metrics flush, retained delta history, subscriber capacity, and per-frame UI work. These values are advanced safety bounds. Increasing them can increase memory use and does not make the UI unbounded.
projection_retry_initial_ms must not exceed projection_retry_max_ms; all capacities and intervals must be greater than zero.
lifecycle
Section titled “lifecycle”Controls idle-to-quiescent time, finalization grace, lifecycle sweep frequency, and coordinated shutdown drain.
analysis
Section titled “analysis”Controls optional local feature similarity and bounded model rebuilds. Percentages must be 0..100; novelty_distance_milli must be at most 2000; maximum cases must be at least minimum findings.
The legacy TOML key semantic_clustering_enabled is read as an alias, but new files serialize feature_similarity_enabled.
analysis.openai
Section titled “analysis.openai”The master opt-in must be true before any hosted subfeature. OpenAI embeddings also require local feature similarity. Cluster labels require OpenAI embeddings. Model names cannot be empty. minimum_failure_confidence_milli is 0..1000; OpenAI embedding dimensions cannot exceed 3072.
Controls service-side page ceilings, retained pages, bounded reveal, and comparison input/output limits. Callers cannot bypass these maxima by requesting a larger page.
Controls unknown-attribute externalization and local explicit reveal. Known prompt/message/reasoning/code/tool-payload keys externalize regardless of the inline threshold. allow_larger_local_reveal=false blocks the larger reveal action.
Controls read permission and bounded response/cursor behavior. Current protocol ceilings are 200 rows, 128 evidence spans, and 65,536 reveal bytes. Compute, write, and reveal capability classes are intentionally unavailable even if a stale environment tries to enable them.
Contributor-only variables
Section titled “Contributor-only variables”These affect local development or packaging, not installed end-user behavior:
| Variable | Purpose |
|---|---|
PERSEVAL_PROFILE_STARTUP | emit local startup profiling information |
PERSEVAL_SLOW_THRESHOLD_MS | change development fixture slow-operation threshold |
PERSEVAL_BUILD_PROFILE | package debug or release |
PERSEVAL_APP_OUTPUT | choose the local .app output path |
PERSEVAL_CODESIGN_IDENTITY | select a local signing identity |
PERSEVAL_BUILD_NUMBER | set the packaged bundle build number |
Contributor commands belong in the repository README, not in end-user installation or onboarding.