Memory and persona
An always-on file layer + one external backend at a time, both following a common lifecycle. What's frequent and durable lives in the files; the rest is retrieved b…
File layer (always injected)
These .md files enter the system prompt on every task, in this priority order, each with a configurable character limit:
| file | role | limit |
|---|---|---|
| SOUL.md | values, principles (slot #1) | 6000 |
| VOICE.md | tone, style, lexicon | 6000 |
| PERSONA.md | self-model: traits, expertise | 6000 |
| AGENTS.md | project context | 4000 |
| USER.md | user model | 4000 |
| MEMORY.md | durable facts | 4000 |
Backend lifecycle
Every backend implements the same automatic flow, mirroring Hermes:
- inject — context into the system prompt.
- prefetch — before each turn.
- sync — store the turn after the response.
- extract — distill facts at the end of the session.
- mirror — mirror the built-in's writes.
- tools — the backend's own search/management.
Backends
| backend | how it works |
|---|---|
| sqlite-fts5 | default hybrid: BM25 (accent-insensitive) + recency + importance · optional embeddings |
| honcho | models user and agent over time · remote over Tailscale |
| holographic | HRR/VSA in local numpy (dim 1024) · no embedding server |
Hybrid search and write policy
Recall on the default backend isn't just full-text. Each item is scored by three combined signals: lexical relevance (BM25, accent-insensitive), recency and importance (the fact's category). When the embedder is available, semantic similarity joins the mix; when it isn't, search degrades to plain BM25 without changing the interface. Every memory injected into the prompt carries a [category · source · confidence] citation, so the model knows where the fact came from.
On writes, a policy classifies each fact (fact · preference · decision · skill · error) and blocks the ephemeral/trivial before persisting — that's what prevents the junk build-up that rots context (context-rot). okami memory add forces the write (you're explicit), but the fact still goes through classification.
The threshold is per-model: it compacts at ~72% of the window. Before compacting, durable facts are promoted to long-term memory (and return via recall). Compaction = promote + point, never forget — even on a 32K model the conversation doesn't lose context.
Identity that evolves
An observer reads how you talk and infers style traits (technical register, nicknames, sarcasm, explicit requests). VOICE and PERSONA evolve on their own once a pattern crosses the threshold (min_count: explicit=1, inferred=2+). SOUL stays protected as an anti-drift anchor. All with an append-only changelog and /undo.

