Learning Objectives
  • 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.
A vague SOUL.md makes a vague agent. Start focused, loosen constraints later, it's easier than adding discipline after the fact.
SOUL.md: Financial Research Example
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:

Example MEMORY.md entries
"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
A real bug surfaced this: a user asked Hermes for a bedtime story, then asked again days later and got the same protagonist, even after a memory reset. 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.

Not fine-tuning, not a change to the model itself. Just an external markdown file, re-read into context later. For tighter control, 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.

process_sales.py
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")
sales_data.csv
category,amount
Electronics,120.50
Groceries,45.00
Electronics,89.99
Groceries,N/A
Electronics,150.00
Groceries,32.75
1
Save both files and ask Hermes to fix it

Use a throwaway profile so it doesn't pollute a skill set elsewhere.

Prompt
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.
2
Watch it fix two real bugs

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.

3
Wait, then check for the new skill

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.

! Do a private dry run before demoing this live.

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.