> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ruminate.so/llms.txt
> Use this file to discover all available pages before exploring further.

# How it works

> Static analysis produces facts. Interpretation produces project knowledge.

Two layers, kept deliberately apart.

## Static analysis

`lib/analysis` reads the repository with ts-morph and produces facts — imports, exports, symbols, the client/server boundary, the dependency graph. Nothing here is an interpretation.

This is what runs when you connect a repository or run `npm run refresh`.

## Semantic interpretation

`lib/llm` turns those facts into systems and concepts — the first map of **project knowledge**.

* For a **hosted analysis**, it is generated from a *structural digest*, never from the source of the whole repo.
* For an **agent on your machine**, the digest is a brief. The agent is expected to open the real files, then submit through [MCP](/mcp).

A good interpretation names systems the way a maintainer would in conversation, explains why this codebase ends up at an idea, and cites only line ranges that actually exist.

## One capability list

Everything the product can do lives in `lib/services`. The web app and the MCP server both call those functions. Adding a surface later means wrapping the same list, not rewriting it.

<Warning>
  Refresh refuses rather than degrades. If the code has moved far enough that the stored interpretation no longer resolves, it says so and asks for a full re-analysis.
</Warning>
