Files
wehub-resource-sync c3749daf48
Tests / test-linux (3.13) (push) Failing after 0s
Tests / test-linux (3.11) (push) Failing after 1s
Tests / lint (push) Failing after 0s
Tests / test-linux (3.9) (push) Failing after 1s
Docker / build (push) Failing after 1s
Docker / build-gpu (push) Failing after 2s
Tests / test-windows (push) Has been cancelled
Tests / test-macos (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:03:03 +08:00

5.7 KiB

MemPalace Recall Protocol

The canonical "search before answering" protocol shared across every MemPalace integration (Cursor, Antigravity, Claude Code, Codex, OpenClaw). This file is the single source of truth — skills and rules should link here rather than restating the protocol, so the rule never drifts from the skill.

The protocol exists to honour MemPalace's foundational promise: 100% recall, verbatim, never guess. When the palace might hold the answer, the agent must read the palace before answering from model memory.

When to recall

Search the palace before answering whenever the user asks about anything that may already be filed:

  • Past work, prior decisions, or "what did we do / decide / try?"
  • A person, project, or entity ("who is …", "what is …")
  • Something that happened in an earlier session ("remember when …", "last time …", "the thing we discussed")
  • A preference, fact, or relationship that could have changed over time

If the question is pure greenfield work with no memory relevance (e.g. "rename this variable", "fix this typo"), do not search — recall is question-driven, not reflexive.

The protocol

  1. On wake-up (if a session-start hook injected context, honour its wing scoping / additional_context): scope recall to the wing inferred from the workspace, then continue.
  2. Before responding about people, projects, past events, or prior decisions: call mempalace_search first. For relational or temporal facts ("who reported to whom in March", "what was true then"), call mempalace_kg_query instead or as well.
  3. If unsure about a fact (name, age, relationship, preference): say "let me check the palace" and query. Wrong is worse than slow.
  4. Return verbatim. Quote the drawer's exact stored words. Never summarize, paraphrase, or lossy-compress what the palace returns — that is the whole point of the system.
  5. After a substantive session, record continuity with mempalace_diary_write (background hooks may already do this — do not double-file).
  6. When a fact changes, call mempalace_kg_invalidate on the old fact, then mempalace_kg_add for the new one.

Tool selection

You need Tool
Find any memory by meaning mempalace_search (start here)
Relational / time-bound facts about an entity mempalace_kg_query
The chronological story of an entity mempalace_kg_timeline
Recent session continuity mempalace_diary_read
Which wings / rooms exist (when scope unknown) mempalace_list_wings, mempalace_list_rooms
Record this session mempalace_diary_write

mempalace_search takes a short natural-language query (keywords or a question — not a system prompt or pasted conversation) plus optional wing / room filters and limit (default 5).

Unhappy paths

  • Empty results. Say the palace has nothing on this; do not invent an answer to fill the gap. Offer to widen the search (drop the wing filter) or to file the new information.
  • MCP unavailable / tool error. Surface the error plainly and suggest the user verify the server (mempalace status, or re-run install). Do not silently fall back to guessing from model memory.
  • Palace index corrupt / compactor error. When the server returns an error mentioning the HNSW segment writer, a ChromaDB compaction failure, or a stuck "Not connected" state after a write, the on-disk vector index is out of sync with chroma.sqlite3 — but the drawer rows are intact in SQLite. Recover by rebuilding the index from SQLite, not by re-mining. See "Recovering a corrupt index" below. Do not attempt an in-process repair from the agent; guide the user to run the CLI.
  • Stale or conflicting facts. Prefer the knowledge graph's time-valid answer; if a fact has changed, invalidate the old one and add the new one rather than overwriting context silently.

Recovering a corrupt index

A ChromaDB compaction failure can leave the drawers HNSW index out of sync with chroma.sqlite3 and wedge the MCP server (every call returns "Not connected"). The data is safe in SQLite; rebuild the index from it. Guide the user through these CLI steps — never run an in-process rebuild from the agent (it can break other live clients):

  1. Stop the MCP server (kill the mempalace-mcp process, or restart the host editor).
  2. Optional backup of the palace directory (--archive-existing already moves the old palace aside, so this is belt-and-suspenders):
    • macOS / Linux: cp -a ~/.mempalace/palace ~/.mempalace/palace.bak.$(date +%F)
    • Windows (PowerShell): Copy-Item -Recurse "$env:USERPROFILE\.mempalace\palace" "$env:USERPROFILE\.mempalace\palace.bak"
  3. Rebuild from SQLite: mempalace repair --mode from-sqlite --archive-existing --yes
  4. Verify: mempalace repair-status (divergence should read 0).
  5. Restart the MCP server.

Do not re-mine from source files to recover: re-mining drops drawers added through the MCP server and diary entries, which have no source file (see MemPalace issue #1843).

Anti-patterns

  • Answering about past work, people, or decisions from model memory when the palace might know — search first.
  • Paraphrasing or summarizing stored content instead of quoting it verbatim.
  • Searching reflexively on every turn, including pure greenfield coding with no memory relevance.
  • Pasting the full conversation or a system prompt into the query argument — keep queries short and keyword-driven.

See also