Severian
Long-term memory for AI agents that runs on your own machine, remembers where every fact came from, and keeps every user's memories apart.
Severian gives an agent a memory it can trust. It saves what was said exactly as it was said, derives short searchable memories from it, and hands the answering model a compact, cited context block for each question. It runs on SQLite out of the box (PostgreSQL + pgvector when you need it), works fully offline, and plugs into Hermes Agent, any MCP client, a CLI, an HTTP API or plain Python.
Results
Severian on the OmniMemEval
long-term-memory leaderboard (October 2026). Every other row is OmniMemEval's own published record, copied verbatim;
Severian's row (†) is our run through the same public harness, answer model (gpt-4.1-mini), judge (gpt-4o-mini),
prompts and metrics, not an official board entry. 🥇 marks the best score in each column; - means not run.
| Backend | LoCoMo | LongMemEval | BEAM 100K | BEAM 10M | PersonaMem v2 | HaluMem |
|---|---|---|---|---|---|---|
| Mem0 | 77.68 | 56.00 | 70.41 | 43.33 | 36.76 | 73.64 |
| Zep / Graphiti | 63.83 | 79.80 | 68.70 | 56.11 | 32.34 | 81.71 |
| Supermemory | 73.53 | 66.07 | 65.98 | 52.49 | 39.64 | 52.61 |
| Viking | 69.33 | 61.07 | 70.76 | 58.14 | 30.80 | 77.39 |
| Cognee | 83.48 | 51.80 | 59.30 | 56.02 | 26.46 | 72.60 |
| Letta | 77.12 | 77.67 | 69.22 | 52.30 | 35.12 | 85.43 |
| Hindsight | 81.99 | 72.20 | 70.22 | 🥇 59.75 | 37.98 | 83.99 |
| Memori | 41.34 | 20.80 | - | - | 33.16 | 49.38 |
| EverOS | 82.75 | 80.40 | 58.64 | 47.73 | 35.94 | 🥇 88.66 |
| MemMachine | 73.90 | 63.60 | 64.80 | 51.90 | 34.14 | 47.02 |
| mem9 | 73.64 | 78.00 | 65.75 | 57.30 | 30.76 | 72.80 |
| MemoryLake | 72.49 | - | - | - | - | - |
| Backboard.io | 22.40 | - | - | - | - | - |
| MemOS | 🥇 88.83 | 89.20 | 66.87 | 56.75 | 🥇 40.58 | 80.91 |
| LCM-X | 78.83 | 87.00 | 🥇 71.84 | - | 33.96 | 81.68 |
| Severian 0.3.11 † | 87.34 | 🥇 90.60 | 71.62 | - | - | - |
- 1st on LongMemEval, 2nd on LoCoMo, 2nd on BEAM 100K (0.22 behind LCM-X). The board has no error ranges, and on 400 questions a gap that small is noise; Severian has not been run on BEAM 10M, PersonaMem v2 or HaluMem yet.
- We checked the board before building on it. Re-running LCM-X through the same pipeline gave its published scores back within 0.65 points. Compared question by question, Severian is ahead of it on LoCoMo (+7.9, 95% range +6.0 to +9.7) and LongMemEval (+4.0, +1.2 to +6.6) and level on BEAM, and a stricter second marker (Claude Opus) agrees.
- Trade-offs, stated plainly. Severian hands the answering model more text than most systems and makes model calls when it saves memories. Hermes ships it with a cheap 8,000-character context cap, which costs little on LoCoMo but about 8 points on BEAM and LongMemEval; raising it to 16,000 characters wins back about 5 points on each (settings).
- We found a marking flaw in BEAM that rewards made-up answers to "the chat never said" questions. It inflates every system's BEAM score, ours included (details).
- Zero leaks, zero stale facts. On Severian's own adversarial quality gate, a corrected fact never comes back in search (0.000 stale-fact rate) and no query ever returns another scope's memory (0.000 leakage).
Per-benchmark tables for every system (LoCoMo, LongMemEval, BEAM, PersonaMem v2, HaluMem), the LCM-X validation, the plan and its changes, and the limitations are in docs/benchmarks/omnimemeval-2026-10.md. Our earlier internal round against Mem0, Mnemosyne, Hindsight and Honcho (different harness and marker) is in docs/benchmarks/competitor-round-2026-10.md.
Why Severian
- Nothing is lost, nothing is made up. Raw observations are append-only and hashed. Every memory and every search hit cites the observation it came from, and corrections create a new revision instead of overwriting history, so any earlier version can be restored.
- Scope is the security boundary. Every read and write names five levels: tenant, profile, collection, agent and session. There is no default scope, and another scope's memories are never returned or even hinted at. Agents can opt in to reading an explicit list of teammates' scopes.
- Built for real conversations. Short facts per turn, real dates for relative times, newer facts that close older ones, and a note when two memories disagree, so the agent answers with the current truth.
- Hybrid search that holds up. BM25 and vector search fused with reciprocal rank fusion, an optional cross-encoder re-ranker, an entity graph for multi-hop lookups, and a context assembler that keeps the most useful items inside a character budget.
- Local-first. No network call from the engine; cloud derivation needs an explicit per-collection opt-in. Qwen3 0.6B embeddings run locally or in a shared sidecar; a deterministic hash embedding needs nothing at all.
- Looks after itself. Background "dreaming" merges near-duplicates and flags contradictions, curation scores salience, and retention policies archive instead of deleting.
- Operable. Crash-safe leased worker jobs, dead-letter recovery, export/import, side-by-side vector rebuilds, an integrity audit, per-profile fact rollback and an optional Rust acceleration module.
- Harness-agnostic. The same engine serves any agent framework through the CLI, the Python SDK, the HTTP API or MCP, and runs unchanged on SQLite or PostgreSQL; the Hermes plugin is one adapter on top.
How it works
┌──────────────────────────────────────────┐
│ SOURCE INPUT │
│ text observation · attachments (multi- │
│ modal metadata: image/audio/video/file) │
└──────────────────┬───────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ IngestionService │
│ normalise · hash raw · source identity │
└──────────────────┬───────────────────────┘
│
┌─────────────────────────┼─────────────────────────┐
▼ ▼ ▼
┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐
│ CANONICAL STORE │ │ derive job queue │ │ Entity/Relation │
│ (SQLite | PostgreSQL)│──▶│ (leased, crash-safe, │──▶│ Graph (auto-populated │
│ observations │ │ idempotent) │ │ by EntityExtraction) │
│ memories │ └───────────────────────┘ └───────────────────────┘
│ entities/relations │
│ jobs · audit events │ append-only · scoped · hashed · supersede-aware
└───────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ DerivationService (worker drains derive/episode/dream jobs) │
│ · policy-gated (cloud_allowed false by default) │
│ · deterministic hash OR Qwen 0.6B semantic opt-in │
│ · skips superseded observations (P0-5) │
│ · EntityExtractionService upserts entities + typed relations│
└──────────────────────────────────────────────────────────────┘
│
├──────────────► ProjectionCoordinator
│ ├──► FTS5 lexical projection (BM25)
│ └──► vector projection (hash default;
│ Qwen 0.6B semantic opt-in, 384-dim)
│
▼
┌──────────────────────────────────────────────────────────────┐
│ RetrievalService (hybrid RRF fusion) │
│ · coverage abstention gate · salience-weighted ranking │
│ · shared-scope read (search_shared, opt-in multi-agent) │
│ · temporal query orientation (active head first for present)│
└───────────────┬──────────────────────────────────────────────┘
│
├──────────────► ContextAssembler (bounded, source-cited)
│
▼
┌──────────────────────────────────────────────────────────────┐
│ GraphRetrievalService │
│ · BFS neighborhood over Entity/Relation (both directions) │
│ · temporal validity filtering (expired relations excluded) │
│ · related_memories by min graph distance │
└──────────────────────────────────────────────────────────────┘
OFFLINE SELF-REGULATION (dream worker jobs, non-destructive):
┌──────────────────────────────────────────────────────────────┐
│ ConsolidationService · Jaccard near-dup merge (>= 0.8) │
│ CurationService · salience scoring (recency+usage+ │
│ confidence), review markers only │
│ RetentionPolicyService· max_age/min_usage/kinds policy, │
│ evaluate + opt-in archive │
│ ContradictionScanService · report-only, never auto-resolves │
└──────────────────────────────────────────────────────────────┘
- The canonical store is the only source of truth. Search indexes are projections that can be rebuilt from it at any time.
- Worker jobs derive memories and facts in the background, so saving stays fast. A failed job retries and then dead-letters; it never silently disappears.
- Retrieval runs inside one exact scope, fuses lexical and semantic results, and drops memories a newer fact has closed from the current view (they stay in history).
More: architecture, memory engine, threat model.
Quick start
Requires Python 3.11+ and uv.
git clone https://github.com/Sahil-SS9/Severian.git
cd severian
uv sync
# Save an observation in a scope
uv run severian ingest \
--database data/severian.db --fts data/fts.db --vectors data/vectors.db \
--tenant acme --profile alice --collection main --agent cli --session ses-1 \
--content "Alice signed the Acme contract on Friday" \
--source '{"uri": "note://contract-1"}'
# Search it (--derive processes pending jobs first; production runs `severian work`)
uv run severian search \
--database data/severian.db --fts data/fts.db --vectors data/vectors.db \
--tenant acme --profile alice --collection main --agent cli --session ses-1 \
--query "contract" --derive
Or run the Python example, which saves memories for two users, searches one and builds a cited context:
uv run python examples/quickstart.py
Use it from
| Surface | How |
|---|---|
| Hermes Agent | Drop-in memory provider: hermes plugins install severian (or copy plugins/hermes/severian/ to $HERMES_HOME/plugins/severian/), set memory.provider: severian. Tools: search, ingest, correct, forget, shared search, task progress notes. |
| MCP | full seven-tool surface over stdio for Claude Code, Codex, OpenCode and Claude Desktop: docs/integrations.md. Tools: ingest, search, get, correct, forget, task progress, shared search. |
| Python | severian.composition.build_bundle(...); see examples/quickstart.py |
| HTTP | uv run severian serve (dev server); client in severian.sdk.client |
| CLI | severian ingest / search / work / export / import / audit / rebuild-vectors / ... (--help lists all) |
Configuration
Behaviour switches are environment variables, so the same code serves benchmarks, tests and production.
| Setting | Default | What it does |
|---|---|---|
SEVERIAN_EMBEDDING |
hash |
qwen (local Qwen3-Embedding-0.6B) or remote-qwen (shared sidecar at SEVERIAN_EMBED_SOCKET) |
SEVERIAN_USER_FACTS |
off (recommended on) | Short facts per conversation turn, extracted by a local model in the background |
SEVERIAN_DATE_STAMPS |
off (recommended on) | Writes real dates next to relative times when saving |
SEVERIAN_TRUTH_RESOLUTION |
off (recommended on) | Memories a newer fact replaced leave the current view and stay in history |
SEVERIAN_RERANK |
off (recommended: cross-encoder/ms-marco-MiniLM-L6-v2) |
Re-ranks the fused candidates |
SEVERIAN_OPT_NUMPY |
off (recommended on) | Fast exact vector scoring on large scopes |
SEVERIAN_CONFLICT_NOTES |
on | Adds a short note when two returned memories disagree (0 turns it off) |
SEVERIAN_FILL_BUDGET |
off | Search over-fetches a bounded pool and the context keeps adding ranked items until its character budget is full, instead of stopping at limit |
SEVERIAN_COMPACT_CITES |
off | Cites the source observation ids in one bracket and drops the trailing source: line: about 45 characters less per item, every citation still resolvable through severian_get_observation |
SEVERIAN_SUFFICIENCY |
off | Adds one line after the results when no returned memory holds the specific detail the question names |
SEVERIAN_STORAGE / SEVERIAN_DSN |
Hermes store / unset | SQLite directory, or a PostgreSQL DSN |
The recommended settings are the ones benchmarked above. PostgreSQL setup: docs/postgresql-backend.md. Day-to-day running: docs/operator-runbook.md.
Roadmap
Two moves carry the next round: per-person fact sheets to close the multi-hop gap, and a better rule for knowing when to answer "I don't know". Then a wider field (MemMachine, Graphiti/Zep, Letta, Cognee, LangMem, Memobase), a cloud-model check of the winning setup, and stricter marks: every in-house run re-marked by Opus, plus cost per memory, a 10x-size stress test, and a confident-wrong vs "I don't know" measure.
Contributing and security
See CONTRIBUTING.md for the development loop and quality gates, and SECURITY.md to report a vulnerability. Release history: CHANGELOG.md. All documentation: docs/.
License
MIT. See LICENSE.
Metadata
Release files for severian 0.3.13
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| severian-0.3.13.tar.gz | 602.8 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| severian-0.3.13-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 914.2 kB
Release files / severian-0.3.13.tar.gz
| Download URL | severian-0.3.13.tar.gz |
|---|---|
| Size | 602.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b4a7e956f48db0310f8d27850386482822807bee84b561026b678f989ddc63d5
|
|
BLAKE2b-256 checksum How to use checksums |
cbbbe249e4e19b48d1a276eb25054d77b2fa4b07ef8baccbbf4c87f46c8c8895
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logRelease files / severian-0.3.13-py3-none-any.whl
| Download URL | severian-0.3.13-py3-none-any.whl |
|---|---|
| Size | 311.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
add5ea1074379b6dc396958b24ed68052deec3ed212f9453053f46e14b1518d0
|
|
BLAKE2b-256 checksum How to use checksums |
f3b53d01626f513235dc342112a7f227fb26e056c4e5e0182f397a64664456af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logSecurity for severian 0.3.13
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for severian-0.3.13.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 25, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.