note
Save durable facts, decisions, or findings to long-term memory for retrieval by relevance across sessions. Preserve context agents need later.
Instructions
Save a general long-term memory (fact, decision, finding). Stored as type='note'.
Timeless knowledge -- retrieved by relevance, not recency. Bring it back with recall() (or search(type='note')); pulse() also shows the few most recent ones as warm-up breadcrumbs.
title: one line naming what this memory is about, in the words someone would look for it by. It is what a list shows instead of the opening of the body, and it outweighs every other field in search, so a title that repeats the type ("note about the parser") names nothing. At most 120 characters, and a name that needs more than that is summarizing the body instead of naming it.
content: ONE fact, and what a reader needs to use it -- what holds, where it holds, what it rules out. Retrieval ranks whole memories, so a body answering four questions comes back for all four and is read for one: write the second subject as its own memory, on its own domain, and connect the two with link_memories(). A [[uid]] typed inside a body is a reference a reader can follow, not an edge -- get_relations() and the graph do not see it until link_memories() creates one. Past a couple of thousand characters, a body is usually several memories written as one.
domain: the subject this belongs to, as a path from the outermost scope in ('acme/x100/p200'). File it as deep as the fact is specific -- a note about one routine goes on the routine, and still comes back when someone asks about the module or the product above it.
also: other domain paths this belongs to, comma-separated. domain is
where the memory LIVES -- one path, one parent chain. also is for the
subjects that cut ACROSS that tree: the same routine belongs to the
module it runs in and to the end-to-end flow it is one step of, and
neither of those is the other's ancestor. Every read scoped to any of
those paths returns it. A path that domain already sits under is
dropped as redundant -- the result echoes what was stored.
tags: comma-separated keywords and synonyms. Retrieval is BM25 over content, tags and domain paths, and tags weigh second only to the body, so they are where a memory becomes findable by words its own text never uses -- the identifier, the symbol, the error string, the plain-language phrasing someone will actually type. A memory with none is reachable only by quoting itself.
review_after: when this stops being safe to trust unchecked, as a date
('2026-11-01') or a span from today ('90d'). pulse() counts what is
overdue in a scope as scope.stale and optimize_scan lists it. Leave
it empty for anything that does not go stale -- most facts do not, and
a date nobody meant is worse than none.
source_ref: what the fact came FROM -- a path, a URL, a table name -- so a later pass can check the claim against the thing itself instead of inferring what to check from the wording.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| also | No | ||
| tags | No | ||
| title | Yes | ||
| domain | No | ||
| content | Yes | ||
| session | No | ||
| source_ref | No | ||
| review_after | No |