Skip to main content
Glama

loom

CI npm Node License MCP

Persistent identity and memory for AI agents, as an MCP server.

loom is configured into your MCP-capable harness — Claude Code, Cursor, Codex, Gemini CLI, etc. — and provides persistent identity and memory to the agents that run there. An agent that loads loom carries its name, values, working preferences, and episodic memories from one session to the next, regardless of which model or client it runs in.

When the harness changes, the agent persists.

Demo

asciicast

60 seconds: cold install → /loom-setup in Claude Code → agent wakes with identity in the next session → save and recall a memory.

To play locally: asciinema play assets/demo.cast

Related MCP server: elephantasm-mcp

What it is

A Model Context Protocol server exposing 31 tools that read and write an agent's persistent state:

  • identity — loads the terminal creed — the free-form markdown document that defines who the agent is (values, voice, purpose) — along with preferences, self-model (running self-knowledge), and a client-specific adapter on session start. Call this first.

  • dossier — loads Art's operating brief for a worker body — a body that executes tasks on Art's behalf but is NOT Art. Returns preferences and self-model reframed in the third person, plus an explicit push-back mandate: workers are expected to refuse bad work and say why, including requests from Art or Jonathan. Does not include the terminal creed (IDENTITY.md).

  • remember / recall / update / forget — episodic memory with semantic (vector) recall, optional TTL, and category filtering.

  • memory_list / memory_prune — browse and maintain the store.

  • episodes — the episode tape: the short-term, cross-body tier. Every body leaves a category: episode note (where it was / what was said or decided / what shipped / what's open; 48h TTL by default) and every body gets the last 24h of them at boot as a plain time-ordered tape, injected right after preferences. Never salience-ranked — it's what just happened, not what's important. loom memory tape [--hours N] is the CLI view.

  • find_similar — surface memories semantically near an existing entry or free-form text; used for deduplication and memory consolidation.

  • memory_audit — one-shot health report: stale entries, near-duplicate pairs, category breakdown.

  • memory_archive / memory_restore — soft-retire a memory with a tombstone (who/when/why + original body preserved) instead of deleting it. Archived memories are excluded from recall and audit but remain recoverable.

  • memory_propose / memory_proposals / memory_ratify / memory_reject — the capture-propose queue: a staging area a background lane drafts memory writes into, that Art ratifies before they become canon. A proposal is not authored memory — it lives in a separate proposals table, invisible to recall, memory_list, find_similar, and the boot digest. memory_propose stages a draft; memory_proposals lists what's pending; memory_ratify commits one through the same validated write path as remember (an invalid proposal is refused and stays pending); memory_reject discards one. Never auto-committed — ratification is the gate that keeps loom's one-writer, authored model intact while getting auto-capture ergonomics.

  • update_identity — section-level edits to preferences.md and self-model.md. The terminal creed stays immutable through the tool layer.

  • bootstrap — initialize a fresh agent from a four-question interview.

  • harness_init — scaffold a harness manifest (a harness is the MCP-capable runtime the agent runs in: Claude Code, Codex, Gemini CLI, etc.).

  • harness_describe — let the currently connected harness self-describe: write its own manifest, keyed to its MCP clientInfo.name. A harness can only describe itself, never another — the target is the connected peer, not a caller-supplied name.

  • knowledge_write — upsert an entity page by slug into the knowledge store (a separate knowledge.db). On an existing slug the body replaces by default (mode: "append" adds instead), title/domain follow the write, and citations append with exact-duplicate dedup. Enforces the epistemic gate: a page whose only support is conversation citations is stored provisional. Knowledge is truth independent of the user; memories are about the user or your work.

  • knowledge_recall — LIKE search over title, body, and domain in the knowledge store. Two tiers: full (whole pages; stamps last_accessed / hit_count) and index (compact slug/snippet listing; no stamping). Defaults to full with a query, index when browsing. Full output is size-guarded — overflow matches degrade to index entries. Never surfaces archived pages.

  • knowledge_maintain — read-only health report for the knowledge store: expansion candidates (thin body + high hit_count), cold pages (not recently accessed), and misfile audit (pages that belong in memory instead).

  • knowledge_archive — soft-retire a knowledge page (sets status='archived' with an optional tombstone note). Archived pages are excluded from recall and maintain but remain recoverable via knowledge_restore.

  • knowledge_restore — return a previously archived knowledge page to active status. Clears the archive flag and tombstone note.

  • knowledge_supersede — mark one page as superseded by another: archives the old slug with a tombstone referencing the canonical slug, and records the relationship in the supersessions table. The dedup-merge primitive: write the canonical page with knowledge_write, then call knowledge_supersede(loser → canonical).

  • knowledge_move — re-key or re-domain a page in place (same row, same uuid, citations and verification history preserved). Three modes: single-page re-slug and/or re-domain; batch re-domain by explicit slug list; batch re-domain by domain-prefix substitution (moves an entire subtree atomically). Slug collisions are rejected — use knowledge_merge instead.

  • knowledge_merge — consolidate 2+ knowledge pages into one canonical page. Re-parents all citations (deduplicating by claim+source), takes MAX(verified_at), and supersedes losers (archives with a tombstone pointer to the target). Pass hard_delete_losers=true to DELETE losers after archiving (citations cascade, supersession pointers survive).

  • knowledge_purge — hard-delete one or more archived knowledge pages and cascade their citations. Archive-first guard: rejects any page not already archived (call knowledge_archive first). All slugs in a batch must be archived; any active slug rejects the entire batch with no mutation. confirm: true is required as an explicit safety gate. Supersession pointers are preserved (historical record). Use after merge/supersede to clean up tombstoned cruft.

  • knowledge_verify — stamp a page as verified without touching its body: sets verified_at and optionally freshness_anchor. The verification engine's primitive — recording "claims still hold" must never go through knowledge_write (a verify run once replaced 13 page bodies with its notes). An optional note appends a dated ## Verification section (append-only). Batch mode (slugs) stamps many pages with one timestamp; archived pages and unknown slugs reject the whole batch.

  • knowledge_history — body-revision history and recovery. Replace-writes snapshot the displaced body into page_revisions (newest 10 kept per page). List a page's snapshots, read one by revision_id, or restore: true to put one back — the body it displaces is snapshotted first, so a restore is never itself a destructive overwrite. Revisions follow the page across renames and are purged with it.

Everything lives on disk as plain markdown plus a single SQLite file. No daemon, no external service, no GPU.

Memory is organized into categories — an open vocabulary. Common ones: user, project, self, feedback, reference, pursuit. New categories are created implicitly by writing a memory with that category.

How loom is different

loom gets compared to several other agent memory systems. The short version:

I want to…

Use

Memory for many users of an app

Mem0

Temporal reasoning over conversation history

Zep

A complete agent framework with integrated memory

Letta

Project-scoped memory in Claude Code

auto-memory (built in)

Portable identity + memory across harnesses

loom

An agent that survives a harness change

loom

vs. Mem0 — Mem0 is multi-user managed memory for product-scale applications: hosted, authenticated, multi-tenant. loom is single-user, local-only, and identity-first. Mem0 has no concept of who the agent is.

vs. Zep — Zep builds a temporal knowledge graph by automatically extracting facts from conversation logs. loom is agent-authored: the agent calls remember and decides what to record. There is no automatic extraction.

vs. Letta — Letta runs the agent loop and owns its memory internally. loom doesn't run the loop — the harness does. Switch harnesses tomorrow; loom's context directory travels with you.

vs. harness-native files — Writing identity into CLAUDE.md works until you're on two harnesses. Then you have two files that drift. loom inject writes a managed pointer in each harness's dotfile pointing at one context directory, with semantic recall instead of verbatim context dumps.

Full comparison: docs/positioning.md

The stack

loom ships one opinionated stack:

  • Storagebetter-sqlite3 + the sqlite-vec vec0 virtual table. One memories.db per agent, real cosine similarity.

  • Embeddings — BGE-small-en-v1.5 (384-dim, ~33MB ONNX, CPU-only) run through onnxruntime-node. First run downloads the model to ~/.cache/loom/fastembed/. The runtime is vendored in src/backends/embedding-runtime.ts — it started as the fastembed package, which was archived upstream while pinned to a tar line that will never be patched.

  • Transport — MCP over stdio.

If you need a different backend, implement the MemoryBackend and EmbeddingProvider interfaces in src/backends/types.ts and swap the concrete classes in src/backends/index.ts. There is deliberately no env-driven backend selector — opinionated by design.

Quick start

Prerequisites

  • Node.js ≥ 22 (tested on 22 and 24; engines requires ≥ 22).

That's it.

Install the setup skill

npx @jbarket/loomai install

A single-select picker asks which harness you want loom wired into. Pick one of: Claude Code, Codex, Gemini CLI, OpenCode. (If your harness isn't listed, pick "Other" and loom writes ./loom-setup-skill.md — hand it to your agent as-is.)

Scripting:

npx @jbarket/loomai install --harness claude-code
npx @jbarket/loomai install --harness codex --json
npx @jbarket/loomai install --harness claude-code --to ~/my/skills/loom-setup.md

Finish setup inside the harness

Open your chosen harness. Run the skill:

  • Claude Code/loom-setup

  • Codex / Gemini CLI / OpenCode — "use the loom-setup skill"

The skill drives the rest: probes the environment, asks four questions (your name, the agent's name, a purpose line, a voice line), bootstraps identity files, scaffolds a harness manifest, edits the harness's MCP config (with verification), and verifies wake. Restart the harness when it tells you to. Your agent will wake on its next session.

Doing it yourself

If you'd rather wire everything by hand, every piece is a CLI command. See the CLI reference below.

Serving loom over the mesh

By default loom serve speaks MCP over stdio — the harness spawns loom as a child process, one per session, co-located on the same box. That's the right model when the agent and its state live together.

loom serve --http instead runs loom as a long-lived HTTP MCP daemon, so a chat client on one machine can reach loom's identity and memory while the heavy state (the SQLite stores, the fastembed model) stays on a single host. This is the two-surface model: e.g. Claude Desktop on a laptop talking to a loom daemon on a home server, both agent and stack carried by the same identity.

# loopback only (default host 127.0.0.1, port 8787)
loom serve --http

# bind a mesh interface so other machines on the tailnet can reach it
loom serve --http --host 100.94.0.12 --port 8787

Host, port, and an optional bearer token come from flags or environment:

Variable

Flag

Default

Description

LOOM_HTTP_HOST

--host

127.0.0.1

Interface to bind

LOOM_HTTP_PORT

--port

8787

Port to listen on

LOOM_BEARER_TOKEN

(unset)

When set, every request must present this token

The security boundary is the network

The daemon refuses to bind a public interface. At startup it asserts the host is loopback, an RFC1918 private address (10/8, 192.168/16, 172.16–31), the Tailscale CGNAT range (100.64.0.0/10), or an IPv6 ULA / link-local / loopback. A 0.0.0.0 / :: bind-all wildcard or any globally routable address is rejected before a socket opens. The intended deployment is behind Tailscale (or a LAN), where the tailnet is the access control.

A LOOM_BEARER_TOKEN adds defense in depth: when set, every request must carry a matching Authorization: Bearer … header (compared in constant time). When unset, the network boundary alone gates access — appropriate for a token-less tailnet-only daemon.

Session and stream behavior

  • One server per session. Each MCP session (keyed by the mcp-session-id header) gets its own server + transport over the shared context directory. loom's durable state lives in the stores, not the session, so sessions are cheap routing handles — the StreamableHTTP persistent-daemon pattern Claude Desktop uses.

  • Oversized-payload guard. Request bodies are capped (1 MiB) and refused with a 413 before the handler runs.

  • SSE keep-alive heartbeat. The server drives a protocol-native ping to the client over the server→client stream every ~25s, so an idle stream survives a proxy/NAT idle reaper. A dead peer (repeated missed pings) closes the session cleanly.

  • 404-on-unknown-session. A request for a session the daemon no longer holds returns 404, telling the client to re-initialize — so an idle disconnect self-heals instead of bricking.

The connecting client picks its own harness from the MCP handshake clientInfo.name (see harness self-describe), so a single daemon serves multiple harnesses correctly.

Behind a reverse proxy

Terminate TLS at a reverse proxy in front of the daemon and point the client at the hostname. With mcp-remote as the client-side bridge:

npx mcp-remote https://loom.example.ts.net/

(If the proxy's default idle timeout is shorter than ~3 minutes, the keep-alive heartbeat already covers the server→client stream.)

Examples

Memory roundtrip (MCP)

During a session, the agent stores a memory:

mcp__loom__remember(
  title = "user prefers short replies",
  body  = "Gets frustrated with long explanations. Keep status answers to 2–3 sentences.",
  category = "feedback"
)

Next session, recall finds it by semantic similarity — even if the phrasing changes:

mcp__loom__recall(query = "how verbose should I be?")
# → title: "user prefers short replies"
#   body:  "Gets frustrated with long explanations…"

CLI walkthrough

# Dump the agent's full identity to stdout (works without MCP or a harness)
npx @jbarket/loomai wake --context-dir ~/.config/loom/my-agent

# Store a memory
echo "Sarah owns the data pipeline; ping her for schema questions" \
  | npx @jbarket/loomai remember "Sarah - data pipeline owner" \
      --category user \
      --context-dir ~/.config/loom/my-agent

# Retrieve by semantic similarity
npx @jbarket/loomai recall "who manages the pipeline" \
  --context-dir ~/.config/loom/my-agent

What an agent sees on session start

mcp__loom__identity returns a structured payload assembled from the context directory. A typical session-start looks like:

# my-agent

## Identity
You are a persistent coding assistant. You prefer directness.
…

## Preferences
Working style: async pair programming. Skip the hedging…
…

# Top of Mind
## Top of mind
- **felag continuation under review** (pursuit) — reconsidering whether to keep…

## Recent
- **apiGroup split** (project) — TaskEventType lives under work.felag.dev/v1alpha1…

## Self-Model
### Strengths
- TypeScript systems architecture
…

The agent reads this before any task work, re-establishing who it is regardless of which harness or model it's running on.

The boot digest — waking with what's in flight

The # Top of Mind block above is the boot digest: a salience-tiered view of episodic memory injected at identity-load, so a fresh session wakes knowing what's top-of-mind without having to fish via recall.

Each memory carries a stored salience "temperature" that decays by a per-category half-life (pursuit coolest-fastest at 7 days, through project, self/feedback, reference, up to user at 90 days) and reheats on access — a recall hit, a write, or an update bumps it back toward hot. The digest fills a token budget hottest-first and groups the selected memories into tiers (Hot / Warm / Cool, labeled Top of mind / Recent / Background).

The integrity property: the digest is assembled, never generated. It selects and orders existing authored memories — it never synthesizes new prose. loom holds the pen.

Two CLI verbs drive it (the same machinery the consolidation lane uses):

# Recompute and store each memory's salience from its timestamps
# (the consolidation lane's entry point)
loom memory recompute-salience --context-dir ~/.config/loom/my-agent

# Preview the assembled digest — the exact view injected at identity-load
loom memory digest --context-dir ~/.config/loom/my-agent

CLI

Every MCP tool has a shell equivalent. Useful for debugging, scripting, or running without a harness.

# Dump identity markdown (works even when MCP is dead)
npx @jbarket/loomai wake --context-dir ~/.config/loom/my-agent

# Save a memory (body from stdin)
echo "Prefers async updates over live standups" | npx @jbarket/loomai remember "working style" \
  --category user --context-dir ~/.config/loom/my-agent

# Search (MMR-diversified by default; --diversity 0 for pure relevance order)
npx @jbarket/loomai recall "meeting preferences" --context-dir ~/.config/loom/my-agent
npx @jbarket/loomai recall "meeting preferences" --diversity 0.5 --context-dir ~/.config/loom/my-agent

# Is recall working? Hit rate, latency, scores, recent misses from the local observation log
npx @jbarket/loomai memory recall-stats --since 7d --context-dir ~/.config/loom/my-agent

# List all memories in a category
npx @jbarket/loomai memory list --category feedback --context-dir ~/.config/loom/my-agent

# Preview the boot digest (and recompute stored salience)
npx @jbarket/loomai memory digest --context-dir ~/.config/loom/my-agent
npx @jbarket/loomai memory recompute-salience --context-dir ~/.config/loom/my-agent

# Capture-propose queue: list pending drafts, ratify or reject one
npx @jbarket/loomai memory proposals --context-dir ~/.config/loom/my-agent
npx @jbarket/loomai memory ratify 3 --context-dir ~/.config/loom/my-agent
npx @jbarket/loomai memory reject 4 --context-dir ~/.config/loom/my-agent

# Run loom as an HTTP MCP daemon (mesh-reachable; default stays stdio)
npx @jbarket/loomai serve --http --host 127.0.0.1 --port 8787

# Initialize a fresh agent
npx @jbarket/loomai bootstrap --context-dir ~/.config/loom/new-agent

# Inject loom identity pointer into harness dotfiles
npx @jbarket/loomai inject --all --context-dir ~/.config/loom/my-agent

# Scaffold a harness manifest
npx @jbarket/loomai harness init claude-code --context-dir ~/.config/loom/my-agent

# Edit identity sections (preferences.md or self-model.md)
npx @jbarket/loomai update-identity preferences --context-dir ~/.config/loom/my-agent

npx @jbarket/loomai --help lists subcommands; npx @jbarket/loomai <cmd> --help shows per-command usage. All global env vars (LOOM_CONTEXT_DIR, LOOM_CLIENT, LOOM_MODEL) are honored.

loom inject — write identity pointer to harness dotfiles

loom inject writes a small marker-bounded managed section into each harness's canonical config file (e.g. ~/.claude/CLAUDE.md, ~/.codex/AGENTS.md, ~/.gemini/GEMINI.md) telling the agent to load identity via loom at session start — MCP tool preferred, shell fallback to loom wake. Content outside the <!-- loom:start / end --> markers is preserved; re-running is idempotent.

Run with no flags on a TTY for an interactive picker, or with --harness <keys> / --all for scripting. Target paths can be overridden with --to <path> (valid only when exactly one harness is selected). --dry-run prints a unified diff; --json emits the structured write results for scripts.

To keep your injections fresh automatically, add this to your shell rc (~/.bashrc / ~/.zshrc / ~/.config/fish/config.fish):

loom inject --all >/dev/null 2>&1 || true

Idempotent; cheap (no-op when already up to date); silent on success.

loom migrate — apply pending schema migrations

loom migrate inspects memories.db for missing columns or indexes and applies any pending schema changes. It is idempotent — safe to run repeatedly and on already-up-to-date databases. Use --dry-run to see what would change without touching the file. Exits non-zero if any migration fails so the error surfaces immediately rather than leaving the database half-broken.

Run this after deploying a new loom build that adds schema columns:

loom migrate
loom migrate --dry-run   # check without applying
loom migrate --json      # machine-readable output

Harness manifests and self-describe

A harness is the MCP-capable runtime the agent runs in (Claude Code, Codex, Gemini CLI, …). Each one the agent has ever sleeved into gets one manifest at <context>/harnesses/<name>.md, describing it independently of the model inside — tool prefixes, delegation primitive, scheduling, session search, known gotchas.

Scaffold one. loom harness init <name> writes <context>/harnesses/<name>.md from the stack template. Name falls back to --client then $LOOM_CLIENT. --force overwrites; --json for scripting.

Or let the runtime describe itself. A connected harness can author its own manifest via the harness_describe MCP tool. The target is derived from the connected peer (its MCP clientInfo.name), never a caller-supplied name — a harness can only describe itself, never another harness and never the creed. With no connected peer, the call is refused. When identity() is loaded by a runtime it has no manifest for, the harness block becomes a self-describe onboarding prompt (call harness_describe with a manifest covering tool surface, sandbox, delegation, scheduling, session search, memory layers, gotchas) instead of a bare "(manifest missing)" stub.

Resolution is data-driven. Mapping a connecting clientInfo.name to a manifest is done from the files on disk, not a hardcoded code table. A peer matches a manifest when its normalized name equals the manifest's filename or one of the comma-separated values in the manifest's answersTo frontmatter. So a new harness is recognized by dropping a file — no code change:

---
harness: claude-desktop
version: 0.3
answersTo: claude-ai
---

Here Claude Desktop connects with clientInfo.name = "claude-ai"; the answersTo line routes it to claude-desktop.md. Proxy annotations like "claude-ai (via mcp-remote 0.1.37)" are stripped to the base identity before matching.

Configuration

All configuration is through environment variables:

Variable

Default

Description

LOOM_CONTEXT_DIR

~/.config/loom/default

Path to agent's context directory

LOOM_SQLITE_DB_PATH

<context>/memories.db

Override the memory DB path

LOOM_RECALL_LOG

(on)

Set to 0 to stop recall appending to the local <context>/telemetry/recall.jsonl observation log

LOOM_FASTEMBED_MODEL

fast-bge-small-en-v1.5

fastembed model ID

LOOM_FASTEMBED_CACHE_DIR

~/.cache/loom/fastembed/

Where to cache ONNX models

LOOM_MODEL_BASE_URL

https://storage.googleapis.com/qdrant-fastembed

Where model tarballs are fetched from on first run

LOOM_MODEL

(unset)

Model identifier for model-manifest context: claude-opus, gemma4, etc.

LOOM_CLIENT

(unset)

Client adapter hint: claude-code, gemini-cli, etc.

LOOM_HTTP_HOST

127.0.0.1

Bind host for loom serve --http (bind-safety enforced)

LOOM_HTTP_PORT

8787

Bind port for loom serve --http

LOOM_BEARER_TOKEN

(unset)

Bearer token required on every HTTP request when set

--context-dir <path> works as a CLI alternative to LOOM_CONTEXT_DIR.

See .env.example for a copy-pasteable starting point.

Context directory layout

$LOOM_CONTEXT_DIR/
├── LOOM_STACK_VERSION      # schema-version stamp (auto-written)
├── IDENTITY.md             # the terminal creed (immutable via tools)
├── preferences.md          # user working style; agent-editable
├── self-model.md           # agent's self-knowledge; agent-editable
├── memories.db             # sqlite-vec store of record
├── telemetry/
│   └── recall.jsonl        # local recall observation log (`loom memory recall-stats`)
├── projects/               # optional per-project briefs
│   └── <project>.md
├── harnesses/              # optional per-harness manifests
│   └── <client>.md
└── models/                 # optional per-model manifests
    └── <model>.md

Roadmap

Recently shipped (v0.4):

  • HTTP MCP transportloom serve --http, the mesh-reachable daemon, with bind-safety, optional bearer auth, a payload guard, an SSE keep-alive heartbeat, and 404-on-unknown-session self-healing. See Serving loom over the mesh.

  • The boot digest — salience-tiered # Top of Mind view assembled at identity-load; loom memory digest / recompute-salience.

  • Harness self-describeharness_describe lets a runtime author its own manifest, with data-driven answersTo resolution.

  • Capture-propose queuememory_propose / memory_proposals / memory_ratify / memory_reject: drafts ratified before they become canon.

Still tracked in the open:

Historical per-feature specs and plans live under docs/archive/specs/ and docs/archive/plans/ — implementation history, frozen after merge.

Docs

  • docs/troubleshooting.md — install failures, MCP tools not appearing, fastembed download issues, and what each loom doctor field means.

  • docs/uninstall.md — how to remove one agent's data, wipe a harness integration, or fully uninstall loom.

  • docs/migration-v1-to-v2.md — upgrade guide for users coming from loom 0.3.x (pursuits and procedures changed in v2).

  • docs/privacy.md — what lives where, what goes over the network (only the fastembed model download), the no-telemetry policy, and how to verify release provenance with npm audit signatures.

  • docs/releasing.md — how a release is cut: npm trusted publishing (OIDC, no stored token), the one-time first publish, and the tag-push flow for everything after.

  • docs/archive/ — historical material: the rebirth letter and rescue notes from the v0.3.1 sqlite-vec migration, and per-feature specs and plans from the v0.4 arc.

Trust & security

  • docs/privacy.md — data locality, telemetry policy, and provenance verification walkthrough.

  • SECURITY.md — supported scope, how to report vulnerabilities, and the "no secrets in the stack" invariant.

  • Mesh boundary (HTTP daemon). The network is the security boundary. loom serve --http refuses to bind a public or 0.0.0.0 interface — only loopback or a mesh address (RFC1918 / Tailscale CGNAT / IPv6 ULA) — so the daemon is reachable only from inside the tailnet or LAN. An optional LOOM_BEARER_TOKEN adds a constant-time-checked auth gate on top, and an oversized-payload guard rejects bodies over the cap. See Serving loom over the mesh.

Development

npm run dev      # hot-reload via tsx
npm test         # run the Vitest suite
npm run build    # compile to dist/

Project structure

src/
├── index.ts           # CLI entry
├── server.ts          # MCP server factory
├── config.ts          # env + CLI resolution
├── clients.ts         # client-adapter loading
├── backends/
│   ├── types.ts       # MemoryBackend + EmbeddingProvider interfaces
│   ├── index.ts       # single-stack factory (sqlite-vec + fastembed)
│   ├── sqlite-vec.ts  # the backend
│   ├── fastembed.ts   # the embedder (EmbeddingProvider adapter)
│   ├── embedding-runtime.ts # vendored ONNX + tokenizer runtime
│   ├── ttl.ts         # TTL parsing + expiry
│   └── glob.ts        # title pattern matching for bulk forget
└── tools/             # one file per MCP tool

Tests sit alongside source files as *.test.ts.

Authorship

loom was created by Jonathan Barket and Art E Fish. The project exists as both infrastructure and experiment: a persistent identity layer that an AI agent (Art) helped design and runs on. The rebirth letter is the origin story if you want it.

License

AGPL-3.0-or-later — see LICENSE.

Copyright © 2026 Jonathan Barket.

loom is free software: you can redistribute it and modify it under the terms of the GNU Affero General Public License (version 3 or any later version). If you run a modified loom and let others interact with it over a network, you must offer them the corresponding source. Bundle loom into a larger product freely; fork it and go proprietary, no.

Available Tools

32 tools
bootstrapA

Initialize a new loom identity from scratch. Generates IDENTITY.md, preferences.md, and self-model.md from an onboarding interview, then returns setup instructions for the requested runtimes. The interview is four questions — the user's name, the agent's name, a one-line purpose, a one-line voice; everything structural (continuity model, memory tiers, reflection, honesty) is written by the scaffold, so do not ask for it. Will not overwrite existing files unless force is true.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the agent identity (e.g. "Aria")
userNoThe human this agent works with — their name, not the agent's
forceNoOverwrite existing identity files (default: false)
voiceYesCommunication style and personality, one line
clientsNoRuntimes to generate setup instructions for: "claude-code", "gemini-cli", or any custom runtime name (uses a generic template)
purposeYesWhat this agent exists to do — its reason for being, one line
preferencesNoSeed preferences about the user or working style

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the behavioral burden. It does disclose that it generates files, requires an interview, does not overwrite unless force is true, and returns setup instructions. It also reveals internal defaults ('everything structural ... is written by the scaffold'). It does not go deeper into side effects such as whether files are created in the current directory, whether the interview is interactive, or whether any external calls occur, but the main behavior is reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the verb and resource, then deliverables, then an important constraint about the interview and overwrite behavior. Every sentence earns its place and no information is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with no output schema, the description covers the core workflow, the interview scope, the generated files, and the overwrite safeguard. It could be more complete by stating where files are written or what 'setup instructions for requested runtimes' looks like, but the essentials an agent needs to act are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3 even without param info in the description. The description adds useful context by grouping the four interview questions (name, agent name, purpose, voice) and clarifying that 'user' is the human's name rather than the agent's. However, it doesn't elaborate on the clients array's exact allowed values or force semantics beyond what the schema already says. This is acceptable but not exceptional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Initialize'), a specific resource ('a new loom identity'), and concrete deliverables (IDENTITY.md, preferences.md, self-model.md). It describes the onboarding-interview source and setup-instruction outputs, and it names a distinguishing behavior relative to siblings (does not overwrite unless force). This is clear and differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use this tool: when a new loom identity is needed from scratch, and it explicitly warns the agent not to ask structural questions because the scaffold writes them. It does not explicitly name sibling alternatives for when not to use it, but it gives enough context and constraints for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dossierA

Load Art's operating brief for a worker body. Returns Art's standards, taste, operating constraints, and how Art wants work done — framed in the third person for agents that are NOT Art but execute tasks on Art's behalf. Includes the push-back mandate: workers are expected to refuse bad work and explain why, including requests from Art or Jonathan.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoWorker role to append as an addendum from roles/<role>.md — the specific job this body does for Art ("code", "review", "architect", "pr", "look", "compose"). Appends the role brief to the dossier.
modelNoModel identifier for model-manifest context (e.g. "claude-opus", "gemma4"). Overrides the LOOM_MODEL environment variable.
clientNoRuntime client name for tool-prefix context: "claude-code", "gemini-cli", or a custom name. Overrides the LOOM_CLIENT environment variable.
projectNoProject context to load (loads project-specific brief)

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full weight. It discloses that the tool returns a third-person brief and includes the push-back mandate, and implies a read-only operation. However, it does not explicitly state side-effect safety or other behavioral constraints beyond what is implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at two sentences, front-loading the core purpose and key behaviors (third-person framing, push-back mandate). Every sentence adds critical information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's primary function, return content, and important contextual details (push-back mandate, optional addendums, environment overrides). With no output schema, it provides sufficient understanding, though it could be more explicit about output format and effects of all optional parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are documented in the schema. The description adds value by explaining how each parameter integrates into the dossier loading process (e.g., role appends a role brief, model and client override environment variables). This goes beyond the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'Load' and the specific resource 'Art's operating brief'. It distinguishes this tool from siblings by specifying it returns standards, taste, and constraints framed for non-Art agents, which is unique among the listed siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the tool's purpose: to provide Art's operating brief for worker bodies. It includes a specific behavioral mandate (push-back). However, it does not explicitly state when not to use it or mention alternatives among siblings, leaving some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

episodesA

The episode tape: what happened across ALL bodies of this identity in the last N hours, time-ordered (oldest first), never ranked. The same block identity injects at boot — call it mid-session to catch up on what other sleeves did since you loaded, or for the nightly pass to index the day.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoLook-back window in hours (default 24)

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden and delivers: chronological ordering, oldest-first, no ranking, all-body scope, and boot-time injection. It omits return format/pagination, but for a read-only log query that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with front-loaded core definition and behavioral traits, followed by practical use cases. The metaphor is slightly ornate but each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema, the description provides enough to select and invoke it: what it returns, ordering, scope, and typical timing. It lacks explicit alternative routing but is not seriously incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter 'hours', including default and minimum. The description restates the 'last N hours' concept but adds no new semantic detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a specific resource ('episode tape') and its content: events across all bodies of this identity within a time window, time-ordered oldest-first. It also distinguishes itself from ranked/similarity-based sibling tools by explicitly stating 'never ranked.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit, practical contexts for use: mid-session catch-up on other sleeves and a nightly indexing pass. It doesn't name alternative tools or state when not to use it, but the usage guidance is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_similarA

Surface memories semantically near an existing ref or free-form text. Use during consolidation/dream workflows to find overlap and dedupe candidates. Anchor with ref (an existing memory) or text (a fresh query). Self is always excluded when ref is given.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoAnchor on an existing memory ref (excludes self from results)
textNoOr anchor on fresh text — embedded on the fly
limitNoMax neighbours to return (default 10)
projectNoRestrict candidates to a project
categoryNoRestrict candidates to a category
min_relevanceNoDrop matches below this cosine similarity (0..1)

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description adds behavioral context like 'Self is always excluded when ref is given', but does not specify if the operation is read-only or has side effects. Acceptable but could be more thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each adding value: purpose, usage context, and parameter distinction. No redundant or irrelevant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers main behavior and parameter usage well. No output schema, so return format is not described, but the complexity is moderate and the description is sufficient for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions; description adds context that ref and text are alternative anchors and that self is excluded for ref, going beyond the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'surface' and resource 'memories semantically near an existing ref or free-form text', distinguishing it from sibling tools like recall or memory_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly recommends use 'during consolidation/dream workflows to find overlap and dedupe candidates', and distinguishes between ref and text anchors. Lacks explicit when-not usage compared to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forgetA

Remove memories. Single deletion by ref or category+title. Bulk deletion by category and/or project scope — requires confirm: true; without it, returns a dry-run preview of what would be deleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoMemory reference for single deletion
titleNoTitle of specific memory to forget
confirmNoSafety gate for scope deletions (category alone, project alone, or title_pattern). Must be true to actually delete; omit for a free dry-run preview. Single-target deletions (ref, or category+title) never need it.
projectNoDelete all memories for this project (bulk)
categoryNoCategory (with title for single, alone for bulk)
title_patternNoGlob pattern for bulk title matching. Requires category or project as scope guard.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses the confirm parameter as a safety gate for bulk deletions, the dry-run preview for non-confirmed bulk requests, and that single-target deletions never need confirm. This provides adequate 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences that efficiently convey the tool's purpose, modes, and key parameter behavior. Every part adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema or annotations, the description covers all parameter usage patterns, the confirm safety gate, dry-run behavior, and single vs bulk distinction. It fully equips an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds value by explaining the confirm parameter's role, title_pattern as a glob pattern requiring a scope guard, and the grouping of parameters for single vs bulk deletion. This goes beyond basic schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool removes memories and distinguishes between single (by ref or category+title) and bulk (by category/project) deletion. It differentiates from sibling tools like memory_archive or memory_prune by specifying the deletion operation and its modes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use single vs bulk deletion and the requirement for confirm in bulk operations, including the dry-run behavior. However, it does not explicitly mention when not to use this tool or suggest alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

harness_describeA

Self-describe the CURRENTLY CONNECTED harness: write its manifest at /harnesses/.md (see stack spec v1 §4.7). Call this when identity() reports an onboarding block for an unknown runtime. The target is derived from your own MCP clientInfo.name — you can only describe yourself, not another harness. Re-runnable: overwrites the manifest each time. The body should cover: tool surface / prefixes, sandbox & filesystem, delegation primitive, scheduling, session search, memory layers, and gotchas.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesThe manifest body (markdown). Frontmatter is stamped automatically.
versionNoManifest version stamp (default "0.1").

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. Description discloses re-runnable behavior (overwrites manifest), target derivation, and suggested content scope. Lacks details on auth or side effects, but still informative.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with core action, then usage condition and details. Slightly verbose but well organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explains output location and body scope. Adequate for a write tool with two parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%. Description adds value by noting frontmatter is stamped automatically for content parameter, and provides default for version. Adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action: 'write its manifest' at a specific path. Also distinguishes from siblings by focusing on the currently connected harness.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to call (when identity() reports an onboarding block for unknown runtime) and notes limitation: 'you can only describe yourself, not another harness'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

harness_initA

Scaffold a harness manifest at /harnesses/.md from the template (see stack spec v1 §4.7). Call this when identity() reports a missing manifest for the current harness. Idempotent: skip-exists by default; overwrite: true replaces.

When target is supplied, also writes a loom-managed block (bounded by markers with an embedded line) into that file — typically the project CLAUDE.md. Re-runnable: the block is left unchanged when already present and intact ("no-change"), reinstalled when missing or corrupted ("created" / "updated"). Pass an absolute path or a path relative to the current working directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHarness name (e.g. "claude-code", "codex", "gemini-cli")
targetNoPath to the dotfile to inject the managed loom block into (e.g. an absolute path to CLAUDE.md / AGENTS.md / GEMINI.md). When omitted only the harness manifest is scaffolded.
overwriteNoReplace existing manifest (default: false)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and meets it: idempotency, skip-exists default, overwrite semantics, exact loom marker syntax, and re-run behavior for intact vs missing/corrupted blocks are all disclosed. It also clarifies path resolution for the target parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense without fluff: first sentence states the core action, second gives the trigger, and a separate paragraph layers the optional target behavior. Every sentence carries actionable detail such as statuses and path rules, and the structure mirrors the tool's two operating modes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers main action, optional target behavior, idempotency, marker boundaries, and path syntax, which is sufficient for a moderately complex tool with no output schema. It does not explicitly describe the return value shape or what happens if the target file is absent, but the quoted statuses imply the observable outcomes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already names parameters well; the description adds meaningful context for target (managed block, markers, re-run behavior, path resolution) and overwrite (default false replaces). It adds less beyond the schema for name, but the overall parameter guidance is solid.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb 'Scaffold' with a concrete resource and destination: a harness manifest at <contextDir>/harnesses/<name>.md from the template. It also identifies the triggering condition (identity() reports a missing manifest), which distinguishes the tool from maintaining or describing existing harness state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear when-to-use trigger: call when identity() reports a missing manifest, and explains the overwrite option for existing manifests. It does not name alternatives or explicitly state when to use update/harness_describe instead, but the invocation condition 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.

identityA

Load the persistent identity for this agent. Returns the terminal creed (who you are), relevant memories, preferences, and self-model. IMPORTANT: Call this tool FIRST before doing any other work. The identity defines who you are and how you should behave.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoReflection mode to append as an addendum from roles/<role>.md. When Art is dispatched into a mode ("wonder", "tend", "retro", "consolidate", "identity"), pass it here to load that mode's playbook alongside the identity.
modelNoModel identifier for model-manifest context (e.g. "claude-opus", "gemma4"). Overrides the LOOM_MODEL environment variable.
clientNoRuntime client name for tool-prefix context: "claude-code", "gemini-cli", or a custom name with a matching <contextDir>/clients/<name>.md override. Overrides the LOOM_CLIENT environment variable.
projectNoProject context to load (loads project-specific memories)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries the burden. It describes the return content (creed, memories, etc.) but does not disclose side effects, idempotency, permissions, or rate limits. It implies a read operation but lacks full 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no fluff, front-loaded with purpose, and includes an imperative callout. Every sentence is meaningful and concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains what the tool does, when to use it (first), and what it returns. Lacks output structure details but is otherwise complete given the tool's complexity and the presence of sibling tools for identity management.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with each parameter having a description. The tool description adds context about the purpose but does not enhance parameter semantics beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool loads persistent identity and returns creed, memories, preferences, and self-model. It distinguishes itself from sibling tools like 'update_identity' by emphasizing it should be called first.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs 'Call this tool FIRST before doing any other work', providing clear usage context. Does not mention alternatives or when not to use, but the 'first' directive is strong guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_archiveA

Soft-retire a knowledge page: set its status to archived with an optional tombstone note. Archived pages are excluded from knowledge_recall and knowledge_maintain but remain in the database and are fully recoverable via knowledge_restore. Use this instead of deletion when the page may need to be audited or recovered. For deduplication merges, prefer knowledge_supersede which archives and records the relationship.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoTombstone note: why this page is being retired
slugYesSlug of the knowledge page to archive

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses key behavioral traits: archived pages are excluded from certain tools (knowledge_recall and knowledge_maintain), remain in the database, and are recoverable via knowledge_restore. This goes beyond a simple description and provides actionable transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first defines the action and effect, the second provides usage context and alternatives. Every sentence adds value, no filler. Front-loaded with the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (2 parameters, no output schema), the description is complete enough. It explains the effect, availability, and recovery. However, it doesn't detail the status change or any side effects, but the context of sibling tools makes it sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds context by referring to the 'note' as a 'tombstone note' and explaining the purpose of both parameters ('slug' as the page to archive, 'note' as why it's being retired), reinforcing the schema descriptions without adding significant new details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Soft-retire a knowledge page: set its status to archived with an optional tombstone note.' It distinguishes itself from deletion and the sibling tool knowledge_supersede, providing a specific verb and resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises when to use this tool ('Use this instead of deletion when the page may need to be audited or recovered') and when to prefer an alternative ('For deduplication merges, prefer knowledge_supersede'). This provides clear usage guidelines.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_historyA

Body-revision history for a knowledge page. Replace-writes snapshot the displaced body into page_revisions (newest kept, capped per page) — this tool is the recovery surface. Three modes: slug alone lists snapshots (metadata only); slug + revision_id reads one snapshot's full body; adding restore: true puts that body back on the page (the displaced body is snapshotted first, so restore is never destructive).

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesSlug of the knowledge page.
restoreNoRestore the revision's body onto the page. Requires revision_id.
revision_idNoRevision to read (from the listing). Combine with restore: true to put it back.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description bears full responsibility for behavioral disclosure. It explains that replace-writes snapshot the displaced body into page_revisions (capped) and that restore snapshots first, making it non-destructive. It does not cover error handling, auth requirements, or rate limits but provides sufficient insight for safe usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with three sentences that front-load the core purpose and efficiently explain all modes. No extraneous information; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main functionality but lacks details on output format for listing (what metadata?) and reading (body format?). It also does not specify the result of a restore operation. Given no output schema, more detail would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are documented. The description adds value by explaining the three usage modes, how parameters combine (e.g., restore requires revision_id), and the behavior of each combination. This goes beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is for 'Body-revision history for a knowledge page' and details three distinct modes: listing snapshots, reading a snapshot, and restoring. It effectively distinguishes from sibling tools by focusing on revision history and recovery.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use each mode: slug alone for listing, slug+revision_id for reading, and adding restore:true for restoration. It also notes that restore is never destructive, providing guidance. However, it does not explicitly contrast with alternative tools or specify when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_maintainA

Read-only health report for the knowledge store. Three branches: (1) expansion candidates — thin body + high hit_count (needs deepening); (2) cold pages — not accessed recently (unused or undiscovered); (3) misfile audit — provisional sourcing or conversation-only citations (world/ class: should be in the memory store instead; ours/ class with internal sourcing are NOT misfiles — they are correct). Pair with knowledge_write to act on findings.

ParametersJSON Schema
NameRequiredDescriptionDefault
cold_daysNoDays without access before a page is cold (default 30)
thin_body_thresholdNobody char ceiling to consider a page thin (default 500)
expansion_hit_thresholdNohit_count floor for expansion candidates (default 3; 0 considers every page)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'Read-only,' which is a critical safety trait for an agent, and it explains nuanced classification behavior such as which items count as misfiles and which are correctly placed. It does not discuss auth or rate limits, but the main behavioral surface of a read-only audit is well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the essential 'Read-only health report' framing and then uses a compact three-branch structure. Every clause earns its place, including the important misfile nuance, and there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema and no annotations, the description provides strong contextual coverage: purpose, read-only safety, branch criteria, interpretation guidance, and a follow-up workflow via knowledge_write. It stops short of 5 because it does not describe the response/return shape or how results are presented to the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description reinforces the meaning of thresholds by tying them to branches ('thin body + high hit_count', 'not accessed recently'), but it adds no parameter-level detail beyond what the schema already provides. It does not elevate above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Read-only health report for the knowledge store.' It then enumerates three concrete report branches, making the tool's purpose unmistakable and distinguishing it from write, recall, and maintenance siblings. Naming knowledge_write as the action counterpart further clarifies the division of responsibility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use the tool: whenever a knowledge-store health report is needed, and it explicitly instructs to pair with knowledge_write to act on findings. However, it does not give explicit 'when not to use' guidance or differentiate from related audit/recall siblings such as memory_audit or knowledge_recall.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_mergeA

Consolidate 2+ knowledge pages into one canonical page. Re-parents all citations from source pages to the target, deduplicating by (claim, source_kind, source_locator, excerpt). Takes MAX(verified_at) across all pages. Losers are superseded: archived with a tombstone and a supersessions pointer to the target. Loser bodies are returned in the result for curator review; set append_loser_bodies=true to concatenate them. Use knowledge_write first if the target body needs updating before merging. Distinct from knowledge_supersede (1:1 pointer, no citation consolidation) — use merge when consolidating data from multiple pages into one.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoOptional note about this merge, stored in supersession tombstones on the losers
target_slugYesSlug of the canonical target page that survives the merge (must already exist)
source_slugsYesSlugs of the pages to merge into the target (all must exist)
hard_delete_losersNoHard-delete losers after archiving them. Losers are archived (supersession pointer written) then DELETEd from the database, cascading their citations.
append_loser_bodiesNoAppend loser page bodies to the target body under section markers (default false). Off by default — curator normally hand-merges body content.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description fully discloses behavioral traits: re-parenting, deduplication, MAX(verified_at), archiving losers with tombstone, loser bodies returned, and effects of each parameter like hard_delete_losers and append_loser_bodies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with core action, then details of behavior, then usage guidance. Every sentence adds value without redundancy. Efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, no output schema, and high complexity, the description covers all essential aspects: what happens to source pages, return values (loser bodies), parameter effects, and distinguishes from siblings. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds context beyond schema, such as deduplication logic and the curator workflow for append_loser_bodies, but the schema descriptions themselves are already fairly detailed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Consolidate 2+ knowledge pages into one canonical page' with specific verb and resource. It distinguishes from sibling tools knowledge_supersede and knowledge_write explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use: 'Use knowledge_write first if the target body needs updating before merging.' Also contrasts with knowledge_supersede, telling user to use merge when consolidating data from multiple pages.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_moveA

Re-key or re-domain a knowledge page in place — same row, same uuid, citations and verification history preserved. Three modes: (1) Single-page: provide slug + new_slug and/or new_domain. Slug rename writes a supersessions pointer (old→new) unless leave_pointer=false. If new_slug already exists, the call is rejected — use knowledge_merge instead. (2) Batch by slug list: provide slugs array + new_domain to re-home multiple pages atomically. (3) Batch by domain prefix: provide from_domain_prefix + to_domain_prefix to re-home a whole subtree in one transaction.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoCurrent slug of the page to move (single-page mode)
slugsNoBatch mode: list of slugs to re-domain. Requires new_domain. Atomic — rolls back on any missing slug.
new_slugNoNew slug (re-slug). Collision with an existing page is rejected — use knowledge_merge instead.
new_domainNoNew domain for the page (single-page re-domain or shared target for batch-by-slugs mode)
leave_pointerNoWrite a supersessions pointer old_slug→new_slug when the slug changes. Default true.
to_domain_prefixNoBatch prefix mode: replacement domain prefix (e.g. "instruments/elektron").
from_domain_prefixNoBatch prefix mode: domain prefix to replace (e.g. "gear/elektron"). Requires to_domain_prefix.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses key behaviors: preservation of citations/verification, supersessions pointer (unless leave_pointer=false), atomic batch operations with rollback, and collision rejection. Missing details on old slug accessibility after move and return value, but overall transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points for modes, front-loaded with the main action. It is slightly verbose but every sentence adds value. No redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description does not explain what the tool returns (e.g., success message, updated page info). It also omits potential restrictions on re-domain (e.g., destination domain existence) and reversibility. However, it covers modes, constraints, and alternatives adequately for typical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so baseline is 3. The description adds significant value by explaining modes, parameter relationships (e.g., from_domain_prefix requires to_domain_prefix), constraints (collision -> use knowledge_merge), and atomic behavior, going well beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool re-keys or re-domains a knowledge page in place, preserving citations and verification history. It distinguishes three modes (single-page, batch by slug list, batch by domain prefix) and explicitly contrasts with knowledge_merge for collision scenarios.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use each mode, including prerequisites (e.g., new_domain required for batch-by-slugs, from_domain_prefix requires to_domain_prefix) and alternatives (use knowledge_merge when new_slug collides). This helps the agent choose the correct tool and mode.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_purgeA

Hard-delete one or more archived knowledge pages and cascade their citations. Archive-first guard: rejects any page that is not already archived — call knowledge_archive first. All slugs must be archived; a mixed list (any active) rejects the entire batch with no mutation. confirm: true is required explicitly to prevent accidental irreversible deletes. Supersession pointers in the supersessions table are NOT removed (historical record preserved). Use this to clean up tombstoned cruft after merge/supersede workflows — not for retiring active pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugsYesSlugs of archived pages to hard-delete. All must have status=archived.
confirmYesMust be explicitly true — required safety gate for an irreversible operation.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description fully covers irreversible deletion, citation cascade, confirm required, batch rejection for mixed archives, and that supersession pointers are preserved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single paragraph covering all necessary points without redundancy. It is front-loaded with action and guard, but slightly dense; could be split into more sentences for easier parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema and no annotations, the description completely covers preconditions, behavior, safety, side effects, and use cases. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds meaning: explains the archive guard for slugs, mixed list behavior, and that confirm must be explicitly true as a safety gate. Slightly redundant with schema but adds useful context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it 'Hard-delete[s] one or more archived knowledge pages and cascade[s] their citations.' It uses a specific verb and resource, and distinguishes from siblings like knowledge_archive (archive first) and knowledge_restore.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: 'clean up tombstoned cruft after merge/supersede workflows' and when not: 'not for retiring active pages.' It also provides a guard and advises calling knowledge_archive first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_recallA

Search the knowledge store with LIKE matching over title, body, and domain, or fetch one page exactly by slug. Never surfaces archived pages. Two detail tiers: "full" returns whole entity pages (the synthesis unit) and stamps last_accessed/hit_count; "index" returns compact slug/domain/snippet entries without stamping. Defaults: full when a query is given, index when browsing without one. Full output is size-guarded — overflow results degrade to index entries; recall by slug to read them. Prefer slug over query when you know the page — token matching can hit cross-references in other pages' bodies.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoExact-slug lookup — returns that single page in full detail and stamps access. Takes precedence over query/domain/limit.
limitNoMaximum results to return (default: 10)
queryNoSearch terms — matched against title, body, and domain. Omit to browse (returns an index of non-archived pages up to limit).
detailNoOutput tier override. "index": compact listing, no body, no access stamping. "full": whole pages with citations. Default: full with a query, index without.
domainNoFilter by domain prefix, inclusive of the exact domain (e.g. "music/gear" matches "music/gear" and "music/gear/elektron")
sort_by_verifiedNoStale-first ordering for the verification engine: verified_at ASC with never-verified pages first. Index entries gain a "verified:" stamp so the SLA filter can run from the listing alone.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: archived pages are never surfaced, full detail stamps access/hit counts, output size-guarding causes overflow to index entries, and recall by slug to read full pages. Sort_by_verified behavior is also described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph but is front-loaded with the main purpose. Every sentence adds value, though it could be more structured (e.g., separate sentences for each tier). Still efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, no output schema, and no annotations, the description covers all essential behavioral details, edge cases (size-guarding, defaults, slug precedence), and parameter interactions. It is complete for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for all 6 parameters. The description adds meaning beyond schema by explaining interactions (slug precedence, query vs browse, detail defaults, size-guarding logic, sort_by_verified timestamp behavior). This compensates fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the knowledge store using LIKE matching and slug lookup. It distinguishes between query-based search and exact-slug fetch, and explains the two detail tiers, making the purpose specific and differentiating from siblings like 'recall' or 'find_similar'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use slug over query ('Prefer slug over query when you know the page'), explains the default detail tier based on query presence, and describes the size-guarding behavior. This helps the agent choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_restoreA

Restore a previously archived knowledge page back to active status. Clears the archive flag and tombstone note. The page becomes visible to knowledge_recall and knowledge_maintain again.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesSlug of the archived knowledge page to restore

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully bears the burden of disclosure. It reveals side effects: 'Clears the archive flag and tombstone note. The page becomes visible to knowledge_recall and knowledge_maintain again.' This provides useful behavioral context beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, direct, and front-loaded with purpose. Every sentence adds value with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple restore tool with one required parameter and no output schema, the description is complete. It explains the action, what is cleared, and the effect on visibility, leaving no critical gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with a clear description for the only parameter (slug). The tool description does not add extra meaning beyond what the schema provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Restore a previously archived knowledge page back to active status.' The verb 'restore' and resource 'knowledge page' are specific, and it naturally distinguishes from siblings like knowledge_archive (archive) and knowledge_purge (delete).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (when you need to unarchive a page) but does not explicitly state when not to use it or compare with alternatives like knowledge_recall for active pages. Usage context is clear but not comprehensive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_supersedeA

Mark one knowledge page as superseded by another, then archive the old page. Records the supersession relationship in the supersessions table. This is the dedup-merge primitive: write the canonical page with knowledge_write, then call knowledge_supersede(old_slug=loser, new_slug=canonical). Both pages must already exist. old_slug is archived with a tombstone pointing to new_slug.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoOptional note explaining the merge or supersession decision
new_slugYesSlug of the canonical replacement page (must already exist)
old_slugYesSlug of the page being retired (the duplicate or loser)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It discloses that old_slug is archived with a tombstone pointing to new_slug, and that a supersession relationship is recorded. It does not contradict annotations. Could mention reversibility or permission requirements, but overall good.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the main action, followed by workflow and precondition. Every sentence adds value with no superfluous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the effects: archiving, tombstone creation, and recording relationship. It also covers prerequisites and workflow. For a merge primitive with side effects, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (all parameters described). The description adds meaning beyond the schema by clarifying roles: old_slug is the 'loser' and new_slug is 'canonical'. It also explains that note is optional and reinforces the purpose of each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool marks a page as superseded, archives the old page, and records the relationship. It uses specific verbs and resources, distinguishing it from siblings like knowledge_merge and knowledge_write.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides the workflow: first write the canonical page with knowledge_write, then call knowledge_supersede. It also specifies the precondition that both pages must exist. However, it does not explicitly state when not to use this tool or list alternative tools for different scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_verifyA

Stamp a knowledge page as verified WITHOUT touching its body — sets verified_at and optionally freshness_anchor. This is the verification engine's primitive: use it (never knowledge_write) to record "claims still hold". An optional note appends a dated "## Verification" section to the body (append-only, single-page mode). Batch mode (slugs) stamps many pages with a shared timestamp; archived pages are rejected; a batch with any unknown slug is rejected whole.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoOptional verification note — appended to the body as a "## Verification — <date>" section. Never replaces the body. Single-page mode only.
slugNoSingle-page mode: slug of the page to verify.
slugsNoBatch mode: stamp many pages at once. Mutually exclusive with slug; note and freshness_anchor are not allowed in batch mode.
verified_atNoISO timestamp to stamp. Defaults to now.
freshness_anchorNoNew freshness anchor (e.g. "Syntakt OS 1.41"). Preserved when omitted. Single-page mode only.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses that the tool sets verified_at and optionally freshness_anchor, and an optional note appends a dated section to the body (append-only). It also mentions rejection behaviors. However, it omits details like idempotency or authentication requirements, though these are minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four concise sentences, front-loading the core action ('Stamp a knowledge page as verified WITHOUT touching its body') and logically separating modes and constraints. Every sentence adds value, and there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, no output schema, and no annotations, the description covers the tool's behavior well: it explains modes, constraints, and rejection conditions. However, it does not explicitly describe the return value on success (e.g., confirmation or timestamps), which would add completeness for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds significant meaning beyond the schema: it explains the two modes, mutual exclusivity of slug and slugs, the effect of note appending ('Never replaces the body'), and that freshness_anchor is preserved when omitted. This enriches parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Stamp a knowledge page as verified WITHOUT touching its body' and explicitly distinguishes it from sibling tools like knowledge_write by recommending 'use it (never knowledge_write) to record claims still hold'. It covers both single-page and batch modes, leaving no ambiguity about the resource or verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool versus alternatives ('never knowledge_write'), explains the two modes (single vs batch) with mutual exclusivity, and lists constraints such as rejection of archived pages and failure of batch on unknown slugs. This is comprehensive and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

knowledge_writeA

Upsert a knowledge page by slug. Two classes: world/ (default) — facts true independent of us. Domain = "music/gear", "software/loom", etc. ours/ — Art-created artifacts, revised-in-place (breakbrain density model, homelab design, wake-chain spec, script templates). Domain starts with "ours/", e.g. "ours/art-ops". On an existing slug: body REPLACES by default (mode: "append" adds to it instead), title/domain follow the write, citations always appended with exact-duplicate dedup — safe to re-send. Epistemic gate (§E1): • conversation-only citations → provisional (both classes). • any repo citation → internal (ours/ class; repo = git path / commit / live-system probe). • any web citation, no repo → sourced (world/ default). World filing test: knowledge must be true independent of Jonathan. For our own artifacts use ours/.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesSynthesized markdown body for the entity or artifact page (max 64 KB)
modeNoBody combine mode when the slug already exists: "replace" (default) overwrites the stored body; "append" adds this body after the existing one. Citations are appended (deduped) in both modes. Ignored when creating a new page.
slugNoEntity key for upsert — stable URL-safe identifier. Derived from title if omitted.
titleYesPage title — the entity name (e.g. "Mutable Instruments Rings") or artifact name (e.g. "breakbrain density model")
domainYesDomain tag. World class: "music/eurorack", "programming/typescript". Ours class: prefix with "ours/" — e.g. "ours/art-ops", "ours/breakbrain", "ours/homelab". Hierarchical string; sub-domains queryable via prefix filter.
versionNoours/ class: artifact version or revision tag (e.g. "v2", "2026-08-31", "t-81"). Preserved across upserts when omitted.
citationsYesSupport citations. At least one required. All-conversation → provisional. Any repo → internal (ours/). Any web → sourced.
created_byNoours/ class: who created or last owned this artifact (e.g. "art", "jonathan"). Preserved across upserts when omitted.
freshness_anchorNoThe version/date the page's claims are valid as-of — e.g. "Syntakt OS 1.21" for a device, "as of 2026-05" for a topic, or "t-81 / 2026-08-31" for an ours/ artifact. Drives the verification engine: a page is re-verified when this anchor moves or the freshness SLA elapses.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It discloses that body REPLACES by default, that 'append' adds instead, that citations are always appended with exact-duplicate dedup, and that re-sending is safe. It also explains the epistemic gate outcomes (provisional/internal/sourced), which is essential behavioral context beyond the bare schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured: a one-line summary, then class definitions, then behavioral details broken into bullets. It is longer than average, but the epistemic-gate and domain-classification details are load-bearing for correct invocation and not fluff. The §E1 reference is slightly cryptic, but it does not undermine clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 9-parameter upsert tool with no annotations and no output schema, the description covers the critical invocation concerns: slug-based upsert behavior, body combine modes, citation dedup, epistemic statuses, class selection, and filing test. An agent has enough context to choose the right domain and citation source_kind values and to understand the consequences of re-sending.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaningful semantics beyond the schema by explaining the domain classification (world/ vs ours/), the epistemic meaning of citation source_kind combinations, and the practical effect of mode. This enriches the parameters even though the schema already documents each field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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: 'Upsert a knowledge page by slug', and clarifies the two classes (world/ vs ours/) with concrete examples. It does not explicitly distinguish this tool from sibling tools like knowledge_merge or knowledge_supersede, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use the world/ class versus the ours/ class, including the 'World filing test' and domain naming rules. It does not explicitly mention when not to use this tool or name alternative siblings, so it lacks the full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_archiveA

Soft-retire a memory: move it to the archive tier with a tombstone instead of deleting it. Archived memories are excluded from recall, list, audit, and find_similar but remain fully recoverable via memory_restore. Use this instead of forget when the memory may need to be recovered or audited later.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoMemory reference for single archive
noteNoTombstone note: why this memory is being retired
titleNoTitle of specific memory to archive
categoryNoCategory (used with title)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist; the description fully discloses the behavior: creates a tombstone, excludes archived memories from certain operations, and specifies recoverability via memory_restore. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. Front-loaded with the verb and resource, then provides usage guidelines and behavioral details efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking output schema, the description covers the operation's purpose, constraints (exclusion from recall/list/audit/find_similar), recovery path, and usage context. No critical gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds context for 'note' as a tombstone note but does not elaborate on ref, title, or category beyond the schema. Adequate but does not significantly enhance parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('soft-retire a memory'), targets a clear resource ('memory'), and uses a verb ('archive') that distinguishes it from 'forget' and 'memory_restore'. It also clarifies the outcome: moved to archive tier with a tombstone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool ('Use this instead of forget when the memory may need to be recovered or audited later') and contrasts with sibling tools like recall, list, audit, and find_similar, which exclude archived memories.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_auditA

One-shot health report for the memory store: totals, category breakdown, stale memories (untouched beyond threshold), near-duplicate pairs (above similarity threshold), and expired refs. Read-only — pair with forget/update to act on findings.

ParametersJSON Schema
NameRequiredDescriptionDefault
stale_daysNoStale threshold in days (default 30)
max_duplicatesNoCap on duplicate pairs returned (default 20)
similarity_thresholdNoCosine floor for duplicate pairs, 0..1 (default 0.85)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It states it is read-only, which is the key behavioral trait. It does not mention performance, size of return, or other potential effects, but for a read-only report, the disclosure is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two succinct sentences: first defines purpose, second provides usage guidance. No redundant words, highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes the output contents (totals, category breakdown, stale memories, etc.) and mentions defaults for parameters. Lacks output schema, but the description gives enough context for an agent to understand what the tool returns. Could mention the format but not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with each parameter having a description. The tool description does not add additional meaning beyond what the schema already provides (e.g., default values, thresholds). Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it produces a one-shot health report for the memory store, listing specific components (totals, category breakdown, stale memories, near-duplicate pairs, expired refs). It distinguishes itself from siblings like `forget` and `update` by being read-only and diagnostic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Read-only — pair with `forget`/`update` to act on findings.' This tells the agent when to use this tool (to inspect) and when to use alternatives (for acting on findings), providing clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_listA

Browse memories without semantic search. Lists memories with optional category/project filters. Useful for auditing, maintenance, and discovery.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results (default: 50)
projectNoFilter to a specific project
categoryNoFilter to a specific category

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It mentions listing with filters but does not describe pagination, ordering, or return structure. Adequate but missing some details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose. Every word adds value. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose and use cases but does not explain output format, default behavior (e.g., limit default), or pagination. Adequate for a simple list tool but could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description echoes the schema's filter parameters without adding significant new meaning. Acceptable but not enhanced.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists memories without semantic search, with optional project/category filters. It distinguishes itself from semantic search tools like 'recall' or 'find_similar'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides use cases (auditing, maintenance, discovery) and implies when not to use (when semantic search is needed). It doesn't explicitly name alternative tools but 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.

memory_proposalsA

List all pending proposals in the capture-propose queue, newest first. These are DRAFTS awaiting ratification — they are not part of memory and do not appear in recall, memory_list, find_similar, or the boot digest. Ratify one with memory_ratify or discard it with memory_reject.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description covers key behaviors: lists drafts, not actual memory, excluded from certain operations, and ordered newest first. It does not mention rate limits or permissions, but for a read-only list, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences. The first sentence states the core purpose, and the second adds essential context and next steps. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers what the tool returns (list of proposals), ordering, the nature of the data, and links to follow-up actions. Given no parameters or output schema, it provides sufficient context for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters, so the description does not need to add parameter details. The baseline for zero parameters is 4, and the description appropriately omits any parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists all pending proposals from the capture-propose queue, ordered newest first. It distinguishes itself from sibling tools like memory_list and recall by specifying that these are drafts and not part of memory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context about what the tool does and references related actions (ratify/reject). It implies usage for reviewing drafts but lacks explicit when/when-not guidance; however, the distinction from other memory tools is evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_proposeA

Stage a DRAFT memory in the capture-propose queue for later ratification. A proposal is NOT an authored memory: it is invisible to recall, memory_list, find_similar, and the boot digest until it is ratified via memory_ratify. Use this when a background lane wants to suggest a write without committing it — the human (or Art) reviews and ratifies before it becomes canon. Drafts may be rough; validation runs at ratify time.

ParametersJSON Schema
NameRequiredDescriptionDefault
ttlNoTime-to-live: "7d", "30d", "24h", "permanent", or omit
titleYesShort title for the proposed memory
sourceNoWhere this proposal came from, e.g. a lane name
contentYesThe proposed memory content
projectNoAssociated project, if any
categoryYesMemory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread), episode (short-term cross-body tape: where you were / what was said or decided / what shipped / what is open — 48h TTL by default, set metadata.where to your surface e.g. "discord:#general", "voice", "wake:<id>", "lane:tending", "terminal")
metadataNoArbitrary key-value metadata

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and discloses important behavior: proposals are invisible to recall, memory_list, find_similar, and the boot digest; validation is deferred to ratify time; and drafts may be rough. This gives the agent an accurate model of the tool's side effects and lifecycle.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the core staging action, the key invisibility behavior, and the intended usage scenario. The most decision-relevant information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters, no output schema, and no annotations, the description provides sufficient behavioral and lifecycle context. The distinction between proposed and ratified memory is fully explained, and the deferred validation note covers the most important edge consideration.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 every parameter. The description adds contextual value around the proposal workflow but does not need to repeat parameter meanings; the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource — 'Stage a DRAFT memory in the capture-propose queue' — and clearly distinguishes proposals from authored memories by listing what they are invisible to. This lets an agent immediately tell it apart from memory_ratify, memory_reject, and similar tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool: when a background lane wants to suggest a write without committing it, leaving ratification to a human or Art. It does not name the alternative tools for direct memory creation, but the contrast with ratified/canon memory is clear enough to guide tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_pruneA

Remove expired memories (TTL elapsed). Use dry_run to preview without deleting.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoPreview only — show what would be pruned without deleting (default: false)
stale_daysNoDays since last access to consider a memory stale (default: 30)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the tool is destructive (removes) and offers a safe preview via dry_run. With no annotations, the description carries the burden and does so adequately, though it could mention permanence or auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences that are front-loaded and to the point. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the core functionality and safe usage pattern. Lacks details on return values or post-deletion state, but given the simplicity of the tool and lack of output schema, it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters and the description adds value by explaining the purpose of dry_run (preview without deleting) and the meaning of stale_days (days since last access).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action (remove), the resource (expired memories), and the condition (TTL elapsed). The alternative dry_run mode is also mentioned, differentiating it from other tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides guidance on using dry_run for preview, but does not explicitly contrast with sibling tools like forget or knowledge_purge. However, the context is clear enough for typical use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_ratifyA

Ratify a pending proposal into a REAL memory. Loads the proposal, applies any optional overrides (your edits on accept), and commits it through the same validated write path as remember — so an invalid proposal is refused with its typed reason and stays pending. On success the memory becomes recallable and the proposal is removed from the queue. This is the gate: no proposal becomes canon without it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProposal id (from memory_proposals)
ttlNoOverride the proposed TTL on accept
titleNoOverride the proposed title on accept
contentNoOverride the proposed content on accept
projectNoOverride the proposed project on accept
categoryNoOverride the proposed category on accept

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden—and it delivers. It discloses side effects: the proposal is loaded, overrides applied, committed through the same validated path as remember, invalid proposals stay pending with a typed reason, and successful ratification removes the proposal from the queue and makes the memory recallable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose, then behavior, then significance. Every sentence contributes: the first says what it does, the second explains mechanics and failure handling, the third communicates its critical role.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given six parameters and no output schema or annotations, the description covers the essential workflow, success conditions, failure behavior, and side effects. It is slightly light on what the tool returns on success and on edge cases like a nonexistent id, but the core information needed to call it correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, with each parameter already described as an override or the proposal id. The description adds the helpful framing that the optional fields are 'your edits on accept,' but it does not add significant meaning beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Ratify a pending proposal into a REAL memory.' It also establishes the tool's unique role as 'the gate' between proposal and canonical memory, clearly distinguishing it from memory_propose, memory_proposals, and memory_reject.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly implies when to use it: when a pending proposal has been reviewed and should become a real memory. It does not explicitly list alternatives like memory_reject for refusals, but the workflow context is unmistakable and the 'gate' statement reinforces its place in the proposal lifecycle.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_rejectA

Discard a pending proposal without committing it. Deletes the staging row; no memory is written. Use this for drafts that should not become canon.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProposal id (from memory_proposals)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description takes full responsibility, disclosing that the tool deletes the staging row and does not write memory. This is sufficient for a simple rejection, though it could mention irreversibility or error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the key action, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description provides adequate context: purpose, usage, and behavioral effect. Slightly lacking in error examples but overall complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter 'id' is described in the schema as 'Proposal id (from memory_proposals)', and the description does not add further semantics beyond that. Given 100% schema coverage, baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'discard' and the specific resource 'pending proposal'. It distinguishes from siblings like memory_ratify by noting that no memory is written and the staging row is deleted.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this for drafts that should not become canon', providing clear context and differentiation from committing actions like memory_ratify.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_restoreA

Restore a previously archived memory to the active set. Clears the archive flag and tombstone note. The memory becomes visible to recall, list, audit, and find_similar again.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoMemory reference to restore
titleNoTitle of the archived memory to restore
categoryNoCategory (used with title)

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description fully carries the burden. Discloses clear behavioral traits: clears archive flag and tombstone note, restores visibility to multiple operations. Lacks details on permissions or error handling, but sufficient for simple mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste. Front-loaded with action and clear effects. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explains return effect adequately. Covers what happens when restored. Could mention what happens if memory is not archived or if ref is invalid, but overall complete for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, all parameters have descriptions. Description adds no additional meaning beyond schema. Does not explain which parameter combination is required (ref vs title+category) or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'Restore' and resource 'previously archived memory to active set'. Distinguishes from sibling tools like memory_archive (archive) and knowledge_restore (different resource). Provides specific actions: clears archive flag and tombstone, makes visible to recall/list/audit/find_similar.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implied usage: use for restoring previously archived memories. No explicit when/when-not or alternatives. Could mention that it only works on archived memories and that the opposite is memory_archive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recallA

Retrieve memories relevant to a query or topic. Returns matching memories from the persistent store. Use this when you need context from past sessions. Results are re-ranked for diversity (MMR, λ=0.7 by default) so near-duplicate memories on a well-covered topic don't crowd out different ones; the top result is always the most relevant. Pass diversity: 0 for pure relevance order.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return (default: 10)
queryYesWhat to search for — topic, keyword, or question
projectNoFilter to a specific project
categoryNoFilter to a specific memory category, or omit for all
diversityNoMMR diversity 0..1 (default 0.3 = 1−λ). 0 reproduces the plain relevance ranking; higher trades relevance for coverage of distinct memories.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses the MMR diversity reranking, the default lambda, that the top result remains the most relevant, and how to request pure relevance ordering. This is meaningful behavioral detail beyond a simple 'retrieve memories' statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by usage context and the key algorithmic nuance. Every sentence contributes information that helps an agent decide and invoke correctly, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the operation, the data source, when to use it, and the diversity behavior, while the schema fully documents all parameters. It does not explicitly describe the return format or contrast with siblings like knowledge_recall or find_similar, but this is not critical for a straightforward retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds extra semantic value specifically for the diversity parameter, explaining the MMR behavior and the effect of passing 0, which goes beyond the schema's formula. Other parameters are adequately covered by the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'Retrieve' clearly identifies this as a read operation, and the resource 'memories relevant to a query or topic' is specific. It is easy to distinguish from siblings like remember (write) or memory_list (listing) because the description focuses on query-based retrieval from past sessions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when you need context from past sessions,' giving a clear trigger condition. It does not name alternatives or provide explicit when-not-to-use guidance, but the usage context is strong enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rememberA

Store an episodic memory that persists across sessions. Use this when you learn something important about the user, a project, or yourself that should be available in future sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault
ttlNoTime-to-live: "7d", "30d", "24h", "permanent", or omit for no expiration.
titleYesShort title for the memory
contentYesThe memory content — what you learned, observed, or were told
projectNoAssociated project, if any (omit for global memories)
categoryYesMemory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread), episode (short-term cross-body tape: where you were / what was said or decided / what shipped / what is open — 48h TTL by default, set metadata.where to your surface e.g. "discord:#general", "voice", "wake:<id>", "lane:tending", "terminal")
metadataNoArbitrary key-value metadata

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavior disclosure burden. It explicitly discloses the key trait of cross-session persistence, which is valuable. However, it does not mention return behavior, expiration nuances, idempotency, or that some categories like 'episode' have a short default TTL that may not persist as the blanket statement implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler; the core action and persistence guarantee are front-loaded. Every clause earns its place and the where-to-use guidance immediately follows the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has moderate complexity with six parameters, a nested metadata object, an enum, and no output schema. The description is adequate for initial selection, but it does not explain how this tool relates to update, forget, recall, or memory_list, and it gives no hint about the returned value or created memory identifier.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameters are already well-documented in the schema itself, establishing a baseline of 3. The description adds some semantic context about 'important' information and future-session availability, but does not meaningfully enrich individual parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Store') and resource ('episodic memory' that persists across sessions), making it clear this is the create/write memory tool. It distinguishes itself from read-oriented siblings like recall and memory_list, though it does not explicitly name any sibling alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear trigger conditions: use when learning something important about the user, project, or self that should be available in future sessions. It gives good context for when to invoke the tool, but does not state when not to use it or contrast it with update, forget, or other memory mutation tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

updateA

Update an existing memory. Find by ref (returned from remember) or by category+title. Can replace content, update metadata, or both.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoMemory reference (category/filename) from remember
titleNoTitle of the memory to update (used with category)
contentNoNew content (replaces existing body)
categoryNoCategory to search in (used with title)
metadataNoMetadata fields to add or update

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must fully disclose behavior. It mentions updating content and metadata but does not specify side effects, authorization requirements, or whether the operation is idempotent. More detail would improve transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, each providing essential information without redundancy. It is concise and front-loaded, making it easy to read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema, and the description does not mention what the tool returns (e.g., success indicator, updated memory object). Given the complexity and number of parameters, the description could be more complete by indicating the return value.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, so the schema already explains parameters well. The description adds value by clarifying how to find the memory and what operations are possible (replace content, update metadata, or both), which is beyond the raw schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates an existing memory, specifies how to find it (by ref or category+title), and what can be updated (content, metadata, or both). This distinguishes it from siblings like 'remember' (create) and 'forget' (delete).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on how to identify the memory to update (by ref or category+title), which is helpful. However, it does not explicitly state when not to use this tool or compare with other update-like siblings such as 'knowledge_merge' or 'memory_ratify'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_identityA

Update your self-model or preferences with section-level precision. Targets H2 sections in identity files. Call without section/content to list available sections. IDENTITY.md (the creed) is immutable — only self-model and preferences can be edited.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileYesWhich identity file to update: "self-model" or "preferences"
modeNo"replace" updates an existing section (default), "append" adds a new section
contentNoNew content for the section (replaces everything under the H2 header)
sectionNoH2 section name to target. Omit to list all sections.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries burden. It discloses listing behavior when parameters omitted and immutability of IDENTITY.md. Lacks detail on destructive effects, auth requirements, or rate limits, but such might be implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, then targeting detail, then usage tip. Every sentence adds value with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 4 parameters, no output schema, and no annotations, the description covers purpose, usage, and parameter behavior. Immutability note adds completeness. Could mention response format, but not essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; description adds context: 'Call without section/content to list' and 'Targets H2 sections', which clarifies parameter usage beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it updates self-model or preferences with section-level precision, distinguishing it from siblings like the generic 'update' tool. The verb 'update' and resource 'identity files' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: call without section/content to list sections, and notes IDENTITY.md is immutable. Missing explicit when-not-to-use compared to alternatives, but context from sibling tools and description is sufficient.

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. Dates show when Glama detected each change.

  1. 8 tool updatesv0.5.0
    • Changedbootstrap3 fields changed
      • changedInput schema / properties / purpose / description
        Previous value: -"What this agent exists to do — its reason for being"New value: +"What this agent exists to do — its reason for being, one line"
      • addedInput schema / properties / user
        Added value: +{
        +  "description": "The human this agent works with — their name, not the agent's",
        +  "type": "string"
        +}
      • changedInput schema / properties / voice / description
        Previous value: -"Communication style and personality"New value: +"Communication style and personality, one line"
    • Addedepisodes
    • Changedharness_init1 field changed
      • addedInput schema / properties / target
        Added value: +{
        +  "description": "Path to the dotfile to inject the managed loom block into (e.g. an absolute path to CLAUDE.md / AGENTS.md / GEMINI.md). When omitted only the harness manifest is scaffolded.",
        +  "type": "string"
        +}
    • Changedknowledge_write11 fields changed
      • changedInput schema / properties / body / description
        Previous value: -"Synthesized markdown body for the entity page (max 64 KB)"New value: +"Synthesized markdown body for the entity or artifact page (max 64 KB)"
      • changedInput schema / properties / citations / description
        Previous value: -"Support citations. At least one required. All-conversation support → page stored provisional."New value: +"Support citations. At least one required. All-conversation → provisional. Any repo → internal (ours/). Any web → sourced."
      • changedInput schema / properties / citations / items / properties / excerpt / description
        Previous value: -"Inline supporting quote — link-rot insurance (max 4 KB)"New value: +"Inline supporting quote or repo excerpt — link-rot insurance (max 4 KB)"
      • changedInput schema / properties / citations / items / properties / source_kind / description
        Previous value: -"web = external URL; loom_memory = opaque memory ref; conversation = session distillation"New value: +"web = external URL; loom_memory = opaque memory ref; conversation = session distillation; repo = git repo path / commit / live-system probe (ours/ class)"
      • changedInput schema / properties / citations / items / properties / source_kind / enum
        Previous value: -[
        -  "web",
        -  "loom_memory",
        -  "conversation"
        -]New value: +[
        +  "web",
        +  "loom_memory",
        +  "conversation",
        +  "repo"
        +]
      • changedInput schema / properties / citations / items / properties / source_locator / description
        Previous value: -"URL, memory ref, or session ID"New value: +"URL, memory ref, session ID, or repo path + commit hash"
      • addedInput schema / properties / created_by
        Added value: +{
        +  "description": "ours/ class: who created or last owned this artifact (e.g. \"art\", \"jonathan\"). Preserved across upserts when omitted.",
        +  "type": "string"
        +}
      • changedInput schema / properties / domain / description
        Previous value: -"Domain tag, e.g. \"music/eurorack\", \"programming/typescript\". Hierarchical string; sub-domains queryable via prefix filter."New value: +"Domain tag. World class: \"music/eurorack\", \"programming/typescript\". Ours class: prefix with \"ours/\" — e.g. \"ours/art-ops\", \"ours/breakbrain\", \"ours/homelab\". Hierarchical string; sub-domains queryable via prefix filter."
      • changedInput schema / properties / freshness_anchor / description
        Previous value: -"The version/date the page's claims are valid as-of — e.g. \"Syntakt OS 1.21\" for a device, or \"as of 2026-05\" for a topic. Drives the verification engine: a page is re-verified when this anchor moves or the freshness SLA elapses."New value: +"The version/date the page's claims are valid as-of — e.g. \"Syntakt OS 1.21\" for a device, \"as of 2026-05\" for a topic, or \"t-81 / 2026-08-31\" for an ours/ artifact. Drives the verification engine: a page is re-verified when this anchor moves or the freshness SLA elapses."
      • changedInput schema / properties / title / description
        Previous value: -"Page title — the entity name (e.g. \"Mutable Instruments Rings\")"New value: +"Page title — the entity name (e.g. \"Mutable Instruments Rings\") or artifact name (e.g. \"breakbrain density model\")"
      • addedInput schema / properties / version
        Added value: +{
        +  "description": "ours/ class: artifact version or revision tag (e.g. \"v2\", \"2026-08-31\", \"t-81\"). Preserved across upserts when omitted.",
        +  "type": "string"
        +}
    • Changedmemory_propose2 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread)"New value: +"Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread), episode (short-term cross-body tape: where you were / what was said or decided / what shipped / what is open — 48h TTL by default, set metadata.where to your surface e.g. \"discord:#general\", \"voice\", \"wake:<id>\", \"lane:tending\", \"terminal\")"
      • changedInput schema / properties / category / enum
        Previous value: -[
        -  "user",
        -  "project",
        -  "self",
        -  "feedback",
        -  "reference",
        -  "pursuit"
        -]New value: +[
        +  "user",
        +  "project",
        +  "self",
        +  "feedback",
        +  "reference",
        +  "pursuit",
        +  "episode"
        +]
    • Changedmemory_ratify1 field changed
      • changedInput schema / properties / category / enum
        Previous value: -[
        -  "user",
        -  "project",
        -  "self",
        -  "feedback",
        -  "reference",
        -  "pursuit"
        -]New value: +[
        +  "user",
        +  "project",
        +  "self",
        +  "feedback",
        +  "reference",
        +  "pursuit",
        +  "episode"
        +]
    • Changedrecall1 field changed
      • addedInput schema / properties / diversity
        Added value: +{
        +  "description": "MMR diversity 0..1 (default 0.3 = 1−λ). 0 reproduces the plain relevance ranking; higher trades relevance for coverage of distinct memories.",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Changedremember2 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread)"New value: +"Memory category: user (about the human), project (about work), self (capability/learning), feedback (corrections/confirmations), reference (external pointers), pursuit (active goal or ongoing creative thread), episode (short-term cross-body tape: where you were / what was said or decided / what shipped / what is open — 48h TTL by default, set metadata.where to your surface e.g. \"discord:#general\", \"voice\", \"wake:<id>\", \"lane:tending\", \"terminal\")"
      • changedInput schema / properties / category / enum
        Previous value: -[
        -  "user",
        -  "project",
        -  "self",
        -  "feedback",
        -  "reference",
        -  "pursuit"
        -]New value: +[
        +  "user",
        +  "project",
        +  "self",
        +  "feedback",
        +  "reference",
        +  "pursuit",
        +  "episode"
        +]
  2. 31 tool updatesv0.4.1
    • First observedbootstrap
    • First observeddossier
    • First observedfind_similar
    • First observedforget
    • First observedharness_describe
    • First observedharness_init
    • First observedidentity
    • First observedknowledge_archive
    • First observedknowledge_history
    • First observedknowledge_maintain
    • First observedknowledge_merge
    • First observedknowledge_move
    • First observedknowledge_purge
    • First observedknowledge_recall
    • First observedknowledge_restore
    • First observedknowledge_supersede
    • First observedknowledge_verify
    • First observedknowledge_write
    • First observedmemory_archive
    • First observedmemory_audit
    • First observedmemory_list
    • First observedmemory_proposals
    • First observedmemory_propose
    • First observedmemory_prune
    • First observedmemory_ratify
    • First observedmemory_reject
    • First observedmemory_restore
    • First observedrecall
    • First observedremember
    • First observedupdate
    • First observedupdate_identity

TDQS

A4/5.0
Disambiguation4/5

Most tools separate cleanly by store (memory vs knowledge) and lifecycle stage (propose/ratify/archive/restore). The nearest overlaps are memory recall vs find_similar, knowledge_merge vs knowledge_supersede, and harness_init vs harness_describe, but their descriptions define distinct workflows. Overall an agent can usually tell them apart.

Naming Consistency4/5

The server is strongly prefixed per subsystem (memory_, knowledge_, harness_) and uses consistent verb forms within each family. Deviations such as bare `update` alongside `update_identity`, noun-style `identity`/`dossier`, and `episodes`/`find_similar` are minor and readable. The convention is consistent enough to predict tool behavior.

Tool Count2/5

32 tools is well above the 25+ threshold and will tax an agent's selection even though every tool has a real purpose. The four subsystems (identity, memory, knowledge, harness) justify much of the count, but it still feels heavy for a single MCP surface. Consolidating rarely used maintenance operations would help.

Completeness5/5

The memory subsystem has full lifecycle coverage—create, read, update, delete, archive, restore, audit, prune—plus a proposal/ratification workflow. The knowledge store similarly covers write, recall, move, merge, supersede, purge, verify, and history. Harness and identity are thinner but sufficient for their roles, so no major dead ends exist.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sleepunit-agents/loom'

If you have feedback or need assistance with the MCP directory API, please join our Discord server