Memory for Hermes, Codex, Claude Code, OpenCode, Devin, and any MCP agent. daimon-memory v2: one-binary typed memory engine with hybrid recall
dm-lite has 24 tools with complete input schemas and descriptions, but quality is uneven. Strengths: bitemporal recall (valid_from/valid_to), typed memory kinds (Decision, Lesson, Incident), graph operations (link/unlink/neighbors). Weaknesses: descriptions are terse (many under 100 chars, below the 194-char baseline); parameter descriptions lack actionable constraints (e.g., 'limit' has no min/max); no output schemas documented; error handling guidance absent; tool names like 'hook' and 'bootstrap' are vague (not verb_noun); composition issues (bootstrap does 7 different things via boolean flags). Naming follows verb_noun for core tools (remember, recall, forget) but fails for utilities (hook, template, bootstrap). No enum constraints on 'kind' parameter in entity tool despite known set (org, engagement, product, solution_stack, person, framework, site). Schemas are present but minimal, no documented return types, no pagination guidance for recall/recent/history despite returning lists.
Save a typed Reminder
Wire (or with --remove, unwire) dmem into your agents (hooks for Devin/Claude Code/Codex/Hermes/Grok; an MCP entry for hook-less Claude Desktop)
Create or update a domain entity (a knowledge-graph node): org, engagement, product, solution_stack, person, framework, site. Relate entities with `dmem link`
Retract a record by uri: drop it from recall, keep its history
Show the full version lineage of a record (append-only history)
Lifecycle hook handlers (called by the agent; emit context on stdout)
Import a template/markdown file (or a directory of them) as memory records
bootstrap tool violates single-responsibility principle: 7 boolean flags (devin, claude, codex, hermes, opencode, grok, claude_desktop, all, remove) make it do 9+ different things. Should split into separate tools: wire_devin, wire_claude, wire_hermes, etc.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., what does recall return? Is it a list of Entry objects? Does it include scores?). Recall returns RecallGraph with seeds/riders/links but this is not visible in the tool definition.
Parameter constraints missing: 'limit' appears in recall (default 6), recent (default 10), history (default 20), neighbors (default 50) but no min/max bounds documented. 'depth' in neighbors has no bounds. 'expand' in recall defaults to 1 but range is unclear. LLMs cannot validate inputs without explicit constraints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Invalidate a record from a valid time onward (keeps history; distinct from forget)
Link two records (the graph layer): from -[rel]-> to
Show the edges touching a record (its graph connections)
Save a typed Convention (a standing rule)
Save a typed Decision
Save a typed Incident
Save a typed Lesson
Save a typed Runbook (a procedure worth repeating)
Show the records reachable from a uri within N hops (its graph neighborhood)
Recall memory for a query (human-readable)
Show recent high-importance memory
Re-embed every live record's body into the vector index, healing records whose embedding predates an embedder fix (e.g. long bodies that overflowed bge's 512-token limit and were stored as a zero vector). Idempotent
Rebuild edges from the [[name]] references in every record body (batch)
Deterministic graph pass: link records to the entities they mention in plain text (word-boundary, exact case). Adds `mentions` edges, distinct from curated `links`
Save a free-form memory
Template helpers (export the bundled defaults to edit)
Remove an edge: from -[rel]-> to
hook and template tool names are vague and do not follow verb_noun convention. 'hook' could mean register, trigger, or emit. 'template' could mean list, export, or create. Should be emit_hook_context and export_templates or similar.
entity tool 'kind' parameter accepts 7 known values (org, engagement, product, solution_stack, person, framework, site) but is defined as free-form string. Should be an enum to prevent hallucinated kinds and guide LLM selection.