Skip to content

Common setup gotchas

The snags people hit between installing IRIS and a working inbox assistant, each with its cause and the fix. Run iris doctor first: it names most of these and prints the fix for each one.

Installing

iris: command not found after the install. uv and pipx put iris in ~/.local/bin, which a fresh machine often does not have on its PATH. Run uv tool update-shell (or pipx ensurepath) and open a new terminal; the change applies only to shells started afterwards. See Install.

uv or pipx is not installed. Neither ships with Python. If you have pip, pip install uv is the shortest route.

The wrong Python. IRIS needs Python 3.12 or 3.13. On 3.14 or later, Poetry says "The currently activated Python version is not supported by the project" and looks for a compatible interpreter; uv tool install fetches one for you. From a clone, install 3.12 or 3.13 first (.python-version pins 3.12).

Windows. Native Windows is not supported; iris doctor reports "Not ready". Use WSL2.

Reading iris doctor

"Ready for the demo only." and exit code 1 is normal right after installing. The demo runs on a scripted model, so it needs none of what real use needs: Ollama, the starter model, a vault master key and 16 GB of RAM. Only "Not ready." (exit 2) means the machine itself must change first.

The vault master key is missing. Every governed tool call needs it, so without it IRIS refuses them. iris doctor --fix creates one, and never overwrites a stored key. On macOS it goes in the Keychain. On Linux with no keyring (WSL2, a headless server) it prints an export IRIS_VAULT_MASTER_KEY=... line: put it in your shell profile and keep a copy, because the vault cannot be read without the key.

--fix did not pull the email judge's model. It pulls only the general starter model. The email judge is pinned to a smaller one that iris doctor does not check. Without it, the "Classify" step of iris email setup stops with "no local email_judge model tier is configured". Run ollama pull qwen3.5:4b-q4_K_M. The demo is unaffected.

Connecting a mailbox

iris email setup says "No mailbox is connected yet". Setup never asks for a password and runs no login itself; it takes an account that is already connected. Connect one first with iris auth imap login --user you@example.com (an app password) or iris auth gmail login --user you@gmail.com, then run iris email setup again. To see the flow without an account, run iris email demo.

Outlook.com and Microsoft 365 cannot be connected. IRIS logs in to IMAP with an app password and does not do OAuth over IMAP, and both require OAuth. Provider notes, with the server and port for each, are in Connect your mailbox.

There is no app-password option for Gmail. App passwords need 2-Step Verification, and are not offered for work or school accounts, Advanced Protection, or security-key-only 2SV. Use Gmail with OAuth instead, which takes a one-time Google Cloud client of your own.

Setup stopped and exited 3. That means it is waiting, for your decision or for something outside setup, not that it failed. Run iris email setup again and it picks up where it stopped. Exit 2 is bad input.

Nothing changed in my mailbox. That is by design: every write is refused until you approve it once per account. iris email writes status shows where you stand and iris email writes approve --account <id> gives the approval.

Running the services

Every request is refused. The IRIS API, the Governor and the channel gateway refuse every request, rather than run open, when IRIS_AUTH_SECRET is unset or blank. Set it before iris serve, and use the same value in every shell that talks to that API (iris device pair and iris status included). A fresh openssl rand in a second shell is a different secret.

The web console is blank from a clone. A bare git clone and poetry install has no console: iris serve answers /chat, but http://localhost:8003 shows nothing until you build it. See the email assistant guide.

A "Governor not reachable" banner. Expected if you started only iris serve. The Governor is an optional, separate front for the governance kernel that iris serve already runs in-process.

Working on IRIS

Tests fail at import or write into your real profile. The suite needs IRIS_AUTH_SECRET and IRIS_DISABLE_WARMUP=1 set, and relocates IRIS_HOME before anything imports. User state resolves IRIS_HOME through iris_harness.foundation.paths, never Path.home().

export IRIS_AUTH_SECRET="test-secret-for-testing" IRIS_DISABLE_WARMUP=1
poetry run pytest tests/unit/<the path you changed>

The demo does nothing the second time. It remembers: run it again and nothing is fetched or judged twice. iris email demo --reset deletes the demo home and starts over. The demo ignores your own IRIS_* settings on purpose, and never touches your profile.