The four memory types
Every memory has a type, set when the agent writes it with memory_type. The type decides how the memory is stored and kept, not how it scores. All four types carry significance and the STARE dimension scores in the same way.
| Type | Holds | Example |
|---|---|---|
semantic (the default) |
Facts, preferences, decisions | Zephyr Logistics renews its support contract every March. |
episodic |
Something that happened, at a point in time | Dana from Zephyr escalated ticket 4411 on the call today; we agreed a workaround. |
procedural |
How to do something the agent can do | To issue a refund, run scripts/refund.sh with the order id. |
commitment |
Something the agent owes, with a due date or schedule | Send Zephyr Logistics the renewal quote by October 20. |
Semantic: what is true
Section titled “Semantic: what is true”Semantic memory is the default; a mm_remember call without memory_type stores one. Use it for anything that stays true until something changes it: a customer’s preferences, a decision, how a system is set up.
The category argument (fact, decision, preference, observation and so on) sorts semantic memories further. It decides which section of the compiled memory file a memory appears under, such as Core Facts or Key Decisions.
Episodic: what happened
Section titled “Episodic: what happened”An episodic memory records an event: a call, an incident, a release. Write one when when it happened is part of the meaning.
mm_remember({"source": "agent", "text": "Dana from Zephyr Logistics escalated ticket 4411 on the call today; we agreed a workaround.", "memory_type": "episodic", "category": "episode"})To list an agent’s events, filter search by type:
mm_search({"memory_type": "episodic"})| # | mem_id | Sig | Eligible | Category | Date | Text ||---|--------|-----|----------|----------|------|------|| 1 | `1e66c92f07e2d62d` | 0.80 | - | episode | 2026-10-03 | Dana from Zephyr Logistics escalated ticket 4411 on the call today; we agreed a ... |Give events the episode category as well; that is what places them under Key Episodes in the compiled file. An episodic memory with category fact is listed with the facts.
Grouping related events across sessions into threads is part of the Episodic dimension of STARE. It is in pilot and off by default; see STARE.
Procedural: what the agent can do
Section titled “Procedural: what the agent can do”A procedural memory tells the agent it can do something, and how. This guards against a common failure: an agent that says “I can’t send that” when instructions for doing it are already in its memory.
Procedural memories behave differently from the rest:
- They are kept when the budget is tight. Procedures appear in the compiled file under Capabilities, ahead of everything else, and like pinned memories they are dropped only if the protected memories alone overflow the budget.
- Only the agent itself, or a person, can store one. Because procedures are always kept, a write from another identity is stored as
semanticinstead, and the response says so. SetMM_ACTORto the agent’s own name, as in the Quickstart.
Before an agent reports that it cannot do something, it can check:
mm_capability_verify({"capability": "refund"})**YES** — capability verified: 'refund'
- **mem_id:** `2b47366a861a87ca`- **text:** To issue a refund, run scripts/refund.sh with the order id; amounts over 500 EUR need a second approver.- **sig:** 0.80- **last_invoked_at:** (never recorded)- **created:** 2026-10-03- **other matches:** 0When nothing matches, the answer is **NO**, and the agent’s inability report stands. Pass "update_invoked": true when the agent actually uses the capability, to record when it was last used.
Commitment: what the agent owes
Section titled “Commitment: what the agent owes”A commitment is a promise with a due date, a recurring duty with a schedule, or a standing obligation. It differs from the other types in two ways:
- It is stored at once, not queued for consolidation, so it is on the agent’s due list as soon as the write returns.
- It stays on the due list until it is closed, however old it gets. Closing it is an explicit, recorded act.
mm_remember({"source": "agent", "text": "Send Zephyr Logistics the renewal quote.", "memory_type": "commitment", "commitment_status": "pending", "due_at": "2026-10-20"})**Remembered** — `2feb993d7cc72852`Commitments have their own guide: Commitments.
Choosing a type
Section titled “Choosing a type”| Ask | If yes |
|---|---|
| Does the agent owe this to someone? | commitment |
| Is this how to do something? | procedural |
| Does it matter when this happened? | episodic |
| Otherwise | semantic |
One conversation can produce several memories of different types. A support call might yield an event (the escalation), a fact (the customer’s renewal month) and a commitment (the quote that was promised). Write each one separately.
When each type becomes searchable
Section titled “When each type becomes searchable”Commitments are searchable as soon as they are written. The other three types are queued: the writing agent can find them at once, and consolidation moves them into the store for everyone else. See When memories become searchable.