From facts to signals to automations
Raw text is a bad memory format. Store transcripts and hope embeddings find the right passage later, and you inherit every ambiguity of the original conversation forever. Illumina structures memory into three layers, each one a compression of the layer below it.
Layer one: typed facts
Commit runs LLM extraction with forced tool use. The model must call an extract_facts tool; it cannot answer in prose. Every fact arrives as structured output with a type, a timestamp, its entities, and any causal relations it asserts. Structured extraction, not embed-and-pray.
Each fact carries one of four types. knowledge is the default: objective, external facts. experience is first-person: what the agent did and saw. decision is a durable commitment with a lifecycle. signal is synthesized by the system and never written directly. Set fact_type on a commit item to classify deterministically instead of leaving it to the model.
Entity resolution runs at write time. Trigram matching catches surface variants ("Sarah Chen", "schen", "Sarah"), and co-occurrence plus temporal scoring decides whether two mentions are the same person or two people who share a name. Facts then get linked to each other by typed edges: temporal, semantic, entity, causal, and supersedes. The causal edges are what let search answer "why" questions by walking the graph instead of guessing from adjacency. supersedes is what keeps a decision's history intact when a later decision overrides it, so search returns what the team decided most recently and can still show what it replaced.
Layer two: signals
Individual facts are noisy. One standup comment saying the billing service caused a checkout incident might be wrong. Four facts from different sources saying the same thing is a pattern.
A background consolidation pass groups corroborating facts into signals. Each signal links to its source facts, so it is auditable down to the original inputs, and search can inline them with include_source_facts:
Facts: "Ada fixed the payments retry bug", "Ada shipped the payments rewrite", "Ada reviewed the payments oncall runbook"
Signal: "Ada is the payments domain expert."
Consolidation is incremental and idempotent. It does not duplicate signals for evidence it has already folded in, and corroboration feeds retrieval: search scores a signal by the weight of every source fact behind it, so a well-evidenced pattern outranks a one-off remark on the same topic.
Layer three: automations
Facts and signals are still granular. An automation is the synthesized document above them: "how our deploy pipeline works", "what the enterprise segment keeps asking for", "what the payments team decided this week". It is a standing illuminate query, and it re-runs as new memories land, so the document stays current without anyone polling for it. Clear one and the next refresh does a full re-synthesis from scratch.
Illuminate reads all three
Illuminate is the reasoning operation, and it works across every layer: automations for the shape of things, signals for the evidence, raw facts for the specifics. Two controls steer it per namespace. Dispositions set temperament on a 1-to-5 scale across skepticism, literalism, and empathy, so a compliance namespace can demand strong evidence while a brainstorming namespace stays loose. Directives are hard rules with no scale: "never speculate about unreleased pricing" binds regardless of disposition.
Every illuminate answer cites what it was based on. The facts and signals behind a conclusion come back with it, so you can check the reasoning instead of trusting it.
Three layers, one guarantee: nothing in the stack is more than one hop from the evidence that produced it.