OpenClaw enhanced LanceDB memory plugin with hybrid retrieval (Vector + BM25), cross-encoder rerank, multi-scope isolation, long-context chunking, and management CLI
UltraMemory provides 14 memory-management tools with generally complete schemas and detailed descriptions. Most tools follow the verb_noun naming convention (memory_store, memory_recall, memory_forget, etc.). Descriptions are well-written and often exceed 100 chars with context on when/why to use tools. However, several critical gaps prevent a higher score: (1) Tool composition issues, memory_resume appears twice (tools 9 and 13) with identical names but different purposes (session resumption vs. re-enabling auto-capture), creating ambiguity for LLM selection. (2) Parameter naming inconsistencies, memory_forget uses 'id' while memory_update uses 'memoryId', forcing LLMs to reason about field mappings. (3) Missing output schemas, no tool explicitly documents what it returns, forcing LLMs to guess structure of lists, counts, or chaining IDs. (4) Weak error handling, no tool description mentions what to do on failure, invalid input, or recovery paths. (5) No permission gates, destructive tools (memory_forget, memory_consolidate) lack clear authorization checks documented in descriptions.
Extract and store memory-worthy items from conversation text. Uses heuristic pattern matching to identify preferences, identity, decisions, and corrections. Returns extracted items with their categories and storage status.
Save a session checkpoint — captures current progress, decisions, and next actions so the session can be resumed later
Consolidate memories — merge near-duplicates and generate a compressed user profile digest. Run periodically (e.g. weekly) to keep memory clean and efficient.
Delete a memory
List memories with optional filters
Pause automatic memory capture for the remainder of this session. Manual memory_store calls are unaffected. Use memory_resume to re-enable.
DUPLICATE TOOL NAME: 'memory_resume' registered twice (tools 9 and 13) with different semantics, one restores session checkpoints, the other toggles auto-capture flag. LLMs cannot disambiguate which tool to invoke. Violates single-responsibility principle.
PARAMETER NAMING INCONSISTENCY: memory_forget uses 'id' while memory_update uses 'memoryId' and memory_recall/memory_provenance use 'id'. Inconsistent field naming forces LLMs to reason about field mappings and violates mxe:response-field-naming principle.
MISSING OUTPUT SCHEMAS: No tool explicitly documents what it returns. Descriptions mention inputs and intent, but output structure (e.g., does memory_recall return array of {id, text, score}? Does memory_store return an ID?) is undocumented. Forces LLMs to infer or guess structure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
Query the provenance (origin story) of a memory — shows where it came from, which session created it, and why
Search for relevant memories
Resume a previous session — retrieves the latest checkpoint to restore context and continue where you left off
Resume automatic memory capture after a previous memory_pause.
Get memory statistics
Store a new memory. PROACTIVE STORE GUIDANCE — call this tool during the conversation, not just at the end: (1) Reusable pattern discovered — store solutions, workarounds, or design patterns immediately (importance: 0.8+). (2) Non-obvious preference confirmed — store when the user explicitly confirms an uncommon preference (importance: 0.8). (3) Corrected misconception — store corrections to previous wrong assumptions so they are never repeated (importance: 0.85). (4) Complex problem solved — store root cause and fix after multi-step debugging or tricky integration (importance: 0.8). Do NOT store greetings, small talk, transient task status, or duplicates (auto-deduplicated).
Update an existing memory
Log structured learning/error entries into .learnings for governance and later distillation.
WEAK ERROR HANDLING: Descriptions lack error recovery guidance. No mention of what to do if memory_recall returns no results, memory_forget fails (ID not found), memory_consolidate merges fail, or memory_auto_capture extraction fails. Forces LLMs to guess recovery strategy.
MISSING PERMISSION GATES: Destructive tools (memory_forget, memory_consolidate, memory_auto_capture with write effects) lack documented authorization checks. No mention of who can delete/merge memories or what roles are required. Enables accidental data loss.
TRUNCATED DESCRIPTIONS: memory_forget (24 chars), memory_list (21 chars), memory_stats (20 chars) fall at or below the 20-char critical floor. These descriptions lack context on when/why to call vs. alternatives.
GENERIC NAMING: 'memory_stats' uses vague noun. More specific names like 'count_memories', 'get_memory_distribution', or 'memory_summary' would clarify intent. Current name risks conflation with other 'get_stats' tools.
MISSING CHAINING IDS: If memory_recall returns a list of memory objects, does it include 'id' for use in memory_update or memory_forget? If memory_checkpoint returns checkpoint_id, can memory_resume immediately use it without another lookup? Undocumented chaining breaks downstream tool invocation.