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. 정체성으로 재개. 동일한 안정적인 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로 관찰 또는 프롬프트 하나를 가져오고, 페이지 매김 또는 타임라인 컨텍스트를 제한합니다.

mem_project

프로젝트, 주제, 그래프 보기 및 운영 상태를 탐색합니다.

mem_session

루트 소유 메모리 세션을 시작, 체크포인트 또는 요약합니다.

설정, 동기화, 마이그레이션, 재구축 및 유지 관리는 추가 MCP 도구가 아닌 CLI/HTTP 관리 명령입니다.

그래프 커뮤니티 검사

커뮤니티는 프로젝트 지식 그래프에서 파생된 제한된 요약입니다. 운영자는 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는 회상 결과에도 나타납니다. 제한된 그래프 이웃의 경우 navigation="neighborhood"와 함께 focus_node_id="obs:<id>"로 재사용하세요.

네이티브 하네스 통합

네이티브 설정은 패키지된 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을 반환합니다. 반복 설정 및 반복 완료 롤백은 검증된 상태가 이미 일치하면 no-op입니다.

Gemini CLI: 수동 MCP

Gemini CLI는 관리형 네이티브 thoth-mem 통합이 아닌 수동 MCP 클라이언트 경로입니다. ~/.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은 신호 관찰과 방해 요소를 시드하고 예상 메모리가 상위권에 랭크되는지 측정합니다. 보고서를 신호 모음으로 읽으세요:

  • 재현율 및 순위는 올바른 증거가 발견되었는지, 얼마나 빨리 발견되었는지 보여줍니다.

  • 노이즈 및 케이스 혼합은 직접, 재구성, 저장소 파생 예제 전반에 걸친 견고성을 보여줍니다.

  • 압축은 컨텍스트 전달 전에 제거된 증거의 양을 보여줍니다. 효율성 신호이지 나머지 텍스트가 올바르다는 증거는 아닙니다.

  • 레인 및 폴백 증거는 어휘, 의미 원시/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.js ONNX Runtime에서 dml은 Windows의 DirectML을 대상으로 하고, cuda는 지원되는 Linux x64 CUDA 설치를, coreml은 macOS를 대상으로 합니다. 사용할 수 없는 장치를 명시적으로 지정하면 자동으로 CPU로 전환하는 대신 모델 초기화가 실패합니다. auto는 플랫폼별 제공자 순서와 폴백(fallback)을 Transformers.js에 위임하므로, 유효 백엔드는 호스트나 의존성 버전에 따라 달라질 수 있습니다.

장치 선택은 transformers_local에만 영향을 미치며, 원격 Ollama 및 LM Studio 요청은 이를 무시합니다. GPU 백엔드는 콜드 스타트가 상당히 느릴 수 있으므로 지속적인 MCP 프로세스나 대규모 임베딩 배치에 가장 유용합니다. 장치는 의도적으로 시맨틱 인덱스 계보에서 제외됩니다. 즉, embedding.device만 변경하는 것은 기존 벡터를 만료 처리하지도 않고 재구축을 대기열에 넣지도 않습니다.

제공 모델 예시:

Profile

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 로컬 실행은 검색 명령문을 쿼리에만 적용하고, 풀링에는 마지막으로 주의를 기울인 은닉 상태 토큰을 사용합니다. 모든 제공자는 불완전하거나, 비한정이거나, 0이거나, 차원이 일치하지 않는 배치를 거부합니다. LM Studio 응답 인덱스는 검증되며, 유효한 순서에 벗어난 행은 입력 순서로 복원됩니다. 누락, 중복 또는 잘못된 인덱스는 거부됩니다. 검색 과정에서 이러한 오류는 시맨틱 검색을 명시적으로 저하시키고, 어휘 및 지식 그래프 검색은 그대로 유지됩니다.

세 개의 모델 품질 게이트(three-model quality gate)를 명시적 모델 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>

게이트는 세 번의 실행이 모두 완료되고, 하나 이상의 후보가 .Nomic 메트릭 중 어떤 것도 퇴보시키지 않으면서 Recall\@1/Recall\@5/MRR 임계값을 충족해야 합니다. Nomic은 절대 임계값이 적용되는 후보가 아니라 상대 비교 대상입니다. 두 후보가 모두 자격을 갖추면 명시적인 품질 점수와 안정적인 동점 브레이크 순서가 우선을 결정합니다. 모델 누락, 잘못된 벡터, 적격 후보 없음, 또는 보고서 생성 실패는 0이 아닌 상태로 종료되고 현재 기본값을 유지합니다.

기록된 2026-08-08 LM Studio 실행에서는 ship의 로컬 기본값으로 EmbeddingGemma가 선택되었습니다. EmbeddingGemma와 Qwen3는 모두 Recall\@1 1.00, Recall\@5 1.00, MRR 1.00으로 완료되었으며, Nomic은 0.50, 1.00, 0.7167이었습니다. 두 후보가 자격되었고, EmbeddingGemma는 동등한 품질 스코어 동점에서 안정적인 lexical profile-ID 규칙으로 우승했습니다. 저장된 결정 실행에서의 중앙값 대기 시간은 Nomic 법 190.5ms, EmbeddingGemma 195ms, Qwen3 320.5ms였습니다.

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차원 대신 기본으로 1,024차원 벡터를 사용합니다. 실행기는 운영자를 대신하여 모델 제공자의 모델을 설치하거나 발견하지 않습니다.

더 엄격한 로컬 실행을 원한다면 검색 노이즈를 조절하세요:

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

고급 작업

  • thoth-mem help를 실행하면 전체 CLI 명령 및 옵션 목록이 표시됩니다.

  • 로컬 대시보드는 http://localhost:7438/, OpenAPI 문서는 http://localhost:7438/docs에서 열립니다.

  • 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도 하나의 보존 배치를 내부적으로 바인딩할 수 있습니다. --until-complete를 추가하면 제한된 백로그를 하나의 고정 유효 시점과 후속의 새 지문으로 처리합니다. 외부에서 공급되는 바인딩에는 --expected-fingerprint와 --effective-now가 모두 포함되어야 합니다.

  • compact-database [--data-dir <path>]은 읽기 전용 미리보기를 수행합니다. 수집 가능한 공간 및 용량 추정치를 검토한 후에만 --apply를 추가하세요. --apply는 물리적, 논리적 데이터베이스 크기 중 더 큰 것이 2배만큼의 공간을 요구할 수 있으며, 다른 SQLite 클라이언트에 의해 차단될 수 있고, 무결성, 외래 키, 스키마, 지속 개수(durable-count), WAL 검사가 통과되어야만 성공을 알려줍니다. SQLite가 관리하는 체크포인트(checkpoint)와 VACUUM을 사용하며, 커밋된 압축 이후의 롤백을 보장하지 않습니다.

  • 압축은 절대 자동으로 발생하지 않습니다. 실제 데이터에 압축을 실행하려면 별도의 운영자 승인이 필요하며, 저장소 테스트는 멱러 가능한 데이터베이스만 사용합니다.

  • 저장된 구성과 환경 변수 기반 설정은 config.schema.json에서 확인합니다.

  • 데이터는 기본적으로 ~/.thoth/thoth.db에 위치하며, THOTH_DATA_DIR 또는 --data-dir로 데이터 디렉터리를 재정의할 수 있습니다.

시맨틱 인덱싱은 블로킹되지 않습니다. 콘텐츠 임베딩이나 sqlite-vec을 사용할 수 없는 경우, 지원되는 어휘 및 그래프 증거를 통해 재현(recall)를 사용할 수 있고, 시맨틱 성공 보고 없이 저하된 경로임을 보고합니다.

개발 환경

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