Persistent local memory for Claude Code. Lets Claude query Longhand memory during live sessions — search, retrieve, and replay session data as tool calls. Total recall from your session files — no API calls, no summaries, no AI deciding what matters.
Longhand demonstrates solid tool definition quality with consistent naming conventions (all tools start with action verbs: search, list, get, timeline, recall, git_timeline, reconcile), detailed parameter schemas, and comprehensive descriptions. All 10 tools have explicit descriptions ranging from 72-168 characters. Input schemas are well-formed with typed parameters. However, there are notable gaps: output schemas are partially incomplete (declared as reusable _EVENT_ROW_SCHEMA and _SESSION_ROW_SCHEMA but the actual schema definitions are truncated in the provided source), error handling strategies are not visible in the sample code, and some parameter descriptions could be more prescriptive about constraints and formats. The tool set is well-composed with clear single responsibilities and good chaining potential (e.g., search returns session_id which feeds into get_session or timeline). The `reconcile` tool includes proper idempotent semantics via ToolAnnotations, and read-only tools are annotated with readOnlyHint=True.
Fetch all events from a specific session by session_id.
Retrieve git operations (commits, branch changes, merges) across sessions, in time order.
Get the most recent events across all sessions, optionally filtered by type.
List all inferred projects from stored sessions. Returns project metadata including display name, category, keywords, languages, and session/edit counts.
List all stored sessions, optionally scoped to a project. Returns session summaries with timestamps, event counts, and outcomes.
Semantically recall a multi-episode narrative for a given query. Returns episode sequences (problem→diagnosis→fix→verification) that match the query, with surrounding context.
Re-ingest any missing session transcripts from the local store. Idempotent — re-running with the same on-disk state is a no-op. Mutates the SQLite store but does not delete or lose data.
Output schemas only partially visible, _EVENT_ROW_SCHEMA and _SESSION_ROW_SCHEMA are declared but definitions truncated in source. Cannot verify output field types, required/optional status, or chaining IDs for downstream tools.
Error handling and recovery strategies not visible in provided source code. No evidence of error categorization (retryable vs. user-fixable vs. fatal), actionable error messages with invalid value + constraint, or recovery guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2025-06-18+ | v2 |
Semantic search across all stored Claude Code session events. Returns events matching a natural language query, with optional filters by event type, session, project, tool, or file path. IMPORTANT: Always pass session_id when you know which session to search — unscoped search returns noisy results. To read matches WITH their surrounding conversation, pass context_events (requires session_id): each match comes back with N events before and after it.
Semantic search with full context window — returns each match along with all surrounding events in the same session. Useful for understanding the conversation around a specific query result.
Retrieve a time-ordered sequence of events from one or more sessions. Useful for replaying what happened during a work session or investigating a time window.
Parameter descriptions lack prescriptive constraints: `limit` parameters have defaults but no explicit min/max bounds stated (e.g., MAX_LIMIT=1000 is a constant, not surfaced in param description). `query` parameter description does not state the 2000-char limit (MAX_QUERY_CHARS=2000).
`get_session` description is minimal ('Fetch all events from a specific session by session_id.'), does not explain what structure is returned, when to prefer over `timeline`, or whether events include full content or summary.
`reconcile` parameter schema is empty (`{}`). No description of what happens (re-ingests missing transcripts, mutates SQLite), idempotent semantics, or expected side effects.
Tool annotations use `readOnlyHint` and `openWorldHint` correctly, but no evidence of `destructiveHint`, `idempotentHint`, or other per-tool capability signaling beyond the `reconcile` tool. Missing annotations on other tools that may have side effects.