palinode
Palinode is an MCP server for git-versioned Markdown project memory: save/search/audit/compact/correct decisions, insights, sessions, and entities.
Session memory: initialize context at session start, capture summaries/decisions/blockers at session end.
Save & organize: create typed memories (people, projects, decisions, insights, research, action items), ingest URLs, list/read files.
Search & resolve: hybrid BM25+vector search with filters, resolve current state, find dedup candidates, topic coverage, cluster neighbors, orphan repair.
Audit & provenance: history, blame, trace lineage, explain delivered context, diff recent changes, rollback safely.
Correct & retire: archive/supersede, restore, unretract mentions, withdraw forget requests, archive expired TTL, review/apply/dismiss/undo corrections.
Compact & maintain: preview/run LLM consolidation, manage versioned prompts, lint memory, review project health, repair wiki links.
Ops & integration: entity graph, triggers for prospective recall, dependency trees, push to git remote, health checks (status/doctor/doctor_deep).
Allows using an Obsidian vault as the memory directory, with full support for daily notes, graph defaults, and wiki contract maintenance.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@palinoderecord decision: use PostgreSQL for primary DB"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
┌─ palinode ─┐
│ ░░░░░░░░░░ │
│ ▓▓▓▓▓▓▓▓▓▓ │
│ ██████████ │
└────────────┘Inspectable, correctable project memory for repeated work across sessions, agents, and worktrees.
Last week, your team chose SQLite for a cache because it avoided operating a database. This week, a changed requirement makes PostgreSQL the better choice. Without the decision and its reason, a fresh agent can repeat the old approach. With Palinode, you can save the replacement, inspect the original and its history, and correct the record for the next session.
Palinode keeps project memory in Markdown files and Git history under your local control. An agent can use its tools to save, search, and inspect that memory. Some supported client integrations can also perform configured capture or recall; their automatic behavior, scope, and controls vary by client and configuration. Nothing is silently promoted from an unmarked note to a fact.
A palinode is a poem that retracts what was said before and says it better. That's what memory compaction does.
Built by Paul Kyle at phasespace-labs. See AUTHORS.
Start here
Follow the canonical Quickstart for one complete journey: install → start → connect an MCP client → save a decision → open a fresh session → inspect its markdown/provenance → correct it. It keeps the private memory store separate from the code checkout and distinguishes the current release from source-checkout capabilities.
Inspect the retired decision

The screenshot shows the archived initial SQLite decision after the separate PostgreSQL replacement was saved and the original was retired. See the local provenance UI guide for the full read-only inspector and the correction lifecycle; the guide explains that the image is taken after retirement, not before the save steps.
Related MCP server: brain
Supported Platforms
Platform | Session Skill Path | MCP Config |
Claude Code CLI |
|
|
Claude Desktop |
|
|
Cursor |
|
|
VS Code + Claude (Continue / Cline) |
| |
JetBrains + Claude |
|
|
Antigravity IDE |
| native 3-dot MCP menu |
Codex CLI | N/A (no skills) |
|
Pi | N/A (native extension) | plugins/pi/ — per-turn recall via lifecycle hooks |
Cline CLI / SDK | N/A (native plugin) | plugins/cline/ — per-turn recall via |
All platforms share the same MCP server — install once on your server, connect from any IDE. docs/HARNESSES.md is the cross-harness map: what each harness gets (native hooks vs. plugin vs. MCP), how the tiers stack, and where to start. Per-client config snippets: docs/MCP-SETUP.md and docs/MCP-INSTALL-RECIPES.md.
The Idea
Palinode treats plain files as the source of truth and builds its index and interfaces from those files.
Files (markdown + YAML frontmatter)
↓ watched
Index (SQLite-vec vectors + FTS5 keywords, single .db file)
↓ queried by
Interfaces (MCP server, REST API, CLI, OpenClaw plugin)
↓ compacted by
Consolidation (structured operations → validation and application → git commits)That's the whole architecture. One directory of .md files, one SQLite database, one API server. No Postgres, no Redis, no cloud dependency.
One Backend, Every Interface
Palinode doesn't care how you talk to it. The full toolkit — save, search, doctor, dedup-suggest, orphan-repair, diff, blame, rollback, and more — works through every interface:
Interface | Transport | Best For |
MCP Server | Streamable HTTP or stdio | Claude Code, Claude Desktop, Cursor, Windsurf, Zed, VS Code (Continue/Cline) |
REST API | HTTP on :6340 | Scripts, webhooks, custom integrations |
CLI | Wraps REST API | Cron jobs, SSH, shell scripts |
Plugin | OpenClaw lifecycle hooks | Agent frameworks with inject/extract patterns |
Set up once on a server. Connect from any machine, any IDE, any agent framework. The MCP server is a pure HTTP client — it holds no state, no database connection, no embedder. Point it at the API and go.
{
"mcpServers": {
"palinode": { "type": "http", "url": "http://your-server:6341/mcp/" }
}
}That's the entire client config. Works with Claude Code, Claude Desktop, Cursor, Windsurf, Zed, and VS Code (Continue/Cline). palinode-mcp-http serves streamable-HTTP at /mcp/ — use "type": "http", not "type": "sse". Always include the trailing slash in the URL. See docs/MCP-SETUP.md for editor-specific install recipes.
How It Works
Store — Typed markdown files (people, projects, decisions, insights) with YAML frontmatter. Git-versioned. Human-readable. Editable in Obsidian, VS Code, vim, or anything.
Index — A file watcher indexes with FTS5 as you save. Content-hash dedup skips re-embedding unchanged files. The index is a local SQLite file; embeddings can use a local BGE-M3 endpoint or a configured remote provider.
Search — Hybrid BM25 + vector search merged with Reciprocal Rank Fusion. The two arms have different jobs: on full-sentence questions the vector arm can retrieve semantic matches while BM25 catches exact terms and identifiers. See benchmarks for the evaluation context and limitations. Optional associative entity graph and prospective triggers.
Compact — Weekly consolidation where an LLM returns structured operations and Palinode validates and applies them. Every compaction is a git commit you can review, blame, or revert.
Dream — If you've met "dreaming" as the name for this, palinode dream is an alias for palinode consolidate. Use --dry-run to inspect the proposed operations; each completed pass lands as a git commit, so a bad consolidation is a diff to review and a commit to revert.
Audit — git blame any fact. git diff any change. rollback any mistake. These aren't just git-compatible files — palinode_diff, palinode_blame, and palinode_rollback are first-class tools your agent can call.
Requirements
Python 3.11+
Git
Ollama with
bge-m3(ollama pull bge-m3, ≈1.2 GB), or another supported embedding endpoint — for hybrid indexing and search. Since v0.21 you can instead choose explicit lexical mode; it is keyword/FTS retrieval, not a fallback when hybrid's endpoint fails. Saves persist without an embedder, but hybrid search returns HTTP 503 until it is reachable (palinode resolvedegrades to keyword-only and says so). See the Homebrew setup guide for installation and verification.
Optional extras: a chat model for weekly consolidation (any 7B+ that outputs JSON), OpenClaw for agent plugin hooks.
Install
Before your first capture: Palinode stores readable Markdown and Git history. private/restricted control discovery by scope; a caller with API access can still read a hidden memory by its known path and use full-store maintenance tools. These labels provide no encryption or per-user/per-agent authentication. Protect the store, backups and API credentials; use separate instances or filesystem permissions for stronger separation. See the privacy contract.
The Quickstart is the authoritative first-use sequence. It covers the separate private store, second-terminal environment, supported lexical preview and hybrid model paths, editor connection, fresh-session check, inspector, and correction workflow. Do not combine a code checkout and a memory store. For a released Homebrew installation, begin with docs/HOMEBREW.md; for an autonomous agent bootstrap, see llms-install.md.
Running as a service
Three long-running processes (API, watcher, embedder) shouldn't live in terminal tabs. Pick one:
Platform | How | Details |
Anywhere with Docker |
| docker-compose.yml header comments |
Linux | systemd units via | |
macOS | launchd LaunchAgents from templates | |
Windows | use Docker Compose (set | docker-compose.yml header comments |
With compose, your memory stays on the host at ~/.palinode (override with PALINODE_DATA_DIR) — the containers mount it; files remain the source of truth. Already running Ollama on the host? OLLAMA_URL=http://host.docker.internal:11434 docker compose up -d palinode-api palinode-watcher skips the bundled one. Verify any of the three the same way: palinode doctor (or curl http://127.0.0.1:6340/status).
Connect your editor
Palinode speaks MCP. Follow the connection step in the
Quickstart: palinode mcp-config generates a native
fragment for the selected client, and the recipes keep the supported manual
configuration. It is read-only; it never edits a client configuration file.
Connecting to a server on another machine over HTTP? Pass your project:
palinode mcp-config --http --project <slug> adds an X-Palinode-Project
header. Since v0.22 a remote server no longer scopes recall to its own working
directory, so a client without the header gets unscoped results, reported as
Scope: none. See the v0.22.0 compatibility notes. Full per-harness detail:
docs/MCP-INSTALL-RECIPES.md.
Merge the Palinode entry into existing settings; redirecting generated output onto an existing configuration file would overwrite it.
Daily use — drop into a project
Already installed with palinode-api running? Scaffold any project in one command:
cd your-project
palinode initThat scaffolds .claude/CLAUDE.md (memory instructions, appended if one exists), .claude/settings.json (SessionStart + SessionEnd + UserPromptSubmit hook registration), all three hook scripts, and .mcp.json (points Claude Code at the palinode MCP server). Sessions then start smart, recall as they go, and end captured: the SessionStart hook injects your core: true memories into every fresh session (startup and /clear) so standing context is there before the first prompt; the UserPromptSubmit hook recalls relevant memory before each prompt — prospective triggers plus a strict-threshold search, injected as compact snippets, silent when nothing matches; and the SessionEnd hook auto-captures on /clear, logout, and exit. Re-run with --dry-run to preview, --force to overwrite, or --no-mcp / --no-hook to scope it. See examples/hooks/ for tuning knobs.
Projects that use other harnesses get the same memory instructions automatically: when AGENTS.md (or a .agent/ directory) exists, init appends a harness-neutral memory block to AGENTS.md (read by Codex, Antigravity, and other AGENTS.md-aware agents), and when a .cursor/ directory exists it writes .cursor/rules/palinode.md for Cursor. Force or skip with --agents/--no-agents and --cursor/--no-cursor — same recall/save/session-end contract, minus the Claude-Code-only machinery (/clear, /wrap, hooks).
Usage Examples
A few common flows. Every command and option is in docs/CLI.md.
Save a decision, recall it later
# During a session — save a decision
palinode save --type Decision "Chose SQLite over Postgres for the cache layer. \
Reason: no ops burden, single-file deployment, good enough for our scale."
# Next week — search for it
palinode search "database decision for cache"End-of-session capture
# Agent calls at end of coding session
palinode session-end \
--summary "Migrated auth from JWT to session tokens" \
--decisions "Session tokens stored server-side, 24h expiry" \
--blockers "Need to update mobile client auth flow"Audit trail — who decided what and when
# Trace a fact back to when it was recorded
palinode blame decisions/auth-migration.md
# Compose the full provenance lineage of a fact — sources, saved/changed
# commits, supersession trail, typed links, and recall — in one view
palinode trace decisions/auth-migration.md
# See what changed across all memory in the last week
palinode diff --days 7
# Retire a memory that turned out to be wrong — it leaves recall but stays
# on disk, in git, and in the index. Never a hard delete.
palinode archive insights/stale-finding.md --reason "superseded by the re-run" \
--superseded-by insights/corrected-finding.mdTools
Tools available through every interface (the full inventory, with parameters, is the table in docs/MCP-SETUP.md — a prose count here only drifts):
Tool | What It Does |
| Session-start context digest for the resolved project scope |
| Hybrid BM25 + vector search with category filter; |
| What memory holds right now for a question or one record — what stands, what replaced what, conflicts with both sides intact, and what is explicitly unknown |
| Store a typed memory (person, decision, insight, project) |
| Browse memory files by type, filter by core status |
| Read the full content of a memory file |
| Fetch a URL and save as research |
| Health check — file counts, index stats, service status |
| Entity graph — cross-references between memories |
| Preview or run LLM-powered compaction |
| Retire one memory that's wrong or obsolete — archive it, or supersede it with a named replacement |
| Bring an archived memory back into default recall — the inverse of |
| Withdraw one preference's mention-level retraction from one memory |
| Take a forget request back — restore what it archived, un-strike what it retracted |
| Archive ephemeral memories whose TTL has expired |
| What changed in the last N days |
| Trace a fact back to the commit that recorded it |
| Compose a fact's full provenance lineage — sources, saved/changed commits, supersession, typed links, recall |
| Git history for a file with diff stats and rename tracking |
| Revert a file to a previous commit (safe, creates new commit) |
| Sync memory to a remote git repo |
| Prospective recall — auto-inject when a topic comes up |
| Health scan — orphans, stale files, missing fields |
| Advisory project-memory review that proposes corrective operations without writing them |
| Capture summary, decisions, and blockers at end of session |
| List, show, or activate versioned LLM prompts |
| Before saving, surface existing files that overlap the draft |
| Find semantic matches for broken |
| Fast diagnostic pass — 18+ checks across paths, services, config, index |
| Full diagnostic with canary write test (~10–15s) |
| Find top-K semantically related files NOT already wiki-linked — surface implicit relationships for cross-link proposals |
| Given a short topic phrase, return whether any existing wiki page already covers it (binary |
| Dependency tree (or unblocked-items list) from |
Every tool is accessible as palinode_<name> via MCP, palinode <name> via CLI (hyphenated: palinode archive-expired; session_init is palinode prime; doctor_deep has no separate CLI command), or POST/GET /<name> via the REST API.
The CLI has more commands than the tool list — service control, migration, repair, and wiki-maintenance helpers. docs/CLI.md is the full command reference, one entry per command with options, defaults, and output behaviour.
Stack
Layer | Choice | Why |
Source of truth | Markdown + YAML frontmatter | Human-readable, git-versioned, portable |
Vector index | SQLite-vec (embedded) | No server, single file, zero config |
Keyword index | SQLite FTS5 (embedded) | BM25 for exact terms, zero dependencies |
Embeddings | BGE-M3 via Ollama, or any OpenAI-compatible | Local, private, no API key needed |
API | FastAPI | Lightweight, async, one process |
MCP | Python MCP SDK (Streamable HTTP) | Works with every IDE over the network |
CLI | Click (wraps REST API) | Shell-native, TTY-aware output |
Behavior | What to remember, how to extract, how to compact — edit one file to change all behavior |
Memory File Format
---
id: project-palinode
category: project
name: Palinode
core: true
status: active
entities: [person/alice]
last_updated: 2026-04-05T00:00:00Z
summary: "Persistent memory for AI agents."
canonical_question: "What is Palinode and what does it do?"
---
# Palinode
Your content here. As detailed or brief as you want.
Files marked `core: true` are always in context.
Everything else is retrieved on demand via hybrid search.
The `canonical_question` field anchors the file to the question it answers, improving search relevance.Open in Obsidian
Palinode stores every memory as a plain markdown file — which means your memory directory is already a valid Obsidian vault. Point Obsidian at the folder and you get graph view, backlinks, and Bases on top of Palinode's hybrid search and compaction. No sync job, no plugin to install, no two-source-of-truth problem.
palinode init --obsidian --dir ~/palinode-vaultThis scaffolds the vault directory layout, an _index.md Map of Content, a _README.md orientation page, and an opinionated .obsidian/ config (graph view colour-coded by category, daily-notes wired to daily/). Then open the directory in Obsidian.
The LLM follows a wiki-maintenance contract — it keeps entities: frontmatter and [[wikilinks]] in the note body in sync so the Obsidian graph stays accurate as new memories are saved. When you save a memory with entity references, Palinode appends an idempotent ## See also block linking them as wikilinks.
Two embedding-aware tools support wiki hygiene: palinode_dedup_suggest checks whether a draft overlaps an existing file before creating a duplicate, and palinode_orphan_repair finds semantic matches for broken [[wikilinks]]. Both are callable via MCP, CLI, and REST.
See docs/OBSIDIAN.md for the comprehensive guide: quickstart, wiki contract details, migration paths, and FAQ.
Diagnose with palinode doctor
Silent misconfiguration — a db_path pointing at the wrong file, a watcher indexing a stale directory, a phantom DB file — is the most common reason Palinode doesn't behave as expected after an upgrade or server move. palinode doctor catches this entire class of bugs.
palinode doctorThe command runs 18+ checks across paths, services, config consistency, index health, and disk state, and emits a structured report with a pass/warn/fail status for each. --fix mode applies safe automated repairs (creates missing directories, appends the CLAUDE.md Palinode block) — it never moves user data; phantom DB files and DB-path mismatches print suggested mv commands but never execute them.
Run palinode doctor after every install, upgrade, or server migration. See docs/DOCTOR.md for the full check catalog and --fix reference.
Configuration
All behavior is in palinode.config.yaml:
memory_dir: "~/.palinode"
ollama_url: "http://localhost:11434"
embedding_model: "bge-m3"
search:
hybrid_enabled: true
hybrid_weight: 0.5 # 0.0 = vector only, 1.0 = BM25 only
consolidation:
llm_model: "llama3.1:8b" # any chat model that outputs JSON
llm_url: "http://localhost:11434"
llm_fallbacks: # tried in order if primary fails
- model: "qwen2.5:14b-instruct"
url: "http://localhost:11434"All models are swappable. Any Ollama embedding model, any OpenAI-compatible chat endpoint. The default search floors (search.mcp_threshold=0.4 and search.api_threshold=0.5) were measured against real bge-m3 embeddings; if you change the embedding model, re-check those floors and review any trigger threshold separately — the trigger default was not part of this calibration.
Every search delivery also reports a match-confidence verdict — confident,
weak or none — in receipt.retrieval, read from each arm's own pre-fusion
score rather than the fused rank, with the arm evidence beside it. Results are
never withheld for it by default; search.abstain_on_no_confident_match: true
opts the MCP surface into withholding a none slate. See
docs/lexical-retrieval.md.
To re-check the search floors against your configured embedding endpoint, run
python -m bench.abstention. It measures false positives for no-answer queries
and retention of true results for answer-present controls as per-arm search
thresholds increase; it does not calibrate trigger thresholds. See
palinode.config.yaml.example for the full
reference.
Embeddings without Ollama. llama.cpp (llama-server --embedding), vLLM, and LM Studio all expose the OpenAI-compatible /v1/embeddings shape; select it with dialect: openai (default ollama, so existing setups are unchanged). Retry, circuit breaker, and per-input error handling are identical to the Ollama path. The Ollama tag bge-m3 is not a llama-server model name — point llama-server at a BGE-M3 GGUF instead:
embeddings:
primary:
dialect: openai
url: "http://localhost:8080" # a trailing /v1 is fine too
model: "bge-m3" # llama-server ignores it; vLLM / LM Studio match it
dimensions: 1024Hosted OpenAI-compatible embedding providers can also use bearer
authentication and provider-specific endpoint paths. Credentials stay out of
YAML: set PALINODE_EMBEDDING_API_KEY, or set
PALINODE_EMBEDDING_API_KEY_FILE to the path of a file containing the key.
For providers whose embedding endpoint is not /v1/embeddings, set
endpoint_path. When it is omitted, the existing bare-host and trailing-/v1
behavior is unchanged.
embeddings:
primary:
dialect: openai
url: "https://generativelanguage.googleapis.com/v1beta/openai"
endpoint_path: "/embeddings"
model: "gemini-embedding-001"When exposing the API beyond loopback (PALINODE_API_HOST other than 127.0.0.1), set PALINODE_API_TOKEN — the server refuses to start unauthenticated on a non-loopback bind unless you opt out explicitly with PALINODE_API_ALLOW_UNAUTH=1. See SECURITY.md for the bearer-token auth model and the bind gate.
API Reference
Method | Path | Description |
|
| Health check + stats |
|
| Hybrid search with filters |
|
| Entity graph traversal |
|
| Create a typed memory file. Schema: |
|
| Fetch URL, save as research. The URL and each redirect target (five hops at most) are validated before they are requested: a host must resolve only to globally routable addresses, and the connection is made to the address that was validated rather than by name. Pinning is skipped for HTTPS requests through an HTTP CONNECT proxy; address validation still runs (see the CLI guide). |
|
| Prospective recall triggers |
|
| Run or preview compaction |
|
| Browse files by type |
|
| Read a memory file |
|
| Git log for a file |
|
| Recent changes |
|
| Git blame |
|
| Composed provenance lineage for a file |
|
| Revert a file |
|
| Push to git remote |
|
| Rebuild indices |
|
| Capture session summary |
|
| Health scan |
Design Principles
Files are truth. Not databases, not vector stores. Markdown files that humans can read, edit, and version with git.
Typed, not flat. People, projects, decisions, insights — each has structure. This enables reliable retrieval and consolidation.
Consolidation, not accumulation. 100 sessions should produce 20 well-maintained files, not 100 unread dumps.
Invisible when working. The human talks to their agent. Palinode works behind the scenes.
Graceful degradation. Vector index down? Read files directly. Embedding service down? Grep. Machine off? It's a git repo, clone it anywhere.
Zero taxonomy burden. The system classifies. The human reviews. If the human has to maintain a taxonomy, the system dies.
What's Unique
Your data, your files — No accounts, no cloud dependency, no vendor lock-in. Your memory is markdown files in a directory you control. Export is
cp. Backup isgit push. Whatever happens to any tool in this ecosystem, your data is plain text on your filesystem.Cross-IDE memory — Your memory lives in one place. Connect from Claude Code, Cursor, Windsurf, Zed, or any MCP-compatible editor. Switch IDEs without losing context.
Git operations as agent tools —
diff,blame,rollback,pushexposed via MCP. No other system makes git ops callable by the agent.Operation-based compaction — Structured operations are schema-checked and applied as reviewable git commits.
Per-fact addressability —
<!-- fact:slug -->IDs inline in markdown, invisible in rendering, preserved by git, targetable by compaction.4-phase injection — Core (always) + Topic (per-turn search) + Associative (entity graph) + Triggered (prospective recall).
Multi-transport MCP — stdio for local, Streamable HTTP for remote. One server, any IDE on any machine.
If everything crashes,
catstill works.
Measured, not asserted: docs/BENCHMARKS.md has LongMemEval results
with methodology, cost, and the losses. For what Palinode does and does not guarantee
about forged, planted, or borrowed-authority content reaching an agent through memory,
see SECURITY.md#memory-poisoning-and-trust-limitations.
Acknowledgments
Palinode builds on ideas from Karpathy's LLM Knowledge Bases, Letta (tiered memory), and LangMem (typed schemas + background consolidation). See docs/ACKNOWLEDGMENTS.md for the full list.
See also the epistemic integrity discussion in the Karpathy gist thread — particularly the problem of LLM wikis that "synthesise without citing, drift from sources without knowing it, and present false certainty where disagreement exists." Git-based provenance is Palinode's answer to that problem.
If you know of prior art we missed, please open an issue.
License
MIT — Privacy Policy
Built by Paul Kyle with help from AI agents who use Palinode to remember building Palinode.
Available Tools
39 toolspalinode_archiveADestructiveIdempotent
Retire one specific memory that is wrong or obsolete. Sets status: archived so it leaves default recall, records the reason in the file's history sibling, and commits — never hard-deletes, so the content stays auditable. Pass superseded_by to name the memory that replaces it (a SUPERSEDE rather than a plain archive). Use this instead of re-saving a memory with a hand-written tombstone body: that leaves the wrong content live in search.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why this memory is being retired (kept in the audit trail). | |
| dry_run | No | Preview what would change, the retained copies and the recovery command; write nothing. | |
| file_path | Yes | Memory file path (e.g., 'insights/stale-finding.md') | |
| superseded_by | No | Slug or path of the memory that replaces this one. Omit for a plain archive with no successor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it specifies the exact state change (sets status: archived), the effect (leaves default recall), where the reason is recorded (the file's history sibling), that it commits, and that it never hard-deletes so content stays auditable. The destructiveHint=true annotation is clarified rather than contradicted — this is soft, auditable mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and each sentence carrying distinct content (purpose, behavior, usage). Tight and well-structured, with only minor redundancy between the behavior and usage sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no output schema, the description covers the state change, the retention guarantee, the audit-trail behavior, and the alternative to avoid. An agent has enough to call it correctly; the main unstated item is what the tool returns on success or failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters (baseline 3). The description adds conceptual meaning on top — superseded_by turns a plain archive into a SUPERSEDE, and reason is framed as part of the audit trail — which lifts it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Retire one specific memory that is wrong or obsolete' — and scopes it to a single memory, which distinguishes it from the bulk sibling palinode_archive_expired. An agent can identify what the tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance and an alternative workflow ('Use this instead of re-saving a memory with a hand-written tombstone body'). However, the alternative named is a manual pattern rather than the actual sibling tools (palinode_save, palinode_archive_expired, palinode_forget_withdraw), so routing among siblings is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_archive_expiredADestructiveIdempotent
Archive ephemeral memories whose expires_at has passed (ADR-015 §2.3 TTL regime). Deterministic + idempotent — flips expired memories to status: archived so they drop out of default recall while staying on disk. Set dry_run=true to preview.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview which memories would be archived without writing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Expands on annotations: specifies deterministic, idempotent (consistent with idempotentHint), effect on status, persistence on disk, and dry_run preview. No contradiction with destructiveHint=true. Adds context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-loading the action. Every sentence provides essential info: what, effect, condition, and usage tip. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and simple mutation, description fully covers purpose, behavior, and parameter. Return value not needed; tool side effects are clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter dry_run is 100% schema-covered with description. Tool description repeats schema description without adding new meaning. Baseline 3 applies as schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states it archives ephemeral memories with expired expires_at, referencing ADR-015. Distinguishes from sibling palinode_archive by specificity to TTL regime. Clear verb+resource scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly indicates when to use (expired memories). Implicitly distinguishes from palinode_archive (non-expired/memories), but lacks explicit exclusion or mention of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_blameARead-onlyIdempotent
Trace a fact back to when it was first recorded. Shows which session or commit created each line in a memory file.
| Name | Required | Description | Default |
|---|---|---|---|
| claims | No | Also resolve the file's claim-level source anchors: which source span justifies each claim, with live integrity status. | |
| search | No | Optional: filter to lines containing this text | |
| file_path | Yes | Memory file path (e.g., 'projects/my-app.md') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by saying the tool maps each line to the session or commit that created it. It does not describe output formatting or whether the claims flag changes the response, but there is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the primary purpose, and the second clarifies the output granularity. The description is front-loaded and every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with 3 well-documented parameters and rich safety annotations, the description is largely complete. Since there is no output schema, the description does need to convey return semantics, and 'shows which session or commit created each line' does that. It could be more explicit about how the optional claims and search flags reshape the result, but the schema fills that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter (file_path, search, claims) already has a meaningful schema description. The tool description adds little parameter-level detail beyond reinforcing that file_path targets a memory file and that the result is line-oriented, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Trace') with a clear resource ('a fact', 'each line in a memory file') and explains the outcome: showing which session or commit created a line. It evokes git-blame semantics, which helps distinguish it from general history or diff tools, though it does not explicitly name sibling alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when an agent needs to know the provenance of a fact or line in a memory file. It does not explicitly state when not to use it or mention alternatives like palinode_trace or palinode_history, so the when-to-use guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_cluster_neighborsARead-onlyIdempotent
Given a memory file path, find the top-K semantically related files that are NOT currently linked to or from it (no existing [[wikilink]] in either direction). Use during wiki-maintenance passes to surface implicit relationships that no wikilink yet captures — the LLM can then propose new cross-links. Preprocessing strips wikilink syntax and the auto-generated ## See also footer so notes linking the same entities don't false-positive as related.
| Name | Required | Description | Default |
|---|---|---|---|
| top_k | No | Maximum number of candidate files to return. Default 10. | |
| file_path | Yes | Relative file path (e.g. 'decisions/palinode-arch.md') to find unlinked semantic neighbours for. | |
| min_similarity | No | Minimum cosine similarity to surface (0.0–1.0). Default 0.70. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds valuable detail about preprocessing that strips wikilink syntax and '## See also' footers to avoid false positives, enhancing transparency beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, with the core functionality immediately stated. Each sentence adds value: purpose, usage, preprocessing detail. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema, the description could specify what the tool returns (e.g., list of file paths with scores). However, the purpose and usage are sufficiently clear for an agent to understand when and how to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does not add new meaning beyond the schema, but the mention of 'top-K' and 'semantically related' aligns with parameter purposes. No additional depth is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the function: find top-K semantically related files that are not linked via wikilinks. It uses specific verbs and resources, and distinguishes from sibling tools by focusing on unlinked semantic relationships for wiki maintenance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends use during 'wiki-maintenance passes' to surface implicit relationships. While it does not list alternative tools or contraindications, the context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_consolidateADestructive
Run a manual knowledge consolidation pass. Set dry_run=true to preview the proposed operations without applying them. A pass that reaches the LLM can run for minutes and may outlast your client's own tool-call timeout; the server finishes it either way and holds a run lock while it does, so a retry returns 409 rather than starting again.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview operations without writing changes. Recommended when invoking from MCP — the tool is annotated destructive. | |
| nightly | No | Run the nightly compaction prompt instead of the default write-time pass. | |
| sources | No | Memory directories to consolidate, e.g. `["insights"]`. Defaults to `daily` only. | |
| respect_gate | No | Apply the activity gate the automatic cron path uses (enough time elapsed AND enough sessions since the last pass); reports `deferred` instead of running when a pass is not yet due. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/non-idempotent, but the description adds substantial context they cannot: the pass can run for minutes and outlast the client timeout, the server completes it regardless, a run lock is held, and a retry returns 409. This is exactly the kind of timeout/locking/retry disclosure an agent needs before invoking a long destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose before operational caveats. Dense but no wasted filler; the timeout/lock information is compressed effectively.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description covers the critical behavioral risks (duration, timeout, locking, retry 409, dry-run preview). It could say more about what the pass actually rewrites in memory, but the operational picture is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters including dry_run's preview behavior. The description repeats the dry_run semantics but says nothing about nightly, sources, or respect_gate, so it adds little beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Run) and resource (manual knowledge consolidation pass), and the word 'manual' implies contrast with the automatic cron path. It does not explicitly name a sibling alternative, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operational guidance for dry_run but never states when a consolidation pass is warranted versus siblings like palinode_trigger or palinode_review. Usage is implied by 'manual' rather than spelled out with conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_correction_applyADestructive
Apply a correction previewed by palinode_correction_preview. Requires confirm=true and the expect_revision that preview returned; a target that changed since the preview, or a ref matching more than one memory, is refused with what it found rather than resolved by guesswork. Writes only through the existing validated path — the replacement is saved and the original is archived with superseded_by, so the original stays on disk, in git and retrievable as history. An ordinary later observation must NOT be routed here: this is the explicit, confirmed path, and it is the only one that retires anything. applied: "partial" means the replacement was saved and the original was NOT retired — do not re-run the correction; run the complete_command it returns.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | supersede or retire. Derived from `replacement` when omitted. | |
| reason | No | Why. Recorded in the history sibling and the commit subject. | |
| target | Yes | Memory to correct, exactly as previewed. | |
| confirm | Yes | Must be true. Nothing is written without it. | |
| project | No | Project scope for the replacement. | |
| claim_id | No | Narrow the correction to one '<!-- fact:id -->' claim inside the target. | |
| backed_by | No | Records supporting the REPLACEMENT (category/slug refs). The superseded original is never among them. | |
| replacement | No | The text that stands instead. Omit to retire with no successor. | |
| candidate_id | No | The candidate this came from; it is marked applied in the queue. | |
| expect_revision | Yes | The revision palinode_correction_preview returned. A mismatch is refused. | |
| allow_content_loss | No | Explicitly permit dropping the original text listed by preview. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, non-idempotent, but the description adds substantial context beyond them: the original is archived with superseded_by and stays retrievable in git/history, stale revisions and ambiguous refs are refused rather than guessed, and the partial outcome is explained. This is exactly the extra behavioral detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and is dense with no filler, but the middle sentence about 'existing validated path' and retrieval is somewhat sprawling for a description that must be scanned quickly. Still, nearly every clause earns its place by covering a distinct behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description supplies the critical return-value semantics for the partial case and the follow-up command to run, plus refusal behavior and the archive/retain guarantee. An agent has everything needed to call this correctly and interpret the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: confirm must be true or nothing is written, expect_revision must match what preview returned, target must match the previewed ref, and partial replies signal a specific recovery action. The enum/derived action and allow_content_loss are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (apply a correction) scoped precisely to the preview produced by palinode_correction_preview, and explicitly distinguishes itself from the preview, dismiss, and undo siblings as the only retiring path. An agent can tell what this does and which sibling precedes it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (confirm=true, matching expect_revision) and an explicit exclusion: 'An ordinary later observation must NOT be routed here.' It also names the alternative flow for the partial outcome ('do not re-run the correction; run the complete_command it returns'), covering both when-to-use and when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_correction_dismissAIdempotent
Record that a correction candidate was reviewed and declined. Writes no memory: the candidate's queue row is marked dismissed, with the reason, and kept — which is what stops a later transcript scan proposing the same span again. A reason is required, because a dismissal with none is indistinguishable from a candidate nobody ever looked at.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it was declined. This is the record. | |
| candidate_id | Yes | The candidate id from palinode_corrections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it clarifies that no memory is written, that the queue row is marked dismissed and kept, and that the reason is mandatory and stored. This reconciles with destructiveHint=false and readOnlyHint=false by explaining exactly what state changes and what is preserved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the state effect, then the rationale for the required parameter. No filler; each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two fully documented parameters, annotations covering the safety profile, and no output schema, the description supplies everything needed: what it does, what it writes, what it preserves, and why the reason is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it stresses the reason is required and explains why (a dismissal without one is indistinguishable from an unlooked-at candidate), reinforcing that the reason is the durable record.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: recording that a correction candidate was reviewed and declined. It clearly distinguishes itself from siblings like palinode_correction_apply or palinode_correction_undo by naming the exact action and target (the candidate's queue row).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the context in which it is used (after a candidate is reviewed and declined) and gives the consequence (prevents a later transcript scan from re-proposing the same span). It does not explicitly name the sibling alternatives such as apply/undo, but the usage situation is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_correction_previewARead-onlyIdempotent
Show exactly what correcting or retiring one memory would change — and change nothing. Returns the old text, the proposed new text, the affected document (and claim), its exact source revision, the rationale, where the correction came from, the project scope, the supersedes/superseded_by relation that would be recorded, every other record that quotes or derives from the target (reported, never rewritten), and the recovery command. Call this before palinode_correction_apply: the revision it returns is what apply requires back, so a target that changed in between is refused rather than silently merged.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | supersede (a replacement stands) or retire (nothing does). Derived from `replacement` when omitted. | |
| reason | No | Why. Recorded in the history sibling and the commit subject. | |
| target | No | Memory to correct: 'decisions/x.md', 'decisions/x', or a bare slug. A slug naming two memories is refused with both, never guessed. | |
| project | No | Project scope. Inferred from the target's own entities when omitted. | |
| claim_id | No | Narrow the correction to one '<!-- fact:id -->' claim inside the target. | |
| backed_by | No | Records supporting the REPLACEMENT (category/slug refs). The superseded original is never cited as support for its replacement — it is lineage, and a verified quote of it establishes what it said, not that the new claim is true. | |
| replacement | No | The text that would stand instead. Omit to retire the target with no successor. | |
| candidate_id | No | The palinode_corrections candidate this came from; its span, session and turn become the recorded source. | |
| allow_content_loss | No | Explicitly permit dropping the original text listed by preview. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is lower; the description clears it easily by disclosing the return payload, the revision-token contract with apply, and the concurrency guarantee (stale targets refused, never silently merged). It also notes quoting records are 'reported, never rewritten', which is real behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the must-call-before-apply rule are front-loaded, and the long return enumeration is justified because no output schema exists. Every clause carries distinct information; none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 9 parameters, the description carries the burden and does so: it enumerates the return contents, the revision contract, and the stale-target refusal behavior. An agent has everything needed to call it correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter carries a detailed inline description, so the schema already does the heavy lifting. The description echoes return fields (rationale, source, project scope, supersedes relation) but adds no syntax or format detail beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show what correcting or retiring one memory would change') plus the critical scope constraint ('and change nothing'), which distinguishes it from the mutating sibling palinode_correction_apply. An agent can tell it apart from the apply tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this before palinode_correction_apply' and explains why: the revision it returns is required by apply, so a target changed in between is refused rather than silently merged. This gives both the when and the consequence, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_correctionsARead-onlyIdempotent
List correction candidates mined from harness session transcripts: moments the user overturned a decision, rejected an approach and said why, or asked for something to be remembered. Each candidate quotes a bounded span of the user's own words with the session, turn and project it came from. Advisory and read-only — candidates are proposals awaiting review, never applied, and the list is empty unless the store's operator enabled transcript capture and named the transcript paths in config. Running a fresh detection pass is deliberately an operator action on the CLI or REST API, not something this tool can trigger.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Only candidates scoped to this project (e.g. 'harbor-notes'). Omit for all. | |
| since_days | No | Only candidates from the last N days. Omit for the whole queue. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds material beyond that: candidates are proposals 'awaiting review, never applied,' and the tool cannot trigger detection. Those are non-obvious operational facts an agent could otherwise assume incorrectly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: what it lists, what a candidate contains, and the advisory/preconditions. Dense but every clause carries information; only the final clause about the CLI/REST detection pass is slightly beyond the minimal core, and it is still useful routing context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the return shape: each candidate quotes a bounded span of the user's own words plus session, turn and project. Combined with the emptiness precondition and advisory status, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two optional filters (project, since_days), and the schema documents each including the 'omit for all' default. The description adds no syntax or format detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'List correction candidates mined from harness session transcripts,' with a concrete enumeration of what qualifies (overturned decisions, rejected approaches, remember requests). This clearly distinguishes it from siblings such as palinode_correction_apply or palinode_correction_preview, which act on candidates rather than listing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real context for when the tool yields data: 'the list is empty unless the store's operator enabled transcript capture and named the transcript paths in config,' and notes that a fresh detection pass is deliberately an operator action on the CLI or REST API, not this tool. It stops short of naming a sibling tool to use instead, but the precondition and exclusion are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_correction_undoAIdempotent
Preview (default) or apply the undo of a correction. Without confirm this reads: it states what would be restored, what would NOT be deleted, and what cannot be reached at all — restoring a previous assertion, deleting history and undoing an agent's external actions are three different things and only the first is on offer. With confirm=true and the preview's expect_revision it brings the archived record back to status: active. It refuses to resurrect a record that was separately retracted or withdrawn by a forget request.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why the correction is being undone. | |
| target | Yes | The archived memory to restore. | |
| confirm | No | Must be true to write. Preview is the default. | |
| expect_revision | No | The revision the undo preview returned. Required with confirm. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses important behavioral details: preview mode reports what would be restored, what would not be deleted, and what cannot be reached; apply mode requires confirm and expect_revision; and the tool refuses to resurrect retracted or withdrawn records. These details are consistent with the annotations and add substantial context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably front-loaded and dense with useful information, with the default preview behavior stated first. It is slightly verbose in the middle sentence, but every major clause contributes to safe and correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation tool with no output schema, the description is complete enough: it covers purpose, preview versus apply behavior, required procedural parameters, expected restoration effect, and refusal conditions. Annotations already cover safety hints, and the description fills the remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds procedural meaning by tying confirm and expect_revision together and clarifying that expect_revision comes from the preview. This helps an agent understand the intended parameter workflow beyond the schema's individual descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: undoing a correction, with a clear preview/apply split. It also distinguishes this operation from related but different actions such as deleting history or undoing external agent actions, which helps separate it from sibling tools like restore or forget_withdraw.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains when to use preview mode versus write mode: without confirm it reads, and with confirm plus expect_revision it applies. It also states a refusal condition, but it does not name sibling tools to use instead for related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_dedup_suggestARead-onlyIdempotent
Given draft memory content the LLM is about to save, return the top-K existing memory files whose embeddings are semantically near it. Use BEFORE writing a new memory to decide 'create new' vs 'update existing'. Each result includes a strong_dup flag — when true (similarity ≥ 0.90), the existing file is a near-paraphrase and the LLM should usually update rather than create. Preprocessing strips wikilink syntax and the auto-generated ## See also footer so notes linking the same entities don't false-positive as duplicates.
| Name | Required | Description | Default |
|---|---|---|---|
| top_k | No | Maximum number of candidate files to return. Default 5. | |
| content | Yes | The draft memory body about to be saved (markdown, with or without frontmatter). | |
| min_similarity | No | Minimum cosine similarity to surface (0.0–1.0). Default 0.80. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds valuable behavioral details beyond annotations: preprocessing strips wikilink syntax and auto-generated footer to avoid false positives, explains strong_dup flag meaning and recommended action. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with efficient structure: purpose, usage guideline, preprocessing detail. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, return value (strong_dup), and preprocessing. Lacks return structure details, but given no output schema, it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers parameters fully (100%), but description adds meaning about output (strong_dup flag) which is not in schema, compensating for lack of output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'return the top-K existing memory files whose embeddings are semantically near it', with specific verb+resource and distinct purpose from siblings like palinode_save or palinode_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use BEFORE writing a new memory to decide create new vs update existing', providing clear context. Doesn't mention when not to use, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_dependsARead-onlyIdempotent
Return the dependency tree for a milestone or task slug, or list all unblocked items. Reads depends_on / blocks / parallel_with frontmatter from ProjectSnapshot files. Set unblocked=true to answer 'what can I work on right now?' across all slugs.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Milestone or task slug to inspect (e.g. 'milestone/M1'). Required unless unblocked=true. | |
| unblocked | No | If true, return the list of all slugs whose every depends_on is done (ignores slug). Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, idempotentHint, and destructiveHint. The description adds that it reads frontmatter from ProjectSnapshot files and explains the unblocked behavior, providing useful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-load the primary function and add a secondary mode. Every sentence adds value, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the two main use cases adequately. No output schema, but description doesn't detail return format; however, for an agent selecting the tool, this is sufficient. Minor gap in describing error cases or edge conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the description adds meaningful context: slug is required unless unblocked=true, and unblocked returns slugs whose dependencies are done. This goes beyond the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns dependency trees or unblocked items, with specific verb and resource. It distinguishes from sibling tools by focusing on dependency relationships, a unique function among many palinode tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use unblocked=true for actionable items, and implies slug for tree inspection. Lacks direct comparisons to sibling tools but offers clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_diffARead-onlyIdempotent
Show what memories changed recently. Use to review what was learned, decisions made, or facts updated in the last N days.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look back this many days (default 7) | |
| paths | No | Filter to specific directories (e.g., ['projects/', 'decisions/']) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only (readOnlyHint=true), idempotent (idempotentHint=true), and non-destructive (destructiveHint=false) behavior. The description confirms it shows changes, aligning with annotations, but adds no additional behavioral disclosure beyond the basic read operation. Given annotation coverage, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the function, the second gives a usage directive. Every sentence is concise and relevant, with no wasted words. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two parameters, no output schema, and extensive annotations, the description sufficiently covers the tool's context. It explains the purpose and provides a typical use case. Some might expect a mention of the default days value, but that is already in the schema. Overall, it is complete for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters ('days' and 'paths') are fully described in the input schema with defaults and filtering semantics. The tool description does not add further meaning to these parameters, so it relies on the schema's 100% coverage. Baseline score of 3 applies as the description adds no extra parameter context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool shows recent memory changes with a specific verb ('Show') and resource ('memories'). It provides context for what types of changes are relevant (learnings, decisions, facts). While it doesn't explicitly differentiate from siblings like palinode_history, the usage hint suggests a focus on recent period, making the purpose clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to 'Use to review what was learned, decisions made, or facts updated in the last N days,' providing a concrete use case. It implies the tool is for recent changes but does not mention alternatives or when not to use it. Nevertheless, the guidance is directly actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_doctorARead-onlyIdempotent
Fast palinode health check (<500ms). Skips network probes and canary writes. Checks path integrity, config consistency, and env-var drift. Use this first; call palinode_doctor_deep when results are unclear.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive. Description adds timing (<500ms), skipping details (network probes, canary writes), and specific checks. Good additional context, though return format not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with key information, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks description of return values (no output schema). For a health check tool, knowing the response structure would be helpful, but the description covers what is checked.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage is 100% (empty schema). Description does not need to elaborate on parameters. Baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it performs a fast health check, specifying what it checks (path integrity, config consistency, env-var drift) and distinguishes from sibling palinode_doctor_deep.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use this tool first and to call palinode_doctor_deep when results are unclear, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_doctor_deepARead-onlyIdempotent
Full palinode health check including network probes and canary write tests. Takes 10-15s. Use when palinode_doctor reports unclear results or you need to verify the API, watcher, and service connectivity.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate safe read operation (readOnlyHint=true, idempotentHint=true, destructiveHint=false). Description adds useful context: execution time (10-15s) and includes canary write tests (not purely read-only despite hint). No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. Clearly states purpose, timing, and usage guidance in a compact format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and no output schema, the description covers all essential information: what it does, how long it takes, and when to use. Sufficient for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in input schema, so no explanation needed. Baseline 4 for zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it performs a full health check with network probes and canary write tests, taking 10-15s. It distinguishes itself from the sibling tool palinode_doctor by being a deeper check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: when palinode_doctor reports unclear results or when verifying API, watcher, and service connectivity. Implies palinode_doctor as an alternative for lighter checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_entitiesARead-onlyIdempotent
List all known entities, or get memory files referencing a specific entity.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_ref | No | Optional entity reference (e.g. person/alice) to lookup files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and destructiveHint=false, so the description's behavioral disclosure is adequate but adds little beyond the two modes (list all vs. specific). No additional traits like pagination or rate limits are noted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no unnecessary words. Every word is informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, the description is adequate but could elaborate on what memory files are or the response format. No output schema exists, so more detail would help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter fully (100% coverage). The description mentions its effect briefly but adds no meaning beyond the schema's description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all known entities or retrieves memory files for a specific entity. It uses a specific verb ('List') and resource ('entities'), distinguishing it from siblings like palinode_search or palinode_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use to list entities or lookup files. However, no explicit when-not-to-use guidance or alternatives among many sibling tools (e.g., palinode_search) are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_explainARead-onlyIdempotent
Explain one delivery of context: given the bundle_id a search receipt returned, show which memories were supplied, the exact revision of each (and whether its source changed since), the resolved scope, the calling surface, each record's disposition, and the coverage qualifiers. Fields that were never recorded are reported as unavailable with the reason, never guessed. This is supplied context only — no evidence that anyone acted on it is recorded. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum supplied records to show; the rest are counted. | |
| bundle_id | Yes | Delivery reference from a receipt (the `bundle_id` / `receipt_ref`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real value beyond them: missing fields are 'reported as unavailable with the reason, never guessed,' and it warns the output is 'supplied context only — no evidence that anyone acted on it is recorded.' That interpretive caveat is exactly the kind of behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and then a dense but purposeful enumeration of returned fields, followed by two short caveats. Every clause earns its place, though the long list makes it heavier than a strictly minimal definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining return contents and does so thoroughly (fields shown, unavailability handling, interpretive limits). Safety is covered by annotations, so the remaining omission is only minor pagination/counting behavior, which the schema handles.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds provenance for bundle_id by tying it to 'the bundle_id a search receipt returned.' The limit parameter is left to the schema, which documents it adequately, so this lands slightly above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (explain) and a tightly scoped resource (one delivery of context keyed by bundle_id), then enumerates exactly what is surfaced: supplied memories, per-record revisions and source-change status, resolved scope, calling surface, dispositions, and coverage qualifiers. The 'delivery of context' scope is distinctive enough against siblings like trace/history/blame that an agent can route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description anchors usage clearly: 'given the bundle_id a search receipt returned,' establishing this as the follow-up to a search that produced a receipt. It does not name an alternative sibling or state when not to use it, so it falls short of the explicit when/when-not/alternatives bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_forget_withdrawADestructiveIdempotent
Take a forget request back. Given the memory that holds the request ('please forget that I…'), restores every memory it archived, un-strikes every mention it retracted, and archives the request record(s) so they stop acting as the retraction. Each step is its own audited commit; failures are reported per target.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why the request is being withdrawn (kept in the audit trail). | |
| dry_run | No | Preview what would change, the retained copies and the recovery command; write nothing. | |
| file_path | Yes | Path of the memory holding the forget request (e.g., 'insights/forget-sneakers.md') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so safety is partly covered. The description adds meaningful behavior beyond that: it is a multi-step composite, each step is an audited commit, and failures are reported per target. What it does not cover is whether partial success leaves the system in an intermediate state or how recovery works on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the single-sentence purpose, then the mechanics, then the commit/failure semantics. Every sentence carries information and there is no padding, though the final clause about per-target failures is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-step mutation with no output schema, the description is largely sufficient: it explains what is touched, that work is committed in audited steps, and how failures surface. It could go further on permission requirements and the resulting state after a partial failure, but the core is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all three parameters, so the schema already documents file_path, reason and dry_run semantics. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Take a forget request back') and then enumerates exactly what it does: restores archived memories, un-strikes mentions, archives the request record. That is far more specific than a tautology. It stops short of a 5 because it never names the closely related siblings (palinode_restore, palinode_unretract, palinode_archive) that an agent might otherwise reach for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Given the memory that holds the request' plus the parenthetical example implies the entry condition, but there is no explicit when-to-use vs when-not guidance and no mention of alternatives for partial undo (e.g., using restore/unretract individually). Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_historyARead-onlyIdempotent
Show the change history of a memory file. Tracks renames (--follow) and includes diff stats per commit. Use detail='full' for the commit-level evolution view.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of commits to show (default 20) | |
| detail | No | 'summary' (default) returns hash/date/message/stats. 'full' additionally includes the unified diff body per commit (commit-level evolution view). | summary |
| file_path | Yes | File path relative to the memory directory (e.g. people/alice.md) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior, so the description only needs to add context beyond that. It adds useful behavioral facts not present in the schema: 'Tracks renames (--follow)' and 'includes diff stats per commit.' There is no contradiction with the annotations. More detail on output ordering or pagination would be nice, but not necessary for this read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The main purpose is front-loaded, followed by a behavioral note and one targeted usage instruction. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the detail parameter's description in the input schema already explains the return structure for summary and full modes (hash/date/message/stats vs unified diff body). Combined with the tool description's rename tracking and diff stats, the agent has enough information to invoke and parse the tool. Minor details like ordering or pagination are not critical for this read-only history operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter already well-documented: limit default, detail enum values, and file_path relative to the memory directory. The description mentions detail='full' but adds no new parameter semantics beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with 'Show the change history of a memory file,' a specific verb+resource that clearly orients the agent. It also adds distinctive behavior ('Tracks renames (--follow)', 'diff stats per commit') that separates it from related siblings like palinode_diff or palinode_blame, though it does not explicitly name or contrast those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is clearly stated ('change history of a memory file'), and the instruction 'Use detail='full' for the commit-level evolution view' gives concrete guidance on parameter selection. It does not explicitly exclude sibling tools or say when to choose history over blame/diff, but the context is unambiguous enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_ingestA
Fetch a URL and save it as a research reference in Palinode memory.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to fetch and ingest | |
| name | No | Optional title/name for the reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a write operation (readOnlyHint=false) and potential external side effects (openWorldHint=true). The description adds the specific 'save as research reference' context but does not detail error handling, idempotency, or other behaviors beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with 12 words, front-loaded with the core action, no wasted words. Excellent conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimally adequate for a simple two-parameter tool with annotations. However, it lacks information about return values (no output schema), error handling, and the specific meaning of 'research reference' in the Palinode context. Given the number of sibling tools, more context could help differentiation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains both parameters. The description adds no additional meaning beyond the schema (e.g., what constitutes a 'research reference'). Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('fetch a URL and save it') and the resource ('research reference in Palinode memory'). It differentiates from siblings like palinode_save by specifying the external fetch aspect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (when you want to import a web page) but does not explicitly state when not to use it or provide alternatives. No guidance on prerequisites or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_lintBRead-onlyIdempotent
Scan memory for health issues: orphaned files, stale active files (>90 days), missing frontmatter fields, and potential contradictions. Returns a report without modifying files.
| Name | Required | Description | Default |
|---|---|---|---|
| propose | No | Also translate the deterministic findings into proposed consolidation operations, each with its rationale and the finding it came from. Advisory: this tool never applies them — run `palinode lint --apply` to let the executor act. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description still adds value beyond that: it confirms 'Returns a report without modifying files' and discloses the concrete staleness threshold (>90 days), a behavioral detail absent from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the scan target and its checks, then the non-mutating guarantee. The enumerated issue list is dense but each item carries meaning; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lint tool with one optional param and no output schema, the description covers purpose, scope, and non-mutation adequately. But given a crowded 30-sibling namespace with three overlapping 'doctor'-style tools, it omits the differentiation an agent needs to disambiguate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'propose' parameter is documented richly in the schema itself (including the advisory note that nothing is applied). The description does not mention 'propose' or the report's structure, but with full schema coverage the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Scan') and resource ('memory') and enumerates the exact health classes it detects (orphaned files, stale >90d, missing frontmatter, contradictions), so the intent is unambiguous. However, it never distinguishes itself from close siblings like palinode_doctor, palinode_doctor_deep, or palinode_orphan_repair, leaving the agent to guess which check-tool it wants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and with siblings named palinode_doctor, palinode_doctor_deep, and palinode_orphan_repair, the omission is material. The description only says what it scans, not when an agent should pick lint over the doctor family.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_listARead-onlyIdempotent
List memory files, optionally filtered by category or core status. Use to browse what memories exist before reading or searching.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Filter by category: people, projects, decisions, insights, research | |
| core_only | No | If true, only return files with core: true in frontmatter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds context about filtering but does not contradict annotations. It is not overly detailed beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long with no wasted words. It front-loads the core action and follows with the usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with two optional parameters and rich annotations, the description is adequate but does not specify the output format or return value structure, which would be helpful given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and both parameters have descriptions in the schema. The description mentions the filtering options but does not add new meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list', the resource 'memory files', and the optional filters by category or core status. It distinguishes itself from sibling tools like 'read' and 'search' by mentioning browsing before reading or searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use to browse what memories exist before reading or searching.' This implies when to use it, though it does not explicitly state alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_orphan_repairARead-onlyIdempotent
Given a [[wikilink]] whose target file does not exist, return existing memory files semantically near the link target text. Use during wiki-maintenance passes to either propose a redirect (rename the link to point at an existing file) or to create the missing target file with informed context about its semantic neighbours. Accepts either [[name]] or bare name.
| Name | Required | Description | Default |
|---|---|---|---|
| top_k | No | Maximum number of candidate files to return. Default 10. | |
| broken_link | Yes | The wikilink text (e.g. '[[alice-meeting]]') or bare target slug. | |
| min_similarity | No | Minimum cosine similarity to surface (0.0–1.0). Default 0.65 — looser than dedup_suggest because the LLM picks from a wider slate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds behavioral context: it is used for broken links, returns existing files, and is safe for maintenance. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (3-4 sentences) and front-loaded with the core function. Every sentence adds necessary context without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description indicates the return type: existing memory files semantically near the link. It explains the tool's purpose for maintenance. Slightly missing explicit ordering or ranking info, but overall sufficient given parameter hints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions. The description adds value beyond schema: it clarifies that broken_link accepts both [[name]] and bare name, and explains that min_similarity default is looser than dedup_suggest. This helps the agent understand parameter intent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool's function: given a wikilink to a missing file, return semantically near existing files. It distinguishes from sibling tools like dedup_suggest by specifying the context of orphan repair and the action of proposing redirects or creating new files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly mentions usage during 'wiki-maintenance passes' and describes two use cases: proposing a redirect or creating a missing file. However, it does not explicitly state when not to use it or name specific alternatives, though the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_promptA
List, read, or activate versioned LLM prompts stored as memory files in the prompts/ directory. Use 'list' to browse available prompts, 'read' to view a specific prompt's content, or 'activate' to set a prompt version as active (deactivates others of the same task).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Prompt name (required for 'read' and 'activate') | |
| task | No | For 'list': filter by task type | |
| action | Yes | Action to perform: 'list', 'read', or 'activate' | list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations set readOnlyHint=false, destructiveHint=false, etc. The description adds behavioral context: 'activate' deactivates others of the same task, indicating side effects. This goes beyond annotations by disclosing the deactivation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the main purpose and then detailing actions. Every sentence is essential, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 3 parameters and no output schema. The description covers all actions, parameter dependencies, and side effects (deactivation). It is sufficient for an agent to correctly invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%. The description adds value by explaining that 'name' is required for 'read' and 'activate', and 'task' is a filter for 'list'. It clarifies parameter usage beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List, read, or activate versioned LLM prompts stored as memory files in the prompts/ directory.' It uses specific verbs (list, read, activate) and resource (prompts), distinguishing it from sibling tools that focus on other aspects like doctor, list, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for each action: 'Use 'list' to browse available prompts, 'read' to view a specific prompt's content, or 'activate' to set a prompt version as active (deactivates others of the same task).' It does not explicitly mention when not to use or alternatives, but the action enum itself covers the main choices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_pushA
Sync memory changes to GitHub for backup and cross-machine access.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-read-only, non-destructive, and non-idempotent. The description adds the GitHub context but omits critical behavioral details like authentication requirements, error handling, or potential side effects (network calls). It provides moderate transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no redundancy. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description is complete for a simple push action. It covers the essential purpose, though additional context about prerequisites (e.g., GitHub repo setup) would be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and schema coverage is 100%. Per the rubric, a baseline of 4 applies when no parameters exist, as the description adds no further information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool syncs memory changes to GitHub for backup and cross-machine access. It uses a specific verb ('sync') and resource ('memory changes to GitHub'), and it distinguishes from local operations like palinode_save.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives (e.g., when to push vs. save locally). There are 29 sibling tools, but no differentiation criteria are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_readARead-onlyIdempotent
Read the full contents of a memory file. Use after palinode_list or palinode_search to see the complete content of a specific file.
| Name | Required | Description | Default |
|---|---|---|---|
| meta | No | If true, the response includes parsed frontmatter alongside the body. Default false (body only) to match prior behavior. | |
| tier | No | How much of the file to return. 'abstract' is the summary line (~300 chars) — enough to judge relevance; 'overview' is frontmatter plus the head of the body; 'full' is the whole file. Omit for 'full'. | |
| file_path | Yes | Relative path to the memory file (e.g., 'people/alice.md', 'projects/palinode-status.md') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds workflow context and the full-content behavior, but no additional side-effect or error information; the strong annotations lower the burden and the description meets it without adding extra behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core operation, then the practical intended usage. No wasted words and no repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent file reader, the description plus fully described schema covers the workflow, parameters, and output-shaping options (tier, meta). No essential information is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (file_path, meta, tier) already has a meaningful schema description. The tool description adds little beyond 'complete content' and the workflow, so the schema carries the semantic weight as expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the action ('Read'), the resource ('a memory file'), and the scope ('full contents' / 'complete content of a specific file'). It also distinguishes the tool from siblings by positioning it after palinode_list or palinode_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: after palinode_list or palinode_search, to retrieve complete content of a specific file. This gives the agent a clear workflow and differentiates read from list/search, which are the main alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_resolveARead-onlyIdempotent
Ask what memory holds RIGHT NOW about a question, or about one record. Returns the assertions that stand (with their evidence and source revisions), what replaced what, conflicts with every side intact, and what is explicitly unknown. Use instead of palinode_search when you want the current answer rather than a list of hits. Read-only; a tight budget can shrink the answer but never turns a conflict into a settled one. Retired records are left out, as in search, unless include_retired=true.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Exact memory ref (path without .md), e.g. 'decisions/db'. | |
| query | No | Natural-language question. Give this or `ref`. | |
| intent | No | What to answer. Only current state is supported. | current_state |
| context | No | Refs you already hold; each is checked, not assumed current. | |
| max_chars | No | Max characters in the answer (default 2000). | |
| max_items | No | Max units in the answer (default 8). | |
| include_retired | No | Also return retired records (archived, superseded, retracted, expired), labelled as history. Off by default, as in search. | |
| include_other_projects | No | Also return records tagged to other projects, each labelled with its project. Off by default: a project-scoped request leaves them out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds non-obvious behavior: budget constraints may shrink the answer but 'never turn a conflict into a settled one', retired records are excluded by default, and it spells out the return contents (assertions, evidence, source revisions, replacement chains, conflicts, unknowns).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The answer content and the differentiator are front-loaded, and every sentence carries information. The middle sentences are somewhat dense and list-heavy, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema, the description covers what is returned, the default exclusions, the budget caveat, and the ref-vs-query distinction. An agent has enough to call it correctly without further inspection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning by explaining that ref targets 'one record' while query targets 'a question', and by reiterating the include_retired default, going slightly beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('resolve what memory holds RIGHT NOW') and explicitly contrasts itself with palinode_search. An agent can distinguish it from the 35+ siblings by the 'current answer vs list of hits' framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative (palinode_search) and the condition that selects this tool ('when you want the current answer rather than a list of hits'). It also states the ref/query choice and the include_retired behavior, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_restoreAIdempotent
Bring one archived memory back into default recall — the inverse of palinode_archive for every archive path (on-demand, forget request, TTL expiry, consolidation). Flips status back to active, drops superseded_by, records restored_at / restored_from provenance and a history line, and commits. Does not un-strike retraction markers (use palinode_unretract) or re-enable triggers.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why this memory is being restored (kept in the audit trail). | |
| dry_run | No | Preview what would change, the retained copies and the recovery command; write nothing. | |
| file_path | Yes | Archived memory file path (e.g., 'insights/retired-finding.md') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (idempotent=true, destructive=false, readOnly=false) by disclosing the exact state changes: status flipped to active, superseded_by dropped, restored_at/restored_from provenance plus a history line, and a commit. It also states the boundary conditions (no retraction un-striking, no trigger re-enabling).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core action and its inverse relationship lead, followed by state effects and exclusions. No filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description fully covers the state transitions, provenance recording, atomic commit, and edge cases an agent must understand before calling. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so dry_run and reason are already documented in the schema. The description adds no per-parameter syntax or meaning beyond the schema baseline, which is expected here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Bring one archived memory back into default recall'), gives the scope ('one'), and frames it as the inverse of palinode_archive across every archive path. An agent can distinguish it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the sibling for a related-but-different case ('Does not un-strike retraction markers (use palinode_unretract)') and clarifies it won't re-enable triggers. The when-to-use case is implied by 'inverse of palinode_archive for every archive path' rather than stated as a trigger, but routing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_reviewARead-onlyIdempotent
Advisory project-memory review. Composes the deterministic health signals (stale files, long-unresolved open questions, open contradictions, orphans, missing descriptions, wiki drift) scoped to a project, and proposes corrective ops (PROPOSE_ARCHIVE/UPDATE/SUPERSEDE). Read-only — proposes, never applies. Omit project to review the whole store.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Project slug (e.g. 'palinode') or typed ref ('project/palinode'). Omit to review the whole store. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false. The description reinforces this with 'Read-only — proposes, never applies', adding behavioral context about the nature of proposals. It also lists the health signals considered, which goes beyond what annotations provide. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences that front-load the purpose and immediately address key behavioral and usage details. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, no output schema, full annotations), the description adequately covers the tool's purpose, behavior, and usage. It lists health signals and proposed operations, which is sufficient for an agent to understand what the tool returns. However, the lack of any detail about the output format or structure (e.g., is it a list of proposals? JSON?) is a minor gap, but not critical given the advisory nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the 'project' parameter with explanation of its meaning and default behavior. The description adds the instruction 'Omit `project` to review the whole store', which slightly clarifies usage but does not add significant new meaning beyond the schema. With 100% schema coverage, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: composing deterministic health signals for a project and proposing corrective operations. It uses specific verbs ('composes', 'proposes') and a resource ('project-memory review'). It distinguishes itself from siblings like palinode_doctor by its advisory and non-applying nature, and by listing specific health signals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: it is read-only and never applies changes, and it explains how to scope the review to a specific project or the whole store by omitting the 'project' parameter. It does not explicitly contrast with siblings or provide when-not-to-use scenarios, but the guidance is sufficient for safe invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_rollbackADestructive
Revert a memory file to a previous version. Safe: creates a new commit preserving the old version in history. Defaults to dry run. A rollback that would undo a retirement (archive/supersede/retraction) is named in the preview and refused unless undo_retirements=true; prefer palinode_restore to bring a retired memory back.
| Name | Required | Description | Default |
|---|---|---|---|
| commit | No | Target commit hash (from palinode_history). Default: previous version. | |
| dry_run | No | If true (default), show what would change without applying. | |
| file_path | Yes | Memory file path to rollback | |
| undo_retirements | No | Acknowledge that applying undoes a retirement and brings the record back as current. Without it such a rollback is refused. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds genuinely new behavioral context: the change is committed so the old version survives in history, dry run is the default, and retirement-undone rollbacks are refused. The word 'Safe' sits in mild tension with destructiveHint=true (the current file state does change), but the description clarifies reversibility rather than contradicting the annotation, so it is not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, front-loaded with the core action and the safety model before the retirement caveat. Every sentence carries load; only the safety/refusal material borders on dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and only 4 parameters, the description covers the action, reversibility model, dry-run default, refusal behavior, and the correct alternative sibling. Combined with annotations that already carry the safety profile, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by sourcing the commit parameter from palinode_history and framing undo_retirements as an explicit acknowledgement gate rather than a plain flag. This cross-tool reference is real added value over the field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (revert) and resource (a memory file to a previous version) precisely, and explicitly distinguishes itself from the sibling palinode_restore, which it tells the agent to prefer for reviving retired memories. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the when (revert to a previous version), the when-not (a rollback that would undo a retirement is refused unless undo_retirements=true), and names the alternative tool (palinode_restore) with the condition that selects it. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_saveA
Save a memory (fact, decision, insight, project update) worth keeping across sessions. Requires exactly one of type or ps=true. On timeout the save may still have committed — palinode_search a distinctive phrase before retrying, or you'll duplicate it.
| Name | Required | Description | Default |
|---|---|---|---|
| ps | No | Shorthand for type=ProjectSnapshot (the CLI `--ps` flag). If true, omit `type`; any other type value errors. | |
| core | No | If true, this memory is always injected at session start (core memory). | |
| slug | No | Optional URL-safe filename slug (auto-generated if omitted) | |
| type | No | Memory type. Required unless `ps=true` is given. | |
| title | No | Human-readable title, used in list/search displays. | |
| claims | No | Binds each claim to the source span justifying it. Read back via palinode_blame(claims=true). | |
| source | No | Source surface that created this memory. | |
| content | Yes | The memory content to save (markdown supported) | |
| project | No | Project slug shorthand — 'palinode' becomes entity 'project/palinode'. | |
| sources | No | Citation anchors for passages this memory quotes. | |
| entities | No | Related entity refs e.g. ['person/alice', 'project/alpha'] | |
| metadata | No | Additional frontmatter fields to merge into the saved memory. | |
| priority | No | Human-assigned memory priority (1–5). Stored as `priority` frontmatter; missing means normal (3). | |
| backed_by | No | Refs (category/slug) that support/back this memory (evidence links). | |
| epistemic | No | Kind of claim: fact=observed, inference=derived, open_question=unresolved, unverified=asserted but unchecked. Omit to leave unmarked — unmarked is NOT fact. | |
| confidence | No | Confidence in this memory's accuracy (0.0-1.0). | |
| contradicts | No | Refs (category/slug) this memory conflicts with; neither wins — surfaced for review. | |
| external_refs | No | SDLC object references such as github_pr or jira_issue. | |
| update_policy | No | Re-save to same slug: 'append' keeps the existing body and adds below it; 'replace' overwrites and marks a living doc. Sticky. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds an important behavioral caveat beyond the annotations: a timeout may still commit the save, so retrying blindly duplicates memories. It also states the type/ps one-of requirement. This meaningfully supplements the idempotentHint=false annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The purpose is front-loaded, and the second sentence carries the critical failure-handling guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 19-parameter write tool with no output schema, the description is rather thin. It covers the one-of constraint and timeout behavior, but does not explain what the tool returns, the update_policy re-save semantics, or what a successful save looks like. The schema covers parameters, but an agent still lacks a full picture of the tool's side effects and return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds the cross-parameter "exactly one of type or ps=true" rule, but the ps schema description already conveys most of this. It provides no additional value for the remaining parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Save a memory" with concrete categories (fact, decision, insight, project update). This clearly distinguishes the tool from its read/search/list siblings even without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool (anything worth keeping across sessions) and includes a concrete exclusion/retry rule: search before retrying after timeout to avoid duplicates. It does not explicitly enumerate alternative tools, but the usage context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_searchBRead-onlyIdempotent
Search Palinode memory for relevant context about people, projects, decisions, insights, or research. Returns the most relevant memory file excerpts ranked by configured hybrid or lexical retrieval.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Return full chunk content instead of snippets. | |
| tier | No | How much of each hit to return. 'abstract' caps every hit at ~300 chars (summary first) for cheap relevance checks; 'overview' returns frontmatter plus the head of the body; 'full' is the chunk body. Omit to keep the default snippet view. | |
| limit | No | Max results to return (default 15) | |
| query | Yes | Natural language search query | |
| types | No | Filter by memory type (matches frontmatter `type`). | |
| resolve | No | Attach evidence around each hit: 'linked' follows superseded_by/contradicts/backed_by both ways under fixed budgets; 'full' adds bounded unlinked discovery. Each hit reports coverage and a resolution — a current answer, an unresolved conflict with both sides, or insufficient evidence. Default none. | |
| category | No | Filter by category (memory directory name): people, projects, decisions, insights, research | |
| threshold | No | Vector similarity floor (0.0-1.0); ignored in lexical mode. | |
| date_after | No | Filter results after an ISO date (e.g. 2024-01-01) | |
| since_days | No | Only return memories created/updated in the last N days. Equivalent to setting `date_after` to now-N days; the API derives one from the other. | |
| date_before | No | Filter results before an ISO date | |
| min_priority | No | Only return memories with human-assigned priority at least this value. Missing priority counts as normal (3). | |
| include_daily | No | Include daily session notes at full rank (default: false, daily/ files are penalized) | |
| include_retired | No | With resolve: also show retired records (archived, superseded, retracted, expired) in each hit's evidence, labelled. Off by default. | |
| include_telemetry | No | Include machine/monitor telemetry memories. | |
| include_other_projects | No | Also return memories tagged to other projects, each labelled with its project. Off by default: a project-scoped search leaves them out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds that retrieval mode is 'configured hybrid or lexical' and that results are rank-ordered, but it does not explain how mode is selected, ranking stability, or result-size limits. Moderate added value, not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose then return behavior, with no filler. It is appropriately sized, though the second sentence is slightly redundant with the tool name and could carry more useful routing information instead.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter tool with no output schema, the description covers the core purpose and roughly what comes back, but says nothing about result shape details, pagination/truncation, or how the many filter parameters interact. The schema carries most of the weight; the description is adequate but thin given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 16 parameters are already documented in the schema. The description adds only a general statement about ranked excerpts, which loosely relates to threshold and retrieval mode but contributes no syntax, defaults, or interaction detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (Palinode memory), names the content domains it covers, and describes the return shape (memory file excerpts ranked by hybrid or lexical retrieval). It does not distinguish itself from siblings like palinode_read or palinode_list, which an agent could plausibly confuse with a search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no mention of alternatives. Nothing tells the agent why it should search here rather than read a known file (palinode_read) or enumerate (palinode_list); usage is only implied by the verb 'Search'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_session_endA
Call at the end of a coding or chat session to capture key outcomes to persistent memory. Writes a session summary to today's daily notes and appends status to relevant project files. Provide a brief summary of what was accomplished, decisions made, and any blockers.
| Name | Required | Description | Default |
|---|---|---|---|
| push | No | Push the memory repo after committing the session note. | |
| source | No | Source surface that created this memory (e.g., 'claude-code', 'cursor', 'api'). Auto-detected if omitted. | |
| dry_run | No | Validate and render the entry without writing, committing, or pushing anything. Use to check a payload before committing it, or to diagnose a failing session-end without leaving entries behind in the daily note. | |
| project | No | Project slug to append status to (e.g., 'palinode'). Auto-detected if omitted. | |
| summary | Yes | What was accomplished in this session (1-3 sentences) | |
| blockers | No | Open blockers or next steps (optional) | |
| decisions | No | Key decisions made (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations by disclosing it writes to today's daily notes and appends status to project files. It doesn't mention commit/push behavior, but the schema's push parameter covers that, and the description does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the trigger and core action, then side effects, then user guidance. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a session-ending tool with 7 parameters, given that the schema covers all parameter details. It explains the main side effects and what the user should provide, though it could mention the optional dry_run for testing but that is covered in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a brief mapping by mentioning 'accomplished, decisions made, and any blockers' to summary/decisions/blockers, but it does not add significant meaning beyond the schema for parameters like push, source, or dry_run.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool writes a session summary and appends status to project files, giving a specific verb+resource. However, it does not explicitly distinguish from sibling tools like palinode_save, relying on the name and title for differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call at the end of a coding or chat session', which is a clear temporal trigger. It does not mention when NOT to use it or name alternative tools, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_session_initARead-onlyIdempotent
Session-start context: call this FIRST in a new conversation. Returns the resolved project scope with recent session snapshots, core memories, recent decisions, and open action items as a bounded digest.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Working directory used to resolve the project scope. Defaults to the server process CWD when omitted. | |
| project | No | Explicit project slug or entity ref; overrides cwd resolution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, idempotentHint, destructiveHint) already indicate safe, non-destructive behavior. The description adds value by explaining the tool returns a 'bounded digest' and listing its components, but it does not contradict annotations. No side effects or additional behavioral traits are disclosed beyond what annotations imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose ('Session-start context'), and each sentence provides essential information with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description adequately explains the return value ('resolved project scope with... bounded digest'). It covers the essential aspects for a session init tool, though it could mention error handling or behavior on repeated calls, which is mitigated by the idempotent hint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description adds minimal information beyond what the schema already provides (default CWD behavior). The description does not elaborate on parameter semantics, so it meets the baseline for high coverage but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the purpose ('Session-start context') and specifies that it should be called first in a new conversation. It also details the return content (project scope, session snapshots, core memories, etc.), distinguishing it from sibling tools that are not initialization tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'call this FIRST in a new conversation,' providing clear usage context. However, it does not mention when not to use it or suggest alternatives, though the sibling tool names imply that other tools are for different operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_statusARead-onlyIdempotent
Check Palinode health plus the effective read-only capture/recall pause state, policy provenance, and resolved project scope.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds useful detail about the reported state axes, but it does not disclose output shape, error behavior, or any additional operational traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It states the core action first and compresses the additional status facets into a compact list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, annotation-covered, read-only status tool, the description is largely sufficient. However, there is no output schema and the description does not clarify the return format or what health/pause values look like, leaving a moderate completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the input schema is empty, so there are no parameter semantics to clarify. The description does not need to compensate for parameter documentation gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Check Palinode health') and names distinct facets of that status. It is clear, though it does not explicitly differentiate itself from siblings like palinode_doctor or palinode_doctor_deep.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement about when to use this tool versus alternatives, and no exclusion criteria. The purpose implies 'check status,' but it gives no comparative guidance against the many diagnostic siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_topic_coverageARead-onlyIdempotent
Given a topic phrase (not a file), check whether any wiki page already covers it. Returns {covered: bool, best_match: str | null, similarity: float}. Use BEFORE ingesting new content to ask 'is this already covered?'. Different framing from palinode_dedup_suggest: takes a short topic phrase rather than full draft content, and answers the binary 'already covered?' question.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Topic phrase to check coverage for (e.g. 'machine learning deployment'). | |
| min_similarity | No | Minimum cosine similarity to count as 'covered' (0.0–1.0). Default 0.78. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint true, destructiveHint false. Description adds context about return fields and usage, consistent with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise, two sentences plus a comparison. No fluff, well-structured, immediately conveys purpose and usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low complexity (2 params, no output schema), description fully covers what the tool does, how to use it, when to use it, and return format. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions. Description adds no additional parameter meaning beyond the schema, so baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'check' and resource 'wiki page coverage' for a topic phrase. Differentiates from sibling palinode_dedup_suggest by specifying input type and binary output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use BEFORE ingesting new content' and contrasts with palinode_dedup_suggest, guiding when to use this tool vs alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_traceARead-onlyIdempotent
Compose the full provenance lineage of a memory file into one view: source citations, when it was first saved and last changed, the supersession trail, typed contradiction/evidence links, and how often it has been recalled. Rows whose provenance is not yet captured render an honest placeholder. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Memory file path (e.g., 'decisions/auth-session-tokens.md') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's 'Read-only' tag is redundant but consistent. The description adds value by revealing that rows with uncaptured provenance render an 'honest placeholder', a behavioral trait not covered by annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using a single comma-separated list to enumerate output components and a separate sentence for the placeholder behavior. It ends with 'Read-only' which is slightly redundant given annotations, but overall efficient and front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple parameter, absence of output schema, and comprehensive annotations, the description sufficiently explains what the tool returns and its behavior. The placeholder disclosure adds completeness. No missing critical information for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for the single parameter 'file_path'. The tool description does not add additional semantics beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool composes the 'full provenance lineage' of a memory file, listing specific components (source citations, timestamps, supersession trail, contradiction/evidence links, recall count). This verb+resource specification distinguishes it from sibling tools like palinode_blame or palinode_history, which focus on different aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on what the tool outputs and implies its use for viewing comprehensive provenance. It does not explicitly state when-not-to-use or name alternatives, but the specific mention of 'provenance lineage' and components gives sufficient guidance for an agent to select it over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_triggerA
Register or manage a prospective trigger for Palinode. When a future user message semantically matches the description, the specified memory file will be automatically injected.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform: 'create', 'list', or 'delete' | create |
| authority | No | For 'create': who or what licensed this trigger to act — a user grant, a session id, a policy name. Stored and shown, not enforced. | |
| threshold | No | For 'create': Similarity threshold (0.0–1.0). Higher = stricter match required to fire. Default 0.75. | |
| expires_at | No | For 'create': ISO-8601 timestamp after which the trigger no longer fires (it stays listed, disabled). Omit for no expiry. | |
| trigger_id | No | For 'delete' or 'create': Custom UUID or ID to delete/create | |
| description | No | For 'create': What context should fire this trigger (e.g., 'User is discussing deployment') | |
| memory_file | No | For 'create': Relative path to the memory file to inject when fired (e.g., 'projects/my-app.md') | |
| cooldown_hours | No | For 'create': Hours to wait between consecutive firings of the same trigger. Default 24. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavior beyond annotations by explaining the automatic injection mechanism and semantic matching. Annotations already indicate a mutating tool, so the added value is the 'future user message' trigger behavior. It does not elaborate on the delete action's permanence, but the schema's 'delete' enum makes that discoverable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the main purpose, and has no filler or repetition. It explains the core mechanism efficiently without duplicating the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema and the high-level nature of the tool, the description gives enough context for an agent to understand what a trigger is and how it behaves. It does not describe return values or list/delete semantics in detail, but with no output schema and a clear action enum, this is not a critical gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters thoroughly. The description only adds general context about semantic matching and memory injection, but does not add parameter-specific meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Register or manage a prospective trigger') and clearly explains the resource and behavior: a future user message semantically matching the description causes a memory file to be injected. This distinguishes palinode_trigger from the long list of sibling tools because 'trigger' is a unique and well-defined resource in the set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: use this tool when you want automatic memory injection based on semantic matching of future user messages. However, it does not explicitly say when not to use it or name alternatives such as manually reading or ingesting memory files, so guidance is present but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palinode_unretractAIdempotent
Withdraw one preference's mention-level retraction from one memory: un-strikes every ~~…~~ [RETRACTED …] span the pref produced and removes the pref from the file's retracted_prefs record, so a later forget request for the same pref can strike again. Pass the pref phrase as recorded in the file's history sibling. The file's status is never changed.
| Name | Required | Description | Default |
|---|---|---|---|
| pref | Yes | The retracted preference phrase, as recorded in the history entry. | |
| reason | No | Why the retraction is being withdrawn (kept in the audit trail). | |
| dry_run | No | Preview what would change, the retained copies and the recovery command; write nothing. | |
| file_path | Yes | Memory file path carrying the retraction (e.g., 'projects/closeout.md') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-readonly, idempotent, non-destructive mutation, but the description adds real substance: exactly what is reversed (every retraction span un-struck, the pref removed from retracted_prefs) and the explicit invariant that 'status' is never changed. It stops short of noting permission needs or error behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the core action front-loaded and no filler; the invariant about 'status' is placed last as a useful caveat. The heavy backtick jargon is compact rather than wasteful, though slightly hard to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the effect, the scoping constraint (one pref, one memory), the parameter sourcing, and the state invariant. It omits what the response/return looks like and any precondition check (e.g., that the pref must currently be retracted), which would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented and the baseline is 3. The description only restates the pref-sourcing rule already in the schema ('as recorded in the history sibling'), adding little beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a precise verb (withdraw/un-strike) and resource (one preference's mention-level retraction in one memory), and spells out the concrete effect on the file. It is very clear what the tool does, though it never explicitly contrasts itself with the similarly named sibling palinode_forget_withdraw, which an agent could confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It hints at the motivating scenario ('so a later forget request for the same pref can strike again') and tells the caller where to source the pref (the history sibling), which implies usage. However, it never states when to choose this over alternatives like palinode_forget_withdraw nor any when-not condition, leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.22.0- Changed
palinode_archive1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "default": false, + "description": "Preview what would change, the retained copies and the recovery command; write nothing.", + "type": "boolean" +}
- Added
palinode_correction_apply - Added
palinode_correction_dismiss - Added
palinode_correction_preview - Added
palinode_correction_undo - Added
palinode_corrections - Added
palinode_explain - Changed
palinode_forget_withdraw1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "default": false, + "description": "Preview what would change, the retained copies and the recovery command; write nothing.", + "type": "boolean" +}
- Changed
palinode_resolve2 fields changed- added
Input schema / properties / include_other_projectsAdded value: +{ + "default": false, + "description": "Also return records tagged to other projects, each labelled with its project. Off by default: a project-scoped request leaves them out.", + "type": "boolean" +} - added
Input schema / properties / include_retiredAdded value: +{ + "default": false, + "description": "Also return retired records (archived, superseded, retracted, expired), labelled as history. Off by default, as in search.", + "type": "boolean" +}
- Changed
palinode_restore1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "default": false, + "description": "Preview what would change, the retained copies and the recovery command; write nothing.", + "type": "boolean" +}
- Changed
palinode_rollback1 field changed- added
Input schema / properties / undo_retirementsAdded value: +{ + "default": false, + "description": "Acknowledge that applying undoes a retirement and brings the record back as current. Without it such a rollback is refused.", + "type": "boolean" +}
- Changed
palinode_search2 fields changed- added
Input schema / properties / include_other_projectsAdded value: +{ + "default": false, + "description": "Also return memories tagged to other projects, each labelled with its project. Off by default: a project-scoped search leaves them out.", + "type": "boolean" +} - added
Input schema / properties / include_retiredAdded value: +{ + "default": false, + "description": "With resolve: also show retired records (archived, superseded, retracted, expired) in each hit's evidence, labelled. Off by default.", + "type": "boolean" +}
- Changed
palinode_unretract1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "default": false, + "description": "Preview what would change, the retained copies and the recovery command; write nothing.", + "type": "boolean" +}
1 tool update
v0.21.0- Changed
palinode_search1 field changed- changed
Input schema / properties / threshold / descriptionPrevious value: -"Override similarity threshold (0.0-1.0); higher is stricter."New value: +"Vector similarity floor (0.0-1.0); ignored in lexical mode."
3 tool updates
v0.20.1- Added
palinode_resolve - Changed
palinode_save1 field changed- changed
Input schema / properties / update_policy / descriptionPrevious value: -"Save behavior: append episodic memory or replace a living document."New value: +"Re-save to same slug: 'append' keeps the existing body and adds below it; 'replace' overwrites and marks a living doc. Sticky."
- Changed
palinode_search1 field changed- added
Input schema / properties / resolveAdded value: +{ + "description": "Attach evidence around each hit: 'linked' follows superseded_by/contradicts/backed_by both ways under fixed budgets; 'full' adds bounded unlinked discovery. Each hit reports coverage and a resolution — a current answer, an unresolved conflict with both sides, or insufficient evidence. Default none.", + "enum": [ + "none", + "linked", + "full" + ], + "type": "string" +}
2 tool updates
v0.19.1- Changed
palinode_consolidate1 field changed- added
Input schema / properties / respect_gateAdded value: +{ + "default": false, + "description": "Apply the activity gate the automatic cron path uses (enough time elapsed AND enough sessions since the last pass); reports `deferred` instead of running when a pass is not yet due.", + "type": "boolean" +}
- Changed
palinode_lint1 field changed- added
Input schema / properties / proposeAdded value: +{ + "description": "Also translate the deterministic findings into proposed consolidation operations, each with its rationale and the finding it came from. Advisory: this tool never applies them — run `palinode lint --apply` to let the executor act.", + "type": "boolean" +}
4 tool updates
v0.17.0- Added
palinode_forget_withdraw - Added
palinode_restore - Changed
palinode_trigger2 fields changed- added
Input schema / properties / authorityAdded value: +{ + "description": "For 'create': who or what licensed this trigger to act — a user grant, a session id, a policy name. Stored and shown, not enforced.", + "type": "string" +} - added
Input schema / properties / expires_atAdded value: +{ + "description": "For 'create': ISO-8601 timestamp after which the trigger no longer fires (it stays listed, disabled). Omit for no expiry.", + "type": "string" +}
- Added
palinode_unretract
2 tool updates
v0.16.0- Changed
palinode_read1 field changed- added
Input schema / properties / tierAdded value: +{ + "description": "How much of the file to return. 'abstract' is the summary line (~300 chars) — enough to judge relevance; 'overview' is frontmatter plus the head of the body; 'full' is the whole file. Omit for 'full'.", + "enum": [ + "abstract", + "overview", + "full" + ], + "type": "string" +}
- Changed
palinode_search1 field changed- added
Input schema / properties / tierAdded value: +{ + "description": "How much of each hit to return. 'abstract' caps every hit at ~300 chars (summary first) for cheap relevance checks; 'overview' returns frontmatter plus the head of the body; 'full' is the chunk body. Omit to keep the default snippet view.", + "enum": [ + "abstract", + "overview", + "full" + ], + "type": "string" +}
4 tool updates
v0.14.0- Changed
palinode_blame2 fields changed- removed
Input schema / properties / fileRemoved value: -{ - "description": "Deprecated alias for `file_path`; use `file_path` instead.", - "type": "string" -} - added
Input schema / requiredAdded value: +[ + "file_path" +]
- Changed
palinode_history1 field changed- changed
Input schema / properties / detail / descriptionPrevious value: -"'summary' (default) returns hash/date/message/stats. 'full' additionally includes the unified diff body per commit (commit-level evolution view, formerly palinode_timeline)."New value: +"'summary' (default) returns hash/date/message/stats. 'full' additionally includes the unified diff body per commit (commit-level evolution view)."
- Changed
palinode_rollback2 fields changed- removed
Input schema / properties / fileRemoved value: -{ - "description": "Deprecated alias for `file_path`; use `file_path` instead.", - "type": "string" -} - added
Input schema / requiredAdded value: +[ + "file_path" +]
- Removed
palinode_timeline
1 tool update
v0.13.0- Changed
palinode_search3 fields changed- changed
Input schema / properties / limit / defaultPrevious value: -10New value: +15 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results to return (default 10)"New value: +"Max results to return (default 15)" - added
Input schema / properties / limit / maximumAdded value: +50
1 tool update
v0.10.1- Changed
palinode_consolidate1 field changed- added
Input schema / properties / sourcesAdded value: +{ + "description": "Memory directories to consolidate, e.g. `[\"insights\"]`. Defaults to `daily` only.", + "items": { + "type": "string" + }, + "type": "array" +}
2 tool updates
v0.10.0- Changed
palinode_save13 fields changed- changed
Input schema / properties / claims / descriptionPrevious value: -"Claim-level source anchors: list of {text, source_id, span:{quote, quote_hash}} bindings resolving each claim to the source span that justifies it. claim_id is derived on save; read back via palinode_blame with claims=true."New value: +"Binds each claim to the source span justifying it. Read back via palinode_blame(claims=true)." - changed
Input schema / properties / claims / items / properties / anchor_id / descriptionPrevious value: -"Optional opaque pointer within a large source (interop; nullable)."New value: +"Optional pointer within a large source." - changed
Input schema / properties / claims / items / properties / claim_id / descriptionPrevious value: -"Optional stable claim id; content-addressed, derived on save if omitted."New value: +"Optional; derived on save." - changed
Input schema / properties / claims / items / properties / source_id / descriptionPrevious value: -"Path under the memory dir of the source that justifies the claim (a sources[].ref)."New value: +"A sources[].ref that justifies the claim." - changed
Input schema / properties / claims / items / properties / span / properties / quote / descriptionPrevious value: -"The exact passage in the source that justifies the claim."New value: +"The justifying passage in the source." - changed
Input schema / properties / claims / items / properties / span / properties / quote_hash / descriptionPrevious value: -"Optional integrity hash; computed on save if omitted."New value: +"Optional; computed on save." - changed
Input schema / properties / epistemic / descriptionPrevious value: -"Epistemic marker: 'fact' (observed/verified), 'inference' (derived, lower trust), 'open_question' (unresolved), or 'unverified' (asserted but not checked). Omit to leave the memory unmarked (no claim is made — not treated as fact)."New value: +"Kind of claim: fact=observed, inference=derived, open_question=unresolved, unverified=asserted but unchecked. Omit to leave unmarked — unmarked is NOT fact." - changed
Input schema / properties / project / descriptionPrevious value: -"Project slug shorthand — e.g. 'palinode' becomes entity 'project/palinode'. Pairs with `palinode_session_end`'s `project` field for consistent project tagging across save and session-end."New value: +"Project slug shorthand — 'palinode' becomes entity 'project/palinode'." - changed
Input schema / properties / ps / descriptionPrevious value: -"Shorthand for type=ProjectSnapshot — matches the CLI `--ps` flag and the `/ps` slash command. If true, `type` may be omitted (or set to ProjectSnapshot redundantly); other type values conflict and error."New value: +"Shorthand for type=ProjectSnapshot (the CLI `--ps` flag). If true, omit `type`; any other type value errors." - changed
Input schema / properties / sources / descriptionPrevious value: -"Source-citation anchors: list of {ref, quote, quote_hash} for passages this memory cites."New value: +"Citation anchors for passages this memory quotes." - changed
Input schema / properties / sources / items / properties / quote / descriptionPrevious value: -"The exact passage cited from the source."New value: +"The exact passage cited." - changed
Input schema / properties / sources / items / properties / quote_hash / descriptionPrevious value: -"Optional integrity hash; computed on save if omitted."New value: +"Optional; computed on save." - changed
Input schema / properties / title / descriptionPrevious value: -"Optional human-readable title. Stored in frontmatter and used in list/search displays."New value: +"Human-readable title, used in list/search displays."
- Changed
palinode_session_end1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Validate and render the entry without writing, committing, or pushing anything. Use to check a payload before committing it, or to diagnose a failing session-end without leaving entries behind in the daily note.", + "type": "boolean" +}
30 tool updates
v0.9.5- First observed
palinode_archive - First observed
palinode_archive_expired - First observed
palinode_blame - First observed
palinode_cluster_neighbors - First observed
palinode_consolidate - First observed
palinode_dedup_suggest - First observed
palinode_depends - First observed
palinode_diff - First observed
palinode_doctor - First observed
palinode_doctor_deep - First observed
palinode_entities - First observed
palinode_history - First observed
palinode_ingest - First observed
palinode_lint - First observed
palinode_list - First observed
palinode_orphan_repair - First observed
palinode_prompt - First observed
palinode_push - First observed
palinode_read - First observed
palinode_review - First observed
palinode_rollback - First observed
palinode_save - First observed
palinode_search - First observed
palinode_session_end - First observed
palinode_session_init - First observed
palinode_status - First observed
palinode_timeline - First observed
palinode_topic_coverage - First observed
palinode_trace - First observed
palinode_trigger
TDQS
Scored across 39 tools
Many tools are distinct in purpose, but there are overlapping clusters around memory retrieval (search, resolve, read, list, dedup_suggest, topic_coverage), retirement/undo (archive, restore, rollback, forget_withdraw, correction_undo), and health checks (status, doctor, doctor_deep, lint). The verbose descriptions help differentiate them, but an agent could still misselect among adjacent lifecycle operations.
All 39 tools consistently use lowercase snake_case with the same `palinode_` prefix. The suffix patterns vary between verb_noun and noun phrases, but the stylistic convention is uniform and predictable throughout.
39 tools is heavy for an MCP server, well beyond the typical 3–15 range. While the domain is complex, the large surface risks overwhelming an agent's context and selection accuracy.
The surface covers memory CRUD, lifecycle retirement/restoration, provenance, health checks, corrections, sync, sessions, prompts, dependencies, and maintenance. Minor gaps exist (e.g., no general direct edit tool outside correction flows), but core and advanced workflows are well represented.
Maintenance
Related MCP Connectors
Hosted MCP memory for coding agents: persistent across sessions, editable markdown, team sharing.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Long-term memory for AI coding agents: durable project facts, recalled by every MCP client.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceOpen, Git-native memory protocol for MCP agents: stores memories as Markdown files in a Git repo, enabling portability, auditability, and human-editable memory across different AI agents.64 npm15MIT
- AlicenseAqualityCmaintenanceA personal memory engine and MCP server that stores durable facts in markdown files managed via git, enabling hybrid search (lexical + semantic) through an MCP interface for persistent context across LLM sessions.3MIT
- AlicenseBqualityAmaintenanceA local MCP server that provides agents with tools to list, read, search, inspect history and diffs, and capture unstructured text in a user-owned Git repository of durable memory.5MIT
- AlicenseNot gradedqualityBmaintenanceMCP server providing persistent, local-first memory for AI agents via Markdown files in a git repo, with search, branching, and auditability.5 npm2MIT