Persistent semantic memory system for Claude Code
claude-crowed demonstrates solid tool design with 10 well-named, verb-prefixed tools (memory_read, memory_store, memory_recall, etc.). All tools have descriptions (avg ~180 chars, within baseline 194). Input schemas are present with type definitions and parameter descriptions. However, output schemas are not formally documented, responses are inferred from code (e.g., memory_read returns {id, title, content, error}). Error handling returns generic error dicts rather than actionable recovery guidance. No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels (READ_ONLY, WRITE, REVERSIBLE). Parameter descriptions are adequate but lack format constraints (e.g., 'max 150 chars' stated in description but not enforced via schema). Tool composition is clean, each tool has one responsibility. Naming is consistent and clear.
Soft-delete a memory. Always confirm with the user before deleting. Deletions are reversible with memory_undelete, but limited to 5 per session as a safety measure.
Retrieve all versions of a logical memory. Pass any version ID in the chain.
Discover and read memory files (CLAUDE.md, auto-memory) for migration into crowed. Returns file sections split by markdown headers. Review each section and decide whether it contains KNOWLEDGE (store with memory_store) or INSTRUCTIONS (skip). With no path: discovers all migratable files (~/.claude/CLAUDE.md and auto-memory) and returns their sections. With a path: reads and splits that specific file. This tool does NOT store anything. You review the sections and call memory_store for each piece of knowledge you want to keep. Skip pure instructions.
Fetch the full content of a specific memory. This is the only tool that returns content. Each read is tracked in the memory_accesses table.
Search memory and return full content for the top results in a single call. Use this instead of memory_search + memory_read to reduce round trips. Returns two lists: - memories: full content for the top read_k results (default 5) - also_matched: titles only for remaining results (for follow-up reads if needed). Call this at the START of every task AND whenever you hit unfamiliar territory mid-task.
Output schemas not formally documented. Code infers responses (e.g., memory_read returns {id, title, content, error}), but no JSON Schema or structured type hints in tool definitions. LLMs cannot reliably plan downstream calls without knowing return field names and types.
Error handling returns generic error dicts ({"error": "..."}) without recovery guidance. LLMs cannot determine if errors are retryable, user-fixable, or fatal. No actionable next steps provided.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
Find semantically related memories via embedding similarity. Returns titles only.
Store a new memory. Call this whenever you learn something worth remembering across sessions -- novel insights, decisions, findings, patterns, or debugging solutions. Title (max 150 chars) must be a complete, descriptive thought, not a label. Another instance of you should judge relevance from the title alone. Content max 1500 chars; split larger ideas into multiple memories. Source: manual, conversation, or auto. Rejects near-duplicates by default (threshold adjustable via `claude-crowed threshold` CLI). Set force=True to skip the duplicate check entirely.
Browse memories chronologically with cursor-based pagination. Returns titles and metadata only.
Restore a soft-deleted memory.
Update an existing memory, creating a new version. The old version is preserved but removed from the search index. Returns the new version's ID.
No tool annotations despite clear risk levels. memory_delete and memory_undelete are marked REVERSIBLE/WRITE but lack destructiveHint or idempotentHint annotations. memory_read is READ_ONLY but lacks readOnlyHint. Agents cannot infer safety properties.
Parameter constraints stated in descriptions but not enforced in schema. E.g., memory_store title 'max 150 chars' and content 'max 1500 chars' are documented but not in JSON Schema maxLength. memory_store source is documented as enum (manual|conversation|auto) but not declared as enum in schema.
memory_delete lacks confirmation/dry-run pattern. Description says 'Always confirm with the user before deleting' but tool has no confirm parameter or dry-run mode. Agents cannot safely preview deletions before executing.