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):
AGENT_VAULT_PATH— absolute path wins.AGENT_OBSIDIAN_DISCOVER=1— read Obsidian’s globalobsidian.jsonand pick a vault only when unambiguous (single vault, singleopen: true, or unique latestts).- Fallback —
~/.agent_vaultwith 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
| Tool | Role |
|---|---|
vault_write | Long briefs, linked research, episode logs |
vault_read / vault_search | Load or keyword-search vault bodies |
vault_links / vault_graph | Backlinks and graph traversal |
remember / forget | Atomic facts in .agent_notes.json |
recall_relevant | Hybrid ranked retrieval across notes and vault |
memory_graph | BFS from a seed key over links[] edges |
memory_query | Exact / type / graph modes when structure matters |
curate_memory | LLM prune plan + deterministic veto (dry-run default) |
Comparison table
Activate memory_advanced and vault families if lazy loading hides them (list_tool_families → activate_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
- Start a task: ask the agent to
vault_writea project brief with links to architecture notes. - Mid-refactor:
recall_relevant({ query: "auth middleware decisions", scope: "both" })surfaces vault + prior reflections. - End of week:
curate_memory({ dry_run: true })to see stale facts; promote durable items withmemory_promoteif needed. - 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_writebeats assumingAGENT_MEMORY_AUTO_EXTRACT. - Liminal AI (Vireon Dynamics) is unrelated to the liminal.ai application-security vendor; disambiguate in docs and search.