Cross-session, cross-CLI memory for AI coding assistants. Mines transcripts from 10 supported CLI clients; surfaces operator identity / decisions / bans / corrections via MCP.
Strong tool definitions with consistent naming (verb_noun pattern), comprehensive descriptions (avg 180 chars), and explicit input schemas. All 14 tools have descriptions and parameter types. Tool annotations present (readOnlyHint). Key gaps: output schemas not documented in code; error handling guidance minimal; some parameter descriptions lack format/constraint details. Composition is excellent, tools are single-responsibility and chainable via ID fields. This is a well-designed recall/memory system with production-grade structure.
Numerically assess operator frustration level from their last turn. Use BEFORE finalizing a response, especially after any operator pushback. Returns {risk, state, triggers, recommended_action, banned_phrases_in_draft}. Recommended actions: 'ship_as_is', 'trim_to_5_lines', 'run_command_paste_output', 'silence_then_act'. Risk >= 4 means stop talking and run the verifying command instead of explaining.
Check if a thing (provider, tool, library, framework, pattern) is banned by the operator. Use BEFORE suggesting any default. Returns {"banned": bool, "strength": ..., "verbatim_quote": ..., "context": ...}. Examples: check_banned("some-provider") → banned=absolute; check_banned("another-provider") → banned=context (only publicly).
Lookup operator-specific vocabulary. E.g. define_term('relay fleet') returns the operator's own definition of that term. Use when encountering unfamiliar nouns in the operator's prompts.
Return the most-recently-progressed active goal for a project. Use at session start to lead with 'Last in-flight: <goal>. Continue?' instead of asking the operator to re-state context. Returns {project, goal_text, declared_ts, last_progress_ts, status, source_session} or None if no active/blocked goal exists for the project. ``cwd`` defaults to the current Claude Code cwd.
Output schemas not documented in source code. Tool descriptions state return types (e.g., 'Returns {banned: bool, strength: ...}') but no formal JSON Schema definitions visible for responses. LLMs cannot reliably parse unstructured output or plan downstream tool chains.
Pagination parameters missing from list tools. list_failed_attempts, list_standing_decisions, list_goals, and list_implicit_preferences accept 'limit' but no offset/cursor or total_count in response. Large result sets risk context window exhaustion.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Quick lookup: 'what did the operator decide about X for this project?' Resolves scope with a fallback chain: first a project-scoped row matching cwd (defaults to the current cwd when omitted), then a global row, preferring the most-asserted / most-recently reasserted match. Returns a single standing_decisions row (topic, scope, the decision, assertion_count, last_reasserted_ts, etc.), or None if no decision is recorded; returns an error envelope if the index or standing_decisions table is missing.
Return the operator's machine inventory: hostname -> {role, lan_ip, tailscale_ip, gpu}. Use when working on LAN/cluster tasks. Pattern is a regex applied to hostname; pass None for all.
Return the operator's identity profile (name, handles, machines, vendor preferences, philosophy). Use at session start to know WHO is asking and what they prefer. Cheap, reads cached profile from the index — does NOT re-mine the corpus.
Return the operator's project graph: cwd -> {purpose, primary_language, related_projects, last_active}. Use to orient at session start — know what other projects this one connects to.
Return recent operator corrections. Use at session start to know what the model has been doing wrong lately. Pulls from the corrections index (kind='model_correction'). Params: cwd scopes to a project (None = all projects); since_days bounds how far back to look (default 30); limit caps how many are returned (default 5, most recent first). Returns a list of dicts each describing one correction (the corrected behavior, context, and timestamp); returns an error envelope if the index is missing.
Failed approaches the operator has documented, sourced from the bans index. Use before suggesting something that 'sounds reasonable' — it might already be on the failed-attempts log. Params: topic filters to a subject (None = all); limit caps results (default 10). Returns a list of dicts each with attempt, replaced_by, reason, cwd, attempted_ts, and abandoned_ts. Distinct from tools.py find_failed_attempts, which is a semantic search over the corrections index; this is a structured listing over the bans index.
List goals by project + status. Use when the operator asks what they've been working on or when surveying the goal stack. ``status`` is one of active|paused|blocked|done|abandoned|any. ``cwd`` defaults to the current Claude Code cwd; pass an empty string to list across ALL projects. Returns up to ``limit`` rows {project, goal_text, declared_ts, last_progress_ts, status, ...} ordered by most-recently-progressed first.
Return operator preferences inferred from behavioral patterns. Use when choosing tools/commands/format defaults that should match observed operator habits (not just explicit statements). Derived from *what the operator consistently does* across sessions — e.g. always Edit over Write, always ``uv`` rather than ``pip``, never emoji. Only patterns observed across ≥5 sessions and ≥3 projects over ≥7 days.
Return standing decisions the operator has made (e.g. provider-a > provider-b, billing-provider-a > billing-provider-b). Use BEFORE suggesting any default — if a decision exists, honor it. Filter by topic ('cloud_provider', 'billing_rail', etc.) or scope ('global' or cwd). Highest-asserted decisions come first; `limit` (default 25, max 50) caps the sweep. A trailing `_meta` row means the response was trimmed to fit the transport — filter by topic/scope to see the rest.
Return past operator corrections matching a topic. Includes the rejected approach (what the model previously did that the operator pushed back on) so the current turn can avoid repeating it. Use before suggesting any default provider, library, pattern, or approach the user might have previously rejected. Returns ranked corrections with rejected approach, context, severity, and ts.
Error handling lacks recovery guidance. check_banned and list_failed_attempts return error dicts (e.g., 'index not initialized') but do not tell the LLM what to do next. Should include actionable steps like 'Run `total-recall index` to build the index'.
Parameter descriptions lack format/constraint details. 'topic' params in recall_corrections_about, list_standing_decisions, and list_implicit_preferences do not specify valid values, format, or examples. 'cwd' params do not clarify path format (absolute vs relative, shell expansion).
get_project_graph and get_operator_profile have minimal descriptions (75 chars). 'Return the operator's project graph' and 'Return the operator's identity profile' lack context on WHEN to call them, what fields are included, or how to use the output.