Skip to main content
Glama

Thoth-Mem

AIコーディングエージェント向けの永続メモリ

npm version Node.js License: MIT

セッション、コンパクション、コンテキストリセットをまたいで、コーディングエージェントに永続的なプロジェクトメモリを提供します。

Thoth-Mem は、SQLite と FTS5 をバックエンドとするローカルファーストのMCPサーバーです。有用な決定、バグ修正、規約、セッションの継続性を保持し、エージェントが必要とするエビデンスだけを取得します。同じインストールには、CLI、オプションのHTTP API、対応コーディングハーネスのネイティブライフサイクル統合も含まれます。

グローバルスコープは現在のユーザーのハーネス設定を管理します。プロジェクトスコープは明示的であり、選択したプロジェクトとそのレシートツリーに限定されます。Engram、thoth-agents、または別のメモリ統合と重複する可能性があります。これは警告としてのみ扱ってください: thoth-mem は外部リポジトリを編集、無効化、削除、または書き込みすることはありません。

クイックスタート

Node.js 18以降が必要です。ネイティブセットアップは任意です: 手動のMCP接続には mcp コマンドだけが必要です。

公開済みパッケージを実行する

グローバルコマンドをインストールせずに、最新の公開済みMCPサーバーを起動します:

npx -y thoth-mem@latest mcp

これによりMCPサーバーとそのローカルHTTPブリッジが起動します。MCPトランスポートのみが必要な場合は --no-http を追加してください。新しいクライアント設定では明示的な mcp サブコマンドを使用してください。

ネイティブ統合はセットアップ後に永続的な thoth-mem コマンドを呼び出すため、ハーネスを設定する前にそのコマンドをグローバルにインストールまたは更新してください。最新の公開済みパッケージからセットアップ実装を npx で実行し、そのゼロ書き込みプランを確認してから適用します:

npx -y thoth-mem@latest setup codex --scope global --plan --json
npx -y thoth-mem@latest setup codex --scope global --json

別のサポート対象ハーネスでは、codex を opencode または claude に置き換えてから、そのハーネスを再起動します。setup を実行するだけでは npm パッケージはインストールまたは更新されません。

このリポジトリをインストールする

まだ公開されていないコミットをテストするには、リポジトリのフローを使用します:

pnpm install
pnpm run build
pnpm add -g .
thoth-mem version
thoth-mem setup codex --scope global --plan --json
thoth-mem setup codex --scope global --json

thoth-mem@latest には最新の公開リリースのみが含まれます。新しい未公開コミットを取得したら、再ビルドして pnpm add -g . を再実行してください。

既存のインストールを更新する

まずパッケージを更新します。ネイティブ統合がインストールされている場合は、そのセットアップを再実行して、コピーされたアセット、スキル、フック、管理対象の宣言が新しいパッケージバージョンに収束するようにします:

pnpm add -g thoth-mem@latest
npx -y thoth-mem@latest setup codex --scope global --plan --json
npx -y thoth-mem@latest setup codex --scope global --json

次に、ハーネスまたはMCPプロセスを再起動します。手動MCPユーザーは setup を必要としません。npx -y thoth-mem@latest mcp を再起動するだけで十分です。

セットアップはメモリデータベースとユーザー所有の設定を保持します。起動時に、欠落している設定フィールドがバックフィルされる場合がありますが、LM Studio モデルなどの明示的な値は選択されたままです。設定形式は "version": 1 のままです。公開インストールの場合は、現在のエディタでの検証とオートコンプリートのために、古い $schema URL をそのリリースバージョンに手動で更新してください。未公開のチェックアウトでは、リリース前に unpkg が変更を公開できないため、一致する検証にはこのリポジトリの config.schema.json を使用する必要があります。スキーマURLはランタイムの移行を制御しません。

埋め込みモデルの変更は、セットアップ操作ではなく設定操作です。必要に応じて embedding.provider、model、baseUrl、ネイティブの dimensions を編集してください。profile: "auto" はサポートされているモデルファミリーを解決します。thoth-mem を再起動し、変更された埋め込み系統にべき等なセマンティックインデックスの再構築をエンキューさせます。

Related MCP server: LumenCore

メモリループ

有用なエージェントワークフローは小さくて繰り返し可能です:

  1. 永続すべき教訓を保存する。 現在のコンテキストを超えて残すべき決定、根本原因、規約、その他の明白でない事実には mem_save を使用します。

  2. 狭く想起する。 mem_recall(mode="compact") から始め、有力な候補を mode="context" で展開し、完全な選択レコードを mem_get で取得します。

  3. IDをもって再開する。 同じ安定した session_id と project を維持します。最近の継続性には mem_context、ルート所有のライフサイクルイベントには mem_session を使用します。

観察の例:

{
  "kind": "observation",
  "title": "Retry SQLite writes in a new transaction",
  "type": "bugfix",
  "project": "my-project",
  "topic_key": "sqlite/busy-retry",
  "content": "**What**: Roll back after SQLITE_BUSY and retry in a new transaction.\n**Why**: Retrying inside the failed transaction repeats the failure.\n**Where**: write transaction helper.\n**Learned**: Use bounded backoff before opening the new transaction."
}

永続化の前に <private>...</private> 内のコンテンツを削除します。再利用可能な教訓なしに、資格情報、完全なトランスクリプト、ユーザーの意図としての生成エージェントプロンプト、または生のログを保存しないでください。

6つのMCPツール

ツール

使用目的

mem_save

観察、実際のユーザープロンプト、ルート所有のサマリー、またはパッシブラーニングを永続化します。

mem_recall

境界付きの融合リコールを実行します。コンテキストを広げる前に、まずコンパクトな結果を使用します。

mem_context

最近のセッション、プロンプト、観察、およびオプションの想起された継続性を読み取ります。

mem_get

IDによって1つの観察またはプロンプトを、境界付きページネーションまたはタイムラインコンテキスト付きで取得します。

mem_project

プロジェクト、トピック、グラフビュー、運用上の健全性をナビゲートします。

mem_session

ルート所有のメモリセッションを開始、チェックポイント、または要約します。

セットアップ、同期、移行、再構築、およびメンテナンスコマンドはCLI/HTTP管理であり、追加のMCPツールではありません。

グラフコミュニティを検査する

コミュニティは、プロジェクトの知識グラフから導出された境界付きサマリーです。オペレーターはCLIを通じてコミットされたサマリーを作成または更新します:

thoth-mem rebuild-communities --project my-project

エージェントはその後、mem_project を通じてそれらを取得します:

{
  "action": "graph",
  "project": "my-project",
  "navigation": "community",
  "limit": 5,
  "max_chars": 2000
}

レスポンスはコミュニティの状態と鮮度を報告し、その後 community=<id>、グラフカバレッジ、信頼度、劣化状態、境界付きサマリー、sources=obs:<id> などのエントリを報告します。コミュニティ検査にはプロジェクトが必要ですが、フォーカスノードや観察IDは不要です。コミットされたサマリーが存在しない場合は、グローバルな回答を合成する代わりに、その旨が示されます。

コミュニティの背後にある証拠を調べるには、その sources フィールドから obs:<id> を取得し、mem_get(kind="observation", id=<id>) を呼び出します。観察IDはリコール結果にも表示されます。境界付きのグラフ近傍については、いずれかを focus_node_id="obs:<id>" として navigation="neighborhood" とともに再利用します。

ネイティブハーネス統合

ネイティブセットアップは、ハーネスがサポートする場所に、パッケージ化されたMCP宣言、メモリスキル、ライフサイクルフックをインストールします。まずゼロ書き込みプランを確認してから、--plan なしで再実行して適用します:

ハーネス

プラン

適用

OpenCode

thoth-mem setup opencode --scope global --plan --json

thoth-mem setup opencode --scope global --json

Codex

thoth-mem setup codex --scope global --plan --json

thoth-mem setup codex --scope global --json

Claude Code

thoth-mem setup claude --scope global --plan --json

thoth-mem setup claude --scope global --json

デフォルトのOpenCodeセットアップコマンドは thoth-mem setup opencode です。プロジェクトを明示的にターゲットにする場合は thoth-mem setup opencode --scope project --project /path/to/project --force を追加し、レシートスコープのロールバックには thoth-mem setup codex --rollback /path/to/receipt.json を使用します。

セットアップのステータスとプロセス終了コードは安定しています:

ステータス

終了コード

complete

0

failed

1

partial

2

requires_user_action

3

プロジェクトローカルのセットアップは明示的です:

thoth-mem setup opencode --scope project --project /path/to/project --plan --json

適用する前に、検出された競合を確認してください。--force は、thoth-memの所有権がすでに証明されている競合する場所にのみ使用します。Codex 0.144.x、0.146.x、0.147.x はテスト済み互換性セットに含まれており、--force は必要ありません。他のCodexバージョンの場合、選択したスコープが完全で独立に検証可能なプラグインマネージャー機能をまだ公開している場合に限り、--force はテスト済みバージョンゲートのみをオーバーライドできます。セットアップはそのオーバーライドを使用するときに警告を発します。状態検証、所有権、封じ込め、調整、クリーンアップの保護をバイパスせず、無関係な設定に対する権限も付与しません。

Claude Code はネイティブマーケットプレイスのフローもサポートしています:

claude plugin marketplace add EremesNG/thoth-mem
claude plugin install thoth-mem

ネイティブ統合は任意です。既存のメモリと6つのツールからなるMCPサーバーは、手動接続でも引き続き動作します。

手動MCPフォールバック

ネイティブフックは任意です。管理されたセットアップやネイティブプラグインを必要としない場合は、プレーンな6ツールMCP接続を維持してください。既存のメモリは引き続き利用可能です。

ネイティブハーネス統合への移行

ネイティブセットアップはオプトインです。ゼロ書き込みプランを確認し、競合を確認してから、一致するハーネスコマンドを適用します。Codexの場合は、/plugins を開き、EremesNG/thoth-mem から thoth-mem をインストールし、マーケットプレイスとプラグインの状態を確認します。外部のCodex登録はアトミックに元に戻せないため、ローカルセットアップを再試行またはロールバックする前に外部状態を確認してください。

管理セットアップの契約: プランモードはゼロ書き込みを実行し、thoth-mem管理の場所でのみ変更を行います。最初の変更の前にバックアップが作成されます。OpenCode は opencode.json または opencode.jsonc を受け入れます。各変更試行は、変更の前にステータス in_progress のHMACで保護されたレシートを書き込みます:

  • グローバルレシート: <thoth-data-dir>/setup/receipts/<receipt-id>/receipt.json

  • プロジェクトレシート: <project>/.thoth/setup/receipts/<receipt-id>/receipt.json

欠落している、または改ざんされたレシートはフェイルクローズします。検証済みのロールバックは無関係な設定を保持しますが、ドリフトまたは利用できない機能がある場合は requires_user_action を返します。検証済みの状態がすでに一致している場合、セットアップの繰り返しと完了済みロールバックの繰り返しはノーオペレーションです。

Gemini CLI: 手動MCP

Gemini CLI は手動のMCPクライアントパスであり、管理されたネイティブ thoth-mem 統合ではありません。このエントリを ~/.gemini/settings.json に追加してください:

{
  "mcpServers": {
    "thoth": {
      "command": "npx",
      "args": ["-y", "thoth-mem@latest", "mcp"]
    }
  }
}

検索とグラフ品質の評価

リポジトリには決定的な評価コマンドが含まれています:

pnpm run eval:retrieval
pnpm run eval:kg
pnpm run eval:embedding-models -- --help

eval:retrieval はシグナル観察とディストラクタをシードし、期待されるメモリが上位にランクインするかどうかを測定します。そのレポートをシグナルの集合として読んでください:

  • 再現率と順位 は、正しいエビデンスが見つかったかどうか、およびどの程度早く見つかったかを示します。

  • ノイズとケースミックス は、直接、言い換え、リポジトリ由来の例にわたる堅牢性を示します。

  • 圧縮 は、コンテキスト配信前にどれだけのエビデンスが削除されたかを示します。これは効率性のシグナルであり、残りのテキストが正しいという証明ではありません。

  • レーンとフォールバックエビデンス は、語彙的、セマンティック raw/HyDE、およびKGの参加を示し、保留中または劣化したセマンティック動作を含みます。

  • 系統と出所 は、返されたエビデンスがそのソースに帰属可能なままであるかどうかを示します。

eval:kg は、期待される主語-関係-目的語の再現率、禁止トリプルの漏えい、決定的な抽出動作、検証済みのオプションLLMエンリッチメントを測定します。期待される事実が欠落している場合はカバレッジのギャップを示し、禁止されたヒットは安全でないグラフの創作を示します。

これらの評価は、キュレーションおよび合成フィクスチャに対する決定的な開発ゲートです。すべての本番コーパスを予測したり、人間のレビューを置き換えたり、ネイティブハーネス統合を証明したり、それだけでオプションのコミュニティ読み取りパスを有効にすることを正当化したりするものではありません。単一の集計数値を普遍的な品質として扱うのではなく、個々のケースと失敗メッセージを比較してください。

埋め込みプロファイルとモデル比較

セマンティック埋め込み入力は、バージョン管理されたモデルプロファイルによってフォーマットされます。auto は Nomic、EmbeddingGemma、Qwen3-Embedding のモデルファミリーエイリアスを認識します。不明なモデルは raw を使用し、推論された非対称フォーマットは適用されません。公開設定には意図的にグローバルな task フィールドがありません。検索意図とクエリ/ドキュメントの役割は、ドキュメント役割のHyDE回答を含む各入力に対して内部的に割り当てられます。

{
  "embedding": {
    "provider": "lmstudio",
    "model": "text-embedding-embeddinggemma-300m",
    "baseUrl": "http://127.0.0.1:1234",
    "dimensions": 768,
    "profile": "auto",
    "normalize": true
  }
}

サポートされているプロファイル値は、auto、nomic、embeddinggemma、qwen3、raw です。THOTH_EMBEDDING_PROFILE と THOTH_EMBEDDING_NORMALIZE は、永続化された値を上書きします。解決されたプロファイルのバージョンと正規化フラグは、セマンティックインデックスのリネージの一部です。そのため、これらを変更すると、以前のベクトルが古いものとしてマークされ、既存の冪等な再構築キューが使用されます。

ローカルの Transformers.js 推論では、特定の ONNX 実行デバイスを選択できます:

{
  "embedding": {
    "provider": "transformers_local",
    "model": "onnx-community/embeddinggemma-300m-ONNX",
    "device": "dml",
    "dimensions": 768,
    "profile": "auto",
    "normalize": true
  }
}

サポートされているデバイス値は、auto、cpu、dml、cuda、coreml です。デフォルトは cpu です。THOTH_EMBEDDING_DEVICE は、永続化された embedding.device 値を上書きします。Transformers.js が使用するプリビルドの Node ONNX Runtime では、dml は Windows 上の DirectML をターゲットにし、cuda はサポートされている Linux x64 CUDA インストールをターゲットにし、coreml は macOS をターゲットにします。明示的に利用できないデバイスを指定すると、黙って CPU に切り替わる代わりに、モデルの初期化が失敗します。auto は、プラットフォーム固有のプロバイダーの順序付けとフォールバックを Transformers.js に委任するため、実効バックエンドはホストや依存関係のバージョンによって変わる可能性があります。

デバイス選択は transformers_local にのみ影響します。リモートの Ollama および LM Studio リクエストでは無視されます。GPU バックエンドはコールドスタートが大幅に遅くなる可能性があるため、永続的な MCP プロセスやより大きな埋め込みバッチに最も役立ちます。デバイスは意図的にセマンティックインデックスのリネージから除外されています。embedding.device のみを変更しても、既存のベクトルが古いものとしてマークされたり、再構築がキューに入ったりすることはありません。

プロバイダーモデルの例:

プロファイル

LM Studio モデル ID

Transformers.js モデル ID

ネイティブ次元数

Nomic

/v1/models から正確な ID を使用します。例: text-embedding-nomic-embed-text-v1.5@q8_0

nomic-ai/nomic-embed-text-v1.5

768

EmbeddingGemma

検証済み GGUF インストールには text-embedding-embeddinggemma-300m を使用します

onnx-community/embeddinggemma-300m-ONNX

768

Qwen3-Embedding-0.6B

検証済み GGUF インストールには text-embedding-qwen3-embedding-0.6b を使用します

onnx-community/Qwen3-Embedding-0.6B-ONNX

1024

EmbeddingGemma のローカル実行は sentence_embedding を消費します。Qwen のローカル実行は、検索命令をクエリにのみ適用し、プーリングには最後にアテンションされた隠れ状態トークンを使用します。すべてのプロバイダーは、不完全、非有限、ゼロ、または次元が一貫しないバッチを拒否します。LM Studio のレスポンスインデックスは検証され、有効な順序不同の行は入力順に復元されます。欠落、重複、または無効なインデックスは拒否されます。リコール中、これらのエラーはセマンティック検索を明示的に劣化させますが、語彙検索と KG 検索は継続されます。

3つのモデルの品質ゲートを、明示的なモデル ID と永続的な出力パスで実行します:

pnpm run eval:embedding-models -- --provider lmstudio --base-url http://127.0.0.1:1234 --nomic-model <nomic-id> --embeddinggemma-model <gemma-id> --qwen3-model <qwen-id> --output <result.json>

このゲートでは、3つの実行すべてが完了し、少なくとも1つの候補が、Nomic のどのメトリクスも後退させることなく、Recall@1/Recall@5/MRR のしきい値を満たすことが必要です。Nomic は相対比較の基準であり、絶対しきい値の対象となる候補ではありません。両方の候補が資格を満たした場合、明示的な品質スコアと安定したタイブレーク順序によって勝者が選択されます。モデルが見つからない場合、ベクトルが無効な場合、資格のある候補がいない場合、またはレポートの書き込みに失敗した場合は、非ゼロで終了し、現在のデフォルトが維持されます。

記録された 2026-08-08 の LM Studio 実行では、出荷時のローカルデフォルトとして EmbeddingGemma が選択されました。EmbeddingGemma と Qwen3 はどちらも Recall@1 1.00、Recall@5 1.00、MRR 1.00 で完了しました。一方、Nomic は 0.50、1.00、0.7167 でした。両方の候補が資格を満たし、EmbeddingGemma は、両者が完全に同点だった品質スコアにおいて、安定した語彙プロファイル ID ルールによって勝利しました。永続化された決定実行における中央値レイテンシは、Nomic が 190.5 ms、EmbeddingGemma が 195 ms、Qwen3 が 320.5 ms でした。

Qwen3 のファイルサイズは、ランタイムアーティファクトによって異なります:

Qwen3 アーティファクト

量子化

バイト

MiB

オリジナルの Transformers model.safetensors

BF16

1,191,586,416

1,136.39

Transformers.js onnx/model_quantized.onnx

Q8

613,527,631

585.11

LM Studio Qwen3-Embedding-0.6B-Q8_0.gguf

Q8_0

639,150,592

609.54

Qwen3 Q8 モデルは、Transformers.js では EmbeddingGemma Q8 より 304,069,133 バイト大きく、LM Studio では 305,559,648 バイト大きくなります。また、EmbeddingGemma の 768 次元ではなく、ネイティブの 1024 次元ベクトルを使用します。ランナーは、オペレーターに代わってプロバイダーモデルをインストールしたり検出したりしません。

より厳しいローカル実行を行いたい場合は、検索ノイズをスケーリングします:

$env:THOTH_RETRIEVAL_EVAL_NOISE='250'
pnpm run eval:retrieval

高度な操作

  • 完全な CLI コマンドとオプションの一覧については、thoth-mem help を実行してください。

  • http://localhost:7438/ でローカルダッシュボードを開き、http://localhost:7438/docs で OpenAPI ドキュメントを開いてください。

  • Git に適した移植性のために、thoth-mem sync --dir=.thoth-sync と thoth-mem sync-import --dir=.thoth-sync を使用してください。

  • repair-sync-journal (--project <name> | --all) --apply は、修復バッチを内部的にプレビューしてバインドします。外部ワークフローがすでにプレビューバインディングを持っている場合、オプションの --expected-fingerprint は引き続き利用可能です。

  • prune-operation-traces (--project <name> | --all) --apply も同様に、1つの保持バッチを内部的にバインドします。--until-complete を追加すると、最初に制限されたバックログを、1つの固定された有効時点とその後の新しいフィンガープリントで処理します。外部から提供されるバインディングには、--expected-fingerprint と --effective-now の両方を含める必要があります。

  • compact-database [--data-dir <path>] は、読み取り専用のプレビューを実行します。回収可能なスペースと容量の見積もりを確認した後にのみ、--apply を追加してください。適用には、物理データベースサイズと論理データベースサイズの大きい方の2倍が必要になる場合があり、他の SQLite クライアントによってブロックされる可能性があり、整合性、外部キー、スキーマ、永続カウント、WAL チェックの後にのみ成功を報告します。SQLite 管理のチェックポイントと VACUUM を使用します。コミットされた圧縮後のロールバックは保証しません。

  • 圧縮が自動で行われることはありません。ライブデータに対して実行するには、別途オペレーターの承認が必要です。リポジトリのテストでは、使い捨てデータベースのみを使用します。

  • 永続化された構成と環境変数による設定については、config.schema.json を確認してください。

  • データはデフォルトで ~/.thoth/thoth.db に保存されます。データディレクトリは THOTH_DATA_DIR または --data-dir で上書きできます。

セマンティックインデックス作成は非ブロッキングです。埋め込みまたは sqlite-vec が利用できない場合でも、リコールはサポートされている語彙およびグラフのエビデンスを通じて引き続き利用可能であり、黙ってセマンティックの成功を主張するのではなく、劣化したレーンを報告します。

開発

pnpm install
pnpm run integration:verify
pnpm run build
pnpm test

ライセンス

MIT

Available Tools

6 tools
mem_contextC

Build bounded handoff-first continuity. project_key required; root_session_key and harness together for session context, neither for project context.

NameRequiredDescriptionDefault
harnessNoVerified native harness.
project_keyYesVerified project_key, copied verbatim; never derived.
budget_charsNo
correlation_idNo
finalize_answerNo
root_session_keyNoVerified root session key.

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description bears the full burden. It implies a build/continuity operation but does not state whether it writes data, what side effects or permissions exist, whether it is idempotent, or what the result contains.

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 two compact sentences with no filler, and the required-parameter guidance is front-loaded. The only weakness is that the opening sentence is so terse and jargon-heavy that it obscures meaning.

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

Completeness2/5

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

For a six-parameter tool with no annotations and no output schema, the description is too thin. It explains the session/project context split but omits behavioral details, output expectations, and several parameter meanings.

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 description adds important conditional semantics for project_key, root_session_key, and harness, including the session-vs-project mode distinction. However, with only 50% schema description coverage, it leaves budget_chars, correlation_id, and finalize_answer unexplained.

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

Purpose3/5

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

The description says it builds 'bounded handoff-first continuity,' which gestures at context creation but is vague jargon rather than a clear verb+resource statement. It also does not distinguish this tool from siblings such as mem_recall, mem_session, or mem_project.

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?

It specifies project_key is required and explains that root_session_key plus harness together select session context while neither selects project context. That is useful conditional guidance, but it gives no explicit when-to-use-this-tool-vs-alternatives guidance or exclusions relative to sibling tools.

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

mem_getB

Expand one selected record from a prior tool result.

NameRequiredDescriptionDefault
idYesMemory, summary, observation, or evidence id.
historyNoInclude predecessors; evidence has none.
correlation_idNo

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not state that this is a read-only retrieval, does not explain what expansion returns, does not mention the optional history behavior, and gives no permission or side-effect context. The word 'expand' hints at non-destructive retrieval but that is the only signal.

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?

A single focused sentence with no wasted words, front-loading the core action. It is perhaps too terse for the gaps it leaves, but structurally it is efficient and readable.

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

Completeness2/5

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

With no annotations and no output schema, the description is the only source of behavioral context, and it says nothing about return shape, history semantics, or the undocumented correlation_id. For a retrieval tool that may return variable content, this leaves the agent without enough to call it confidently.

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 67%: the schema documents 'id' and 'history' with useful detail, while 'correlation_id' is undocumented. The description's only contribution is that 'id' refers to a record from a prior tool result, which adds marginal context beyond the schema. Baseline 3 fits given the partial coverage.

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 verb 'expand' plus the object 'one selected record from a prior tool result' makes the purpose reasonably clear: fetch the full detail of a single record referenced by a previous result. It does not differentiate itself from the sibling mem_recall, so an agent cannot tell from the text alone which retrieval tool to pick.

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 phrase 'from a prior tool result' implies the context of use — after another tool has returned a record stub — which gives some usage guidance. However, it never states when to use this vs. mem_recall or mem_context, and offers no exclusions or prerequisites.

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

mem_projectC

Read-only project views. list: no fields required; returns at most 256 exact aliases/project with aliasCount/aliasesTruncated. timeline: project_key required; accepts only since, until, cursor, limit, budget_chars. briefing/summaries/observations: project_key required; optional session filter selects summaries/observations, not briefing's project-wide memories. history: id required from a prior result.

NameRequiredDescriptionDefault
idNo
limitNoTimeline/observations: 1-100 items.
sinceNoInclusive lower ISO-8601 instant; <= until.
stateNo
untilNoInclusive upper ISO-8601 instant.
actionYes
cursorNoUnchanged nextCursor; preserve project_key, since, until.
harnessNo
temporalNoSummaries/observations: current=latest summaries/correction leaves; history=predecessors.
project_keyNoVerified project_key, copied verbatim; never derived.
budget_charsNoAggregate chars; timeline: positive integer clamped to 1024-20000.
root_session_keyNoSession filter; pair with harness.

TDQS

C2.8/5.0
Behavior3/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. It does disclose read-only behavior and several useful constraints: list returns at most 256 aliases with aliasCount/aliasesTruncated, timeline accepts only a specific set of filters, and a session filter affects summaries/observations but not briefing. However, permissions, return shapes for most actions, and error behavior are not 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 short and front-loads the read-only nature. It is dense and semicolon-delimited, making it harder to scan than a bulleted structure, but every clause conveys actionable information with little waste.

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

Completeness2/5

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

The tool has six actions and twelve parameters with no output schema, yet the description explains return values only for list. It does not explain when to use briefing versus summaries or observations, what those actions return, or how temporal/state/harness parameters affect behavior. Significant gaps remain for an agent to invoke the tool correctly across all actions.

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 67%, so the schema already documents many parameters. The description adds action-specific constraints not obvious from the schema: timeline accepts only since/until/cursor/limit/budget_chars, list requires no fields and returns a capped alias set, history id must come from a prior result, and the session filter behavior varies by action. It leaves state, harness, temporal, and root_session_key semantics largely unaddressed beyond the schema.

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

Purpose3/5

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

Starts with 'Read-only project views,' which is a vague resource description, then lists action names and parameter requirements. The action list gives some clarity about what the tool can do, but the overall purpose ('project views') is not concretely defined and the tool is not distinguished from siblings like mem_context or mem_recall.

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

Usage Guidelines2/5

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

Provides per-action parameter requirements (e.g., timeline requires project_key and accepts only certain filters), but gives no guidance on when to use this tool versus alternatives or which action to choose for a given intent. There are no exclusions or alternative-tool references.

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

mem_recallB

Call at the start of non-trivial repository work before exploring, with task key terms, unprompted. Search promoted project memory before expanding selected records.

NameRequiredDescriptionDefault
modeNocompact (default): snippets; context: selected content.
limitNo
queryYesNon-empty task search terms.
temporalNocurrent (default) or historical guidance.
project_keyYesVerified project_key, copied verbatim; never derived.
budget_charsNo
correlation_idNo
finalize_answerNo

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose a two-stage retrieval workflow (search snippets, then expand selected records) and that results are pre-promoted memory. However, it says nothing about what finalize_answer, correlation_id, or budget_chars do, what the response looks like, or whether the operation has any side effects. Useful workflow context, but not enough for an 8-parameter tool without annotations.

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 short sentences with the imperative and timing front-loaded; nothing is filler. The phrase 'with task key terms, unprompted' is slightly awkward but still parses as useful guidance.

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

Completeness2/5

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

For a tool with 8 parameters, no annotations, and no output schema, the description covers purpose and timing but omits the semantics of most parameters and the shape of results. An agent would need to open the schema and still lack clarity on finalize_answer and correlation_id.

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

Parameters2/5

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

At 50% schema coverage, the description must compensate, and it only hints at 'query' ('with task key terms') and implicitly at mode via 'expanding selected records'. The remaining parameters (project_key, limit, temporal, budget_chars, correlation_id, finalize_answer) get no explanation in the description beyond the schema's own text.

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 names a specific action (search promoted project memory) and adds scope ('promoted', 'project memory') that is more than a restatement of the tool name. It doesn't explicitly contrast with siblings like mem_context or mem_get, leaving the agent to infer the boundary.

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 gives a clear trigger ('at the start of non-trivial repository work, before exploring') and says to call it unprompted, plus a follow-up step ('before expanding selected records'). It stops short of naming which sibling to use instead when the task isn't repository work.

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

mem_saveA

Save unprompted as soon as decisions, root causes, failed approaches, or non-obvious conventions are verified. Save durable discoveries and continuation handoffs. Direct promoted memory (not handoff): memory.content uses labeled Result, Rationale, Scope, Caveat / safe action lines; omit inapplicable Scope/Caveat and never invent details. Handoffs: Objective, Completed, First pending action, Blockers, Key files/checks; require a stable workstream topic_key; close a finished handoff by saving its outcome under the same topic_key. Send exactly one branch: evidence, observation, observation_review, or observation_promotion. Supply root_session_key and harness together or omit both.

NameRequiredDescriptionDefault
memoryNoDirect promoted memory; requires evidence without metadata.
harnessNoVerified native harness.
evidenceNoCompact factual evidence; metadata requires event_key + session pair and forbids memory.
event_keyNoStable idempotency key.
observationNoSupported candidate, not promoted; requires event_key. Session scope needs session pair + coverage; project scope forbids coverage.
project_keyYesCopy opaque project_key verbatim from verified native identity; never derive from names, paths, remotes, branches, worktrees, host IDs, listings, or recalled content.
project_nameYesDisplay/creation name, not identity; prefer persisted lifecycle/project name.
root_session_keyNoVerified root session key; blank is absent.
observation_reviewNoReview supported observation; requires event_key + session pair.
observation_promotionNoPromote accepted observation without new prose; requires event_key + session pair.

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the burden well: it discloses branch mutual exclusivity, the root_session_key/harness all-or-nothing pairing constraint, and the requirement of a stable topic_key to close a handoff. It does not say what happens on supersede/dedup or what the call returns, leaving those gaps.

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 the trigger condition, and every clause carries a rule rather than filler. Density is high and semicolon-chained, with terse terms like 'safe action lines' that take re-reading, but nothing is expendable.

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?

For a 10-parameter, deeply nested write tool with no annotations and no output schema, the description covers branch selection and the session-pair constraint but omits return behavior, supersede semantics, and how the four branches relate to each other downstream. Adequate to make a correct call, not 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%, so the baseline is 3, but the description adds meaning the schema cannot express: the labeled Result/Rationale/Scope/Caveat shape of memory.content and the Objective/Completed/First pending action/Blockers structure of a handoff. It leaves supersedes_id, outcome, and the memory-vs-evidence relationship to 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?

The imperative verb 'Save' plus enumerated resource types (decisions, root causes, failed approaches, conventions, handoffs) makes clear this tool persists memory. It does not explicitly contrast itself with the read-oriented siblings (mem_get, mem_recall, mem_context), but the write framing is unmistakable.

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?

Strong trigger guidance: 'Save unprompted as soon as... verified', plus durable discoveries and continuation handoffs. It also gives branch-selection rules ('Send exactly one branch'). It never names a sibling tool as an alternative or states a when-not-to-save condition, which keeps it off a 5.

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

mem_sessionB

Record verified root lifecycle events, never ordinary saves. guide_post_compact content carries host compaction text.

NameRequiredDescriptionDefault
contentNo
harnessYesVerified native harness.
summaryNoSession summary.
event_keyYesStable lifecycle key; retries must resend identical content/summary.
operationYesRoot lifecycle operation.
project_keyYesVerified project_key, copied verbatim; never derived.
project_nameYesDisplay/creation name, not identity; prefer persisted lifecycle/project name.
root_session_keyYesStable verified root session key.

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full burden, but it only says these are lifecycle events and that guide_post_compact content carries host compaction text. It does not disclose mutation semantics, idempotency expectations, permission/auth requirements, or what happens for each lifecycle operation beyond what the schema implies.

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 two short sentences, front-loads the core action, and contains no filler. It is efficient, though its brevity contributes to gaps elsewhere rather than being a structural flaw itself.

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

Completeness2/5

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

This is a complex tool with eight parameters, nested summary objects, six lifecycle operations, and no annotations or output schema. The description does not explain the lifecycle operations, what is recorded or changed, retry behavior, or the relationship between required fields, leaving too much for the agent to infer.

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 high at 88%, so the schema already documents most parameters. The description adds one valuable clarification: content for guide_post_compact carries host compaction text, but it does not add meaning for the other parameters or nested summary fields.

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 states a specific verb and resource: 'Record verified root lifecycle events,' and explicitly distinguishes this from 'ordinary saves,' which helps separate it from mem_save. It is less clear about what a root lifecycle event is, but the operation enum and sibling contrast keep the purpose identifiable.

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?

It gives one useful exclusion, 'never ordinary saves,' which points agents away from mem_save for normal persistence. However, it does not explain when to use enroll, recover, capture_root, checkpoint_pre_compact, guide_post_compact, or finalize, so operation selection remains implied by the schema rather than guided.

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.

  1. 6 tool updatesv0.6.2
    • Changedmem_context2 fields changed
      • removedInput schema / properties / project_key / minLength
        Removed value: -1
      • removedInput schema / properties / root_session_key / minLength
        Removed value: -1
    • Changedmem_get1 field changed
      • changedInput schema / properties / history / description
        Previous value: -"true: include predecessor lineage; evidence has no lineage."New value: +"Include predecessors; evidence has none."
    • Changedmem_project20 fields changed
      • removedInput schema / properties / action / description
        Removed value: -"Project view."
      • changedInput schema / properties / budget_chars / description
        Previous value: -"Aggregate character budget for timeline/briefing/summaries/observations; timeline clamps positive integers to 1024-20000."New value: +"Aggregate chars; timeline: positive integer clamped to 1024-20000."
      • changedInput schema / properties / cursor / description
        Previous value: -"Timeline nextCursor, unchanged; keep project_key, since, until unchanged."New value: +"Unchanged nextCursor; preserve project_key, since, until."
      • removedInput schema / properties / cursor / maxLength
        Removed value: -4096
      • removedInput schema / properties / cursor / minLength
        Removed value: -1
      • removedInput schema / properties / harness / description
        Removed value: -"Native harness for session filter."
      • removedInput schema / properties / id / description
        Removed value: -"Prior-result record id."
      • removedInput schema / properties / id / minLength
        Removed value: -1
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items for timeline/observations."New value: +"Timeline/observations: 1-100 items."
      • removedInput schema / properties / limit / exclusiveMinimum
        Removed value: -0
      • removedInput schema / properties / limit / maximum
        Removed value: -100
      • removedInput schema / properties / project_key / minLength
        Removed value: -1
      • changedInput schema / properties / root_session_key / description
        Previous value: -"Verified session filter; pair with harness or omit both."New value: +"Session filter; pair with harness."
      • removedInput schema / properties / root_session_key / minLength
        Removed value: -1
      • changedInput schema / properties / since / description
        Previous value: -"Timeline inclusive lower ISO-8601 instant; <= until."New value: +"Inclusive lower ISO-8601 instant; <= until."
      • removedInput schema / properties / since / minLength
        Removed value: -1
      • removedInput schema / properties / state / description
        Removed value: -"Observations state filter."
      • changedInput schema / properties / temporal / description
        Previous value: -"Summaries/observations only: current=latest summaries/correction leaves; history=older summaries/observation predecessors."New value: +"Summaries/observations: current=latest summaries/correction leaves; history=predecessors."
      • changedInput schema / properties / until / description
        Previous value: -"Timeline inclusive upper ISO-8601 instant."New value: +"Inclusive upper ISO-8601 instant."
      • removedInput schema / properties / until / minLength
        Removed value: -1
    • Changedmem_recall4 fields changed
      • changedInput schema / properties / mode / description
        Previous value: -"compact (default): bounded snippets; context: selected content."New value: +"compact (default): snippets; context: selected content."
      • removedInput schema / properties / project_key / minLength
        Removed value: -1
      • removedInput schema / properties / query / minLength
        Removed value: -1
      • changedInput schema / properties / temporal / description
        Previous value: -"current (default): current guidance; history: historical records."New value: +"current (default) or historical guidance."
    • Changedmem_save58 fields changed
      • removedInput schema / properties / evidence / anyOf
        Removed value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "content": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "kind": {
        -        "enum": [
        -          "root_prompt",
        -          "explicit_save",
        -          "checkpoint",
        -          "handoff",
        -          "legacy_prompt",
        -          "legacy_observation",
        -          "session_summary"
        -        ],
        -        "type": "string"
        -      },
        -      "source_ref": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "content"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "content": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "explicit_save",
        -        "type": "string"
        -      },
        -      "metadata": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "observation_validation": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "method": {
        -                "maxLength": 500,
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "observation_id": {
        -                "maxLength": 200,
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "result": {
        -                "enum": [
        -                  "passed",
        -                  "failed"
        -                ],
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "observation_id",
        -              "result",
        -              "method"
        -            ],
        -            "type": "object"
        -          }
        -        },
        -        "required": [
        -          "observation_validation"
        -        ],
        -        "type": "object"
        -      },
        -      "source_ref": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "content",
        -      "metadata"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "content": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "handoff",
        -        "type": "string"
        -      },
        -      "metadata": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "observation_review_attestation": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "method": {
        -                "maxLength": 500,
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "observation_id": {
        -                "maxLength": 200,
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "reviewer": {
        -                "maxLength": 200,
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "verdict": {
        -                "enum": [
        -                  "accepted",
        -                  "rejected"
        -                ],
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "observation_id",
        -              "verdict",
        -              "reviewer",
        -              "method"
        -            ],
        -            "type": "object"
        -          }
        -        },
        -        "required": [
        -          "observation_review_attestation"
        -        ],
        -        "type": "object"
        -      },
        -      "source_ref": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "content",
        -      "metadata"
        -    ],
        -    "type": "object"
        -  }
        -]
      • addedInput schema / properties / evidence / properties
        Added value: +{
        +  "content": {
        +    "type": "string"
        +  },
        +  "kind": {
        +    "enum": [
        +      "root_prompt",
        +      "explicit_save",
        +      "checkpoint",
        +      "handoff",
        +      "legacy_prompt",
        +      "legacy_observation",
        +      "session_summary"
        +    ],
        +    "type": "string"
        +  },
        +  "metadata": {
        +    "properties": {
        +      "observation_review_attestation": {
        +        "properties": {
        +          "method": {
        +            "type": "string"
        +          },
        +          "observation_id": {
        +            "type": "string"
        +          },
        +          "reviewer": {
        +            "type": "string"
        +          },
        +          "verdict": {
        +            "enum": [
        +              "accepted",
        +              "rejected"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "observation_id",
        +          "verdict",
        +          "reviewer",
        +          "method"
        +        ],
        +        "type": "object"
        +      },
        +      "observation_validation": {
        +        "properties": {
        +          "method": {
        +            "type": "string"
        +          },
        +          "observation_id": {
        +            "type": "string"
        +          },
        +          "result": {
        +            "enum": [
        +              "passed",
        +              "failed"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "observation_id",
        +          "result",
        +          "method"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "source_ref": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / evidence / required
        Added value: +[
        +  "kind",
        +  "content"
        +]
      • addedInput schema / properties / evidence / type
        Added value: +"object"
      • removedInput schema / properties / memory / additionalProperties
        Removed value: -false
      • removedInput schema / properties / memory / properties / content / minLength
        Removed value: -1
      • removedInput schema / properties / memory / properties / title / minLength
        Removed value: -1
      • removedInput schema / properties / observation / additionalProperties
        Removed value: -false
      • removedInput schema / properties / observation / properties / claim / maxLength
        Removed value: -4000
      • removedInput schema / properties / observation / properties / claim / minLength
        Removed value: -1
      • removedInput schema / properties / observation / properties / concepts / items / maxLength
        Removed value: -200
      • removedInput schema / properties / observation / properties / concepts / items / minLength
        Removed value: -1
      • removedInput schema / properties / observation / properties / concepts / maxItems
        Removed value: -16
      • removedInput schema / properties / observation / properties / coverage / additionalProperties
        Removed value: -false
      • removedInput schema / properties / observation / properties / coverage / properties / from_sequence / exclusiveMinimum
        Removed value: -0
      • removedInput schema / properties / observation / properties / coverage / properties / from_sequence / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / observation / properties / coverage / properties / to_sequence / exclusiveMinimum
        Removed value: -0
      • removedInput schema / properties / observation / properties / coverage / properties / to_sequence / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / observation / properties / files / items / maxLength
        Removed value: -500
      • removedInput schema / properties / observation / properties / files / items / minLength
        Removed value: -1
      • removedInput schema / properties / observation / properties / files / maxItems
        Removed value: -16
      • removedInput schema / properties / observation / properties / generator / additionalProperties
        Removed value: -false
      • removedInput schema / properties / observation / properties / generator / properties / config_hash / pattern
        Removed value: -"^[0-9a-f]{64}$"
      • removedInput schema / properties / observation / properties / generator / properties / name / maxLength
        Removed value: -200
      • removedInput schema / properties / observation / properties / generator / properties / name / minLength
        Removed value: -1
      • removedInput schema / properties / observation / properties / generator / properties / version / maxLength
        Removed value: -200
      • removedInput schema / properties / observation / properties / generator / properties / version / minLength
        Removed value: -1
      • removedInput schema / properties / observation / properties / predecessor_id / maxLength
        Removed value: -200
      • removedInput schema / properties / observation / properties / predecessor_id / minLength
        Removed value: -1
      • removedInput schema / properties / observation / properties / proposed_memory / additionalProperties
        Removed value: -false
      • removedInput schema / properties / observation / properties / proposed_memory / properties / content / minLength
        Removed value: -1
      • removedInput schema / properties / observation / properties / proposed_memory / properties / title / minLength
        Removed value: -1
      • removedInput schema / properties / observation / properties / support_ids / items / maxLength
        Removed value: -200
      • removedInput schema / properties / observation / properties / support_ids / items / minLength
        Removed value: -1
      • removedInput schema / properties / observation / properties / support_ids / maxItems
        Removed value: -16
      • removedInput schema / properties / observation / properties / support_ids / minItems
        Removed value: -1
      • removedInput schema / properties / observation / properties / title / maxLength
        Removed value: -500
      • removedInput schema / properties / observation / properties / title / minLength
        Removed value: -1
      • removedInput schema / properties / observation_promotion / additionalProperties
        Removed value: -false
      • removedInput schema / properties / observation_promotion / properties / observation_id / maxLength
        Removed value: -200
      • removedInput schema / properties / observation_promotion / properties / observation_id / minLength
        Removed value: -1
      • removedInput schema / properties / observation_review / additionalProperties
        Removed value: -false
      • removedInput schema / properties / observation_review / properties / observation_id / maxLength
        Removed value: -200
      • removedInput schema / properties / observation_review / properties / observation_id / minLength
        Removed value: -1
      • removedInput schema / properties / observation_review / properties / policy / additionalProperties
        Removed value: -false
      • removedInput schema / properties / observation_review / properties / policy / properties / id / maxLength
        Removed value: -200
      • removedInput schema / properties / observation_review / properties / policy / properties / id / minLength
        Removed value: -1
      • removedInput schema / properties / observation_review / properties / policy / properties / version / maxLength
        Removed value: -200
      • removedInput schema / properties / observation_review / properties / policy / properties / version / minLength
        Removed value: -1
      • removedInput schema / properties / observation_review / properties / reason / maxLength
        Removed value: -1000
      • removedInput schema / properties / observation_review / properties / reason / minLength
        Removed value: -1
      • removedInput schema / properties / observation_review / properties / support_ids / items / maxLength
        Removed value: -200
      • removedInput schema / properties / observation_review / properties / support_ids / items / minLength
        Removed value: -1
      • removedInput schema / properties / observation_review / properties / support_ids / maxItems
        Removed value: -16
      • removedInput schema / properties / observation_review / properties / support_ids / minItems
        Removed value: -1
      • removedInput schema / properties / project_key / minLength
        Removed value: -1
      • changedInput schema / properties / project_name / description
        Previous value: -"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output."New value: +"Display/creation name, not identity; prefer persisted lifecycle/project name."
      • removedInput schema / properties / project_name / minLength
        Removed value: -1
    • Changedmem_session27 fields changed
      • removedInput schema / properties / event_key / minLength
        Removed value: -1
      • removedInput schema / properties / project_key / minLength
        Removed value: -1
      • changedInput schema / properties / project_name / description
        Previous value: -"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output."New value: +"Display/creation name, not identity; prefer persisted lifecycle/project name."
      • removedInput schema / properties / project_name / minLength
        Removed value: -1
      • removedInput schema / properties / root_session_key / minLength
        Removed value: -1
      • removedInput schema / properties / summary / additionalProperties
        Removed value: -false
      • removedInput schema / properties / summary / properties / claims / items / additionalProperties
        Removed value: -false
      • removedInput schema / properties / summary / properties / claims / items / properties / content / minLength
        Removed value: -1
      • changedInput schema / properties / summary / properties / claims / items / properties / support_ids / description
        Previous value: -"Distinct evidence ids inside coverage from this project_key + root_session_key/harness session; never memory, summary, or observation ids."New value: +"Distinct same-session evidence ids within coverage; no memory/summary/observation ids."
      • removedInput schema / properties / summary / properties / claims / items / properties / support_ids / items / maxLength
        Removed value: -200
      • removedInput schema / properties / summary / properties / claims / items / properties / support_ids / items / minLength
        Removed value: -1
      • removedInput schema / properties / summary / properties / claims / items / properties / support_ids / maxItems
        Removed value: -16
      • removedInput schema / properties / summary / properties / claims / items / properties / support_ids / minItems
        Removed value: -1
      • removedInput schema / properties / summary / properties / claims / maxItems
        Removed value: -32
      • removedInput schema / properties / summary / properties / claims / minItems
        Removed value: -1
      • removedInput schema / properties / summary / properties / coverage / additionalProperties
        Removed value: -false
      • removedInput schema / properties / summary / properties / coverage / properties / from_sequence / exclusiveMinimum
        Removed value: -0
      • removedInput schema / properties / summary / properties / coverage / properties / from_sequence / maximum
        Removed value: -9007199254740991
      • changedInput schema / properties / summary / properties / coverage / properties / to_sequence / description
        Previous value: -"Last sequence: >= from_sequence and >= the current summary's ending sequence for this session."New value: +">= from_sequence and the previous summary end."
      • removedInput schema / properties / summary / properties / coverage / properties / to_sequence / exclusiveMinimum
        Removed value: -0
      • removedInput schema / properties / summary / properties / coverage / properties / to_sequence / maximum
        Removed value: -9007199254740991
      • removedInput schema / properties / summary / properties / generator / additionalProperties
        Removed value: -false
      • removedInput schema / properties / summary / properties / generator / properties / config_hash / pattern
        Removed value: -"^[0-9a-f]{64}$"
      • removedInput schema / properties / summary / properties / generator / properties / name / maxLength
        Removed value: -200
      • removedInput schema / properties / summary / properties / generator / properties / name / minLength
        Removed value: -1
      • removedInput schema / properties / summary / properties / generator / properties / version / maxLength
        Removed value: -200
      • removedInput schema / properties / summary / properties / generator / properties / version / minLength
        Removed value: -1
  2. 6 tool updatesv0.6.1
    • Changedmem_context3 fields changed
      • changedInput schema / properties / harness / description
        Previous value: -"Native harness for root_session_key; supply both for session context, or omit both for project context."New value: +"Verified native harness."
      • changedInput schema / properties / project_key / description
        Previous value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content."New value: +"Verified project_key, copied verbatim; never derived."
      • changedInput schema / properties / root_session_key / description
        Previous value: -"Optional verified root session key; supply with harness for session context, or omit both for project context."New value: +"Verified root session key."
    • Changedmem_get2 fields changed
      • changedInput schema / properties / history / description
        Previous value: -"Set true to expand predecessor lineage for memory, summary, or observation records; evidence ids have no lineage."New value: +"true: include predecessor lineage; evidence has no lineage."
      • changedInput schema / properties / id / description
        Previous value: -"Memory, summary, observation, or evidence id returned by a prior tool result."New value: +"Memory, summary, observation, or evidence id."
    • Changedmem_project12 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Inspect project views without mutation. action=\"list\": no fields required. action=\"timeline\": project_key required; optionally since, until, cursor, limit, and budget_chars. action=\"briefing\", \"summaries\", or \"observations\": project_key required; optionally supply both root_session_key and harness to select that session's summaries/observations (briefing still includes project-wide memories). action=\"history\": id required from a prior result. temporal filters summaries/observations, not timeline. list returns at most 256 exact aliases per project plus aliasCount and aliasesTruncated metadata."New value: +"Project view."
      • changedInput schema / properties / budget_chars / description
        Previous value: -"Optional aggregate character budget for timeline, briefing, summaries, or observations; timeline clamps a positive integer to 1024-20000 characters."New value: +"Aggregate character budget for timeline/briefing/summaries/observations; timeline clamps positive integers to 1024-20000."
      • changedInput schema / properties / cursor / description
        Previous value: -"Unchanged nextCursor from a prior mem_project action=\"timeline\" result; keep project_key, since, and until unchanged."New value: +"Timeline nextCursor, unchanged; keep project_key, since, until unchanged."
      • changedInput schema / properties / harness / description
        Previous value: -"Native harness for the optional root_session_key filter; supply both or omit both. Not accepted for action=\"timeline\"."New value: +"Native harness for session filter."
      • changedInput schema / properties / id / description
        Previous value: -"Required for action=\"history\"; send a record id returned by a prior tool result."New value: +"Prior-result record id."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items (1-100) for action=\"timeline\" or \"observations\"."New value: +"Maximum items for timeline/observations."
      • changedInput schema / properties / project_key / description
        Previous value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content. Required for action=\"timeline\", \"briefing\", \"summaries\", or \"observations\"; not required for \"list\" or \"history\"."New value: +"Verified project_key, copied verbatim; never derived."
      • changedInput schema / properties / root_session_key / description
        Previous value: -"Optional session filter for action=\"briefing\", \"summaries\", or \"observations\"; supply with harness or omit both."New value: +"Verified session filter; pair with harness or omit both."
      • changedInput schema / properties / since / description
        Previous value: -"Optional inclusive lower ISO-8601 instant for action=\"timeline\" only; must be <= until."New value: +"Timeline inclusive lower ISO-8601 instant; <= until."
      • changedInput schema / properties / state / description
        Previous value: -"Optional state filter for action=\"observations\"."New value: +"Observations state filter."
      • changedInput schema / properties / temporal / description
        Previous value: -"Filter summaries/observations: current selects current summary versions or observation correction-chain leaves; history includes older summary versions or selects observation predecessors. Not accepted for action=\"timeline\"."New value: +"Summaries/observations only: current=latest summaries/correction leaves; history=older summaries/observation predecessors."
      • changedInput schema / properties / until / description
        Previous value: -"Optional inclusive upper ISO-8601 instant for action=\"timeline\" only; must be >= since."New value: +"Timeline inclusive upper ISO-8601 instant."
    • Changedmem_recall4 fields changed
      • changedInput schema / properties / mode / description
        Previous value: -"compact (default) returns bounded snippets; context adds selected memory content."New value: +"compact (default): bounded snippets; context: selected content."
      • changedInput schema / properties / project_key / description
        Previous value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content."New value: +"Verified project_key, copied verbatim; never derived."
      • changedInput schema / properties / query / description
        Previous value: -"Non-empty search string for promoted project memory."New value: +"Non-empty task search terms."
      • changedInput schema / properties / temporal / description
        Previous value: -"current (default) searches current guidance; history includes historical records."New value: +"current (default): current guidance; history: historical records."
    • Changedmem_save10 fields changed
      • changedInput schema / properties / event_key / description
        Previous value: -"Stable event key for idempotency; required for observation, observation_review, observation_promotion, and evidence with metadata."New value: +"Stable idempotency key."
      • changedInput schema / properties / evidence / description
        Previous value: -"Direct evidence { kind, content }; optionally add memory for a promoted save. Structured metadata forbids memory and requires event_key, root_session_key, and harness."New value: +"Compact factual evidence; metadata requires event_key + session pair and forbids memory."
      • changedInput schema / properties / harness / description
        Previous value: -"Native harness for root_session_key; supply both or omit both. Required wherever root_session_key is required."New value: +"Verified native harness."
      • changedInput schema / properties / memory / description
        Previous value: -"Promoted memory for direct evidence only; requires evidence without metadata. Do not combine with observation, observation_review, or observation_promotion."New value: +"Direct promoted memory; requires evidence without metadata."
      • changedInput schema / properties / observation / description
        Previous value: -"Submit a supported candidate without promotion; requires event_key. Session scope also requires root_session_key, harness, and coverage."New value: +"Supported candidate, not promoted; requires event_key. Session scope needs session pair + coverage; project scope forbids coverage."
      • changedInput schema / properties / observation_promotion / description
        Previous value: -"Promote one accepted observation without new prose; requires event_key, root_session_key, and harness. Send no other operation branch or memory."New value: +"Promote accepted observation without new prose; requires event_key + session pair."
      • changedInput schema / properties / observation_review / description
        Previous value: -"Review one supported observation; requires event_key, root_session_key, and harness. Send no other operation branch or memory."New value: +"Review supported observation; requires event_key + session pair."
      • changedInput schema / properties / project_key / description
        Previous value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content."New value: +"Copy opaque project_key verbatim from verified native identity; never derive from names, paths, remotes, branches, worktrees, host IDs, listings, or recalled content."
      • changedInput schema / properties / project_name / description
        Previous value: -"Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output."New value: +"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output."
      • changedInput schema / properties / root_session_key / description
        Previous value: -"Verified root session key; supply with harness or omit both. Required for session-scoped observations, observation_review, observation_promotion, and evidence with metadata; blank counts as absent."New value: +"Verified root session key; blank is absent."
    • Changedmem_session15 fields changed
      • changedInput schema / properties / event_key / description
        Previous value: -"Stable lifecycle event key; retries for the same operation must resend identical content/summary."New value: +"Stable lifecycle key; retries must resend identical content/summary."
      • changedInput schema / properties / harness / description
        Previous value: -"Verified native harness for root_session_key in project_key."New value: +"Verified native harness."
      • changedInput schema / properties / operation / description
        Previous value: -"Lifecycle operation; summary is allowed only for checkpoint_pre_compact (checkpoint) or finalize (final)."New value: +"Root lifecycle operation."
      • changedInput schema / properties / project_key / description
        Previous value: -"Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content."New value: +"Verified project_key, copied verbatim; never derived."
      • changedInput schema / properties / project_name / description
        Previous value: -"Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output."New value: +"Display/creation metadata only, not identity; prefer the persisted name from lifecycle/project output."
      • changedInput schema / properties / root_session_key / description
        Previous value: -"Stable verified root session key; required with harness for every operation."New value: +"Stable verified root session key."
      • changedInput schema / properties / summary / description
        Previous value: -"Optional only for operation=\"checkpoint_pre_compact\" (kind=\"checkpoint\") or operation=\"finalize\" (kind=\"final\"). coverage starts at 1 and to_sequence must advance the current summary for this session and kind. support_ids must be evidence ids from this project_key + root_session_key/harness session inside coverage. Canonical submission limit: 20000 UTF-16 units."New value: +"Session summary."
      • changedInput schema / properties / summary / properties / claims / description
        Previous value: -"1-32 atomic supported claims; keep the canonical summary within 20000 UTF-16 units."New value: +"Supported claims; canonical summary <=20000 UTF-16 units."
      • changedInput schema / properties / summary / properties / claims / items / properties / content / description
        Previous value: -"Atomic claim content; at most 2000 code points after privacy filtering."New value: +"Atomic claim; <=2000 code points after privacy filtering."
      • changedInput schema / properties / summary / properties / claims / items / properties / support_ids / description
        Previous value: -"1-16 distinct evidence ids from this project_key + root_session_key/harness session inside summary.coverage; never memory, summary, or observation ids."New value: +"Distinct evidence ids inside coverage from this project_key + root_session_key/harness session; never memory, summary, or observation ids."
      • changedInput schema / properties / summary / properties / coverage / description
        Previous value: -"Inclusive session evidence coverage; start at 1 and advance to_sequence for this session and summary kind."New value: +"Inclusive session evidence range."
      • changedInput schema / properties / summary / properties / coverage / properties / from_sequence / description
        Previous value: -"Inclusive first session event sequence; must start at 1."New value: +"First event sequence: 1."
      • changedInput schema / properties / summary / properties / coverage / properties / to_sequence / description
        Previous value: -"Inclusive last session event sequence; must be >= from_sequence and exceed the current summary ending sequence for this session and kind."New value: +"Last sequence: >= from_sequence and >= the current summary's ending sequence for this session."
      • removedInput schema / properties / summary / properties / kind
        Removed value: -{
        -  "description": "Send checkpoint for operation=\"checkpoint_pre_compact\" or final for operation=\"finalize\".",
        -  "enum": [
        -    "checkpoint",
        -    "final"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / properties / summary / required
        Previous value: -[
        -  "kind",
        -  "coverage",
        -  "generator",
        -  "claims"
        -]New value: +[
        +  "coverage",
        +  "generator",
        +  "claims"
        +]
  3. 6 tool updatesv0.5.6
    • Changedmem_context13 fields changed
      • addedInput schema / properties / budget_chars
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / correlation_id
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / finalize_answer
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / harness
        Added value: +{
        +  "description": "Native harness for root_session_key; supply both for session context, or omit both for project context.",
        +  "enum": [
        +    "opencode",
        +    "codex",
        +    "claude",
        +    "pi",
        +    "mcp",
        +    "cli",
        +    "import"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / limit
        Removed value: -{
        -  "description": "Number of observations to retrieve (default: 20)",
        -  "type": "number"
        -}
      • removedInput schema / properties / max_chars
        Removed value: -{
        -  "description": "Output character budget; 0 disables the context cap",
        -  "minimum": 0,
        -  "type": "number"
        -}
      • removedInput schema / properties / project
        Removed value: -{
        -  "description": "Filter by project name",
        -  "type": "string"
        -}
      • addedInput schema / properties / project_key
        Added value: +{
        +  "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / recall_query
        Removed value: -{
        -  "description": "Optional query to append fused recall evidence without changing base context sections",
        -  "type": "string"
        -}
      • addedInput schema / properties / root_session_key
        Added value: +{
        +  "description": "Optional verified root session key; supply with harness for session context, or omit both for project context.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / scope
        Removed value: -{
        -  "description": "Filter by scope",
        -  "enum": [
        -    "project",
        -    "personal"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "Filter to a specific session",
        -  "type": "string"
        -}
      • addedInput schema / required
        Added value: +[
        +  "project_key"
        +]
    • Changedmem_get10 fields changed
      • removedInput schema / properties / after
        Removed value: -{
        -  "description": "Timeline observations after the focus item (default: 5)",
        -  "maximum": 20,
        -  "minimum": 0,
        -  "type": "number"
        -}
      • removedInput schema / properties / before
        Removed value: -{
        -  "description": "Timeline observations before the focus item (default: 5)",
        -  "maximum": 20,
        -  "minimum": 0,
        -  "type": "number"
        -}
      • addedInput schema / properties / correlation_id
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / history
        Added value: +{
        +  "description": "Set true to expand predecessor lineage for memory, summary, or observation records; evidence ids have no lineage.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / id / description
        Previous value: -"Record ID to retrieve, interpreted according to kind"New value: +"Memory, summary, observation, or evidence id returned by a prior tool result."
      • changedInput schema / properties / id / type
        Previous value: -"number"New value: +"string"
      • removedInput schema / properties / include_timeline
        Removed value: -{
        -  "description": "Include surrounding observations in the same session",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / kind
        Removed value: -{
        -  "description": "Memory kind to retrieve (defaults to observation)",
        -  "enum": [
        -    "observation",
        -    "prompt"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / max_length
        Removed value: -{
        -  "description": "Max characters to return (default: 50000)",
        -  "minimum": 100,
        -  "type": "number"
        -}
      • removedInput schema / properties / offset
        Removed value: -{
        -  "description": "Character offset for large content (default: 0)",
        -  "minimum": 0,
        -  "type": "number"
        -}
    • Changedmem_project26 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"Project view to return"New value: +"Inspect project views without mutation. action=\"list\": no fields required. action=\"timeline\": project_key required; optionally since, until, cursor, limit, and budget_chars. action=\"briefing\", \"summaries\", or \"observations\": project_key required; optionally supply both root_session_key and harness to select that session's summaries/observations (briefing still includes project-wide memories). action=\"history\": id required from a prior result. temporal filters summaries/observations, not timeline. list returns at most 256 exact aliases per project plus aliasCount and aliasesTruncated metadata."
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "list",
        -  "summary",
        -  "graph",
        -  "topics",
        -  "topic",
        -  "health"
        -]New value: +[
        +  "list",
        +  "timeline",
        +  "briefing",
        +  "history",
        +  "summaries",
        +  "observations"
        +]
      • addedInput schema / properties / budget_chars
        Added value: +{
        +  "description": "Optional aggregate character budget for timeline, briefing, summaries, or observations; timeline clamps a positive integer to 1024-20000 characters.",
        +  "type": "number"
        +}
      • removedInput schema / properties / continuation
        Removed value: -{
        -  "description": "Opaque continuation token returned by graph navigation views",
        -  "type": "string"
        -}
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Unchanged nextCursor from a prior mem_project action=\"timeline\" result; keep project_key, since, and until unchanged.",
        +  "maxLength": 4096,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / focus_node_id
        Removed value: -{
        -  "description": "Graph focus node id for navigation=neighborhood, currently obs:<id>",
        -  "type": "string"
        -}
      • addedInput schema / properties / harness
        Added value: +{
        +  "description": "Native harness for the optional root_session_key filter; supply both or omit both. Not accepted for action=\"timeline\".",
        +  "enum": [
        +    "opencode",
        +    "codex",
        +    "claude",
        +    "pi",
        +    "mcp",
        +    "cli",
        +    "import"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / id
        Added value: +{
        +  "description": "Required for action=\"history\"; send a record id returned by a prior tool result.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / include_superseded
        Removed value: -{
        -  "description": "Explicit history opt-in; honored by navigation=superseded only",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum items to return"New value: +"Maximum items (1-100) for action=\"timeline\" or \"observations\"."
      • addedInput schema / properties / limit / exclusiveMinimum
        Added value: +0
      • changedInput schema / properties / limit / maximum
        Previous value: -500New value: +100
      • removedInput schema / properties / limit / minimum
        Removed value: -1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • removedInput schema / properties / max_chars
        Removed value: -{
        -  "description": "Response character budget; 0 is supported for action=summary only",
        -  "maximum": 20000,
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • removedInput schema / properties / navigation
        Removed value: -{
        -  "description": "Graph navigation mode for action=graph; defaults to ledger",
        -  "enum": [
        -    "ledger",
        -    "neighborhood",
        -    "lineage",
        -    "community",
        -    "superseded"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / observation_id
        Removed value: -{
        -  "description": "Observation id for lineage or superseded graph navigation",
        -  "exclusiveMinimum": 0,
        -  "maximum": 9007199254740991,
        -  "type": "integer"
        -}
      • removedInput schema / properties / project
        Removed value: -{
        -  "description": "Project name. Required except action=list and optional for action=topics or health",
        -  "type": "string"
        -}
      • addedInput schema / properties / project_key
        Added value: +{
        +  "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content. Required for action=\"timeline\", \"briefing\", \"summaries\", or \"observations\"; not required for \"list\" or \"history\".",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / relation
        Removed value: -{
        -  "description": "Graph relation filter for action=graph",
        -  "enum": [
        -    "HAS_TYPE",
        -    "IN_PROJECT",
        -    "HAS_TOPIC_KEY",
        -    "HAS_WHAT",
        -    "HAS_WHY",
        -    "HAS_WHERE",
        -    "HAS_LEARNED"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / root_session_key
        Added value: +{
        +  "description": "Optional session filter for action=\"briefing\", \"summaries\", or \"observations\"; supply with harness or omit both.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "Optional inclusive lower ISO-8601 instant for action=\"timeline\" only; must be <= until.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / state
        Added value: +{
        +  "description": "Optional state filter for action=\"observations\".",
        +  "enum": [
        +    "pending",
        +    "accepted",
        +    "rejected",
        +    "promoted"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / temporal
        Added value: +{
        +  "description": "Filter summaries/observations: current selects current summary versions or observation correction-chain leaves; history includes older summary versions or selects observation predecessors. Not accepted for action=\"timeline\".",
        +  "enum": [
        +    "current",
        +    "history"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / topic_key
        Removed value: -{
        -  "description": "Topic key for action=topic or graph filtering",
        -  "type": "string"
        -}
      • addedInput schema / properties / until
        Added value: +{
        +  "description": "Optional inclusive upper ISO-8601 instant for action=\"timeline\" only; must be >= since.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Changedmem_recall20 fields changed
      • addedInput schema / properties / budget_chars
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / correlation_id
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / debug
        Removed value: -{
        -  "description": "Include retrieval defaults and semantic input sources",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / finalize_answer
        Added value: +{
        +  "type": "boolean"
        +}
      • removedInput schema / properties / hyde
        Removed value: -{
        -  "description": "Request HyDE query expansion when configured",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / limit / description
        Removed value: -"Maximum evidence items (default: 5)"
      • removedInput schema / properties / limit / maximum
        Removed value: -20
      • removedInput schema / properties / limit / minimum
        Removed value: -1
      • changedInput schema / properties / mode / description
        Previous value: -"compact returns evidence lines; context includes retrieved text"New value: +"compact (default) returns bounded snippets; context adds selected memory content."
      • removedInput schema / properties / project
        Removed value: -{
        -  "description": "Optional project filter",
        -  "type": "string"
        -}
      • addedInput schema / properties / project_key
        Added value: +{
        +  "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Recall/search query"New value: +"Non-empty search string for promoted project memory."
      • removedInput schema / properties / scope
        Removed value: -{
        -  "description": "Optional scope filter",
        -  "enum": [
        -    "project",
        -    "personal"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "Optional session filter",
        -  "type": "string"
        -}
      • addedInput schema / properties / temporal
        Added value: +{
        +  "description": "current (default) searches current guidance; history includes historical records.",
        +  "enum": [
        +    "current",
        +    "history"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / time_from
        Removed value: -{
        -  "description": "Optional inclusive created_at lower bound",
        -  "type": "string"
        -}
      • removedInput schema / properties / time_to
        Removed value: -{
        -  "description": "Optional inclusive created_at upper bound",
        -  "type": "string"
        -}
      • removedInput schema / properties / topic_key
        Removed value: -{
        -  "description": "Optional exact topic_key filter",
        -  "type": "string"
        -}
      • removedInput schema / properties / type
        Removed value: -{
        -  "description": "Optional observation type filter",
        -  "enum": [
        -    "decision",
        -    "architecture",
        -    "bugfix",
        -    "pattern",
        -    "config",
        -    "discovery",
        -    "learning",
        -    "session_summary",
        -    "manual"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "query"
        -]New value: +[
        +  "project_key",
        +  "query"
        +]
    • Changedmem_save19 fields changed
      • removedInput schema / properties / content
        Removed value: -{
        -  "description": "Memory content, prompt text, session summary, or text containing a Key Learnings section",
        -  "type": "string"
        -}
      • addedInput schema / properties / event_key
        Added value: +{
        +  "description": "Stable event key for idempotency; required for observation, observation_review, observation_promotion, and evidence with metadata.",
        +  "type": "string"
        +}
      • addedInput schema / properties / evidence
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "content": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "kind": {
        +          "enum": [
        +            "root_prompt",
        +            "explicit_save",
        +            "checkpoint",
        +            "handoff",
        +            "legacy_prompt",
        +            "legacy_observation",
        +            "session_summary"
        +          ],
        +          "type": "string"
        +        },
        +        "source_ref": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "content"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "content": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "kind": {
        +          "const": "explicit_save",
        +          "type": "string"
        +        },
        +        "metadata": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "observation_validation": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "method": {
        +                  "maxLength": 500,
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "observation_id": {
        +                  "maxLength": 200,
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "result": {
        +                  "enum": [
        +                    "passed",
        +                    "failed"
        +                  ],
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "observation_id",
        +                "result",
        +                "method"
        +              ],
        +              "type": "object"
        +            }
        +          },
        +          "required": [
        +            "observation_validation"
        +          ],
        +          "type": "object"
        +        },
        +        "source_ref": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "content",
        +        "metadata"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "content": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "kind": {
        +          "const": "handoff",
        +          "type": "string"
        +        },
        +        "metadata": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "observation_review_attestation": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "method": {
        +                  "maxLength": 500,
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "observation_id": {
        +                  "maxLength": 200,
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "reviewer": {
        +                  "maxLength": 200,
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "verdict": {
        +                  "enum": [
        +                    "accepted",
        +                    "rejected"
        +                  ],
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "observation_id",
        +                "verdict",
        +                "reviewer",
        +                "method"
        +              ],
        +              "type": "object"
        +            }
        +          },
        +          "required": [
        +            "observation_review_attestation"
        +          ],
        +          "type": "object"
        +        },
        +        "source_ref": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "content",
        +        "metadata"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "description": "Direct evidence { kind, content }; optionally add memory for a promoted save. Structured metadata forbids memory and requires event_key, root_session_key, and harness."
        +}
      • addedInput schema / properties / harness
        Added value: +{
        +  "description": "Native harness for root_session_key; supply both or omit both. Required wherever root_session_key is required.",
        +  "enum": [
        +    "opencode",
        +    "codex",
        +    "claude",
        +    "pi",
        +    "mcp",
        +    "cli",
        +    "import"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / kind
        Removed value: -{
        -  "description": "Write mode. Defaults to observation",
        -  "enum": [
        -    "observation",
        -    "prompt",
        -    "session_summary",
        -    "passive_learnings"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / memory
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Promoted memory for direct evidence only; requires evidence without metadata. Do not combine with observation, observation_review, or observation_promotion.",
        +  "properties": {
        +    "content": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "decision",
        +        "convention",
        +        "architecture",
        +        "discovery",
        +        "failure",
        +        "project_structure",
        +        "handoff",
        +        "preference"
        +      ],
        +      "type": "string"
        +    },
        +    "outcome": {
        +      "enum": [
        +        "unknown",
        +        "succeeded",
        +        "failed",
        +        "mixed"
        +      ],
        +      "type": "string"
        +    },
        +    "supersedes_id": {
        +      "type": "string"
        +    },
        +    "title": {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "topic_key": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "title",
        +    "content"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / observation
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Submit a supported candidate without promotion; requires event_key. Session scope also requires root_session_key, harness, and coverage.",
        +  "properties": {
        +    "claim": {
        +      "maxLength": 4000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "concepts": {
        +      "items": {
        +        "maxLength": 200,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "maxItems": 16,
        +      "type": "array"
        +    },
        +    "coverage": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "from_sequence": {
        +          "exclusiveMinimum": 0,
        +          "maximum": 9007199254740991,
        +          "type": "integer"
        +        },
        +        "to_sequence": {
        +          "exclusiveMinimum": 0,
        +          "maximum": 9007199254740991,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "from_sequence",
        +        "to_sequence"
        +      ],
        +      "type": "object"
        +    },
        +    "files": {
        +      "items": {
        +        "maxLength": 500,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "maxItems": 16,
        +      "type": "array"
        +    },
        +    "generator": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "config_hash": {
        +          "pattern": "^[0-9a-f]{64}$",
        +          "type": "string"
        +        },
        +        "kind": {
        +          "enum": [
        +            "root_agent",
        +            "harness",
        +            "model"
        +          ],
        +          "type": "string"
        +        },
        +        "name": {
        +          "maxLength": 200,
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "version": {
        +          "maxLength": 200,
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "name"
        +      ],
        +      "type": "object"
        +    },
        +    "kind": {
        +      "enum": [
        +        "decision",
        +        "constraint",
        +        "fact",
        +        "procedure",
        +        "result",
        +        "failure",
        +        "preference"
        +      ],
        +      "type": "string"
        +    },
        +    "predecessor_id": {
        +      "maxLength": 200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "proposed_memory": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "content": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "kind": {
        +          "enum": [
        +            "decision",
        +            "convention",
        +            "architecture",
        +            "discovery",
        +            "failure",
        +            "project_structure",
        +            "handoff",
        +            "preference"
        +          ],
        +          "type": "string"
        +        },
        +        "outcome": {
        +          "enum": [
        +            "unknown",
        +            "succeeded",
        +            "failed",
        +            "mixed"
        +          ],
        +          "type": "string"
        +        },
        +        "title": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "topic_key": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "title",
        +        "content"
        +      ],
        +      "type": "object"
        +    },
        +    "scope": {
        +      "enum": [
        +        "session",
        +        "project"
        +      ],
        +      "type": "string"
        +    },
        +    "support_ids": {
        +      "items": {
        +        "maxLength": 200,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "maxItems": 16,
        +      "minItems": 1,
        +      "type": "array"
        +    },
        +    "title": {
        +      "maxLength": 500,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "scope",
        +    "title",
        +    "claim",
        +    "proposed_memory",
        +    "support_ids",
        +    "generator"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / observation_promotion
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Promote one accepted observation without new prose; requires event_key, root_session_key, and harness. Send no other operation branch or memory.",
        +  "properties": {
        +    "observation_id": {
        +      "maxLength": 200,
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "observation_id"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / observation_review
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Review one supported observation; requires event_key, root_session_key, and harness. Send no other operation branch or memory.",
        +  "properties": {
        +    "basis": {
        +      "enum": [
        +        "root_user_confirmed",
        +        "observable_validation",
        +        "independent_review"
        +      ],
        +      "type": "string"
        +    },
        +    "observation_id": {
        +      "maxLength": 200,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "policy": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "id": {
        +          "maxLength": 200,
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "version": {
        +          "maxLength": 200,
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "version"
        +      ],
        +      "type": "object"
        +    },
        +    "reason": {
        +      "maxLength": 1000,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "support_ids": {
        +      "items": {
        +        "maxLength": 200,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "maxItems": 16,
        +      "minItems": 1,
        +      "type": "array"
        +    },
        +    "verdict": {
        +      "enum": [
        +        "accepted",
        +        "rejected"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "observation_id",
        +    "verdict",
        +    "basis",
        +    "policy",
        +    "reason",
        +    "support_ids"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / project
        Removed value: -{
        -  "description": "Project name",
        -  "type": "string"
        -}
      • addedInput schema / properties / project_key
        Added value: +{
        +  "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / project_name
        Added value: +{
        +  "description": "Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / root_session_key
        Added value: +{
        +  "description": "Verified root session key; supply with harness or omit both. Required for session-scoped observations, observation_review, observation_promotion, and evidence with metadata; blank counts as absent.",
        +  "type": "string"
        +}
      • removedInput schema / properties / scope
        Removed value: -{
        -  "description": "Observation scope",
        -  "enum": [
        -    "project",
        -    "personal"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "Session ID (default: manual-save-{project})",
        -  "type": "string"
        -}
      • removedInput schema / properties / title
        Removed value: -{
        -  "description": "Short searchable title. Required for kind=observation",
        -  "type": "string"
        -}
      • removedInput schema / properties / topic_key
        Removed value: -{
        -  "description": "Stable key for observation upserts",
        -  "type": "string"
        -}
      • removedInput schema / properties / type
        Removed value: -{
        -  "description": "Observation category for kind=observation",
        -  "enum": [
        -    "decision",
        -    "architecture",
        -    "bugfix",
        -    "pattern",
        -    "config",
        -    "discovery",
        -    "learning",
        -    "session_summary",
        -    "manual"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "content"
        -]New value: +[
        +  "project_key",
        +  "project_name"
        +]
    • Changedmem_session17 fields changed
      • removedInput schema / properties / action
        Removed value: -{
        -  "description": "Session action",
        -  "enum": [
        -    "start",
        -    "summary",
        -    "checkpoint"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / content / description
        Removed value: -"Full session summary for action=summary"
      • removedInput schema / properties / directory
        Removed value: -{
        -  "description": "Working directory for action=start",
        -  "type": "string"
        -}
      • addedInput schema / properties / event_key
        Added value: +{
        +  "description": "Stable lifecycle event key; retries for the same operation must resend identical content/summary.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / harness
        Added value: +{
        +  "description": "Verified native harness for root_session_key in project_key.",
        +  "enum": [
        +    "opencode",
        +    "codex",
        +    "claude",
        +    "pi",
        +    "mcp",
        +    "cli",
        +    "import"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / id
        Removed value: -{
        -  "description": "Session ID. Required for action=start; defaults to manual-save-{project} for summary/checkpoint",
        -  "type": "string"
        -}
      • addedInput schema / properties / operation
        Added value: +{
        +  "description": "Lifecycle operation; summary is allowed only for checkpoint_pre_compact (checkpoint) or finalize (final).",
        +  "enum": [
        +    "enroll",
        +    "recover",
        +    "capture_root",
        +    "checkpoint_pre_compact",
        +    "guide_post_compact",
        +    "finalize"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / project
        Removed value: -{
        -  "description": "Project name",
        -  "type": "string"
        -}
      • addedInput schema / properties / project_key
        Added value: +{
        +  "description": "Exact opaque project_key copied verbatim from verified native identity; never derive it from a display name, path hint, remote, branch, worktree name, host ID, listing, or recalled content.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / project_name
        Added value: +{
        +  "description": "Creation/display metadata only; never participates in project identity equality. Prefer the database-persisted name returned by lifecycle or project output.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / root_session_key
        Added value: +{
        +  "description": "Stable verified root session key; required with harness for every operation.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / summary / additionalProperties
        Added value: +false
      • changedInput schema / properties / summary / description
        Previous value: -"Short checkpoint summary for action=checkpoint"New value: +"Optional only for operation=\"checkpoint_pre_compact\" (kind=\"checkpoint\") or operation=\"finalize\" (kind=\"final\"). coverage starts at 1 and to_sequence must advance the current summary for this session and kind. support_ids must be evidence ids from this project_key + root_session_key/harness session inside coverage. Canonical submission limit: 20000 UTF-16 units."
      • addedInput schema / properties / summary / properties
        Added value: +{
        +  "claims": {
        +    "description": "1-32 atomic supported claims; keep the canonical summary within 20000 UTF-16 units.",
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "content": {
        +          "description": "Atomic claim content; at most 2000 code points after privacy filtering.",
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "kind": {
        +          "enum": [
        +            "objective",
        +            "completed",
        +            "decision",
        +            "changed_surface",
        +            "verification",
        +            "pending",
        +            "blocker",
        +            "next_action"
        +          ],
        +          "type": "string"
        +        },
        +        "outcome": {
        +          "enum": [
        +            "unknown",
        +            "succeeded",
        +            "failed",
        +            "mixed"
        +          ],
        +          "type": "string"
        +        },
        +        "support_ids": {
        +          "description": "1-16 distinct evidence ids from this project_key + root_session_key/harness session inside summary.coverage; never memory, summary, or observation ids.",
        +          "items": {
        +            "maxLength": 200,
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "maxItems": 16,
        +          "minItems": 1,
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "kind",
        +        "content",
        +        "support_ids"
        +      ],
        +      "type": "object"
        +    },
        +    "maxItems": 32,
        +    "minItems": 1,
        +    "type": "array"
        +  },
        +  "coverage": {
        +    "additionalProperties": false,
        +    "description": "Inclusive session evidence coverage; start at 1 and advance to_sequence for this session and summary kind.",
        +    "properties": {
        +      "from_sequence": {
        +        "description": "Inclusive first session event sequence; must start at 1.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 9007199254740991,
        +        "type": "integer"
        +      },
        +      "to_sequence": {
        +        "description": "Inclusive last session event sequence; must be >= from_sequence and exceed the current summary ending sequence for this session and kind.",
        +        "exclusiveMinimum": 0,
        +        "maximum": 9007199254740991,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "from_sequence",
        +      "to_sequence"
        +    ],
        +    "type": "object"
        +  },
        +  "generator": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "config_hash": {
        +        "pattern": "^[0-9a-f]{64}$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "enum": [
        +          "root_agent",
        +          "harness",
        +          "model"
        +        ],
        +        "type": "string"
        +      },
        +      "name": {
        +        "maxLength": 200,
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "version": {
        +        "maxLength": 200,
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "name"
        +    ],
        +    "type": "object"
        +  },
        +  "kind": {
        +    "description": "Send checkpoint for operation=\"checkpoint_pre_compact\" or final for operation=\"finalize\".",
        +    "enum": [
        +      "checkpoint",
        +      "final"
        +    ],
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / summary / required
        Added value: +[
        +  "kind",
        +  "coverage",
        +  "generator",
        +  "claims"
        +]
      • changedInput schema / properties / summary / type
        Previous value: -"string"New value: +"object"
      • changedInput schema / required
        Previous value: -[
        -  "action",
        -  "project"
        -]New value: +[
        +  "operation",
        +  "harness",
        +  "project_key",
        +  "project_name",
        +  "root_session_key",
        +  "event_key"
        +]
  4. 5 tool updatesv0.4.13
    • Addedmem_context
    • Addedmem_get
    • Addedmem_project
    • Addedmem_save
    • Addedmem_session
  5. 5 tool updatesv0.4.1
    • Removedmem_context
    • Removedmem_get
    • Removedmem_project
    • Removedmem_save
    • Removedmem_session
  6. 6 tool updatesv0.3.7
    • First observedmem_context
    • First observedmem_get
    • First observedmem_project
    • First observedmem_recall
    • First observedmem_save
    • First observedmem_session

TDQS

B3.3/5.0

Scored across 6 tools

Disambiguation4/5

mem_save and mem_session both persist information, but mem_session is explicitly limited to lifecycle events. The read-side tools (mem_recall, mem_context, mem_project) have overlapping search/context/view roles, which could cause misselection, though descriptions provide clear trigger guidance.

Naming Consistency4/5

All tools use a consistent mem_ prefix in snake_case, making names predictable and readable. Minor inconsistency exists because some names are verbs (save, get, recall) and others are nouns (context, project, session), but the pattern is still coherent.

Tool Count5/5

Six tools is well within the ideal range for a focused memory server. Each tool maps to a distinct stage of the memory lifecycle—save, recall, expand, context building, project inspection, and session events—without obvious redundancy.

Completeness3/5

The surface covers saving, searching, retrieval, context building, project views, and session lifecycle. However, there is no explicit update or delete/forget operation for memories, and listing memories beyond search results or project views is limited, which may hinder correcting or pruning stored knowledge.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Provides AI coding agents with persistent, long-term memory through local semantic search and SQLite storage. It enables agents to save and retrieve architectural decisions or project context across different conversation sessions without requiring cloud services.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI coding assistants with persistent project memory to retain architectural decisions, code patterns, and domain knowledge across sessions. It stores data locally in a SQLite database, allowing agents to remember, recall, and manage project-specific context using full-text search.
    0
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Gives AI coding agents persistent memory by storing observations, decisions, and learnings in a local SQLite database with vector search, full-text search, and a rules engine.
    4
    MIT