Mnemosyne is a library/service other Pantheon gods call to recall() and remember() — it does not plan, orchestrate, or route work itself. It fills the memory capability slot in Pantheon: one god per capability, ABI-swappable, owns its own memory, runs standalone, standard interface.
Memory is organized as an ordered, escalating stack — meta (broad) to file (raw). A recall walks the layers and merges/ranks hits with provenance; a write routes to the correct layer(s) and keeps indexes coherent.
meta (hive Obsidian vault — Consus knowledge home / canonical truth)
→ enterprise (org-wide knowledge + standards, promoted from approved CBAs)
→ project (per-project working memory, decisions, context)
→ code-graph (typed impact graph: depends_on / cites / implements)
→ vector (Qdrant Cloud — default backend, semantic recall)
→ file (raw grep — loud-failure floor)
Backends are pluggable: Qdrant is the default vector backend but the slot is swappable (any OpenAI-compatible embeddings / alternate vector store); Obsidian is the default meta store but the meta layer is a contract, not a hard dependency. Slot config is owned by Vesta — see Vision for how the A/B/metrics story plays out here.
flowchart TB
subgraph pantheon["Pantheon gods (callers)"]
minerva["Minerva
planner"]
argus["Argus
metrics"]
swarm["swarm agents"]
end
subgraph mnemosyne["Mnemosyne — memory god"]
api["recall(query, scope, intent)
remember(content, scope, layer?)"]
router["layer router + escalation
(narrow↔broad, merge + rank)"]
prov["provenance stamping
(7 fields per hit)"]
idx["continuous indexing
(Multica-native schedule)"]
api --> router --> prov
end
subgraph layers["Layer stack (pluggable slots)"]
meta["meta — Obsidian vault"]
ent["enterprise"]
proj["project"]
cg["code-graph"]
vec["vector — Qdrant Cloud"]
file["file — grep (loud floor)"]
end
minerva --> api
argus --> api
swarm --> api
router --> meta
router --> ent
router --> proj
router --> cg
router --> vec
router --> file
idx -.keeps fresh.-> vec
idx -.keeps fresh.-> cg
idx -.keeps fresh.-> meta
vec -->|wraps| sm[("swarm-memory
+ Qdrant Cloud")]
cg -->|wraps| sm
api -.decision + metric record.-> argus
consus["Consus / Janus
(read model: browse layers,
trace provenance, spot stale scopes)"] --> api
recall() call
sequenceDiagram
participant God as Calling god (e.g. Minerva)
participant Client as MnemosyneClient
participant Router as Layer router
participant Layer as Layer adapter(s)
participant Obs as Observability (logger + metrics)
God->>Client: recall(query, scope, intent)
Client->>Obs: recall_start(query, scope, intent)
Client->>Router: resolve layer order (narrow↔broad)
loop each candidate layer
Router->>Layer: query layer
Layer-->>Router: hits | degraded
Router->>Obs: layer_query(layer, duration_ms, ok)
alt layer unavailable/degraded
Router->>Obs: layer_degraded(layer, reason)
end
end
Router->>Router: merge + rank hits, stamp provenance
Router-->>Client: RecallSuccess(hits, layers_queried, layers_skipped, degraded)
Client->>Obs: recall_end(duration_ms, hit_count, ok)
Client-->>God: result
Every hit carries the mandatory 7-field provenance record (layer, source, chunk_span, index_timestamp, content_hash, embedder, retrieval_time); a layer that cannot supply a field returns it explicitly as null, never omits it. A degraded or unreachable layer is flagged in the response — recall never silently falls back without saying so (the loud failure contract).
Mnemosyne currently runs as two separate processes:
| Service | Entry point | Port | Wraps |
|---|---|---|---|
| Production recall/remember service | src/server.mjs |
:8477 |
swarm-memory engine over remote Qdrant Cloud |
| MnemosyneClient HTTP API | lib/mnemosyne/server.ts |
:3141 |
MnemosyneClient (code-graph/vector/file routing) |
See HTTP API for the client-API request/response contract.