Liminal can treat your Obsidian vault as durable, link-rich memory — not just ephemeral chat context. This post explains what the harness actually does: vault resolution, tools, recall_relevant scoring, and federation across chats.

For the full walkthrough with setup steps, see the Obsidian + agent memory use case. Technical reference: Liminal docs.

Two layers: session notes vs vault markdown

Structured notes live in .agent_notes.json with typed keys (fact:, reflection:, user:, etc.). Each note has scope: chat (one conversation), workspace (sibling chats sharing a workspace fingerprint), or global (identity-style facts). The ranker applies AGENT_RECALL_SIBLING_DISCOUNT (default 0.85) so your current chat wins ties but sibling projects still surface when relevant.

The vault is standard Obsidian markdown on disk. vault_write creates files under typed folders — Facts/, Entities/, Reflections/, Recipes/, Tasks/, Notes/, Episodes/ — with YAML frontmatter (title, type, tags, created, updated) and a markdown body. Wikilinks [[Exact Title]] work in Obsidian and in agent-generated briefs.

The protocol tells the model to query memory and vault before opening the public web for factual tasks.

How Liminal finds your vault

Resolution order (from vault_store.ts and obsidian_vault_discovery.ts):

  1. AGENT_VAULT_PATH — absolute path wins.
  2. AGENT_OBSIDIAN_DISCOVER=1 — read Obsidian’s global obsidian.json and pick a vault only when unambiguous (single vault, single open: true, or unique latest ts).
  3. Fallback~/.agent_vault with the folder layout above.

If you run multiple vaults, set AGENT_VAULT_PATH or AGENT_OBSIDIAN_VAULT_NAME_SUBSTRING so the harness does not guess wrong.

AGENT_VAULT_PATH=C:/Users/you/Documents/WorkVault
AGENT_MEMORY_GRAPH=1
AGENT_EMBED_MODEL=qwen/qwen3-embedding-8b

Tools you will see in traces

ToolRole
vault_writeLong briefs, linked research, episode logs
vault_read / vault_searchLoad or keyword-search vault bodies
vault_links / vault_graphBacklinks and graph traversal
remember / forgetAtomic facts in .agent_notes.json
recall_relevantHybrid ranked retrieval across notes and vault
memory_graphBFS from a seed key over links[] edges
memory_queryExact / type / graph modes when structure matters
curate_memoryLLM prune plan + deterministic veto (dry-run default)

Comparison table

Activate memory_advanced and vault families if lazy loading hides them (list_tool_familiesactivate_tool_family).

Inside recall_relevant (not magic)

recall_relevant requires query= or queries= — passing only scope= returns an error. Multiple queries fuse with reciprocal rank fusion (RRF).

For notes, ranking blends BM25, recency, note type, confidence, and access counts into hot/warm/cold tiers. When AGENT_EMBED_MODEL is set:

  • Note embeddings → ~/.liminal/memory.index.json
  • Vault paragraph embeddings → ~/.liminal/vault.index.json

Scores combine semantic, RRF, and BM25 weights (AGENT_RECALL_WEIGHTS, default roughly 45% / 35% / 20%). Optional HyDE embeds a hypothetical answer for better paraphrase match. expand_vault_neighbors pulls linked vault notes from top hits.

Output includes provenance: (own chat), (sibling chat <id>), or (global) so you can audit what influenced the model.

Graph, curation, and auto-dream

With AGENT_MEMORY_GRAPH=1, memory_graph(seed) walks linked structured notes — useful after recall surfaces a key like reflection:migration-plan.

curate_memory({ dry_run: true }) shows what an LLM would prune; harness vetoes protected keys (user:, identity:, pref:), high-access notes, and young notes. Deletes archive to notes.archive.json when AGENT_MEMORY_ARCHIVE is on; restore_memory recovers.

AGENT_AUTO_DREAM (off by default) consolidates idle sessions into memory/vault. consolidate_chat runs the same pipeline on demand for one chat’s JSONL.

A workflow that compounds

  1. Start a task: ask the agent to vault_write a project brief with links to architecture notes.
  2. Mid-refactor: recall_relevant({ query: "auth middleware decisions", scope: "both" }) surfaces vault + prior reflections.
  3. End of week: curate_memory({ dry_run: true }) to see stale facts; promote durable items with memory_promote if needed.
  4. Open Obsidian — everything is normal markdown you own.

Honest limits

  • Embedding calls go to your configured embed provider unless you point at a local endpoint.
  • The agent will not auto-save everything — explicit remember / vault_write beats assuming AGENT_MEMORY_AUTO_EXTRACT.
  • Liminal AI (Vireon Dynamics) is unrelated to the liminal.ai application-security vendor; disambiguate in docs and search.

Install Liminal · Compare vs Continue · OpenRouter guide