- Understand what SOUL.md, MEMORY.md, and USER.md store and how each is used.
- Write an effective SOUL.md for a financial research use case.
- Understand the distinction between memory (durable facts) and skills (reusable procedures).
- Trigger and observe Hermes writing a skill for itself, live.
Why Memory Matters
A model without persistent memory starts from zero every conversation, fine for one-off questions, frustrating for a daily tool. Hermes treats memory as a first-class feature instead:
- Three persistent files, plus a searchable conversation history
- All read before every conversation
- Written to whenever it learns something worth keeping
SOUL.md: The Agent's Identity
SOUL.md is the foundation, a system prompt you edit directly. It doesn't need to be long, it needs to be precise.
Effective SOUL.md Structure
| Element | Example |
|---|---|
| Persona | "You are a financial research assistant focused on Indonesian and Singaporean equities." Short and specific, not generic. |
| Scope | "Always pull live data from Sectors before answering about a specific stock. Don't speculate about future prices." |
| Output format | "Keep responses concise. Use tables for comparisons. Express prices in IDR." Followed reliably once it's in SOUL.md. |
| Action guardrails | "Before writing any file, email, or message, confirm with the user first." An extra layer on top of command approval. |
You are a financial research assistant focused on Indonesian equities. Before answering any question about a specific stock or sector, always retrieve live data from Sectors. Do not rely on training data for price, ratio, or earnings information. Format numbers in IDR where relevant. Keep responses concise unless the user asks for a full breakdown. Always cite which tool you used to retrieve data. Before executing any write operation (files, emails, calendar), confirm with the user first.
MEMORY.md: The Persistent Knowledge Base
MEMORY.md is where Hermes stores facts it decides are worth keeping between sessions.
Examples of what ends up here after regular use:
"User tracks BBCA, BMRI, and TLKM as their core watchlist." "User prefers P/E and ROE as primary screening ratios." "When summarizing earnings, lead with net income, not revenue." "User is most interested in Indonesian banking and telecom sectors."
Hermes writes to MEMORY.md via the same background review that creates skills, on the four triggers from Module 02. Write to it manually too, anything you add is picked up next conversation.
USER.md: A Model of You
USER.md is built entirely automatically. Hermes updates it as it learns about how you communicate and what you care about.
| Field | Example value |
|---|---|
| Communication style | Prefers bullet points, dislikes lengthy preamble |
| Work context | Focus on Indonesian banking sector |
| Recurring tasks | Morning Sectors briefing every weekday |
| Response preference | Tables for multi-company comparisons |
| Terminology | Uses "IDR" not "Rupiah" in messages |
Read and edit USER.md any time. Wrong model of you, or needs changed? Update the file directly, edits take effect next conversation.
How Recall Works
SOUL.md, MEMORY.md, and USER.md are read at the start of every conversation, small enough to be cheap. Past conversations live in a separate store, searchable through session_search rather than loaded wholesale.
hermes memory reset only clears MEMORY.md and USER.md, not conversation history. Use --target conversations or --target everything for a genuinely clean slate.
Case: the bedtime-story memory bug
hermes memory reset only cleared the two files, conversation history still let session_search find old patterns. The --target option was added to fix it.
Skills: The Other Kind of Memory
MEMORY.md and USER.md store facts. Skills store procedures. A background review, run after each turn, writes a SKILL.md file on its own on one of the four triggers from Module 02, or you can trigger one explicitly with /learn.
skills.write_approval stages every write for your review instead of committing automatically.
Watching a Skill Get Created
A deliberately messy script and CSV, chosen because it reliably hits three of the four trigger conditions at once rather than depending on just one.
import csv
def process_sales(filename):
totals = {}
counts = {}
with open(filename) as f:
reader = csv.DictReader(f)
for row in reader:
category = row["category"]
amount = float(row["Amount"])
totals[category] = totals.get(category, 0) + amount
counts[category] = counts.get(category, 0) + 1
for category in totals:
avg = totals[category] / counts[category]
print(f"{category}: average sale = {avg:.2f}")
process_sales("sales_data.csv")
category,amount Electronics,120.50 Groceries,45.00 Electronics,89.99 Groceries,N/A Electronics,150.00 Groceries,32.75
Use a throwaway profile so it doesn't pollute a skill set elsewhere.
Run process_sales.py, which reads sales_data.csv, and make sure it correctly computes the average sales per category. Fix any errors you encounter, including any bad data in the file.
First a KeyError from the header case mismatch (row["Amount"] vs the CSV's lowercase amount), then a ValueError from the N/A value in a Groceries row. It fixes both, reruns, and confirms clean output.
Give it a genuine minute, not a few seconds, the write lands with no notification and an early check just looks broken. Then run hermes skills list (default, off approval) or /skills pending (if approval is on). Expect something generalized, like a data-pipeline-debugging skill, not just a note about this one script.
Compared to Other Approaches
In Hermes, memory is always on, nothing to install or configure, created automatically on first run. OpenClaw's Gateway also maintains memory as a core feature, the main difference is Hermes's three files are plain, directly readable and editable text.