Environment variables¶
Set them in the environment or in a .env file the CLI and the IRIS API read at
start.
- Applies: when a change takes effect (the next call, the next scheduled run, or a restart).
- Guarded: the web console asks the owner to confirm a change.
- On/off settings take
1/true/yes/onand0/false/no/off.
Stable settings¶
What an install of iris-harness[email] needs: the settings the getting-started
pages, the email guide and iris doctor name. They are part of the
stable API: a name or a default changes only after a deprecation
cycle. src/iris_harness/sdk/stable_tier.yaml lists them.
| Variable | Kind | Default | Applies | Description |
|---|---|---|---|---|
IRIS_AUTH_SECRET |
secret | next call | Shared bearer secret every request to the IRIS API, the governor and the channel gateway must present, except their liveness probes (a paired device presents its own token instead); unset or blank, those services refuse every such request rather than run open. The learning eval sandbox forwards it (default 'eval-sandbox') into its container. Guarded. | |
IRIS_API_HOST |
url | 127.0.0.1 |
next call | Host iris serve binds the IRIS API to (as scripts/start_iris.sh binds every service), and the host health checks probe the local services on and the model inventory queries Ollama's /api/tags on. |
IRIS_API_PORT |
url | 8003 |
restart | Port iris serve binds the IRIS API to, and the port the health watch probes for its /healthz endpoint (default 8003). |
IRIS_API_URL |
url | http://localhost:8003 |
restart | Base URL the CLI commands and the channel gateway use to reach the IRIS API (CLI defaults vary between http://localhost:8003 and http://127.0.0.1:8003). |
IRIS_PUBLIC_URL |
url | next call | Absolute base URL the web console is reached at (https:// |
|
IRIS_ALLOWED_HOSTS |
list | restart | Comma-separated host names (host, host:port or a URL) the HTTP services answer to besides the built-in ones (loopback, testserver, the compose service names, this machine's hostname, the host of IRIS_PUBLIC_URL and their short names); any other Host is refused with 400 (DNS rebinding). An IP literal is always accepted. '' turns the check off. Guarded.* | |
IRIS_HOME |
path | ~/.iris |
restart | Relocates the identity tree, plugin home, session logs and (when set) the governance data/config dirs. |
IRIS_VAULT_MASTER_KEY |
secret | restart | Fernet master key for the credential vault and the file vault, used instead of the OS keyring. Guarded. | |
IRIS_PROFILE |
str | default |
restart | Selects which shipped profile (config/profiles/default, or email when the email plugins are installed. Guarded. |
IRIS_DEMO_HOME |
path | next call | Where iris email demo keeps its own isolated IRIS home (default ~/.iris-demo); never the owner's profile. |
|
IRIS_TZ |
str | UTC |
restart | The owner's IANA time zone (e.g. America/Chicago). The morning digest's time, reminders and schedules are read in it; the Docker Compose files also set the container clock (TZ) from it. Unset or not a zone name means UTC. |
IRIS_EMAIL_JUDGE |
bool | on |
next run | When on (default), the email judge sorts each new non-promo email into Bill, Event, Needs reply, FYI or Unsure three times a day, on a local model only. New email stays hidden until it is judged, so off means new email waits and stays hidden. |
IRIS_EMAIL_JUDGE_LABELS |
bool | on |
next run | When on (default), each judged email gets one IRIS/* label in Gmail (never archived, never marked read); off keeps the judgments in IRIS only. |
IRIS_EMAIL_JUDGE_UNSURE_BELOW |
float | 0.7 |
next run | A judgment less sure than this is filed as Unsure and asked on an Action Center card. |
Third-party model backends¶
Not IRIS_*, so outside the settings catalog's scope -- the local-model
backends' own address variables, read wherever the harness talks to them.
| Variable | Default | Description |
|---|---|---|
OLLAMA_BASE_URL |
http://localhost:11434 |
Ollama's base URL (a trailing /v1 is accepted and trimmed). Set it to move the local-model backend to another box -- the cloud harness reaches the Mac's Ollama over the tailnet this way. |
LM_STUDIO_BASE_URL |
http://localhost:1234 |
LM Studio's base URL, shared with the LLM failover proxy -- told apart by port (the proxy's IRIS_PROXY_PORT, default 4000, vs. LM Studio's 1234). |
Every other setting¶
The full catalog of the email profile (not stable)
Every IRIS_* setting the install reads, from the settings catalog: the
core's (src/iris_harness/foundation/settings/catalog.yaml) and each plugin's
in the email profile (its manifest's settings:). A test fails when the
code reads an IRIS_* name no catalog declares. The stable settings above are
listed again here, marked Stable.
These are configuration, not part of the stable API: a name or a default may change in a 0.x release, and the release notes say so.
From core
| Variable | Kind | Default | Applies | Description |
|---|---|---|---|---|
IRIS_ACTIVITY_WORKERS |
int | 1 |
restart | Sets how many worker threads the background ActivityRunner uses (minimum 1). |
IRIS_ADAPTIVE_TIERS |
bool | off |
restart | When on, the tier router's ResourceGovernor downshifts large local model tiers under host pressure (RAM, CPU load, thermal throttling); skipped entirely if IRIS_DISABLE_ARBITER is set. |
IRIS_AGENTIC_CORE_ENABLED |
enum | 1 |
restart | Selects the AgenticCore governed loop rollout: 0/false/no/off turns it off, 'shadow' runs it in shadow, anything else (default) turns it on. |
IRIS_AGENTIC_CORE_P4 |
bool | off |
restart | When on, routes the calendar and planner intents through the one governed agentic loop (requires the base loop rollout on/shadow). |
IRIS_AGENT_SELF_MANAGEMENT |
bool | off |
next call | Adds the ADR-0086 self-management ReAct tools (introspect the agent's own brain, one of which compacts the conversation) to each turn's tool loop. |
IRIS_ALLOWED_HOSTS |
list | restart | Comma-separated host names (host, host:port or a URL) the HTTP services answer to besides the built-in ones (loopback, testserver, the compose service names, this machine's hostname, the host of IRIS_PUBLIC_URL and their short names); any other Host is refused with 400 (DNS rebinding). An IP literal is always accepted. '' turns the check off. Guarded. Stable.* | |
IRIS_API_HOST |
url | 127.0.0.1 |
next call | Host iris serve binds the IRIS API to (as scripts/start_iris.sh binds every service), and the host health checks probe the local services on and the model inventory queries Ollama's /api/tags on. Stable. |
IRIS_API_PORT |
url | 8003 |
restart | Port iris serve binds the IRIS API to, and the port the health watch probes for its /healthz endpoint (default 8003). Stable. |
IRIS_API_URL |
url | http://localhost:8003 |
restart | Base URL the CLI commands and the channel gateway use to reach the IRIS API (CLI defaults vary between http://localhost:8003 and http://127.0.0.1:8003). Stable. |
IRIS_AUTH_SECRET |
secret | next call | Shared bearer secret every request to the IRIS API, the governor and the channel gateway must present, except their liveness probes (a paired device presents its own token instead); unset or blank, those services refuse every such request rather than run open. The learning eval sandbox forwards it (default 'eval-sandbox') into its container. Guarded. Stable. | |
IRIS_BEHAVIOR_BROAD_INTENTS |
list | general,system,chat,other |
restart | Comma-separated intents treated as catch-all when matching behavior files, so they get the lower broad-intent weight instead of the full intent weight. |
IRIS_BEHAVIOR_BROAD_INTENT_WEIGHT |
float | 0.5 |
restart | Sets the relevance weight a catch-all intent (general, system, chat, other) contributes when matching stored behaviors to a turn. |
IRIS_BEHAVIOR_INTENT_WEIGHT |
float | 2.0 |
restart | Sets the relevance weight a behavior file earns when one of its specific match_intents matches the turn's intent. |
IRIS_BEHAVIOR_KEYWORD_WEIGHT |
float | 1.0 |
restart | Sets the relevance weight a keyword match contributes when deciding which behavior files to inject into a turn. |
IRIS_BEHAVIOR_MATCH_THRESHOLD |
float | 2.0 |
restart | Minimum relevance score the best-matching behavior must reach in match_behavior before it is used for a turn; below it no behavior is selected. |
IRIS_BEHAVIOR_MINER |
bool | off |
restart | Turns on the local-tier behavior-pattern miner (digital-twin layer 1) that proposes behaviors for user approval; this env value is the default the learning console reverts to on restart. |
IRIS_CHANNEL_GATEWAY_PORT |
url | 8006 |
restart | Port the channel gateway listens on (launcher) and that the health check probes; default 8006. |
IRIS_CHANNEL_GATEWAY_TELEGRAM_ENABLED |
bool | on |
restart | When on, the channel gateway runs the Telegram long-poller; when off (and IRIS_RUNTIME_TELEGRAM_POLLER_ENABLED unset) the runtime's own Telegram poller starts instead. Guarded. |
IRIS_CHANNEL_GATEWAY_TRACING_ENABLED |
bool | off |
restart | Sets up OpenTelemetry tracing for the channel gateway service at startup; spans export only when an OTLP endpoint is set (OTEL_EXPORTER_OTLP_ENDPOINT). |
IRIS_COMPACTION_KEEP_RECENT |
int | 10 |
restart | Sets how many of the most recent conversation turns are kept verbatim when the conversation is compacted. |
IRIS_COMPACTION_RATIO |
float | 0.8 |
restart | Fraction of the compactor's token budget the running history must reach before it is compacted (values outside 0-1 fall back to 0.8); also sizes the kept-verbatim window. |
IRIS_COMPACTION_THRESHOLD |
int | 20 |
restart | Turn-count floor at which a conversation is compacted into a summary (with the token budget also able to trigger compaction). |
IRIS_COMPACTION_TOKEN_BUDGET |
int | restart | Sets the token budget at which the conversation compactor summarises older turns; unset uses a budget derived from the communication tier's context window. | |
IRIS_CONFIG_DIR |
path | restart | Points the harness at the directory holding its YAML config (memory, skills, profiles, governance, finance categories, plugin dump); cached after first read. Unset resolves, in order, to the checkout's config/ when running from a checkout, else the defaults shipped inside the installed package (foundation/paths.py config_dir). | |
IRIS_CRYSTALLIZE_PREFLIGHT |
bool | off |
restart | When on, each newly crystallized skill proposal is replayed through an isolated eval runtime and quarantined as preflight_failed if it fails quality. |
IRIS_CURATOR_ESCALATION |
bool | off |
restart | When truthy, builds the escalation judge that grades answers and (in enforce mode) re-runs capability gaps at a stronger tier; the env can only turn it on, config/escalation.yaml enabled:true also turns it on. |
IRIS_CURATOR_ESCALATION_CLOUD |
bool | off |
restart | When on (or cloud.allow in escalation.yaml), the escalation judge may escalate a turn to a cloud tier for content classified as eligible (default only 'public'; 'secret' never). Guarded. |
IRIS_CURATOR_ESCALATION_MODE |
enum | shadow |
restart | Overrides the escalation judge mode from config/escalation.yaml: 'shadow' only diagnoses and records, 'enforce' lets the judge act (escalate) when it is enabled; other values are ignored. Guarded. |
IRIS_CURATOR_ESCALATION_PRIORS |
bool | off |
restart | When on (or escalation.yaml priors.enabled), applies start-tier priors mined from escalation history to the router instead of running them in shadow. Guarded. |
IRIS_CURATOR_FAITHFULNESS_LLM |
bool | off |
restart | Builds an LLM faithfulness judge for the ResponseCurator's strict mode so answers are checked against their sources. |
IRIS_CURATOR_GROUNDING_LLM |
bool | off |
restart | When on, an LLM grounding judge client is built for the curator to check responses that carry retrieved context. |
IRIS_CURATOR_LEAK_JUDGE |
bool | on |
restart | When not set to 0/false/no/off, builds an LLM leak judge that may clear responses the deterministic dump-phrase guard flagged; when off, that guard's halt stands. Guarded. |
IRIS_CURATOR_OUTPUT_SAFETY |
bool | off |
restart | When on, builds the Llama Guard 3 output-safety judge the curator uses to check responses (shadow/warn-only unless enforce categories are configured). Guarded. |
IRIS_CURATOR_OUTPUT_SAFETY_TIMEOUT_S |
float | 12.0 |
restart | Per-call time budget in seconds (clamped 1-60) for the output-safety guard, which fails open on timeout. Guarded. |
IRIS_DATA_DIR |
path | data |
restart | Relocates every local data store (memory.db, chroma, tasks.db, finance and email stores, etc.). |
IRIS_DEPLOYMENT_LABEL |
str | next call | Sets the deployment name returned to the web console, which shows it as a badge; empty when unset. | |
IRIS_DISABLE_ARBITER |
bool | off |
restart | Any non-empty value (even 0) skips attaching the Ollama arbiter ResourceGovernor to the tier router. |
IRIS_DISABLE_EXTERNAL_WRITES |
bool | off |
next call | When set to 1, calendar writes stay local (no Apple or Google Calendar providers are registered); the playground and learning preflight set it for their sandboxes. |
IRIS_DISABLE_WARMUP |
bool | off |
restart | When set to any non-empty value, skips the background warm-up calls that pre-load the router and executor models at startup (the playground and eval harness also set it for their own runtimes). |
IRIS_EMBED_BACKEND |
enum | onnx |
next call | Chooses the embedding backend for corpus embeddings: 'onnx' (the shared ONNX MiniLM, default model only) or 'sentence-transformers' (needs the optional ML extra); any other value raises an error. |
IRIS_ENABLE_COPILOT_BACKEND |
bool | off |
restart | Opts in to the GitHub Copilot cloud LLM provider (providers report available when set; copilot_auth requires exactly '1' before any network call); errors.py:20 only matches it in an error message. Guarded. |
IRIS_EVALUATOR_PORT |
url | 8090 |
restart | Port where the remote governance evaluator sidecar is probed for /healthz. |
IRIS_EVAL_SANDBOX |
enum | effect |
restart | Chooses how skill-proposal pre-flight replays are contained: effect (neutralize side effects), docker (full container), or off (no containment). Guarded. |
IRIS_EXPORT_DIR |
path | ~/.iris/exports |
restart | The one folder the web API's POST /memory/export may write under; a request names a sub-folder of it, never a path. Point it at an Obsidian vault's parent to export straight into one. Created owner-only (0700). The CLI (iris memory export --to PATH) is not limited by it. |
IRIS_FACT_EXTRACTION_MODE |
enum | llm |
next call | Set to regex to extract user facts with regex patterns instead of the LLM extractor; any other value uses the LLM. |
IRIS_FACT_HISTORY_RETENTION_DAYS |
int | 180 |
next call | Sets the default age in days used by the iris facts retention command when no --older-than value is given. |
IRIS_FAKE_MODEL_SCRIPT |
path | next call | The YAML script the scripted fake model (provider fake) answers from when no script was installed in-process (iris_harness.testing does that). |
|
IRIS_FEEDBACK_CAPTURE |
bool | off |
next call | When on, the API reports feedback_capture=true so the web UI shows the thumbs up/down answer-feedback control. |
IRIS_FEEDBACK_CLARIFY |
bool | off |
next call | When exactly '1', appends one gentle invitation to refine to an answer when the judge or router signals uncertainty (never on a confident answer). |
IRIS_FILEMANAGER_AGENT |
bool | off |
restart | When on, registers a first-class filemanager agent to answer the files intent (requires the base loop rollout on/shadow). |
IRIS_GENERAL_TOOL_MAX_TURNS |
int | 4 |
next call | Base number of tool turns (bounded 1-128) the general agent loop may take before stopping; the cap var lifts it for continuation/auth-related queries. |
IRIS_GENERAL_TOOL_MAX_TURNS_CAP |
int | 8 |
next call | Upper bound (clamped 1-128) on tool-call turns in the general tool loop, including the adaptive bump. |
IRIS_GOVERNANCE_ALLOWED_TOOLS |
list | restart | Comma-separated exact tool names the governance kernel allows; unset means no allowlist (all tools). Guarded. | |
IRIS_GOVERNANCE_APPROVALS_ENABLED |
bool | on |
restart | When on, require_approval verdicts enqueue an approval and notify channels; when off, halts are advisory only. Guarded. |
IRIS_GOVERNANCE_AUDIT_DB_PATH |
path | restart | Overrides where the governance audit ledger database is stored (default: governance data dir/audit.db). | |
IRIS_GOVERNANCE_BLOCKED_TOOLS |
list | restart | Comma-separated tool names the governance kernel blocks. Guarded. | |
IRIS_GOVERNANCE_COMMAND_SANDBOX |
bool | on |
restart | Registers the governance CommandSandbox (on by default); 0/false/no/off disables it without dropping the rest of the kernel. Guarded. |
IRIS_GOVERNANCE_CONFIRM_ONCE_TOOLS |
list | restart | Comma-separated tool names that must ask for confirmation once, added on top of each tool's own declaration; unset or 'none' adds nothing. Guarded. | |
IRIS_GOVERNANCE_COST_ENFORCE |
bool | on |
restart | When on, a call that would pass the daily cost cap is refused; off only records spend. Guarded. |
IRIS_GOVERNANCE_COST_LEDGER_DB_PATH |
path | restart | Path of the SQLite cost ledger the cost limiter writes and the cost summary reads; unset uses CostStore's default location. | |
IRIS_GOVERNANCE_COST_LIMITER_ENABLED |
bool | off |
restart | When truthy, registers the cost limiter, which records LLM spend and (with cost enforce on) refuses calls past the daily cap. Guarded. |
IRIS_GOVERNANCE_DAILY_COST_CAP_USD |
float | 5.0 |
restart | Daily spend cap in USD the cost limiter enforces when IRIS_GOVERNANCE_COST_LIMITER_ENABLED is on (unparseable values fall back to $5.00). Guarded. |
IRIS_GOVERNANCE_DISPLAY_MASK |
bool | on |
next call | Masks email addresses in displayed text and streams (on unless explicitly turned off); the audit ledger keeps originals. Guarded. |
IRIS_GOVERNANCE_DRIFT_EXEMPTIONS_DB_PATH |
path | restart | Overrides where approved goal-drift exemptions are stored; unset uses the governance data dir drift_exemptions.db. Guarded. | |
IRIS_GOVERNANCE_ENABLED |
bool | on |
restart | Enables the governance kernel (secure by default; only an explicit 0/false/no/off disables it). Guarded. |
IRIS_GOVERNANCE_EVALUATOR_MODE |
enum | local |
restart | Set to remote to have the kernel use the remote evaluator sidecar (IRIS_GOVERNANCE_EVALUATOR_URL) instead of the in-process evaluator registry; health checks then also probe the sidecar. Guarded. |
IRIS_GOVERNANCE_EVALUATOR_TIMEOUT_S |
float | 5.0 |
restart | Sets the timeout in seconds for calls to the remote governance evaluator; on failure local-tier runs fail open and cloud-tier runs fail closed. Guarded. |
IRIS_GOVERNANCE_EVALUATOR_URL |
url | http://127.0.0.1:8090 |
restart | Base URL of the remote governance evaluator used when evaluator mode is 'remote'; the CLI evaluator commands also use it. Guarded. |
IRIS_GOVERNANCE_EXTERNAL_CONTENT_FLOOR |
bool | on |
restart | On by default. Text a tool, capability or MCP server declares content: external (a web page, a feed, an email, a retrieved document) reaches the model inside an untrusted-content envelope, and a small set of deterministic patterns (instruction overrides, chat-template and tool-call syntax, exfiltration instructions, hidden characters) is redacted with a ledger row. No model, no weights, no network. Plain boolean: on is unset, blank, 1, true, yes or on; off is only 0, false, no or off (anything else stays on). The model guard (IRIS_GOVERNANCE_PROMPT_GUARD) is separate and stays opt-in. Guarded. |
IRIS_GOVERNANCE_FS_JAIL |
bool | on |
restart | Registers the governance FSJail (on by default); 0/false/no/off disables it without dropping the rest of the kernel. Guarded. |
IRIS_GOVERNANCE_GOAL_DRIFT_MAX_DISTANCE |
float | restart | Sets the goal_drift signal's max distance (0.0-2.0) before a turn is flagged; unset keeps the signal default of 0.90. Guarded. | |
IRIS_GOVERNANCE_INPUT_SAFETY |
bool | off |
restart | When truthy, screens every user turn for hazards (self-harm, violence, ...) with the output guard's Llama Guard model before anything answers it, deterministic handlers included. Follows config/governance/threat-detection.yaml mode (shadow logs, enforce refuses). Guarded. |
IRIS_GOVERNANCE_JUDGE_CLOUD_OPT_IN |
bool | off |
restart | Let judge_from_env's judge use tier_3 (cloud); production does not build that judge. |
IRIS_GOVERNANCE_JUDGE_ENABLED |
bool | off |
next call | After every agent run that used tools, a background judge scores the trace and the answer for hallucination, goal alignment, tool misuse and danger, on the model IRIS_GOVERNANCE_JUDGE_TIER picks; a halt recommendation alerts your channels, the rest go to the audit log. Guarded. |
IRIS_GOVERNANCE_JUDGE_MODEL_TIER |
enum | tier_2 |
restart | Picked a governance tier label for the judge built by judge_from_env, which production does not use. |
IRIS_GOVERNANCE_JUDGE_TIER |
str | run |
next call | Which model reviews a run: 'run' judges each run on the same route the run used (a run that stayed on local models is judged on local models); any tier name from llm_tiers.yaml (e.g. tier2, private, tier3), local or cloud, judges every run on that tier. An unknown name falls back to 'run'. Guarded. |
IRIS_GOVERNANCE_JUDGE_TIMEOUT_S |
float | 30.0 |
next call | How long one post-run review may take before it is recorded as a judge failure (non-positive or invalid values fall back to 30). |
IRIS_GOVERNANCE_LOOP_DETECT_ENABLED |
bool | off |
restart | When truthy, builds an embedder and registers the governance loop-detection signal; off by default. Guarded. |
IRIS_GOVERNANCE_MCP_ALLOWLIST |
bool | on |
restart | When on, the MCP allowlist hook enforces mcp-servers.yaml governance; 0 disables the hook entirely. Guarded. |
IRIS_GOVERNANCE_NETWORK_EGRESS |
bool | on |
restart | Enables the governance NetworkEgress control; 0/false/no/off disables it. Guarded. |
IRIS_GOVERNANCE_OWNER_PII |
enum | off |
restart | Owner-PII masking across the guards (ADR-0125): off (default) or shadow, which audits what each guard would do with the owner's name, email, phone, address and handles and changes nothing (read it with iris governance pii-shadow). Any other value, enforce included, runs shadow with a startup warning; enforce arrives kind by kind in PR 5. Guarded. |
IRIS_GOVERNANCE_PROMPT_GUARD |
bool | off |
restart | When truthy, installs the inbound and retrieved-content prompt-injection guard hooks using config/governance/threat-detection.yaml. Guarded. |
IRIS_GOVERNANCE_REDACTION_ENABLED |
bool | off |
restart | When truthy, builds the vault store the governance kernel uses to redact stored secrets from content. Guarded. |
IRIS_GOVERNANCE_SIDE_EFFECT_LEDGER |
bool | on |
restart | On (the default, the same as unset) the side-effect ledger (side_effects.db in the governance data dir, $IRIS_HOME/governance when IRIS_HOME is set, else ~/.local/share/iris) always covers the high-risk class. A destructive tool's or a pinned write's row is written before the call runs, and plain writes and reads leave no row and open no file; setting this to true or 1 does not widen that, use IRIS_GOVERNANCE_SIDE_EFFECT_LEDGER_ALL. Off denies every destructive tool and pinned write, since none may run without a durable record. Guarded. |
IRIS_GOVERNANCE_SIDE_EFFECT_LEDGER_ALL |
bool | off |
restart | Only meaningful while IRIS_GOVERNANCE_SIDE_EFFECT_LEDGER is on. On also records every other non-read call's side effect after it runs (commits, pushes, file writes, sends), on top of the high-risk class the ledger always covers. Off (the default) records the high-risk class only. With the ledger off this has no effect and logs a warning. Before this setting existed, IRIS_GOVERNANCE_SIDE_EFFECT_LEDGER=1 meant this; it no longer does. |
IRIS_GOVERNANCE_SIDE_EFFECT_LEDGER_DB_PATH |
path | restart | SQLite path for the governance side-effect ledger; unset uses side_effects.db in the governance data dir ($IRIS_HOME/governance when IRIS_HOME is set, else ~/.local/share/iris). | |
IRIS_GOVERNANCE_TRUSTED_CLOUD_FOR |
list | restart | Comma-separated data classes ('personal', 'internal') the egress gate lets reach cloud models; other values are dropped. Guarded. | |
IRIS_GOVERNANCE_VAULT_DB_PATH |
path | restart | Overrides the database path of the vault used for secret redaction. | |
IRIS_GOVERNOR_AUDIT_DB |
path | restart | Path of the governor service's audit database; unset uses the service's repo default. | |
IRIS_GOVERNOR_BASE_URL |
url | restart | Where a deployment that runs the standalone governor service says it is (docker-compose sets it). When set, the health check expects the governor to answer; unset, a desktop install that never started it is not reported as broken. | |
IRIS_GOVERNOR_POLICY_PATH |
path | restart | Path to the policy file the standalone governor service loads instead of the repository default. Guarded. | |
IRIS_GOVERNOR_PORT |
url | 8080 |
restart | Port the governor service listens on (launcher) and that the health check probes; default 8080. |
IRIS_HEALTH_ENABLED |
bool | on |
next run | Master switch for the health subsystem; off makes the health heartbeat skip. |
IRIS_HEALTH_NET_PROBE |
bool | off |
next run | When on, credential health checks make live network probes outside a manual refresh. |
IRIS_HEALTH_WATCH_ENABLED |
bool | restart | Overrides the enabled flag from config/health_watch.yaml (which defaults to true); a falsy value turns the connector health watcher off. | |
IRIS_HOME |
path | ~/.iris |
restart | Relocates the identity tree, plugin home, session logs and (when set) the governance data/config dirs. Stable. |
IRIS_INTENTION_ROLLUP |
bool | off |
restart | Turns on the local-tier intention-rollup analyst (digital-twin layer 3) that proposes rolled-up goals for approval; this env value is the default the learning console reverts to on restart. |
IRIS_INTENT_ROUTER_SEMANTIC |
bool | off |
restart | When on, an embedding classifier becomes the primary intent router (deferring to keyword/LLM when unsure) and calendar create-intent uses it. |
IRIS_INTENT_ROUTER_SEMANTIC_MARGIN |
float | 0.05 |
restart | How far the winning intent must beat the runner-up for the semantic intent classifier to decide instead of deferring. |
IRIS_INTENT_ROUTER_SEMANTIC_THRESHOLD |
float | 0.42 |
restart | Sets the minimum similarity the semantic intent classifier needs to decide an intent itself (only used when IRIS_INTENT_ROUTER_SEMANTIC=1). |
IRIS_INTERACTIVE_SESSION |
bool | on |
next call | When set to 0, approval requests are not prompted on the terminal even when stdin is a TTY. |
IRIS_INTERCEPTS_CONFIG |
path | restart | Path to the intercept chain YAML; when unset uses intercepts.yaml in the resolved config directory (IRIS_CONFIG_DIR, else the checkout's config/, else the packaged defaults). | |
IRIS_LEARNING_ANALYST |
bool | off |
restart | Turns on the local-tier agentic learning analyst that interprets learning telemetry into a report (never acts); this env value is the default the learning console reverts to on restart. |
IRIS_LEARNING_CORRECTION_JUDGE |
bool | off |
restart | When on (or outcomes.yaml user_correction.enabled), spends a governed LLM call on turns that look like corrections to judge whether the prior answer was corrected. |
IRIS_LESSON_CAPTURE_ENABLED |
bool | on |
restart | Enables capturing lessons into memory; 0/false/False disables it. |
IRIS_LESSON_DOMAIN_ALLOW |
list | restart | Comma-separated domains; when set, only lessons whose domain is in the list are captured/recalled. | |
IRIS_LESSON_DOMAIN_BLOCK |
list | restart | Comma-separated lesson domains excluded when retrieving lessons for a turn. | |
IRIS_LESSON_TOP_K |
int | 3 |
restart | Default number of lessons LessonCapture retrieves (negative values clamp to 0; invalid falls back to 3). |
IRIS_LLM_PROVIDER |
str | restart | Puts every model tier on this provider, which must be declared in the providers block of llm_tiers.yaml; fake runs everything on the scripted fake model (tests and iris email demo), offline and deterministic. |
|
IRIS_LOG_LEVEL |
enum | INFO |
restart | Sets the root logging level (e.g. DEBUG, INFO, WARNING); unknown names fall back to INFO. |
IRIS_LOG_PROMPT_CAP |
int | 8192 |
next call | Most characters of each LLM prompt message written to the session log (the middle is cut beyond it). Raise it to capture whole ReAct prompts for a model bake-off; values below 8192 are ignored. |
IRIS_MCP_KEYS_DIR |
path | ~/.config/iris/mcp-keys |
next call | Directory where the mcp CLI keeps its signing keys. |
IRIS_MCP_SERVERS_CONFIG_PATH |
path | config/coding-agent/mcp-servers.yaml |
restart | Path of the mcp-servers.yaml governance map used by the MCP allowlist hook; missing file runs the hook in degraded allow+warn mode. Guarded. |
IRIS_MEMORY_MAX_PROFILE_CHARS |
int | 8000 |
restart | Maximum characters of the curated USER.md profile injected into the memory context. |
IRIS_MEMORY_MIN_FACT_CONFIDENCE |
float | 0.35 |
restart | Facts below this confidence are dropped from memory recall; 0.0 stops dropping. |
IRIS_MEMORY_RECALL_MAX_DISTANCE |
float | 1.45 |
restart | Relevance cutoff for cross-session recall and memory_search fact results; results farther than this distance are dropped. |
IRIS_MEMORY_RECALL_MODE |
enum | push |
next call | How turns from OTHER conversations reach a prompt. push (default) puts up to 4 related turns in every prompt; pointer puts a one-line note naming up to 2 related conversations that recall_conversation can read on demand, and pushes the nearest 2 turns only when the message clearly refers back (config/memory/recall.yaml). Anything else is push. Switch back at any time. |
IRIS_MEMORY_UNCERTAIN_BELOW |
float | 0.6 |
restart | Facts recalled with confidence below this value are kept but marked uncertain ('unconfirmed') in the prompt. |
IRIS_MISSION_AUTOCREATE |
bool | off |
next call | When truthy, successful multi-step turns and recurring episodic patterns are proposed as pending missions awaiting approval. |
IRIS_OBSERVABILITY_METRICS_ENABLED |
bool | off |
next call | When on, the /observability/llm-metrics endpoint returns an LLM metrics summary; when off it returns 404. |
IRIS_OLLAMA_BREAKER |
bool | on |
next call | When on, the circuit breaker applies to local-provider LLM calls; 0/false/no/off disables it. |
IRIS_OLLAMA_PORT |
url | 11434 |
next run | Port used to reach Ollama for its health probe and the local model inventory. |
IRIS_OTEL_HTTPX_ENABLED |
bool | on |
restart | When on, instruments httpx calls for OpenTelemetry tracing (only while an OTLP endpoint is set). |
IRIS_OTEL_LANGCHAIN_ENABLED |
bool | on |
restart | Enables OpenTelemetry instrumentation of LangChain while an OTLP endpoint is set. |
IRIS_PLAYGROUND_DIR |
path | next call | Directory holding playground scenario suites; unset uses playground/ in the resolved config directory (IRIS_CONFIG_DIR, else the checkout's config/, else the packaged defaults). | |
IRIS_PLUGINS_DISABLE |
list | restart | Comma-separated plugin names removed from the active profile. Guarded. | |
IRIS_PLUGINS_ENABLE |
list | restart | Comma-separated plugin names forced on over the profile. Guarded. | |
IRIS_PROFILE |
str | default |
restart | Selects which shipped profile (config/profiles/default, or email when the email plugins are installed. Guarded. Stable. |
IRIS_PROVIDERS_CONFIG |
path | ~/.iris/providers.json |
restart | Path to the LLM providers JSON; in iris_code an empty value disables the global provider override. |
IRIS_PROXY_PORT |
url | 4000 |
restart | Port an LLM failover proxy listens on, when the deployment runs one; the health checks also use it to tell the proxy from LM Studio. |
IRIS_PUBLIC_URL |
url | next call | Absolute base URL the web console is reached at (https:// |
|
IRIS_RAG_UPLOAD_DIR |
path | <repo>/data/rag_uploads |
restart | Directory where uploaded RAG documents are stored. |
IRIS_REACT_ASK_USER |
bool | on |
restart | Lets the conversational ReAct loop pause and ask the user a question; 0/false/no/off disables the ask tool. |
IRIS_REACT_HISTORY_TOKEN_BUDGET |
int | restart | Overrides the token budget for the running ReAct transcript; unset, the harness loop derives it from the tier-2 context window and the email agent uses 3000. | |
IRIS_REACT_MAX_ITERATIONS |
int | 10 |
restart | Caps how many tool-use iterations the ReAct loops (general and email) run per turn. |
IRIS_REACT_MEMORY_TOKEN_BUDGET |
int | restart | Overrides the token budget for the memory block admitted into the ReAct loop; unset uses the context controller's window-derived budget. | |
IRIS_REACT_TIER_BUMP_TOOL_COUNT |
int | 6 |
next call | When a tier-1 intent faces more tools than this number (and governance is on), the ReAct loop borrows the multi-step (tier-2) routing intent. |
IRIS_REACT_TIMEOUT_SECONDS |
int | 120 |
restart | Timeout in seconds for the ReAct agentic loop (general and email agents). |
IRIS_REACT_TOOL_CAP |
int | 12 |
next call | Maximum number of tools shortlisted into the ReAct tool menu each turn. |
IRIS_RECENT_TURNS_BUDGET_SHARE |
float | 0.45 |
restart | Sets the share of the memory token budget the live conversation transcript may fill. |
IRIS_RESEARCH_AGENT |
bool | off |
restart | Registers the dedicated research persona and remaps the 'search' intent to it; off by default. |
IRIS_RESTART_ON_REQUEST |
bool | on |
restart | Under a supervisor, whether this server exits when the app's Restart harness asks. A deployment whose governor owns the network namespace the other services share sets it off on the governor. |
IRIS_ROUTINE_REFLECTION |
bool | off |
next run | When on, each routine-reflection heartbeat run posts approval requests proposing changes to failing/stale routines (never mutates a routine). |
IRIS_RUNTIME_TELEGRAM_POLLER_ENABLED |
bool | off |
restart | When set, explicitly decides whether the runtime's own Telegram poller starts; unset defers to the inverse of IRIS_CHANNEL_GATEWAY_TELEGRAM_ENABLED. Guarded. |
IRIS_SANDBOX_EGRESS_ALLOWLIST |
list | next call | Comma-separated hosts the code sandbox may reach; unset uses the built-in default list (PyPI, GitHub, Yahoo quotes). Guarded. | |
IRIS_SANDBOX_PREFLIGHT |
bool | off |
next run | When on, promoted experiments are replayed through an isolated eval runtime under baseline vs variant and the verdict is stamped; the change is never applied. |
IRIS_SANDBOX_RUNTIME |
enum | restart | Overrides the code sandbox runtime with docker, gvisor or firecracker (otherwise config/governance/sandbox.yaml, default docker). Guarded. | |
IRIS_SEARCH_SYNTHESIS_MODEL |
str | gpt-5-mini |
restart | Copilot model used for cloud search synthesis when IRIS_SEARCH_SYNTHESIS_PROVIDER=copilot and IRIS_ENABLE_COPILOT_BACKEND is set. Guarded. |
IRIS_SEARCH_SYNTHESIS_PROVIDER |
enum | restart | Set to 'copilot' (with IRIS_ENABLE_COPILOT_BACKEND) to synthesize search results with a GitHub Copilot cloud model (default gpt-5-mini) instead of the local search tier. Guarded. | |
IRIS_SECRET_BACKEND |
enum | keyring |
next call | Chooses where secrets are stored: the OS keyring or the Fernet-encrypted vault. Guarded. |
IRIS_SESSION_LOG_DIR |
path | $IRIS_HOME/logs (~/.iris/logs) |
restart | Directory where session logs are written. |
IRIS_SESSION_MEMORY_MAX_SESSIONS |
int | 256 |
restart | How many conversations keep their live window in the server's memory; the least recently used beyond this are dropped and reload from the memory store on their next turn. |
IRIS_SETTINGS_SIDECAR_CATALOGS |
path | restart | Settings catalogs (YAML files separated by the path separator, each naming its owner) of processes the deployment runs beside the harness, such as an LLM proxy; the app lists their settings and leaves changing them to that process's environment. | |
IRIS_SKILL_HOTRELOAD |
bool | off |
restart | When truthy, watches the skills directory and reloads skills when their files change. |
IRIS_SKILL_ROUTER_SEMANTIC |
bool | on |
restart | When on, routine authoring and briefing-section extraction use an embedding-based SemanticSkillRouter; off forces the legacy keyword scorer. |
IRIS_SKILL_ROUTER_THRESHOLD |
float | 0.45 |
restart | Embedding-similarity threshold the semantic skill router uses to match a request to a skill (default 0.45 from semantic_router.py:29). |
IRIS_SKILL_SYNTHESIS |
bool | off |
restart | When on, the crystallizer uses a local-tier LLM to synthesize skills instead of falling back to a scaffold. |
IRIS_STANDING_INSTRUCTIONS |
bool | on |
next call | When on, a chat message that teaches a rule is saved as a behavior and honored on later matching turns. |
IRIS_SUPERVISED |
bool | off |
restart | Set by a deployment whose supervisor restarts every server that exits (a compose file with restart policies, for example); only then may the app's Restart harness ask the servers to exit. |
IRIS_SYNC_MEMORY_BLOCKING |
bool | off |
restart | When on, the startup memory-to-index sync runs inline before build_runtime returns instead of on a background thread. |
IRIS_SYNC_WIKI_BLOCKING |
bool | off |
restart | When on (and wiki ingest is enabled), re-indexes wiki pages synchronously at startup instead of in a background thread. |
IRIS_THREAT_DETECTION_CONFIG |
path | config/governance/threat-detection.yaml |
restart | Overrides the path of the threat-detection (prompt guard) YAML config. Guarded. |
IRIS_TZ |
str | UTC |
restart | The owner's IANA time zone (e.g. America/Chicago). The morning digest's time, reminders and schedules are read in it; the Docker Compose files also set the container clock (TZ) from it. Unset or not a zone name means UTC. Stable. |
IRIS_USER_ID |
str | local |
restart | User id under which LLM spend is recorded and summed against the daily cost cap. Guarded. |
IRIS_VAULT_MASTER_KEY |
secret | restart | Fernet master key for the credential vault and the file vault, used instead of the OS keyring. Guarded. Stable. | |
IRIS_VAULT_PASSPHRASE |
secret | next call | Passphrase from which the encrypted-file vault key is derived (scrypt) when IRIS_SECRET_BACKEND=vault; unset uses a keychain-held key. Guarded. | |
IRIS_WEBUI_ALLOW_WRITES |
bool | off |
next call | Allows gated control writes from callers without a paired device (shared secret or no credentials); paired devices are judged by their own scope regardless. Guarded. |
IRIS_WEBUI_DIST |
path | /app/webui/dist |
restart | Directory the API serves the built web UI from; without an index.html there the UI is not served. |
IRIS_WEBUI_PORT |
int | 5181 |
next call | Port the setup wizard's closing "open the web UI" hint shows; it reads this to reflect a custom port mapping but does not itself change which port the web UI binds to. |
IRIS_WEB_PUSH_SUBJECT |
url | https://github.com/evarness-ai/iris-harness |
next call | Contact subject (URL or mailto) sent in Web Push VAPID claims. |
IRIS_WEB_PUSH_VAPID_PRIVATE_KEY |
secret | next call | PEM EC private key used to sign web push requests instead of the generated key file; changing it breaks existing subscriptions. Guarded. | |
IRIS_WIKI_INGEST |
bool | off |
restart | When on, chat turns and classified emails are automatically ingested into wiki pages and pages are re-embedded at startup. |
From plugin code_exec
| Variable | Kind | Default | Applies | Description |
|---|---|---|---|---|
IRIS_CODE_EXEC_MAX_ITERATIONS |
int | 8 |
next call | Sets the base number of loop iterations a code_exec task gets (bounded 1-128; the cap env is raised to match if lower). |
IRIS_CODE_EXEC_MAX_ITERATIONS_CAP |
int | 14 |
next call | Sets the maximum iteration budget for a code_exec loop (clamped 1-128, never below IRIS_CODE_EXEC_MAX_ITERATIONS). |
From plugin email_workflows
| Variable | Kind | Default | Applies | Description |
|---|---|---|---|---|
IRIS_DEMO_HOME |
path | next call | Where iris email demo keeps its own isolated IRIS home (default ~/.iris-demo); never the owner's profile. Stable. |
|
IRIS_EMAIL_DEFAULT_SENDER |
str | next call | Names the connected mail account (address or account id) a new email is sent from when no sender is given; if it names an unconnected account the send is refused, and when unset the first account in sorted order is used. | |
IRIS_EMAIL_JUDGE |
bool | on |
next run | When on (default), the email judge sorts each new non-promo email into Bill, Event, Needs reply, FYI or Unsure three times a day, on a local model only. New email stays hidden until it is judged, so off means new email waits and stays hidden. Stable. |
IRIS_EMAIL_JUDGE_LABELS |
bool | on |
next run | When on (default), each judged email gets one IRIS/ label in Gmail (never archived, never marked read); off keeps the judgments in IRIS only. Stable.* |
IRIS_EMAIL_JUDGE_MAX |
int | 100 |
next run | The most emails the judge reads in one run; the rest wait, hidden, and are judged first next run. |
IRIS_EMAIL_JUDGE_UNSURE_BELOW |
float | 0.7 |
next run | A judgment less sure than this is filed as Unsure and asked on an Action Center card. Stable. |
IRIS_EMAIL_SEMANTIC_SEARCH |
bool | on |
restart | When on (default), the email tools search by meaning as well as by words, the index follows new mail, and a heartbeat fills in older mail in small batches; 0 turns it off. |
IRIS_FOLLOWUP_ACTIONABLE_ROOTS |
list | next call | Comma-separated email category roots that may create follow-up tasks; unset uses personal, work, finance, jobs, travel, community. |
From plugin research
| Variable | Kind | Default | Applies | Description |
|---|---|---|---|---|
IRIS_REDIS_URL |
url | redis://localhost:6379/0 |
restart | Redis URL for the research result cache when the Redis backend is selected. |
IRIS_RESEARCH_CACHE |
enum | sqlite |
restart | Selects the research cache: sqlite (default), redis (falls back to sqlite), or off/none to disable. |
IRIS_RESEARCH_CRAWLER |
enum | trafilatura |
next call | Selects the research page extraction backend: crawl4ai, otherwise trafilatura fetch-and-extract. |
IRIS_RESEARCH_NEWS_SOURCES |
path | plugins_builtin/research/news_sources.yaml |
next call | Path of the YAML file giving per-domain trust scores for news search ranking. |
IRIS_RESEARCH_RERANKER |
enum | restart | Set to bge or cross-encoder to rerank research results with a cross-encoder; any other value leaves order unchanged. | |
IRIS_RESEARCH_RERANKER_MODEL |
str | BAAI/bge-reranker-base |
restart | sentence-transformers CrossEncoder model used to rerank research results when IRIS_RESEARCH_RERANKER is 'bge' or 'cross-encoder'. |
IRIS_SEARXNG_URL |
url | next call | Base URL of a self-hosted SearXNG instance; when set it becomes the first research search provider. |
From plugin web_channel
| Variable | Kind | Default | Applies | Description |
|---|---|---|---|---|
IRIS_WEB_SESSION |
str | default |
restart | Web chat session id that channel messages without a recipient (e.g. heartbeat notices) are delivered into. |