Skip to main content
IronBee stores its state in a few places: a global directory in your home folder, an .ironbee/ directory inside each project, and a per-session runtime tree that by default lives outside the project. This page is a reference for what lives where, and what’s safe to commit.

Global (~/.ironbee/)

Machine-wide state, shared across all your projects:

Project (<project>/.ironbee/)

Created by ironbee install in each project: ironbee install adds .ironbee/sessions/, .ironbee/otel/, and .ironbee/config.local.json to your project’s .gitignore automatically. These are machine-local runtime state and personal overrides, not something you commit. The committed config.json, scenarios/, and any VERIFICATION.md files are what your teammates pick up when they run ironbee install.

Where per-session data lives

The per-session runtime tree (sessions/<id>/) is controlled by runtime.location: Either way the contents of sessions/<id>/ are identical — only the base directory differs. Committed config (config.json, config.local.json, scenarios/, VERIFICATION.md) and the transient otel/ dir always stay in-project, regardless of runtime.location. Switch layouts with ironbee config set runtime.location in-project or the IRONBEE_RUNTIME_LOCATION env var; it takes effect on the next session.

Per-session (sessions/<id>/)

Each agent task gets its own directory, keeping concurrent sessions isolated (see How verification works):

Per-agent state (agents/<agentId>/)

A session usually has more than one actor: the main agent, and the delegated sub-agents IronBee installs (ironbee-verifier, ironbee-scenario, ironbee-issue-tracker). Everything an individual agent writes is partitioned under its own agents/<agentId>/ directory so concurrent writers — say a verifier running in the background while the main agent keeps working — never clobber each other’s state. The <agentId> is the host’s opaque agent/thread id (only the main conversation is literally main); the human-readable agent name travels separately, as cycle.json’s owner and the agent_name on shipped events.
Not every file is present in every session, and these persist after a session ends (they aren’t auto-deleted). Sessions from older CLI versions kept actions.jsonl at the session root — that file is still merged in for a session in flight across the upgrade, but new writes all land under agents/ (a pre-upgrade root verdict.json is no longer read; verdicts are looked up only under agents/<agentId>/). You rarely touch any of this directly: use ironbee status to read verdicts and ironbee queue to inspect pending sends.

What’s next?

Configuration

Every key you can set in the config files.

Environment variables

Overrides that take precedence over the config files.