Skip to content

Runtime model

Frigg combines regenerable repository state under .frigg/ with session and task state inside the running MCP process. Keeping those layers separate explains why two clients can share one index while retaining different session defaults.

Each indexed repository has one SQLite store:

.frigg/storage.sqlite3

The store contains manifest snapshots, retrieval projections, symbols, semantic rows, vectors, navigation data, and provenance. Treat it as regenerable runtime state, not source or a secret store.

Optional precise-navigation state uses:

.frigg/scip/
.frigg/precise.json
.frigg/tmp/precise-generation/

Frigg honors the repository root’s .gitignore and .ignore files and always excludes .frigg, .git, and target from normal source indexing.

The MCP process owns the repository registry, runtime tasks, watch supervisor, caches, and active tool surface. Each MCP session separately tracks:

  • its adopted repositories
  • its session-default repository
  • result handles and targets issued to that session

Repository-aware tools normally resolve an omitted repository_id from the session default. The workspace tool reports the current repository, repositories visible to the session, runtime tasks, watch status, exposed tools, and the authoritative freshness state.

Transport Process shape Watch default Best fit
Loopback HTTP One long-lived service shared by clients Service profile with watch support Multiple clients, subagents, shared caches, and post-edit refreshes
Stdio One client owns one Frigg subprocess Off unless explicitly enabled One ephemeral local client

Start the shared HTTP service with:

Terminal window
frigg serve

Its default endpoint is http://127.0.0.1:37444/mcp. Stdio remains supported, but several stdio processes do not share in-memory caches, sessions, or watch leases and can contend for the same SQLite writer.

Built-in watch mode observes repositories adopted by active sessions while watcher leases exist. A source change first queues a manifest-fast refresh. When semantic runtime is enabled, a successful manifest refresh can queue a semantic follow-up.

Watch settings control the debounce delay, retry delay, and concurrency of those two refresh classes. Watch updates .frigg/storage.sqlite3; it does not create a second index.

A usable snapshot does not require an active watch. Watch answers whether Frigg can converge after edits without operator action; snapshot freshness answers whether the indexed evidence is currently usable. See Freshness and evidence.

The public MCP surface has no reindex or other write tool. Use workspace for status and repository adoption. Use CLI maintenance when storage is missing, uninitialized, or erroneous:

Terminal window
frigg init
frigg index

Normal source inspection does not edit project source. Frigg can still update ignored .frigg/ state, and optional precise generators can execute repository or PATH-discovered tools and write artifacts.

Semantic retrieval and precise navigation are accelerators, not prerequisites:

  • Semantic retrieval is off by default. Lexical, path, symbol, graph, structural, and source evidence remain available without it.
  • Precise navigation uses optional SCIP or JSON graph artifacts. Frigg falls back to source-backed heuristic navigation when artifacts or generators are unavailable.
  • ../frigg/README.md
  • ../frigg/crates/cli/src/settings/runtime_profile.rs
  • ../frigg/crates/cli/src/settings/watch.rs
  • ../frigg/crates/cli/src/mcp/types/workspace.rs
  • ../frigg/crates/cli/src/mcp/server/workspace_freshness.rs
  • ../frigg/crates/cli/src/mcp/types.rs
  • ../frigg/crates/cli/src/workspace_ignores.rs