Skip to content

Configuration

Documentation home · Previous: Features · Next: CLI

Synapse reads its configuration from the process environment. It does not auto-load a file. Pass settings with docker run --env-file, Compose env_file, a strict dotenv loader, or your process manager. Do not shell-source an untrusted dotenv file: shell syntax in that file would execute. A fully documented template lives in .env.example.

Conventions: an empty value means unset, so the built-in default applies. Booleans accept 1/0/true/false. Durations use Go syntax such as 30s, 10m, 1h. Sizes are byte counts.

Reading the enabled set back

GET /api/v1/capabilities reports, for every optional subsystem, a stable key, a human name, whether this deployment enables it, and the SYNAPSE_* variable that controls it:

{"capabilities": [
  {"key": "fleet", "name": "Agent fleet transport", "enabled": false, "switch": "SYNAPSE_FLEET_ENABLED"},
  {"key": "cspm", "name": "Cloud security posture management", "enabled": false,
   "switch": "SYNAPSE_CSPM_ENABLED", "requires": ["fleet_assets"]}
]}

An optional subsystem registers its routes only when its switch is on, so a disabled subsystem and a broken one both answer 404. Read this endpoint first and render a disabled subsystem as disabled. requires names the other capabilities a subsystem depends on, which is why an enabled switch can still report enabled: false. The response carries booleans and variable names, never a configured value. Any authenticated role may read it.

Required

Variable Default Description
SYNAPSE_API_TOKEN (none) Bootstrap-admin bearer token. The API exits if empty. Operational routes require it; liveness GET /healthz and readiness GET /readyz are intentionally public. Generate with openssl rand -hex 32.
SYNAPSE_OIDC_ENABLED false Enable the browser OIDC BFF. Requires the fixed HTTPS issuer, client credentials, callback URL, fixed frontend URL, fixed tenant, and allowlisted group-to-role mapping below.
SYNAPSE_OIDC_ISSUER (none) Absolute HTTPS issuer used for pinned discovery and ID-token validation.
SYNAPSE_OIDC_CLIENT_ID, SYNAPSE_OIDC_CLIENT_SECRET, SYNAPSE_OIDC_REDIRECT_URL (none) OAuth client settings. The callback must be the exact registered https://<api-host>/api/auth/oidc/callback URL. Never log the secret.
SYNAPSE_OIDC_FRONTEND_URL (none) Fixed absolute HTTPS dashboard URL for a successful callback redirect. Query strings, fragments, and credentials are rejected; request parameters never control this destination.
SYNAPSE_PUBLIC_BASE_URL SYNAPSE_OIDC_FRONTEND_URL if set; otherwise unset Trusted HTTPS console URL (optionally including the deployment path prefix) for outgoing deep links. Works without OIDC. HTTP, relative URLs, credentials, query strings, fragments, invalid ports, control and Unicode format characters (including percent-encoded characters in hostnames), and double-encoded path segments are rejected at API and worker startup. Never put tokens or secrets in this value. Set explicitly if no OIDC frontend URL exists.
SYNAPSE_OIDC_TENANT_ID (none) The one fixed Synapse tenant accepted by this BFF instance.
SYNAPSE_OIDC_GROUP_ROLE_MAPPING (none) Comma-separated exact provider-group=role entries. Roles may only be admin, consultant, reviewer, or readonly; unmapped, duplicate, and multi-role group claims are rejected.
SYNAPSE_OIDC_TRANSACTION_TTL, SYNAPSE_OIDC_SESSION_TTL 10m, 8h Maximum authorization-transaction and opaque browser-session lifetimes.

The console link builder routes to engagements, incidents, the Findings tab (#finding-<id>) and the Scan Runs tab (#scan-<id>). The latter opens scan history and preserves the scan ID in its fragment; the current UI does not yet auto-select a scan from that fragment. If neither public URL nor OIDC frontend is configured, link generation is unavailable until an HTTPS base is supplied.

Core and server

Variable Default Description
SYNAPSE_HTTP_ADDR :8080 Listen address.
SYNAPSE_ENV development Non-prod values: development, dev, local, test, ci. Any other value is treated as production and enables the strict, fail-closed gates.
SYNAPSE_LOG_LEVEL info Log verbosity.
SYNAPSE_SINGLE_TENANT true Single-tenant mode.
SYNAPSE_AUP_VERSION 1.0 Acceptable Use Policy version the operator accepts on first run.
SYNAPSE_AUP_FILE data/aup-accepted.json File-backed path, in-memory mode only.
SYNAPSE_AUDIT_FILE data/audit.jsonl File-backed path, in-memory mode only.
SYNAPSE_MEASURE_CURSOR_SECRET Ephemeral in development; required in production HMAC key for signing Measures pagination cursors; minimum 32 bytes

Observability

Variable Default Description
SYNAPSE_METRICS_ENABLED false Expose Prometheus metrics on a SEPARATE listener (SYNAPSE_METRICS_ADDR). Off by default; the listener is never bearer-protected and is never itself instrumented. On an all profile worker with notifications enabled, it also exposes worker-owned delivery metrics.
SYNAPSE_METRICS_ADDR 127.0.0.1:9090 Metrics listener address. Loopback-only by default; widen it only onto a private scrape network, never a public interface.
SYNAPSE_ACCESS_LOG_ENABLED true Emit one structured http access log event per request (method, matched route, status, latency, request id, and (once authenticated) the resolved principal id). Never logs raw paths, query strings, headers, bodies, tenant ids, remote addresses, user agents, or secrets.

Metric names and label cardinality:

Metric Type Labels Description
synapse_http_requests_total counter method, route, status_class Total HTTP requests. route is the matched net/http ServeMux pattern (e.g. GET /api/v1/engagements/{id}), never the raw path, path values collapse into one bounded label. An unmatched request reports route="unmatched". status_class is 2xx/3xx/4xx/5xx.
synapse_http_request_duration_seconds histogram method, route, status_class Request handling latency.
synapse_job_queue_queued gauge none Aggregate queued durable jobs, across every tenant. Present only when the configured job queue supports aggregate stats (Postgres and in-memory both do).
synapse_job_queue_in_flight gauge none Aggregate claimed/in-flight durable jobs, across every tenant.
synapse_job_queue_oldest_active_age_seconds gauge none Age of the oldest still-queued-or-claimed job (ports.JobStats.OldestActiveAt), 0 when the queue is empty.
synapse_job_queue_scrape_errors_total counter none Failed attempts to read aggregate durable job queue stats for a scrape. The three synapse_job_queue_* gauges above are omitted from that scrape (never a stale or bogus value) when this increments.
synapse_notification_worker_sent_total counter channel_type, provider Committed successful notification delivery attempts, emitted by the worker only.
synapse_notification_worker_failed_total counter channel_type, provider Committed unsuccessful attempts, including retryable ones.
synapse_notification_worker_dead_lettered_total counter channel_type, provider Committed terminal delivery transitions observed by the worker.
synapse_notification_worker_delivery_duration_seconds histogram channel_type, provider Attempt duration excluding durable queue wait.
synapse_notification_worker_oldest_pending_age_seconds gauge channel_type, provider Oldest pending/retrying delivery across RLS-scoped tenants (0 if none). Omitted when any tenant read fails.
synapse_notification_worker_pending_scrape_error gauge none 1 if aggregate backlog read failed, otherwise 0.
synapse_notification_worker_template_fallback_total counter channel_type, provider Committed attempts that rendered built-in title/summary fallback content.
synapse_sca_scan_duration_seconds histogram outcome Completed synchronous or asynchronous SCA execution duration. For an async scan, measured from worker execution start, not from StartScan/enqueue time. Queue failures, dead letters, stale sweeps, and blocked gates do not record a duration.
synapse_sca_scan_outcomes_total counter outcome Terminal SCA outcomes: success, failed, or blocked. Queue failures, dead letters, and stale sweeps count as failed without a duration. blocked is recorded only for an execution-gate denial reached after a genuine scan attempt, never for a pre-gate validation failure.
synapse_finding_lineage_operations_total counter outcome, method, reason Finding correlation and human-review outcomes. Every label is reduced to a fixed allowlist.
synapse_finding_lineage_backfill_items_total counter outcome Backfill item outcomes: observation_created, provisional_candidate_created, skipped, or unknown.
synapse_finding_lineage_backfill_runs_total counter state Backfill terminal states: completed, cancelled, failed, or unknown.
synapse_assessment_comparison_operations_total counter status, mode, reason Comparison generation outcomes with allowlisted status, mode, and reason values.
synapse_assessment_comparison_backlog gauge tenant_id, state Per-tenant queued, generating, failed, and dead-lettered Comparison backlog used by rollout gates.
synapse_assessment_comparison_oldest_active_age_seconds gauge tenant_id Age of the oldest queued or generating Comparison for a tenant.
synapse_assessment_comparison_generation_duration_seconds histogram tenant_id, mode, status, fingerprint_version, risk_model_version, item_count_band Worker generation latency; item counts are reduced to bounded bands.
synapse_assessment_relationship_candidates_total counter outcome, confidence Historical relationship candidate generation outcomes.
synapse_assessment_relationship_decisions_total counter action, outcome Relationship review decision outcomes.
synapse_assessment_closure_reports_total counter outcome, reason Deterministic closure-report generation outcomes with bounded reasons.

Only the explicitly documented Assessment Comparison rollout series carry tenant_id; access logs and every other metric omit tenant, engagement, target, raw path, and free-form error text. All non-tenant label values are fixed allowlists or bounded bands.

Example Prometheus scrape config:

scrape_configs:
  - job_name: synapse-api
    static_configs:
      - targets: ["127.0.0.1:9090"]

The metrics listener has no authentication of its own. Keep SYNAPSE_METRICS_ADDR on loopback or a private network reachable only by your scrape infrastructure; do not put it behind the same reverse-proxy path as the bearer-protected API, and do not widen it to a public interface. The API warns when a configured metrics listener is non-loopback. A co-located synapse-worker must use a different metrics port (for example 127.0.0.1:9091); its listener is enabled only in the all profile with notifications enabled. Worker delivery metric labels are fixed to webhook/generic, slack/slack, email/smtp or other/other, never tenant or destination data.

Persistence

Variable Default Description
SYNAPSE_DB_DSN (in-memory) Runtime PostgreSQL connection URL. Empty runs an in-memory dev store, so nothing is durable.
SYNAPSE_DB_MIGRATION_DSN SYNAPSE_DB_DSN in development Optional owner-level PostgreSQL DSN used only by synapse-migrate, separating migration authority from the least-privileged runtime DSN. In production it must use a database user distinct from the runtime DSN.
SYNAPSE_DB_HALT_WRITER_DSN (none) PostgreSQL DSN for the dedicated response halt-writer role. Required with PostgreSQL-backed live response execution; its database user must differ from both migration and ordinary runtime users. Expose it only to the API, and grant only the fence, dispatch, and response-audit-intent privileges provisioned by synapse-migrate.
SYNAPSE_DB_AUTO_MIGRATE true in development Long-running services apply embedded migrations only in development. Production requires false; run synapse-migrate first. Use backward-compatible, phased, migrate-first changes: the API accepts only an applied forward migration strictly above its embedded maximum and exposes a stale or divergent schema through /readyz; worker and MCP refuse startup until the schema is current because they have no readiness endpoint.
SYNAPSE_DB_MAX_CONNS 32 pgx pool maximum connections.
SYNAPSE_DB_MIN_CONNS 0 pgx pool minimum connections.
SYNAPSE_DB_MAX_CONN_LIFETIME 1h Connection lifetime.
SYNAPSE_DB_MAX_CONN_IDLE 30m Idle connection timeout.

Shared artifact store (S3 or MinIO)

When S3/MinIO is configured, the same object store retains evidence artifacts and Engagement source packages uploaded from the UI. Uploaded packages accept non-empty .zip, .tar, .tar.gz, and .tgz files up to 512 MiB compressed. API and worker processes must use the same endpoint and bucket. Without an endpoint, evidence uses the non-durable development store, but uploaded source uses a persistent filesystem root. Durable source metadata also requires PostgreSQL; an in-memory database is not a restart-safe deployment even when archive files are retained.

Variable Default Description
SYNAPSE_BLOB_ENDPOINT (none) Host and port without a scheme. Empty uses in-memory evidence storage and filesystem storage for uploaded Engagement source.
SYNAPSE_BLOB_ACCESS_KEY (none) Object-store access key; provide through the deployment's secret-management mechanism.
SYNAPSE_BLOB_SECRET_KEY (none) Object-store secret key; never commit it to configuration or logs.
SYNAPSE_BLOB_BUCKET synapse-evidence Shared bucket for evidence artifacts and uploaded Engagement source packages.
SYNAPSE_BLOB_USE_SSL false Set true for HTTPS endpoints; use TLS for production object-store traffic.
SYNAPSE_ENGAGEMENT_SOURCE_DIR OS user configuration directory + synapse/engagement-sources Durable operator-owned source archive root when the blob endpoint is empty. Must be an absolute, non-root real directory, not a symlink. API and workers must use the same persistent volume and root; keep it outside scanned repositories and temporary workspaces.

The filesystem adapter creates private directories/files and refuses unsafe roots or invalid object paths. Do not treat this root as a disposable cache. Separate containers or hosts do not share their default user configuration directories: mount the same retained volume and configure the path in each process, or use S3/MinIO. Back up PostgreSQL and source objects consistently. Changing an existing filesystem root or bucket does not migrate retained objects. Source reuse verifies the actual bytes; metadata or SHA-256 alone cannot restore a missing archive. See the uploaded-source lifecycle for immutable versions, Re-test choices, legacy limitations and migrations 0159/0160.

Restore verification (synapse-verify-restore)

synapse-verify-restore is a read-only recovery tool. It reuses SYNAPSE_DB_DSN and the evidence blob-store settings above, and requires a database identity permitted to read every tenant's evidence chain; a least-privilege runtime role fails closed rather than reporting an empty restore as intact.

Variable Default Description
SYNAPSE_RESTORE_VERIFY_TIMEOUT 2m Maximum duration for one restore-verification run before it fails.
SYNAPSE_RESTORE_VERIFY_EXPECTED_STATE (none) Path to an independently captured expected-state manifest (audit head, per-engagement evidence heads and counts, expected applied migration versions). Equivalent to --expected-state. Without it a run reports completeness: incomplete_no_expected_state, because an emptied database cannot be distinguished from an intact one.

Custody, signing, and anchoring (required in production)

Variable Default Description
SYNAPSE_VAULT_MASTER_KEY (ephemeral) AES-256 credential-vault master key, 64 hex chars or base64 of 32 bytes. Empty uses an ephemeral dev key, so stored secrets do not survive a restart. Never logged.
SYNAPSE_EVIDENCE_SIGNING_SEED (ephemeral) ed25519 seed attesting evidence and audit chain heads. Never logged.
SYNAPSE_TSA_URL (none) RFC-3161 timestamp authority for external anchoring. Empty leaves the chain signed but not anchored, still tamper-evident.

Software composition analysis

Variable Default Description
SYNAPSE_SBOM_PRODUCER ownsbom ownsbom (default; detection-independent owned parsers across 23 ecosystems with dep-graph edges, so no third-party scanner binary is required) or syft (the pinned Syft binary, an opt-in cross-check). Set syft to roll back.
SYNAPSE_SYFT_BIN syft Syft executable, resolved on PATH.
SYNAPSE_GRYPE_BIN grype Grype executable. Missing means detection degrades to the live source only.
SYNAPSE_GRYPE_DB_DIR (online) Pin Grype's vulnerability database to a pre-synced directory for offline, reproducible scans.
SYNAPSE_DETECTION_SOURCES (owned default) Comma list selecting and ordering the vulnerability detection sources from grype, osv, advisory-store (Synapse's own advisory corpus). Empty selects the owned-only default: osv unless offline, then advisory-store when SYNAPSE_OWNED_ADVISORY (the default), with Grype dropped to an opt-in cross-check. Dropping Grype does not silently lower OS-package recall: the OS-distro coverage guard marks a scan not-confident when an OS-package's distro is not covered by the owned store and Grype is absent. When set it is authoritative, so an operator restores Grype with osv,grype,advisory-store. Unknown names fail closed at startup.
SYNAPSE_STRICT_SOURCES false Fail closed on a detection-source error. Default degrades: a source that errors (a transient OSV.dev outage, an advisory-store read blip) is skipped with a warning and the remaining sources still run, matching how Grype self-degrades when its binary or database is absent.
SYNAPSE_SCAN_TIMEOUT 10m Per-scan timeout. 0 disables.
SYNAPSE_FINDING_MIN_SEVERITY info Lowest severity promoted to a finding: critical, high, medium, low, info. The default promotes everything; set high to tighten the floor and drop medium/low/info.
SYNAPSE_MAX_WORKSPACE_BYTES 2147483648 Maximum prepared workspace size. A bigger target or archive is rejected.
SYNAPSE_OWNED_ADVISORY true Match the SBOM against the owned advisory store, the default primary vulnerability source. Populate it first with synapse-cli sync-advisories; an empty store yields no findings, so a deployment that has not synced advisories should keep osv/grype in SYNAPSE_DETECTION_SOURCES.
SYNAPSE_SYMBOL_OVERLAY_DIR (none) Directory of curated advisory-id -> affected-symbol JSON files; the owned matcher merges these onto findings so non-Go / NVD-CSAF-only advisories can drive symbol reachability. Best-effort.
SYNAPSE_JARHASH_ONLINE_ENABLED false Recover the coordinate of a shaded or metadata-less JAR by its SHA-1.
SYNAPSE_OSV_URL, SYNAPSE_OSV_BULK_URL, SYNAPSE_DEPSDEV_URL, SYNAPSE_KEV_URL, SYNAPSE_EPSS_URL (public) Feed overrides for tests or mirrors.
SYNAPSE_ALPINE_SECDB_URL https://secdb.alpinelinux.org Base URL sync-advisories --remote-secdb ingests Alpine's apk advisories from. Point it at an internal mirror of the same layout for an air-gapped estate.

Owned-only scanner default and rollback

The shipped default is the owned engine end to end, so a production deployment needs no third-party scanner binary:

  • SBOM producer: SYNAPSE_SBOM_PRODUCER=ownsbom produces the SBOM with Synapse's own per-ecosystem parsers (23 ecosystems, dependency-graph edges). Syft is retained as an opt-in cross-check. The producer flip was gated on the owned engine meeting the independent oracle and pinned-competitor floors (internal/usecase/scabench) and Syft dependency-graph parity (internal/infrastructure/tools/ownsbom).
  • Detection sources: live OSV (unless offline) plus the owned advisory-store, with Grype dropped to an opt-in cross-check. Offline, the default is the owned advisory store alone.

Dropping Grype does not silently lower OS-package recall. The OS-distro coverage guard marks a scan not-confident (and, under SYNAPSE_STRICT_SOURCES, aborts) when an OS-package's distro ecosystem is not covered by the owned advisory store and Grype is not in the detection set, so an unsynced distro feed surfaces as a gap rather than a false clean posture.

Before relying on the owned-only posture for OS packages, run synapse-cli sync-advisories --remote-distros, configure authenticated API-managed OVAL sources with a pinned OpenPGP key or trusted provider metadata, and sync any required CSAF sources. The only non-OpenPGP OVAL exception is suse_https_origin=true on the exact SLES 15 SP6 compressed SUSE artifact documented in Vulnerability intelligence; it is HTTPS-origin trust, not signature verification, and is neither a generic SUSE nor unsigned-feed option. Unbounded RPM evidence from CSAF requires sync_mode=full, configured trust, and authoritative_snapshot=true; ordinary CSAF suppresses it. The current Red Hat directory/archive/update distribution is not an automatically supported authoritative source. sync-advisories --oval rejects unsigned local OVAL rather than persisting it. Use synapse-cli sync-advisories for app-ecosystem advisories.

To roll back to the previous Syft plus Grype behavior, set both:

export SYNAPSE_SBOM_PRODUCER=syft
export SYNAPSE_DETECTION_SOURCES=osv,grype,advisory-store

The producer rollback is exercised by TestLoadSBOMProducer, and the detection rollback by the rollback: explicit list restores grype case in TestResolveDetectionSourceNames.

Extra scanners and detection tuning (opt-in)

Most of these ship ON by default (safe, best-effort). See Features for what each one does.

Variable Default Description
SYNAPSE_SECRET_SCAN_ENABLED true Secret scanning over the workspace (regex plus entropy). Matches are redacted; the raw secret never reaches logs, evidence, or the report.
SYNAPSE_SECRET_HISTORY_ENABLED false Also scan git history (every blob reachable from all refs) for a secret committed then removed. Best-effort on a git repository; matches redacted.
SYNAPSE_SECRET_VERIFY_ENABLED false Opt-in active verification for GitHub, GitLab, OpenAI, AWS, and Vault credentials. SECURITY-SENSITIVE: it sends raw detected material over the network to the issuing provider, so enable it only for an authorized assessment. AWS is checked only when a unique nearby access-key/secret-key pair (and an ASIA session token) can be correlated; ambiguous/incomplete pairs make no request. Requests use SSRF-hardened, rate-limited clients with no proxy or redirects, raw values are never logged/sealed/reported, and at most 100 distinct credentials are checked per scan. A verified credential raises confidence; unknown/unverified never suppresses the finding. --offline disables verification.
SYNAPSE_SECRET_VERIFY_RPS 5 Cap on the secret verifier's outbound provider requests per second. Only meaningful when SYNAPSE_SECRET_VERIFY_ENABLED is true.
SYNAPSE_SECRET_VERIFY_VAULT_ADDR (none) Optional absolute HTTPS Vault base address. Required only for Vault-token verification. Private RFC1918 addresses are permitted, while loopback, link-local, multicast, redirects, and ambient proxies remain blocked.
SYNAPSE_MISCONFIG_ENABLED true Misconfiguration and IaC scanning of Dockerfiles and Kubernetes manifests.
SYNAPSE_CSPM_ENABLED false Enable durable read-only cloud posture runs. Requires PostgreSQL, fleet assets, synapse-worker, sandbox, and kernel egress enforcement.
SYNAPSE_CSPM_PROVIDERS empty Comma-separated provider allowlist: aws, azure, gcp.
SYNAPSE_CSPM_RATE 0 Requests per second, 1..100; 0 selects provider defaults.
SYNAPSE_CSPM_HELPER_BIN synapse-cspm CSPM requires this to be an absolute path and authoritatively pinned in SYNAPSE_TOOL_HASHES; the helper executes inside bubblewrap.
SYNAPSE_CSPM_EGRESS_HOSTS empty Comma-separated provider=hostname HTTPS allowlist. Empty fails CSPM startup closed.
SYNAPSE_FP_TRIAGE_ENABLED false Enable advisory LLM false-positive analysis over production-scope SAST/misconfig findings. Secrets never enter the LLM. A proposer alone or a scan without an evidence ledger never changes a gate.
SYNAPSE_FP_TRIAGE_MODEL SYNAPSE_LLM_MODEL Proposer model for false-positive analysis.
SYNAPSE_FP_TRIAGE_PROVIDER SYNAPSE_LLM_PROVIDER Explicit provider identity for the triage proposer model.
SYNAPSE_FP_TRIAGE_MODE shadow shadow records would_gate_exempt but always keeps the finding gating. enforce permits the verified-consensus policy to set gate_exempt. Empty or unknown values fail closed to shadow.
SYNAPSE_FP_TRIAGE_MAX_FINDINGS 100 Hard per-scan cap on eligible findings sent to AI triage (range 1..1000). When capped, deterministic policy-impact/severity/risk ordering selects work; skipped findings remain reported and gating, and counts are exposed in ai_triage_budget. Invalid values restore the finite default.
SYNAPSE_FP_TRIAGE_CONCURRENCY 6 Maximum simultaneous AI finding assessments (range 1..32). A distinct verifier makes at most two provider calls per attempted finding. Invalid values restore the finite default.
SYNAPSE_FP_TRIAGE_MAX_TOKENS 1000000 Conservative per-scan token reservation ceiling. Both proposer/verifier requests are reserved before a finding is scheduled; work that does not fit remains gating.
SYNAPSE_FP_TRIAGE_MAX_COST_MICRO_USD 0 Optional per-scan cost ceiling in integer micro-USD (0 disables cost enforcement). When enabled, all active role prices must be configured or triage fails closed without provider calls.
SYNAPSE_FP_TRIAGE_PROPOSER_INPUT_MICRO_USD_PER_MILLION 0 Proposer input price in micro-USD per million tokens, for deterministic cost reservation and observed-cost metrics.
SYNAPSE_FP_TRIAGE_PROPOSER_OUTPUT_MICRO_USD_PER_MILLION 0 Proposer output price in micro-USD per million tokens.
SYNAPSE_FP_TRIAGE_VERIFIER_INPUT_MICRO_USD_PER_MILLION 0 Verifier input price in micro-USD per million tokens.
SYNAPSE_FP_TRIAGE_VERIFIER_OUTPUT_MICRO_USD_PER_MILLION 0 Verifier output price in micro-USD per million tokens.
SYNAPSE_FP_TRIAGE_CIRCUIT_FAILURES 5 Consecutive provider/parse failures before that role's circuit opens (range 1..100). An open circuit is advisory-only and cannot exempt findings.
SYNAPSE_FP_TRIAGE_CIRCUIT_COOLDOWN 1m Open-circuit cooldown before one half-open probe (maximum 24h).
SYNAPSE_FP_TRIAGE_ALERT_MIN_SAMPLES 10 Minimum per-scan samples before a safety-rate baseline alert is emitted.
SYNAPSE_FP_TRIAGE_DISAGREEMENT_BASELINE_BPS 1500 Expected proposer/verifier disagreement rate in basis points (10000 = 100%).
SYNAPSE_FP_TRIAGE_EXEMPTION_BASELINE_BPS 1000 Expected gate-exemption rate in basis points.
SYNAPSE_FP_TRIAGE_PARSE_FAILURE_BASELINE_BPS 200 Expected model parse-failure rate in basis points.
SYNAPSE_FP_TRIAGE_ALERT_DEVIATION_BPS 1000 Absolute deviation from a configured baseline that emits a persisted warning and structured alert metric.
SYNAPSE_LLM_PROVIDER openai-compatible Explicit proposer-provider audit identity. It is not inferred from the URL because gateways may route multiple providers.
SYNAPSE_VERIFIER_BASE_URL SYNAPSE_LLM_BASE_URL Independent OpenAI-compatible endpoint for the verifier.
SYNAPSE_VERIFIER_API_KEY SYNAPSE_LLM_API_KEY Independent verifier credential; never logged.
SYNAPSE_VERIFIER_PROVIDER SYNAPSE_FP_TRIAGE_PROVIDER Explicit verifier-provider audit identity. It defaults to the proposer identity so provider independence remains advisory-only until an operator deliberately selects a different verifier provider.
SYNAPSE_VERIFIER_MODEL SYNAPSE_LLM_MODEL Must name a different canonical model family for AI gate exemptions. The verifier is blind to the proposer result. Provider/date aliases and Amazon Bedrock inference-profile IDs fail closed as the same family. Two-model consensus remains subject to high/critical, secret, and dangerous-CWE human-review floors.
SYNAPSE_FP_TRIAGE_INDEPENDENCE model_family model_family requires different canonical model families. provider additionally requires different non-empty provider identities. Empty defaults to model-family compatibility; unknown values fail closed to advisory-only.
SYNAPSE_DETECTION_PRIORITY comprehensive comprehensive reports every match. precise quarantines single-source, non-KEV findings into a needs-verify queue that is still reported and sealed but exempt from the --fail-on gate.
SYNAPSE_OFFLINE false Run synapse-cli scan without network egress: detect with the local sources only (the owned advisory store, plus Grype's pre-synced database when SYNAPSE_DETECTION_SOURCES lists it), and switch off live OSV, every registry resolver (npm, composer, poetry, Bundler, Maven, Gradle), the Maven Central JAR SHA-1 lookup, KEV/EPSS, online NVD CVSS backfill, deps.dev and PyPI license metadata, and AI false-positive triage. Same as --offline.
SYNAPSE_IGNORE_UNFIXED false Drop vulnerabilities that have no fixed version.
SYNAPSE_DB_MAX_AGE_DAYS 30 Warn when a dated reference database (KEV, EPSS, or the Grype DB) is older than this many days. 0 disables the check.
SYNAPSE_SUPPRESSION_ENABLED true Honor a .synapseignore file. Acceptance exempts only the --fail-on gate; the finding is still reported, persisted, and evidence-sealed.
SYNAPSE_VEX_ENABLED true Consume an in-repo OpenVEX document (.synapse.vex.json) at scan time, on the same retain-and-mark surface as suppression.
SYNAPSE_COMPLIANCE_ENABLED true Compliance benchmark. Re-projects findings onto a control specification and reports per-control PASS or FAIL.
SYNAPSE_SCAN_CACHE_ENABLED true Enables content-addressed scan caches. SBOM entries key on content plus producer version. Tenant-bound API AI-triage entries key on tenant, project/engagement scope, finding fingerprint, complete-source hash, prompt-context hash, proposer/verifier models, prompt version, and policy version. Cached AI claims are always rebound to the current finding, re-authorized by server policy, and linked to newly sealed scan evidence; missing tenant identity and provider failures are not cached. The directory must be operator-owned, since a shared-writable cache would allow poisoning.
SYNAPSE_SCAN_CACHE_DIR (per-user) Cache location. Empty uses a per-user cache directory; AI-triage entries live in its owner-only ai-triage subdirectory and contain typed claims, never source text or credentials.
SYNAPSE_IMAGE_ROOTFS_ENABLED true Materialize a container image root filesystem so the owned OS-package catalogers (dpkg, apk, and the rpm sqlite database) and installed-binary catalogers (Go build info, Python dist-info) can run. Best-effort.

Project Code artifact retention and historical comparisons

Variable Default Description
SYNAPSE_PROJECT_SOURCE_ARTIFACT_DIR data/project-source-artifacts Operator-owned local storage for immutable, gzip-compressed Project Code head/base artifacts. Restrict OS access, encrypt/back up it according to source-data policy, and do not place it on a shared writable volume. The full Compose stack mounts its dedicated project-source-artifacts named volume here.
SYNAPSE_PROJECT_SOURCE_RETENTION 2160h (90 days) How long captured analysis artifacts remain available. Startup cleanup removes expired analysis directories; project deletion removes all of that project's artifacts. Legacy analyses are never backfilled.
SYNAPSE_PROJECT_ANALYSIS_SHORTLIVED_KEEP 20 How many of the newest analyses to keep on a short-lived (feature/pull-request) branch. After a new analysis is recorded on such a branch, older ones beyond this count are pruned. Long-lived branches (main/develop, release lines, the project default) are retained in full. Set 0 to disable pruning and keep all history.
SYNAPSE_PROJECT_SOURCE_MAX_FILE_BYTES 2097152 Maximum captured source file size. Bigger files are retained as unavailable metadata.
SYNAPSE_PROJECT_SOURCE_MAX_FILES 10000 Maximum source files captured for one analysis.
SYNAPSE_PROJECT_SOURCE_MAX_BYTES 524288000 Total source-artifact capture budget per analysis.
SYNAPSE_MAVEN_POM_CACHE OS cache dir Where fetched Maven POMs are kept so a second scan of the same project needs no network. The layout is a standard Maven repository layout, so an existing mirror can be pointed at directly. An unwritable directory disables caching without disabling fetching.
SYNAPSE_MAVEN_ALLOW_PRIVATE_REPOS false Allow a <repositories> entry that resolves to a private address (RFC 1918) to be fetched from. Off by default because a pom.xml is untrusted input and a scanner must not be steered into the network it runs inside; turn it on to resolve your own project against your own internal repository. Loopback and link-local (cloud instance metadata) are refused even when this is on.
SYNAPSE_SAST_SOURCE_BUDGET_BYTES 0 (built-in 64 MiB) Source bytes the pattern SAST analyzer retains for cross-file context analysis. The default bounds memory on an untrusted tree and never binds on an ordinary repository, but it does bind on a monorepo: a tree holding 164 MiB of source against a 64 MiB budget leaves most of itself unretained, and no rule runs over the part that was not held. The scan reports the number of files in that state, so raising this is a memory-for-coverage trade an operator makes deliberately. 0 keeps the built-in default.
SYNAPSE_PROJECT_GIT_COMPARISON_DEPTH 256 Maximum Git history depth acquired for persisted comparisons and behavioral-hotspot evidence. Behavioral hotspots evaluate at most depth - 1 first-parent commits (capped at 2048), never fetch during analysis, and report shallow/incomplete history explicitly; a missing/too-old comparison base leaves source readable but comparison/unified/split capabilities unavailable.

Historical Code reads are analysis-scoped and private-cacheable. Source and diff APIs never fetch the current repository or read mutable local paths. Git comparison requires configured, validated head/base/default-branch refs; local and archive scans intentionally expose source-only capability. Generated files are hidden by default from the Code inventory but remain retained and explicitly addressable. Binary/non-UTF-8/limited artifacts expose an unavailable reason instead of content.

For docker run, mount durable storage at the image's configured artifact path (the API image uses /project-source-artifacts): --mount type=volume,source=synapse-project-source-artifacts,target=/project-source-artifacts. Removing that volume permanently removes retained historical Code source and diffs.

Fleet attack paths

Attack paths are available when SYNAPSE_FLEET_ASSETS_ENABLED=true. They correlate the tenant's asset relationships with explicitly attributed findings and reachability judgments. Every response reports whether traversal was truncated; lowering a bound never produces a result that looks complete.

Variable Default Description
SYNAPSE_ATTACKPATH_MAX_LEN 12 Maximum number of steps in one path. Must be positive.
SYNAPSE_ATTACKPATH_MAX_PATHS 100 Maximum retained paths per requested target or finding. Must be positive.
SYNAPSE_ATTACKPATH_WALLCLOCK 2s Wall-clock traversal budget. Must be positive.

Reachability tiers (opt-in per language)

Variable Default Description
SYNAPSE_REACHABILITY_ENABLED true Go Tier-2 call-graph reachability proof (best-effort).
SYNAPSE_REACHABILITY_BUILDER owned Go Tier-2 call-graph producer: owned (Synapse's own go/ssa builder, no third-party engine) or govulncheck.
SYNAPSE_JVM_REACHABILITY_ENABLED false Opts in to JVM Tier-2 bytecode reachability analysis for target artifacts.
SYNAPSE_JVM_REACH_TIER2_POINTS_TO_ENABLED false Optional JVM Tier-2 receiver points-to refinement. When enabled, applies bounded intraprocedural Andersen-style narrowing and falls back to CHA whenever receiver facts are incomplete. Raise-only: it can increase urgency but never emits not_affected. Requires JVM reachability and judgments.
SYNAPSE_PYREACH_ENABLED true Python Tier-1 import-reachability: a declared DIRECT dependency never imported by first-party source becomes an OpenVEX not_affected (transitive deps are refused, not answered). Default ON; fails to unknown on any coverage gap. Needs judgments.
SYNAPSE_PYREACH_TIER2_ENABLED false Python Tier-2 affected-symbol semantic reachability. Requires Tier-1, judgments, and a CGO-enabled synapse-ast.
SYNAPSE_PYTAINT_ENABLED true Python interprocedural semantic taint proposals (default-on when the synapse-ast sidecar resolves; a clean no-op otherwise). Requires judgments and a CGO-enabled synapse-ast; it does not require the target-compilation sandbox.
SYNAPSE_JSTAINT_ENABLED false JavaScript/TypeScript interprocedural semantic taint proposals. OFF by default while the catalog breadth grows. Requires judgments and a CGO-enabled synapse-ast; source-only, so the target-compilation sandbox is not required.
SYNAPSE_JAVATAINT_ENABLED false Java interprocedural semantic taint proposals (Spring/Servlet/JDBC). OFF by default while the catalog breadth grows. Requires judgments and a CGO-enabled synapse-ast; source-only, so the target-compilation sandbox is not required.
SYNAPSE_TRISCORE_REASSESS_ENABLED false Tri-score risk reassessment surface (POST /api/v1/fleet/incidents/{id}/risk/reassess): re-scores an incident's RiskAssessment via the deterministic Scorer. Threat is live; Exposure/Behavior/Coverage abstain until their producers are wired.
SYNAPSE_AST_BIN bundled / PATH Optional path to the synapse-ast sidecar used by Python Tier-2 reachability, Python taint, and code-quality analysis.
SYNAPSE_JSREACH_ENABLED true JS/TS Tier-1 import-level reachability. Default ON; fails to unknown on any coverage gap. Needs judgments.
SYNAPSE_JSREACH_TIER2_ENABLED false JS/TS Tier-2 affected-export reachability. When Tier-1 is on, Tier-2 runs by default in raise-only mode (mints only reachable/urgency-raising judgments, never suppresses). Setting this to true additionally mints not-reachable (suppressing → OpenVEX not_affected) judgments, which the lexical scanner can only assert conservatively.
SYNAPSE_JSREACH_INTERPROC_TIER2_ENABLED false Suppressing direction of the interprocedural JS/TS Tier-2 call graph. The interprocedural recorder is raise-only by default (it proves a reached affected export via first-party wrappers). Setting this to true lets it also mint not-reachable (suppressing → OpenVEX not_affected) for an affected export proven unreached, but only on a COMPLETE resolver graph (any dynamic construct or escaping callable taints every negative) with entry points present. A wrong negative would hide a real vulnerability, so this stays off by default.

Fleet, leader election, and DAST

All off by default. The fleet needs PostgreSQL + synapse-worker; agents run on Linux hosts / Kubernetes. Enable leader election when running more than one API/worker so scheduled work fires once.

Variable Default Description
SYNAPSE_FLEET_ENABLED false Fleet transport + agent-admin routes.
SYNAPSE_FLEET_ASSETS_ENABLED false Fleet asset model + attack paths.
SYNAPSE_FLEET_HOST_INGEST_ENABLED false Accept host-inventory from synapse-agent.
SYNAPSE_FLEET_CLUSTER_INGEST_ENABLED false Accept Kubernetes inventory from synapse-cluster-agent.
SYNAPSE_FLEET_TELEMETRY_INGEST_ENABLED false Accept signed agent telemetry batches (A3, POST /api/v1/fleet/telemetry); verified + idempotently sequenced server-side.
SYNAPSE_FLEET_DETECTION_INGEST_ENABLED false Accept signed agent detection batches (A4, POST /api/v1/fleet/detections); sealed once into the evidence chain.
SYNAPSE_FLEET_DETECTION_RECONCILE_INTERVAL 1m How often the tenant-scoped reconciler repairs pending attributed detections.
SYNAPSE_FLEET_CORRELATION_ENABLED false Correlation orchestration: folds an engagement's sealed detections into incidents, auto-scoring each when tri-score is enabled. Runs on every detection batch that seals new detections, and on demand through POST /api/v1/fleet/engagements/{id}/correlate.
SYNAPSE_FLEET_CORRELATION_WINDOW 30m Session gap for correlation, detections on one (asset, host) more than this apart start a new incident.
SYNAPSE_FLEET_CORRELATION_ALLOWED_LATENESS 5m Delay between maximum observed event time and the monotonic watermark. A newly seen detection behind the previous watermark is isolated with a visible coverage note rather than silently rewriting a finalized session.
SYNAPSE_FLEET_CORRELATION_MAX_PER_INCIDENT 100 Cap on detections one incident reflects individually before a storm is suppressed to a single note.
SYNAPSE_FLEET_CORRELATION_PAGE_SIZE 100 Source materialization and staged consumption rows per bounded invocation (1–1000).
SYNAPSE_FLEET_CORRELATION_MAX_ACTIVE_SESSIONS 500 Maximum active session summaries loaded into one correlation transaction (1–10000).
SYNAPSE_FLEET_CORRELATION_MAX_TIMELINE_REFS_PER_DETECTION 32 Maximum causal timeline references fetched for one detection (1–1000).
SYNAPSE_FLEET_CORRELATION_MAX_TIMELINE_REFS_PER_PAGE 500 Maximum causal timeline references fetched by one materialization page; at least the per-detection cap (1–10000).
SYNAPSE_FLEET_KEY_REGISTRATION_ENABLED false Serve agent signing-key registration (POST /api/v1/fleet/keys) + operator key list/revoke (A4, A0.2).
SYNAPSE_FLEET_STALE_AFTER 10m An agent older than this reads as stale (<=0 disables the staleness view).
SYNAPSE_ALERT_WEBHOOK_URL (unset) Enables operator alerting: each incident correlation opens is posted as signed JSON to this URL. https required, http only for a loopback host. POST /api/v1/alerts/test sends a test alert.
SYNAPSE_ALERT_WEBHOOK_SECRET (unset) Signs each webhook body: X-Synapse-Signature: sha256=<hex HMAC-SHA256 of "<X-Synapse-Timestamp>.<body>">. At least 16 bytes when set.
SYNAPSE_ALERT_MIN_SEVERITY medium Inclusive severity floor for delivered alerts (critical, high, medium, low, info). Test alerts always deliver.
SYNAPSE_ALERT_WEBHOOK_ALLOW_PRIVATE false Let the webhook client dial private and link-local receivers. The SSRF guard refuses them otherwise.
SYNAPSE_ALERT_WEBHOOK_ALLOW_UNSIGNED false Allow UNSIGNED alert delivery when no secret is set. Default false: a configured webhook requires SYNAPSE_ALERT_WEBHOOK_SECRET so a receiver can trust the alert is genuine. Set true only for a development receiver that does not verify the signature.
SYNAPSE_NOTIFICATIONS_ENABLED false Enable tenant-managed Webhook, Slack, and Email channels, durable rule fan-out, delivery history, and the worker source scheduler. Requires PostgreSQL, a running synapse-worker, and a stable shared SYNAPSE_VAULT_MASTER_KEY.
SYNAPSE_OWNERSHIP_MODE off Finding ownership rollout: off, observe, or enforce; invalid values stop startup. Enabled modes require PostgreSQL. The API admits durable preview/reroute runs and synapse-worker captures scan provenance, dispatches dirty findings, and consumes routing jobs. observe evaluates without automatic assignment; enforce enables automatic assignment and release-to-auto. Memory mode reports postgres_required. See ownership API.
SYNAPSE_NOTIFICATION_SMTP_HOST (unset) Operator-managed SMTP relay host used by every tenant Email channel. Tenants can select recipients but cannot select the relay.
SYNAPSE_NOTIFICATION_SMTP_PORT 587 SMTP relay port.
SYNAPSE_NOTIFICATION_SMTP_FROM (unset) Envelope and message sender for notification email. Required before an Email channel can deliver.
SYNAPSE_NOTIFICATION_SMTP_USERNAME / SYNAPSE_NOTIFICATION_SMTP_PASSWORD (unset) Optional SMTP authentication. The password is secret and must not be logged.
SYNAPSE_NOTIFICATION_SMTP_REQUIRE_TLS true Require STARTTLS with certificate verification. Keep enabled in production.
SYNAPSE_FLEET_COVERAGE_FRESHNESS_TARGET 24h Coverage freshness SLO.
SYNAPSE_FLEET_MIN_AGENT_VERSION empty Reject agents below this version (empty = no floor).
SYNAPSE_FLEET_ENROL_URL SYNAPSE_FLEET_URL One-time enrollment API base URL for synapse-agent; after enrollment, the agent uses SYNAPSE_FLEET_URL. HTTPS is required except for a loopback host.
SYNAPSE_FLEET_CA_CERT / _CA_KEY / _CERT_TTL empty Enrolment PKI for agent client certificates (never logged).
SYNAPSE_FLEET_SIGNER_KEY empty Signing key for agent packages/updates (never logged).
SYNAPSE_RESPONSE_EXECUTION_ENABLED false Opt in to live governed response. The API requires fleet transport, assets, host ingest, telemetry ingest, key registration, and the command-signing key. An endpoint agent additionally requires process detection and a pinned command trust bundle.
SYNAPSE_RESPONSE_COMMAND_SIGNING_KEY_FILE empty API-only owner-readable Ed25519 response-command private-key document. Never mount it into an endpoint agent.
SYNAPSE_RESPONSE_COMMAND_TRUST_FILE empty Agent-only owner-readable bundle of pinned response-command public keys. Unknown, expired, revoked, or incorrectly purposed keys fail closed.
SYNAPSE_RESPONSE_COMMAND_TTL 2m API-issued response command lifetime; must be greater than zero and at most 10m.
SYNAPSE_RESPONSE_EXECUTION_POLL_INTERVAL 100ms API polling interval for a durable response work-order result; must be greater than zero and at most 1s.
SYNAPSE_RESPONSE_OBSERVER_ENABLED false Enable the independent non-executing process observer. It cannot execute response commands.
SYNAPSE_RESPONSE_OBSERVER_DELAY 5s Delay before the observer seals its verdict-free readiness report.
SYNAPSE_LEADER_ENABLED false Fence scheduled dispatch to one node via a Postgres lease.
SYNAPSE_LEADER_RESOURCE scheduler Lease name.
SYNAPSE_LEADER_TERM 15s Lease term.
SYNAPSE_LEADER_RENEW 5s Renew interval.
SYNAPSE_WORKER_CONCURRENCY 1 Durable queue claim loops per synapse-worker process; must be from 1 through 64. Jobs remain active on every worker, while maintenance sweepers are leader-gated when election is enabled.
SYNAPSE_WORKER_PROFILE all all initializes hardened scanner handlers, captures ownership source evidence and requires the production sandbox. integrations claims only external-integration jobs. lifecycle claims Assessment comparison and closure-report jobs and, when ownership is enabled, also dispatches and consumes data-only ownership routing jobs. The two data-only profiles do not construct executable-tool handlers or require sandbox support.
SYNAPSE_INTEGRATION_SCHEDULER_ENABLED false Dispatch due external-integration polls. Requires PostgreSQL and SYNAPSE_LEADER_ENABLED=true; startup fails closed otherwise.
SYNAPSE_INTEGRATION_SCHEDULER_POLL 1m Interval for checking enabled integrations whose provider poll is due.
SYNAPSE_INTEGRATION_SCHEDULER_DISPATCH_LIMIT 10 Maximum integration poll operations created per scheduler tick.
SYNAPSE_INTEGRATION_SCHEDULER_MAX_QUEUE_DEPTH 100 Stop integration dispatch when the durable queue reaches this aggregate depth.
SYNAPSE_ACCURACY_EVAL_INTERVAL 0 (off) Interval at which the leader worker runs the detection-accuracy regression over the golden corpus and persists a run for the console trend. Zero disables it.
SYNAPSE_INTEGRATION_ALLOW_PRIVATE_NETWORK false Operator gate allowing tenant administrators to request private-address Jenkins origins. Keep off unless internal egress is explicitly approved; loopback, link-local, metadata, CGNAT, 6to4, and well-known NAT64 ranges remain blocked.
SYNAPSE_VULNERABILITY_SCHEDULER_ENABLED false Dispatch due vulnerability-source syncs and recover stale runs. PostgreSQL deployments must also enable leader election.
SYNAPSE_VULNERABILITY_SCHEDULER_POLL 1m Scheduler polling interval.
SYNAPSE_VULNERABILITY_SCHEDULER_STALE_AFTER 30m Age after which a queued/running sync is eligible for checkpoint-based recovery.
SYNAPSE_VULNERABILITY_SCHEDULER_JITTER_PERCENT 10 Stable per-source cadence jitter, from 0 through 100 percent.
SYNAPSE_VULNERABILITY_SCHEDULER_DISPATCH_LIMIT 10 Maximum new source runs dispatched per scheduler tick.
SYNAPSE_VULNERABILITY_SCHEDULER_MAX_QUEUE_DEPTH 100 Stop dispatching when the vulnerability-sync queue reaches this depth.
SYNAPSE_VULNERABILITY_SCHEDULER_RECOVERY_LIMIT 10 Maximum stale runs recovered per scheduler tick.
SYNAPSE_VULNERABILITY_PROVIDER_SYNC_ENABLED false Permit provider sync execution. This global gate also blocks already queued runs after rollback.
SYNAPSE_VULNERABILITY_INLINE_WORKER_ENABLED false Let synapse-api consume only vulnerability sync and reconciliation jobs in a PostgreSQL deployment. Intended for an explicit local/single-process topology; leave off when a separate worker consumes those jobs. These data-only handlers execute no target code and do not replace the sandboxed scan worker.
SYNAPSE_VULNERABILITY_SYNC_SCHEDULER_INTERVAL 0 (off) Above zero, turns on the leader-gated cadence-driven sync scheduler: every interval one worker enqueues each source whose last successful sync is older than its Cadence and reclaims stranded runs. Needs SYNAPSE_VULNERABILITY_PROVIDER_SYNC_ENABLED and SYNAPSE_LEADER_ENABLED.
SYNAPSE_VULNERABILITY_SYNC_STALE_AFTER 2h A queued/running sync run older than this is reclaimed by the scheduler's stale-recovery sweep.
SYNAPSE_VULNERABILITY_SYNC_SCHEDULER_DISPATCH_LIMIT 16 Maximum syncs enqueued (and stale runs recovered) per scheduler tick.
SYNAPSE_VULNERABILITY_SOURCE_ALLOW_PRIVATE_NETWORK false Permit a vulnerability source to reach RFC1918 addresses. A source is a URL the control plane fetches on a schedule, so leaving this off keeps whoever can write a source from probing the operator's own network. Loopback, link-local and carrier-grade NAT ranges stay blocked either way.
SYNAPSE_VULNERABILITY_OCCURRENCE_WRITES_ENABLED false Permit tenant-scoped occurrence mutations for allowlisted tenants.
SYNAPSE_VULNERABILITY_FINDING_PROJECTION_ENABLED false Permit machine-owned finding projection updates for allowlisted tenants.
SYNAPSE_VULNERABILITY_ACTIONS_ENABLED false Permit risk-change action creation for allowlisted tenants.
SYNAPSE_VULNERABILITY_NOTIFICATIONS_ENABLED false Permit notification-outbox writes for allowlisted tenants.
SYNAPSE_VULNERABILITY_DRY_RUN_ENABLED true Persist reconciliation diffs and counts without occurrence, finding, action, or notification mutations.
SYNAPSE_VULNERABILITY_TENANT_ALLOWLIST empty Comma-separated tenant IDs allowed to use tenant-scoped gates and dry-run; * enables every tenant. Empty fails closed.
SYNAPSE_VULNERABILITY_MAINTENANCE_INTERVAL 0 (off) Leader-gated interval for audited vulnerability retention passes. A positive interval still performs dry-runs unless deletion is separately enabled.
SYNAPSE_VULNERABILITY_MAINTENANCE_DELETE_ENABLED false Opt in to bounded deletion/clearing of eligible data. Requires a positive maintenance interval and a database role with global RLS visibility.
SYNAPSE_VULNERABILITY_RAW_PAYLOAD_RETENTION 720h Age for non-current provider raw payload clearing; normalized current evidence is preserved.
SYNAPSE_VULNERABILITY_SYNC_RUN_RETENTION 4320h Age for terminal sync runs that have no observation or revision references.
SYNAPSE_VULNERABILITY_RESOLVED_OCCURRENCE_RETENTION 2160h Age for resolved/withdrawn occurrences with no finding, risk, legal hold, current-inventory, or pending-work reference.
SYNAPSE_VULNERABILITY_UNREFERENCED_ADVISORY_RETENTION 720h Age for rejected/withdrawn advisories that have no aliases, observations, revisions needed by runs, tenant checkpoints, workflows, or pending reconciliation.
SYNAPSE_VULNERABILITY_MAINTENANCE_BATCH_SIZE 1000 Per-category upper bound for one maintenance pass; values above 1000 are rejected.
SYNAPSE_SLA_ENABLED false Enable versioned risk-based remediation deadlines, immutable assessment history, human-only lifecycle transitions, and continuous-intelligence reassessment. See Remediation SLA governance.
SYNAPSE_ASSESSMENT_CYCLE_API_ENABLED false Atomically create initial Assessment Cycles and enable tenant-scoped lifecycle, Re-test, list, and archive APIs. Create/archive requests require Idempotency-Key; archive also requires If-Match.
SYNAPSE_ASSESSMENT_CYCLE_DUAL_WRITE_ENABLED false Enable the independently gated new-Assessment Cycle/root dual-write path after schema readiness and tenant rollout checks.
SYNAPSE_ASSESSMENT_CYCLE_DUAL_WRITE_TENANTS empty Comma-separated tenant allowlist for Cycle dual-write; * enables all tenants. Required when the dual-write gate is enabled.
SYNAPSE_ASSESSMENT_SNAPSHOT_ENABLED false Enable immutable Assessment Snapshot generation and reads.
SYNAPSE_ASSESSMENT_IDENTITY_COMPARISON_SHADOW_ENABLED false Enable finding Identity/Observation and Comparison shadow generation without changing legacy reads. Requires Snapshot generation.
SYNAPSE_ASSESSMENT_IDENTITY_COMPARISON_SHADOW_TENANTS empty Comma-separated tenant allowlist for Identity/Observation and Comparison shadow generation; * enables all tenants. Required when shadow generation is enabled.
SYNAPSE_ASSESSMENT_SNAPSHOT_COMPLETION_ENABLED false Require a finalized default Snapshot before Assessment completion for an explicit rollout cohort. Disabled preserves legacy completion behavior.
SYNAPSE_ASSESSMENT_SNAPSHOT_COMPLETION_TENANTS empty Comma-separated Snapshot-completion enforcement allowlist; it must be a subset of the lifecycle-read allowlist.
SYNAPSE_ASSESSMENT_LIFECYCLE_READ_ENABLED false Enable lifecycle read projections after backfill and integrity verification.
SYNAPSE_ASSESSMENT_LIFECYCLE_READ_TENANTS empty Comma-separated tenant allowlist for lifecycle reads; must be a subset of the shadow-generation allowlist.
SYNAPSE_ASSESSMENT_LIFECYCLE_UI_DEFAULT_ENABLED false Make lifecycle UI the default; startup rejects this unless lifecycle reads are enabled.
SYNAPSE_ASSESSMENT_LIFECYCLE_UI_DEFAULT_TENANTS empty Comma-separated tenant allowlist for lifecycle UI; must be a subset of the lifecycle-read allowlist.
SYNAPSE_ASSESSMENT_CLOSURE_REPORT_ENABLED false Enable closure and report paths; requires lifecycle reads, Snapshots, and Identity/Comparison generation.
SYNAPSE_ASSESSMENT_MIGRATION_BATCH_SIZE 500 Rows per committed lifecycle migration/backfill batch; maximum 2000.
SYNAPSE_ASSESSMENT_PROCESS_TENANT_JOBS 4 Maximum tenants processed concurrently by one lifecycle runner process; maximum 4.
SYNAPSE_ASSESSMENT_COMPARISON_BACKLOG_WARNING 500 Per-tenant queued/generating Comparison warning threshold; maximum 500.
SYNAPSE_ASSESSMENT_COMPARISON_BACKLOG_HARD_LIMIT 1000 Per-tenant Comparison rollout gate; must be at least the warning threshold and no more than 1000.
SYNAPSE_DAST_RATE_PER_SEC 5 DAST crawler request rate.
SYNAPSE_DAST_CONCURRENCY 4 DAST crawler concurrency.
SYNAPSE_DAST_MAX_DEPTH 8 Maximum crawl depth.
SYNAPSE_DAST_MAX_PAGES 2000 Maximum pages crawled.
SYNAPSE_DAST_MAX_WALL_CLOCK 30m Maximum crawl wall-clock.
SYNAPSE_DAST_HELPER_BIN synapse-dast-helper Sandboxed DAST helper binary.

Recon and execution sandbox (sandbox required in production)

Variable Default Description
SYNAPSE_SANDBOX_ENABLED false Run tool execution and acquisition in the bubblewrap sandbox. Production requires true; if bubblewrap is missing, startup fails closed. Kernel egress enforcement additionally needs net.ipv4.ip_forward=1 on the host: the sandbox namespace reaches the network over a veth, and with forwarding off the kernel drops every packet leaving it, so a destination the policy allows is as unreachable as one it denies. The egress probe refuses rather than enabling enforcement that blocks everything.
SYNAPSE_SANDBOX_MEM_MAX 536870912 Per-run memory limit in bytes.
SYNAPSE_SANDBOX_PIDS_MAX 256 Per-run pid limit.
SYNAPSE_TOOL_HASHES (TOFU) Authoritative sha256 pins. The sandbox refuses a binary whose hash does not match.
SYNAPSE_RECON_TIMEOUT 3m Per-run recon timeout.
SYNAPSE_RECON_CONCURRENCY 3 Recon worker pool size.
SYNAPSE_RECON_ALLOW_CAPABILITY_SENSITIVE false Permit tools that need raw sockets.
SYNAPSE_TOOL_EXECUTION_MODE (role default) Explicit process execution posture: dispatch-only, worker, or in-process. Production synapse-api defaults to dispatch-only and refuses in-process, so untrusted tools run only on synapse-worker; dispatch-only requires PostgreSQL. Leave unset unless overriding the role default.
SYNAPSE_RECON_VIA_WORKER false Route recon through the durable queue to synapse-worker. Requires PostgreSQL.

Signed egress grants (native worker tier)

Scoped network access for an untrusted process is authorized by the control plane, not by the worker. The API signs a short-lived grant bound to the exact process and namespace; a root-owned broker verifies it and configures that namespace before the sandboxed child is released. The signing seed stays in the control plane and the broker holds only the public verification key. See Deployment and Security.

Set the issuer variables on synapse-api and the client variables on synapse-worker.

Variable Default Description
SYNAPSE_EGRESS_GRANT_AUTHORITY_ADDR (none) API: listen address for the machine-only grant listener, for example :8082. Publish it through a private TLS load balancer reachable only from the worker security group, never through the browser ingress.
SYNAPSE_EGRESS_GRANT_ISSUER_TOKEN (none) API: bearer credential the worker machine identity presents to the grant listener. Keep it distinct from SYNAPSE_API_TOKEN so a worker holds no human API authority. Never logged.
SYNAPSE_EGRESS_GRANT_SIGNING_SEED (none) API: Ed25519 seed that signs grants. Rotate in two phases so in-flight grants stay verifiable. Never logged.
SYNAPSE_EGRESS_GRANT_AUTHORITY_URL (none) Worker: private HTTPS URL of the grant listener.
SYNAPSE_EGRESS_GRANT_AUTHORITY_TOKEN (none) Worker: machine bearer credential for the grant listener. Never logged.
SYNAPSE_EGRESS_BROKER_SOCKET (none) Worker: path to the root-owned broker's Unix socket. The protocol carries only a run id and canonical CIDR/port rules; it has no command or argv field.

AI agent orchestration (off by default)

Variable Default Description
SYNAPSE_AGENT_ENABLED false Turn on the agent orchestrator.
SYNAPSE_LLM_BASE_URL (none) OpenAI-compatible Chat Completions endpoint.
SYNAPSE_LLM_API_KEY (none) Provider key. Never logged.
SYNAPSE_LLM_PROVIDER openai-compatible Explicit provider identity retained for audit and separation-of-duties checks.
SYNAPSE_LLM_MODEL (none) Required when the agent is enabled.
SYNAPSE_LLM_TIMEOUT 60s Per-request timeout.
SYNAPSE_AGENT_APPROVAL_MODE manual Human-in-the-loop approval: manual, filter, or auto.
SYNAPSE_AGENT_APPROVAL_TIMEOUT 30m Fail-closed approval timeout.
SYNAPSE_AGENT_MAX_STEPS 16 Per-run step bound.
SYNAPSE_AGENT_TOKEN_BUDGET 0 0 means unbounded.
SYNAPSE_AGENT_MAX_DURATION 10m Per-run duration bound.
SYNAPSE_AGENT_VIA_WORKER false Durable agent on synapse-worker. Requires the recon worker and PostgreSQL.

AI analysis brain (opt-in, best-effort)

SYNAPSE_JUDGMENTS_ENABLED (on by default) is the prerequisite for the analyzers that mint judgments. All are best-effort and no-op without inputs. Set a flag to false to opt out.

Variable Default Description
SYNAPSE_JUDGMENTS_ENABLED true Judgment lifecycle routes (verify, accept, list).
SYNAPSE_SAST_ENABLED true Pattern SAST in the scan pipeline.
SYNAPSE_REACHABILITY_ENABLED true Call-graph reachability proof (Go, Tier-2). Needs judgments.
SYNAPSE_REACHABILITY_BUILDER owned Reachability call-graph producer: owned (go/ssa, default) or govulncheck.
SYNAPSE_PYREACH_ENABLED true Python import-reachability (Tier-1 direct dead-dependency → OpenVEX). Default ON. Needs judgments.
SYNAPSE_PYREACH_TIER2_ENABLED false Python semantic call-graph reachability (Tier-2). Requires Python Tier-1 and synapse-ast.
SYNAPSE_TAINT_ENABLED false Go call-graph taint proposals. Needs judgments and the target-compilation sandbox.
SYNAPSE_PYTAINT_ENABLED true Python value-flow taint proposals (default-on when synapse-ast resolves). Needs judgments and synapse-ast; source-only, so the sandbox is optional.
SYNAPSE_JSTAINT_ENABLED false JavaScript/TypeScript value-flow taint proposals (OFF by default). Needs judgments and synapse-ast; source-only, so the sandbox is optional.
SYNAPSE_JAVATAINT_ENABLED false Java value-flow taint proposals (OFF by default). Needs judgments and synapse-ast; source-only, so the sandbox is optional.
SYNAPSE_TAINT_RULES_FILE empty Optional YAML file of custom Python and JavaScript taint rules (python.sources / python.sinks and js.sources / js.sinks) merged additively into the built-in catalogs at startup. A custom source/sink is import-anchored (modules + names); a sink also names a taint class, a cwe, a rule id, and a zero-based argument. Custom rules only ADD detection (a new source or sink); there are no custom sanitizers, so they cannot suppress a built-in flow. A malformed or invalid file fails startup rather than silently dropping rules.
SYNAPSE_CROSSCHECK_ENABLED true Detection-source disagreement judgments.
SYNAPSE_SBOM_CROSSCHECK_ENABLED false Dual-producer SBOM cross-check: a second producer runs beside the primary and components only one emits become ungated judgments for review. Opt-in, because the owned parsers are the primary producer and the only second producer is Syft, so enabling it makes the deployment depend on a Syft binary.
SYNAPSE_GOMODGRAPH_ENABLED true Transitive Go dependency edges via go mod graph.
SYNAPSE_WRITEUP_DRAFTS_ENABLED false Agent write-up draft tool. A distinct human signs off.

Additional operator settings

The settings below are intentionally grouped by owning process. They are real operator controls even when they are used only by a CLI, helper, or optional subsystem.

Database, project storage, and maintenance

Variable Default Description
SYNAPSE_DB_MIGRATION_DSN SYNAPSE_DB_DSN Optional owner-level PostgreSQL DSN used only for embedded migrations. Use it to keep the runtime DSN least-privileged.
SYNAPSE_PROJECT_UPLOAD_DIR data/project-uploads Server-owned directory for uploaded project source bundles.
SYNAPSE_PROJECT_ANALYSIS_COMPLETION_TIMEOUT 1m Maximum wait for project-analysis completion; non-positive values reset to one minute.
SYNAPSE_APPROVAL_SWEEP_INTERVAL 1m Sweep interval for expired pending approvals.
SYNAPSE_PROMOTION_RECONCILE_INTERVAL 1m Interval for deterministic promotion-rule reevaluation.

Advisory, NVD, and resolver access

Network-backed manifest resolution is disabled by default. When enabled, set the associated host allowlist; an empty or overly broad allowlist must not become an implicit network policy.

Variable Default Description
SYNAPSE_NVD_API_URL public NVD API NVD API endpoint override for an approved mirror.
SYNAPSE_NVD_API_KEY empty NVD API key. Keep it in the process environment or secret manager; never put it in source.
SYNAPSE_NVD_BUDGET 20s Per-request NVD enrichment budget.
SYNAPSE_NVD_CVSS_DB empty CLI path to an offline CVSS database built with build-cvss-db.
SYNAPSE_MAVEN_RESOLVE_ENABLED false Resolve Maven metadata from allowlisted repositories.
SYNAPSE_MAVEN_REPO_HOSTS empty Comma-separated Maven host allowlist.
SYNAPSE_MAVEN_LOCAL_REPO platform default Local Maven repository override.
SYNAPSE_GRADLE_RESOLVE_ENABLED false Resolve Gradle metadata. Requires an isolated Gradle home and approved hosts.
SYNAPSE_GRADLE_HOME empty Isolated Gradle user-home directory.
SYNAPSE_GRADLE_HTTP_TIMEOUT_MS implementation default Gradle HTTP timeout in milliseconds.
SYNAPSE_NPM_RESOLVE_ENABLED false Resolve npm manifests from allowlisted registries.
SYNAPSE_NPM_REGISTRY_HOSTS empty Comma-separated npm registry host allowlist.
SYNAPSE_MANIFEST_RESOLVE_ENABLED false Enable remaining external manifest resolvers.
SYNAPSE_BUNDLER_RESOLVE_ENABLED false Enable the Ruby Bundler resolver. Opt-in everywhere (incl. the CLI) because bundle lock evaluates the Gemfile as Ruby, i.e. runs project code; run sandbox-confined in production.
SYNAPSE_MANIFEST_REGISTRY_HOSTS empty Comma-separated host allowlist for those resolvers.
SYNAPSE_JARHASH_BASE_URL empty Approved jar-hash service or mirror URL.
SYNAPSE_JARHASH_DB_PATH empty Offline jar-hash database path.

Tool binary overrides use SYNAPSE_AST_BIN, SYNAPSE_GOVULNCHECK_BIN, SYNAPSE_GO_BIN, SYNAPSE_MVN_BIN, SYNAPSE_GRADLE_BIN, SYNAPSE_NPM_BIN, SYNAPSE_COMPOSER_BIN, SYNAPSE_BUNDLE_BIN, SYNAPSE_POETRY_BIN, and SYNAPSE_TAINT_CALLGRAPH_BIN. Defaults are the corresponding command names on PATH; production sandbox deployments should use absolute, pinned paths.

Recon and DAST limits

Variable Default Description
SYNAPSE_RECON_MAX_OUTPUT 8388608 Maximum captured output per recon run, in bytes.
SYNAPSE_RECON_QUEUE 64 Recon work queue depth.
SYNAPSE_DAST_MAX_REAUTH 2 Maximum governed reauthorization cycles for a DAST session.
SYNAPSE_DAST_MAX_REQUESTS 20000 Hard request ceiling for a DAST session.
SYNAPSE_DAST_SECRET_<NAME> unset Helper-only projection of a named vault placeholder. The parent constructs and scrubs these values; operators should store the source secret in the vault instead of setting this prefix manually.

SYNAPSE_DAST_AUTH_REQUEST_FD, SYNAPSE_DAST_AUTH_DECISION_FD, SYNAPSE_CSPM_CREDENTIAL_FD, SYNAPSE_CSPM_AUTH_REQUEST_FD, and SYNAPSE_CSPM_AUTH_DECISION_FD are inherited-pipe descriptors managed by the parent process. They are not operator settings and must not be injected manually.

Fleet control plane

Variable Default Description
SYNAPSE_FLEET_CA_KEY empty Private key for the fleet client-certificate CA. Required with the fleet CA certificate; treat as a production secret.
SYNAPSE_FLEET_CERT_TTL 24h Lifetime of issued fleet client certificates.
SYNAPSE_FLEET_CLIENT_CERT_HEADER empty Trusted reverse-proxy header carrying the verified client certificate. Enable only behind a proxy that strips all client-supplied copies and sets the header after mTLS verification. Required when fleet is enabled in production.
SYNAPSE_FLEET_CLIENT_CERT_HOST empty Dedicated mTLS virtual host for post-enrollment fleet transport. Required and distinct from the enrollment host in production.
SYNAPSE_FLEET_ENROLLMENT_HOST empty Dedicated TLS-only virtual host for one-time bearer enrollment. Required and distinct from the mTLS host in production.
SYNAPSE_UPDATE_PUBLIC_KEY built-in release key Hex Ed25519 public-key override for fleet self-update verification. Use only for a controlled private release channel.
SYNAPSE_AGENT_CONCURRENCY 8 Total server-side agent work concurrency.
SYNAPSE_AGENT_QUEUE_DEPTH 256 Pending agent-work queue depth.
SYNAPSE_AGENT_MAX_PARALLEL 1 Maximum parallel actions per agent; serial by default.
SYNAPSE_AGENT_RECON_CONCURRENCY 3 Recon work admitted within the agent budget.

Host and Kubernetes agents

The following variables are read by synapse-agent and synapse-cluster-agent, not by the API:

Variable Default Description
SYNAPSE_FLEET_URL empty Fleet API base URL. HTTPS is required except for loopback development.
SYNAPSE_FLEET_ENROL_TOKEN empty One-time enrollment token. Environment use is supported, but a token file is preferred; the equivalent command-line flag is visible in process listings and shell history.
SYNAPSE_FLEET_ENROL_TOKEN_FILE empty Preferred file containing the one-time token. Remove it after successful enrollment.
SYNAPSE_AGENT_STATE_DIR platform default Credential and offline-buffer directory; /var/lib/synapse-cluster-agent for the cluster agent. Protect it from other users.
SYNAPSE_AGENT_ROOT / Host filesystem root inventoried by the VM agent.
SYNAPSE_AGENT_NAME hostname Human-readable agent display name.
SYNAPSE_INVENTORY_SWEEP_ENABLED true Ship host inventory continuously on a cadence (A8, #629), not only on a scan.host work order. Ingest is idempotent server-side (host upsert-by-natural-key), so a re-sweep of an unchanged host is a no-op. Set false to disable.
SYNAPSE_INVENTORY_SWEEP_INTERVAL 1h Cadence of the continuous host-inventory sweep. Clamped to a 1-minute floor so a misconfiguration cannot busy-loop the collector over the filesystem.
SYNAPSE_RUNTIME_REACHABILITY_ENABLED true Ship runtime-reachability evidence (#1060/#1061): the shared libraries observed loading via eBPF, joined to their owning OS packages, so a finding on an actually-loaded package is raised over one that is only installed. Linux with the eBPF library-load sensor only; on other hosts the agent ships a single coverage-gap report and stops. Set false to disable.
SYNAPSE_RUNTIME_REACHABILITY_INTERVAL 5m Cadence of the runtime-reachability evidence ship. Clamped to a 1-minute floor so a misconfiguration cannot busy-loop the package-database read.
SYNAPSE_PROCESS_REPORT_ENABLED true Report the host's running processes to the behavior baseline (#594 D) on the inventory-sweep cadence. Read-only procfs metadata (pid, comm, exe path); no process memory is read and nothing is executed. Set false to disable.
SYNAPSE_AGENT_PROC_ROOT /proc Procfs root the agent enumerates running processes from. A host without procfs reports nothing.
SYNAPSE_DETECT_CLASSES empty Comma-separated eBPF classes: process, network, file, privilege. Empty disables the engine; Linux root/capabilities are required.
SYNAPSE_DETECT_CPU_CEIL_PCT 0 CPU ceiling for deterministic class shedding; zero disables shedding.
SYNAPSE_DETECTION_ENGAGEMENT_ID empty Engagement receiving signed detection batches. Empty keeps confirmed detections durably local and does not start the remote detection shipper.
SYNAPSE_DETECTION_SHIP_INTERVAL 1s Poll interval while the independent P1 detection delivery lane is empty. Network/429/5xx retry uses separate capped exponential backoff.
SYNAPSE_TELEMETRY_SPOOL_BYTES 536870912 Maximum bytes of checksummed telemetry WAL segments (minimum 1 MiB). P3 is evicted first with durable gap evidence; P0–P2 backpressure instead of shedding.
SYNAPSE_AGENT_METRICS_ADDR empty Optional private Prometheus listener for agent spool metrics. It has no authentication; bind to loopback or a protected scrape network.
SYNAPSE_CLUSTER empty (required) Stable cluster identity attached to every Kubernetes asset.
SYNAPSE_CLUSTER_NAMESPACES empty Comma-separated namespace scope; empty means all authorized namespaces.
SYNAPSE_CLUSTER_RESYNC 5m Interval between Kubernetes inventory collections.

CLI integration

Variable Default Description
SYNAPSE_API_URL empty Server base URL used by synapse-cli publish-source; overridden by --server.
SYNAPSE_DECORATION_TOKEN (none) Forge write token for synapse-cli gate --decorate. Scoped to the CI provider's forge (a GitHub/GitLab/Bitbucket token with permission to write commit statuses, checks/reports, and PR/MR comments). Prefer a short-lived CI-provided token. Never logged, and never needed for --dry-run.
SYNAPSE_DECORATION_USERNAME empty Username paired with SYNAPSE_DECORATION_TOKEN for Bitbucket Basic auth. Leave empty for GitHub/GitLab and for Bitbucket access tokens (defaults to x-token-auth).
SYNAPSE_REACH_RUST true Conservative Rust manifest/import reachability (Tier-1). Default ON; fails to unknown on any coverage gap. Needs judgments.
SYNAPSE_REACH_RUBY true Conservative Ruby manifest/import reachability (Tier-1). Default ON; fails to unknown on any coverage gap. Needs judgments.
SYNAPSE_REACH_PHP true Conservative PHP manifest/import reachability (Tier-1). Default ON; fails to unknown on any coverage gap. Needs judgments.
SYNAPSE_REACH_DOTNET true Build-aware .NET (C#/VB) dead-dependency reachability (Tier-1). Reads each direct NuGet package's REAL exported namespaces from its restored assemblies (project.assets.json + the on-disk assembly cache), not a guess from the package id, so AWSSDK.S3 (namespace Amazon.S3) is matched correctly. Concludes not_affected only when a direct dependency's full namespace set is known and none of it is referenced in first-party source. Reads bytes only, runs nothing. Fails closed to unknown (mints nothing) on any gap: a reflection/dynamic construct, no restore graph (build the project first), an unreadable/forwarder-bearing assembly, or a transitive subject. Needs judgments.
SYNAPSE_REACH_GOBIN true RAISE-ONLY Go-binary affected-symbol reachability (Tier-2). For a Linux/amd64 Go process image, a rooted direct-call path from main.main to an affected function can raise the finding only when its exact module and version agree across the advisory, current SBOM, and that binary's build info. Supported inlining metadata can also prove a call. Missing or ambiguous metadata, unsupported binaries, and unresolved indirect calls provide no coverage. It never concludes not_reachable or OpenVEX not_affected. Reads binaries only, builds nothing. Needs judgments.
SYNAPSE_REACH_CPP true Source-only, RAISE-ONLY C/C++ (Conan) affected-symbol reachability (Tier-2). First-party source that references a curated vulnerable function by its scope-qualified name (ns::Class::method(, new ns::Class() raises that finding's urgency. It NEVER concludes not_reachable (macros, function pointers, dlopen/dlsym, textual #include, LTO/inlining, and mangling all hide calls), so it can only raise, never suppress, and its verdict never becomes an OpenVEX not_affected. Reads source bytes only, builds nothing. Needs judgments.

MCP server (synapse-mcp)

Read and propose only. It never executes. The token and engagement ID are required to start it.

Variable Default Description
SYNAPSE_MCP_TOKEN (none) Bearer token. Never logged.
SYNAPSE_MCP_ENGAGEMENT_ID (none) The engagement the MCP server is scoped to.
SYNAPSE_MCP_ADDR :8081 Listen address.

Next: CLI