Sovereign, local-first memory for every AI, over MCP. Durable facts about users and their work.
Sthayi demonstrates strong naming conventions (verb_noun pattern: memory_search, memory_write, memory_review, memory_consolidate, memory_pack, memory_entities, memory_journal) and comprehensive parameter schemas with type definitions, enums, and constraints. Descriptions are detailed and contextual (avg ~180 chars), explaining WHAT each tool does and WHEN to use it. However, several parameters lack descriptions (e.g., 'scope' in memory_search has minimal guidance on valid values like 'user' vs 'project:<name>'), and output schemas are not explicitly documented in the visible code. Error handling is present but recovery guidance is sparse. Tool composition is excellent, each tool has a single responsibility and outputs chain naturally (e.g., memory_search returns ranked results suitable for memory_write input).
Run consolidation passes (deterministic deduplication, decay, and optional oracle-driven merges). Example: {"mode":"deterministic"} or {"mode":"oracle","provider":"openai","model":"gpt-4o"}
List local pseudonym → value mappings (vault entities). Pseudonyms mask sensitive data in memory content and search results.
Show recent journal entries and verify the hash chain. The journal is the durable log of all mutations; the chain proves integrity.
Export a scoped, masked memory pack (context.md) for sharing or backup. Example: {"scope":"user","format":"markdown"}
List proposed memories and confirm or reject them. Proposals are searchable and readable; only confirmed memories affect ranking. Example: {"action":"list"} or {"action":"confirm","ids":["id1","id2"]}
Search the user's memory, ranked by relevance × confidence × recency. Example: {"query":"deployment preferences","k":5}. Note: NOT read-only — each search bumps the returned memories' retrieval recency/boosts, appends a journal entry, and may update the association graph.
Output schemas not documented in visible code. Tools return structured data (e.g., memory_search returns ranked results with scores, memory_write returns confirmation status) but LLMs cannot infer the exact fields, types, and nesting without explicit schema documentation.
Parameter 'scope' across multiple tools (memory_search, memory_write, memory_pack, memory_entities) lacks clear description of valid formats. Code shows examples like 'user' and 'project:<name>' but descriptions do not enumerate or explain the scope syntax, forcing LLMs to guess.
memory_consolidate exposes 'apiKey' as a parameter. Credentials must never appear as tool parameters, they should be injected server-side via environment variables or vault. Agent traces log all parameters, risking secret leakage.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Record durable facts/preferences/decisions. They enter as proposals by default. Example: {"items":[{"type":"semantic","content":"Prefers pnpm"}]}
Error handling in tool results (visible in degradedReport and withDegraded functions) provides structured warnings but lacks actionable recovery guidance. When a write fails, the LLM is told 'committed_unanchored' but not what to do next (retry? check journal? contact admin?).
memory_consolidate's 'provider' and 'model' parameters are required only in 'oracle' mode but the schema does not express conditional requirements. LLMs may pass them in 'deterministic' mode or omit them in 'oracle' mode, causing silent failures.