agent-knowledge
agent-knowledge
面向 AI 编码助手的跨会话记忆与召回 —— 开箱即用地支持 Claude Code、Cursor、OpenCode、Cline、Continue.dev 和 Aider。Git 同步的知识库、混合语义 + TF-IDF 搜索、自动蒸馏并清洗机密信息。
基准测试: 在 longmemeval_s 上 R@5 = 97.2%(稀疏)/ 98.8%(混合),在更难的 longmemeval_m 分割上 86.0%(稀疏)/ 88.4%(混合) —— 这是公开的 LongMemEval 学术基准(Wu 等人,2024,ICLR 2025),每个分割 500 个完整问题,无需 LLM、无需 API 密钥,完全离线运行。在与论文的苹果对苹果复现中,R@5 比论文官方 flat-bm25 基线高出 +8.6 到 +13.2 个百分点。完整的按类别表格、复现说明和论文对比细节见 bench/README.md。
为什么
AI 编码会话是短暂的。当会话结束时,它学到的一切——架构决策、调试见解、项目上下文——都消失了。下一个会话从零开始。
agent-knowledge 通过两个互补系统解决这个问题:
知识库 —— 一个 Git 同步的 Markdown 仓库,包含结构化条目(决策、工作流、项目上下文),跨会话和跨机器持久化。
会话搜索 —— 对所有编码工具的会话记录进行 TF-IDF 排序的全文搜索,让代理能够回忆之前发生的事情——无论使用哪个工具。
Related MCP server: Memory-MCP
支持的工具
所有主流 AI 编码助手的会话都会被自动发现——如果安装了某个工具,它的会话会自动出现。
工具 | 格式 | 自动检测路径 |
Claude Code | JSONL |
|
Cursor | JSONL |
|
Codex CLI | JSONL |
|
Aider | Markdown/JSONL |
|
Continue.dev | JSON |
|
Cline | JSON | VS Code globalStorage |
OpenCode | SQLite |
|
无需配置。可以通过 AGENT_KNOWLEDGE_EXTRA_SESSION_ROOTS 环境变量(逗号分隔的路径)添加额外的会话根目录。
功能
与宿主无关的会话搜索 —— 统一搜索所有主流 AI 编码助手(Claude Code、Cursor、Codex CLI、Aider、Continue.dev、Cline、OpenCode)。配置中不硬编码任何宿主名称——适配器注册表在启动时探测已安装的宿主根目录。
混合搜索 —— 语义向量相似度与 TF-IDF 关键词排名混合
Git 同步的知识库 —— 带 YAML frontmatter 的 Markdown 仓库,写入时自动提交并推送
自动过时检测 ——
knowledge_analyze(action: "stale_by_code_activity")将每个条目正文中提到的文件路径与最近会话摘要中的filesModified进行交叉引用。配合符号存在性精确层:检查条目引用的标识符(内联反引号 + 围栏代码块)是否在受影响的文件中;如果仍然存在,置信度下调 ×0.3。带有evergreen: true的条目豁免。搜索缺口跟踪 ——
knowledge_analyze(action: "search_gaps")显示过去since_days内的零结果查询,按 token-Jaccard 相似度分组。这是“接下来应该写什么条目?”的最清晰信号。分区优先级上下文打包器 ——
knowledge(action: "wakeup")在 token 预算内(默认 800,可通过token_budget或AGENT_KNOWLEDGE_WAKEUP_BUDGET覆盖)组装多分区捆绑包(identity→active_tasks→recent_decisions→known_gotchas→last_session_summary→top_weighted→semantic_fallback)。未使用的分区预算会重新分配给后面的分区。评分 + 门控提升器 —— 通过 6 信号加权评分器提升会话洞察,带有三个独立门控(
minScore、minRecallCount、minUniqueQueries)。自动在后台运行,可通过knowledge_admin(action: "promote")按需运行,或通过npm run bench:promote离线基准测试。每次运行都会生成可审计的.dreams/YYYY-MM-DD.md日记。可插拔适配器系统 —— 通过实现
SessionAdapter接口来添加对新工具的支持嵌入 —— 本地(Hugging Face)、OpenAI、Claude/Voyage 或 Gemini 提供商
模糊匹配 —— 使用 Levenshtein 距离的容错搜索
6 种搜索范围 —— 错误、计划、配置、工具、文件、决策
6 个 MCP 工具 —— 统一的基于操作的接口(
knowledge、knowledge_search、knowledge_session、knowledge_graph、knowledge_analyze、knowledge_admin)常青条目 —— frontmatter 中的
evergreen: true使条目在排名中免于衰减,并在提升时仅允许追加。仪表板在这些卡片上显示图钉徽章。作者归属 —— 可选的
author: <string>frontmatter 在每张卡片上显示为弱化的标签。代码图解析 —— 用于代码结构的
calls、imports、inherits边类型;有向 BFS 遍历(outbound/inbound/both);bulk_link用于高效摄取;unlink_by_origin用于在重新摄取前清除过时的代码边;code:前缀的节点 ID 区分代码与知识时间知识图 —— 边支持
valid_from/valid_to有效性窗口;as_of查询返回时间点快照;invalidate操作将事实标记为已结束而不删除它们混合评分提升 —— 在 TF-IDF + 语义混合之上增加专有名词和时间邻近性提升,上限为 +66.7%,无信号时短路
类别作为提升(而非过滤) —— 选择
category_mode: "boost",这样错误的类别猜测会降低排名,而不是丢弃正确答案逐字会话索引 —— 将每条消息的块(≥30 字符)嵌入向量存储,使原始对话可检索;通过
AGENT_KNOWLEDGE_INDEX_VERBATIM=false切换可配置的 Git URL ——
knowledge_admin(action: "config")用于运行时设置,持久化在 XDG/AppData 位置跨机器持久化 —— 知识通过 git 同步,会话从每个工具的本地存储读取
实时仪表板 —— 在
localhost:3423浏览、搜索和管理机密清洗 —— API 密钥、令牌、密码、私钥在 git push 前自动编辑
知识图 —— 条目之间的关系边(related_to、supersedes、depends_on、contradicts、specializes、part_of、alternative_to、builds_on)及 BFS 遍历
置信度/衰减评分 —— 根据访问频率和最近性对条目评分;从候选自动提升到已建立再到已验证
记忆整合 —— 写入时进行 TF-IDF 重复检测(警告相似条目),加上
knowledge_analyze(action: "consolidate")进行批量去重扫描反思循环 ——
knowledge_analyze(action: "reflect")显示未连接的条目,并生成结构化提示,让代理识别新的图连接写入时自动链接 —— 当余弦相似度 > 0.7 时,新条目自动链接到前 3 个相似现有条目
置信度元数据 —— 条目标记为
extracted(用户编写)或inferred(自动蒸馏,0.85× 搜索排名乘数);confidence_score字段携带模型的确定性 0-1知识分析 ——
knowledge_analyze操作god_nodes(连接最多的条目)、bridges(跨类别连接器)、gaps(孤立条目)知识简报 ——
knowledge_analyze(action: "brief")返回缓存的约 200 token 摘要(核心概念、活跃项目、最近决策、过时和缺口计数),用于会话开始时的定向边来源 —— 图边跟踪
origin(manual、auto-link、distill、reflect),以便分析区分用户判断与自动化启发式蒸馏中的确定性预提取 —— 会话摘要现在包括通过正则表达式从 bash/工具输出中提取的 git 提交、错误模式、访问的 URL 和更改的包(无 LLM 成本)
每次搜索命中的新鲜度元数据 —— 每个知识结果都携带
freshness: { body_age_days, last_accessed, access_count, verified_at, verification_age_days, evergreen }。代理读取信任信号并自行决定;我们不施加任何策略降级。按类别衰减窗口 —— “未使用”过滤器和按类型图表遵循按类别阈值(项目 180 天、人员 365 天、决策 90 天、工作流 60 天、笔记 30 天),这样身份类内容不会仅仅因为不是每周重读而显得过时。
生命周期钩子 ——
SessionStart自动唤醒 + 摄取新鲜度检查,UserPromptSubmit首次提示定向注入,PreCompact内存刷新提示 + 蒸馏,SessionEnd蒸馏。共六个钩子脚本,全部故障开放,每个可通过AGENT_KNOWLEDGE_*环境变量切换。参见docs/HOOKS.md。取代宿主自动记忆 —— 在具有每会话记忆系统的宿主上(Claude Code 的
~/.claude/projects/*/memory/,其他 IDE 类似),将持久的用户事实和反馈路由到 agent-knowledge 而不是自动记忆。自动记忆是机器本地的,对其他机器不可见;agent-knowledge 是 git 同步的、跨机器的、可搜索的,并在唤醒时显示。参见docs/USER-MANUAL.md中的 Claude Code 集成说明。
代码库摄取
knowledge-ingest 技能从代码库目录填充或更新知识库。它使用 tree-sitter 进行零 token 的结构提取(类、函数、导入、调用图、原理注释),然后将文件聚类为子系统,并通过现有的 MCP 工具创建知识条目 + 图边。后续运行是增量的——只重新处理更改的文件。
/knowledge-ingest ./my-project使用 Agent Skills 标准 —— 适用于 Claude Code、OpenCode、Cursor、Codex CLI 和 Gemini CLI。详见 摄取指南。
支持的语言: TypeScript、JavaScript、Python、Go、Rust、Java、C、C++。
快速开始
从 npm 安装
npm install -g agent-knowledge或从源码克隆
git clone https://github.com/keshrath/agent-knowledge.git
cd agent-knowledge
npm install && npm run build选项 1:MCP 服务器(用于 AI 代理)
添加到你的 MCP 客户端配置(Claude Code、Cline 等):
{
"mcpServers": {
"agent-knowledge": {
"command": "npx",
"args": ["agent-knowledge"]
}
}
}仪表板在首次 MCP 连接时自动启动于 http://localhost:3423。
参见 设置指南 获取特定客户端的说明(Claude Code、Cursor、Windsurf、OpenCode)。
选项 2:独立服务器(用于 REST/WebSocket 客户端)
node dist/server.js --port 3423MCP 工具(6)
知识库
工具 | 操作 | 描述 | 参数 |
|
| 按分类和/或标签列出条目 |
|
| 读取特定条目 |
| |
| 创建/更新条目(自动 git 同步) |
| |
| 删除条目(自动 git 同步) |
| |
| 手动 git pull + push | -- | |
| 返回 L0 身份 + L1 权重最高的条目(受 token 预算限制) |
|
搜索
工具 | 描述 | 参数 |
| 通用混合 TF-IDF + 语义搜索(无 |
|
限定会话范围的召回(当设置 |
|
响应格式:{mode: "general" | "scoped", sessions, knowledge}。限定范围模式按设计返回 knowledge: []。
范围:errors, plans, configs, tools, files, decisions, all。
搜索调节选项:
mmr: true应用最大边际相关性(Maximal Marginal Relevance)重排序(消除 top-K 中的近似重复簇)。mmr_lambda取值范围 0-1,默认 0.7。category_mode: "boost"(默认)为匹配分类的条目提供 1.25× 的分数乘数,而不是丢弃不匹配的条目。传入"filter"可进行硬过滤。explain: true为每条知识命中附加score_components: {bm25, decay, maturity, confidence, category_boost, mmr_penalty}。
会话
工具 | 操作 | 描述 | 参数 |
|
| 列出带元数据的会话 |
|
| 检索完整会话对话 |
| |
| 会话摘要(主题、工具、文件) |
|
知识图谱
工具 | 操作 | 描述 | 参数 |
|
| 创建/更新条目之间的边 |
|
| 移除条目之间的边 |
| |
| 将边标记为过期(设置 valid_to) |
| |
| 列出边 |
| |
| 从条目进行有向 BFS 遍历 |
| |
| 批量创建边(代码图谱摄取) |
| |
| 按来源删除所有边 |
|
知识类型:related_to, supersedes, depends_on, contradicts, specializes, part_of, alternative_to, builds_on
代码结构类型:calls, imports, inherits
遍历方向:outbound(source→target)、inbound(target→source)、both(默认,无向)
分析
工具 | 操作 | 描述 | 参数 |
|
| 查找近似重复条目 |
|
| 查找未连接的条目以进行链接 |
| |
| 连接最多的条目(度中心性) |
| |
| 跨分类连接器(介数中心性) |
| |
| 按成熟度查找孤立条目(0-1 条边) |
| |
| 缓存的约 200 token 知识库摘要 | -- |
管理
工具 | 操作 | 描述 | 参数 |
|
| 向量存储统计 | -- |
| 查看或更新配置 |
| |
| 重新嵌入所有知识条目(在切换提供商时有用) | -- | |
| 删除磁盘上已不存在会话的嵌入 |
| |
| 回收向量存储中的空闲页 | -- | |
| 带评分和门控的提升器 |
|
评分提升器
每个项目级候选条目基于六个信号进行评分(相关性 0.30、频率 0.24、查询多样性 0.15、时效性 0.15、整合度 0.10、概念丰富度 0.06),并通过 minScore ≥ 0.5、minRecallCount ≥ 2、minUniqueQueries ≥ 2 进行门控。三个门控必须全部通过。后台自动提升由相同的 auto_distill 配置标志控制;可通过 knowledge_admin(action: "promote") 按需调用。
promote_mode: "explain"(默认)— 对候选条目进行评分 + 门控,写入日志,不修改知识库。promote_mode: "apply"— 提升通过的候选条目,写入日志,git 提交。每次运行都会在
~/agent-knowledge/.dreams/YYYY-MM-DD.md中写入每个候选条目的信号分解和门控结果。以.开头的目录由 git 跟踪,但被排除在列表/搜索之外。基于来源的再水合:如果候选条目的源会话文件在磁盘上不再存在,则跳过该候选条目(防止提升已删除的内容)。
带有
evergreen: truefrontmatter 的条目永远不会被提升覆盖 — 活动会被追加。
写入基准测试工具:npm run bench:promote — 离线回放,通过"在后续会话中被引用"自动标注。将门控提升器与朴素的"全部发布"基线进行比较,报告精确率 / 召回率 / F1。在推出信号权重或阈值更改之前,使用它进行门控。
REST API
方法 | 端点 | 描述 |
GET |
| 列出知识条目 |
GET |
| 搜索知识库 |
GET |
| 读取特定条目 |
GET |
| 连接最多的条目 |
GET |
| 跨分类连接器 |
GET |
| 孤立条目 |
GET |
| 知识库摘要 |
GET |
| 列出会话 |
GET |
| 搜索会话(TF-IDF) |
GET |
| 限定范围召回 |
GET |
| 读取会话 |
GET |
| 会话摘要 |
POST |
| 写入条目(HTTP 客户端) |
GET |
| 健康检查 |
架构
graph LR
subgraph Storage
KB[(Knowledge Base<br/>~/agent-knowledge<br/>Git Repository)]
end
subgraph Session Sources
CC[(Claude Code<br/>JSONL)]
CU[(Cursor<br/>JSONL)]
OC[(OpenCode<br/>SQLite)]
CL[(Cline<br/>JSON)]
CD[(Continue.dev<br/>JSON)]
AI[(Aider<br/>MD / JSONL)]
end
subgraph agent-knowledge
KM[Knowledge Module<br/>store / search / git]
AD[Session Adapters<br/>auto-discovery]
SE[Search Engine<br/>TF-IDF + Fuzzy]
DS[Dashboard<br/>:3423]
MCP[MCP Server<br/>stdio]
end
subgraph Clients
AG[Agent Sessions]
WB[Web Browser]
end
KB <-->|git pull/push| KM
CC --> AD
CU --> AD
OC --> AD
CL --> AD
CD --> AD
AI --> AD
AD --> SE
KM --> MCP
SE --> MCP
KM --> DS
SE --> DS
MCP --> AG
DS --> WB知识图谱
条目和代码符号可以通过存储在专用 edges SQLite 表中的类型化、加权边进行连接。支持十一种关系类型 — 8 种用于知识边,3 种用于代码结构:
知识:related_to, supersedes, depends_on, contradicts, specializes, part_of, alternative_to, builds_on
代码结构:calls, imports, inherits
knowledge_graph(action: "link")创建或更新边(可带 0-1 的强度值)knowledge_graph(action: "unlink")移除边(可选按类型过滤)knowledge_graph(action: "list")列出条目或关系类型的边knowledge_graph(action: "traverse")从起始条目执行有向 BFS 遍历。支持direction(outbound、inbound、both)和rel_type过滤器knowledge_graph(action: "bulk_link")在单个事务中批量创建边(用于代码图谱摄取)knowledge_graph(action: "unlink_by_origin")删除具有特定来源的所有边(用于在重新摄取前清除过期的代码边)
代码图谱
代码结构边由 knowledge-ingest 技能在代码库摄取期间创建。它们使用 code: 前缀的节点 ID:
code:src/auth/middleware.ts # file node
code:src/auth/middleware.ts::validateToken # symbol node查询示例:
# Who calls validateToken?
knowledge_graph({ action: "traverse", entry: "code:src/auth.ts::validateToken", direction: "inbound", rel_type: "calls", depth: 3 })
# What breaks if I change this function?
knowledge_graph({ action: "traverse", entry: "code:src/auth.ts::validateToken", direction: "inbound", rel_type: "calls", depth: 5 })
# Combined: callers + knowledge context (decisions, design rationale)
knowledge_graph({ action: "traverse", entry: "code:src/auth.ts::validateToken", depth: 2 })自动链接
当 knowledge 以 action: "write" 创建或更新条目时,它会自动通过余弦相似度找到最相似的 3 个现有条目,并为任何得分高于 0.7 的配对创建 related_to 边。
置信度与衰减评分
每个知识条目都有一个置信度分数,跟踪在 entry_scores SQLite 表中。搜索结果使用以下公式排名:
finalScore = baseRelevance * 0.5^(daysSinceLastAccess / 90) * maturityMultiplier条目根据访问次数自动成熟:
阶段 | 访问次数 | 倍数 |
| < 5 | 0.5x |
| 5-19 | 1.0x |
| 20+ | 1.5x |
频繁访问的条目在搜索排名中会上升;过时的条目会随时间衰减。
搜索能力
TF-IDF 排名 —— 结果按词频-逆文档频率(term frequency-inverse document frequency)评分。稀有词会提升相关性。全局索引缓存 60 秒。
模糊匹配 —— 基于 Levenshtein 编辑距离的滑动窗口匹配。阈值可配置(默认 0.7)。
作用域召回 —— 通过 knowledge_search 的 scope 参数实现:
作用域 | 匹配内容 |
| 堆栈跟踪、异常、失败的命令 |
| 架构、待办事项、实现步骤 |
| 设置、环境变量、配置文件 |
| MCP 工具调用、CLI 命令 |
| 文件路径、修改 |
| 权衡、理由、选择 |
集成
REST 写入端点
POST /api/knowledge 接受 { category, filename, content } 并运行完整的写入流水线:git pull → 文件写入 → 嵌入索引 → 自动链接 → git push → 重复检查。返回 { path, autoLinks?, duplicateWarnings?, git },状态码为 201。
这使得其他服务无需 MCP 连接即可通过 HTTP 进行写入。
agent-tasks KnowledgeBridge
agent-tasks 内置了 KnowledgeBridge,会在任务完成时自动将 learning 和 decision 工件推送到 agent-knowledge。条目会落入 decisions/ 目录并带有 frontmatter 标签(agent-tasks、项目名称、工件类型),自动进行嵌入索引,并自动链接到相似条目。无需配置——只要 agent-knowledge 运行在 localhost:3423,即可正常工作。
测试
npm test # 563 tests across 35 files
npm run test:watch # Watch mode
npm run lint # ESLint on src/ and tests/
npm run typecheck # tsc --noEmit
npm run check # typecheck + lint + format + test环境变量
所有环境变量均以 AGENT_KNOWLEDGE_* 前缀命名。没有硬编码的主机名——适配器注册表会自动检测已安装的 AI 编码主机(.claude、.cursor、.codex、.aider、.continue、OpenCode),无需配置。
核心
变量 | 默认值 | 描述 |
|
| Git 同步的知识库目录 |
| -- | Git 远程仓库 URL(若目录不存在则自动克隆) |
|
| 自动将会话洞察提炼到知识库中 |
|
| 将原始会话消息块索引到向量存储中,以便后续可检索会话内容。在规模较大时设为 |
| (平台配置) | 覆盖主主机数据根目录。常规情况下保持未设置——适配器会自动检测 |
| -- | 额外的会话目录,以逗号分隔。会添加到自动检测到的结果之上。 |
|
| 仪表板 HTTP/WebSocket 端口 |
嵌入
变量 | 默认值 | 描述 |
|
|
|
|
| TF-IDF 与语义混合权重( |
| -- | 覆盖提供商的默认模型 |
|
| 卸载本地模型前的空闲秒数( |
| (自动) | 本地提供商的 ONNX / OMP 线程数 |
API 密钥
项目级覆盖优先于标准密钥。设置任一即可;项目级形式允许你使用与环境中其他部分不同的密钥来运行 agent-knowledge。
变量 | 回退 | 描述 |
|
| OpenAI 嵌入 |
|
| Claude / Voyage 嵌入 |
|
| Gemini 嵌入 |
钩子
变量 | 默认值 | 描述 |
|
| 自动将 |
|
| 唤醒包的令牌数 |
|
| 在首个用户提示上执行定向 |
|
| 首提示注入的令牌数(限制在 |
|
| 附加到首提示的最大知识命中数(限制在 |
|
| 在预压缩之前,提示代理通过 |
外部工具覆盖
变量 | 默认值 | 描述 |
|
| 覆盖 OpenCode 会话数据库的存储位置(OpenCode 自身的环境变量,我们的适配器会予以识别) |
文档
设置指南 —— 安装、客户端设置(Claude Code、OpenCode、Cursor、Windsurf)、钩子、技能
摄取指南 —— 代码库摄取技能、tree-sitter 提取、增量更新
架构 —— 源码结构、设计原则、数据库模式
仪表板 —— Web UI 视图与功能
许可证
Available Tools
6 toolsknowledgeA
Knowledge base CRUD, sync, and session-start hydration. Actions: "list" (browse entries), "read" (get entry content), "write" (create/update entry, auto git sync), "delete" (remove entry, auto git sync), "sync" (manual git pull + push), "wakeup" (return token-budgeted section-priority context bundle — identity, active_tasks, recent_decisions, known_gotchas, last_session_summary, top_weighted, semantic_fallback — call once at session start).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter by tag (action=list) | |
| path | No | Relative path to the entry, e.g. 'projects/my-project.md' (action=read, delete) | |
| action | Yes | Action to perform | |
| content | No | Full markdown content for the entry (action=write) | |
| category | No | Category (action=list: filter; action=write: target directory). One of: projects, people, decisions, workflows, notes | |
| filename | No | Filename with or without .md extension (action=write), e.g. 'my-project.md' | |
| sections | No | [wakeup] Comma-separated, ordered section list. Valid: identity, active_tasks, recent_decisions, known_gotchas, last_session_summary, top_weighted, semantic_fallback. Default: all seven in that order. Omit to preserve v1.8.0 behaviour. | |
| token_budget | No | [wakeup] Max tokens to render (chars/4 estimate, default 800) | |
| section_budgets | No | [wakeup] Per-section token-budget overrides, e.g. {"identity": 200, "top_weighted": 400}. Unspecified sections split the remainder evenly. Unused budget redistributes to later sections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden — and it does disclose meaningful side effects: write/delete trigger auto git sync, sync is a manual git pull+push, and wakeup returns a token-budgeted section-priority bundle. This is solid disclosure for a mutation-capable tool; it only omits reversibility (e.g., whether delete is recoverable from git history) and confirmation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the content is dense and informative, but it is presented as one long run-on sentence without line breaks or structural separation, making the six actions and their caveats harder to parse at a glance. Fewer words could be used; the parentheticals are useful but poorly delimited.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool (9 params, 6 actions, enums, nested objects) with no output schema, the description explains wakeup's return bundle but not the return values for the other five actions (e.g., what list returns, what read returns on success/failure). The schema covers parameter semantics well, but the absence of output descriptions for the remaining actions leaves gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already documents all nine parameters with action-scoped descriptions. The description adds value on top by explaining wakeup semantics — section ordering, defaults, budget behavior — but does not substantially enrich the other parameters beyond what the schema states. A baseline of 3 is appropriate given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear purpose ('Knowledge base CRUD, sync, and session-start hydration') and enumerates six concrete actions with brief one-line definitions. It implicitly distinguishes from siblings (search, graph, analyze) by being the CRUD/sync/wakeup orchestrator, though it never names the siblings or their differing responsibilities explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is conveyed per-action ('call once at session start' for wakeup, 'auto git sync' for write/delete) and the verb definitions imply when each is appropriate. However, with five siblings present, there is no explicit when-to-use-versus-alternative guidance (e.g., when to prefer knowledge_search over this tool's list action), and no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_adminB
Admin operations: view vector store stats, view/update configuration, rebuild embeddings, prune orphan session embeddings, or VACUUM the database. Use action "status" for index stats, "config" to view or update settings, "rebuild_embeddings" to re-embed all knowledge entries (useful when switching providers), "prune_orphans" to delete embeddings for sessions no longer present on disk, "vacuum" to reclaim free pages.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action: status (vector store stats), config (view/update settings), rebuild_embeddings (re-embed all entries), prune_orphans (delete embeddings for missing sessions), vacuum (reclaim free pages), promote (run the scored promoter — see promote_mode) | |
| vacuum | No | Run VACUUM after pruning (action=prune_orphans, default true) | |
| git_url | No | Git remote URL (action=config). Set to empty string to remove. | |
| min_score | No | [promote] Minimum composite score to promote (default: 0.5). | |
| memory_dir | No | Local knowledge base directory (action=config). Empty to reset. | |
| auto_distill | No | Enable/disable scheduled promotion (action=config) | |
| force_vacuum | No | Run VACUUM even if no orphans were pruned (action=prune_orphans) | |
| promote_mode | No | action=promote mode (default: explain). "explain" returns score breakdowns without writing; "apply" promotes candidates that pass all gates. | |
| min_recall_count | No | [promote] Minimum recall count gate (default: 2). | |
| min_unique_queries | No | [promote] Minimum unique-query gate (default: 2). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it does disclose destructive effects for prune_orphans ('delete embeddings') and vacuum ('reclaim free pages'). However, it understates rebuild_embeddings' destructive rewriting of existing embeddings, and it completely omits the 'promote' action's behavior (apply vs explain modes, write behavior vs read-only). For a tool with several destructive operations, the disclosure is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operations are front-loaded in the opening sentence, with each action's purpose expanded in a single subsequent sentence. The structure is efficient and scannable. Minor deduction for the slightly run-on single-sentence expansion and for leaving out promote, which makes the list feel incomplete rather than intentionally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex admin tool with 10 parameters, 6 actions, no output schema, and no annotations, the description should be comprehensive — but it covers only 5 of 6 actions and omits the entire promote workflow with its 4 dedicated parameters (promote_mode, min_score, min_recall_count, min_unique_queries). An agent reading only the description would never learn a whole callable mode exists, which is a significant completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 10 parameters, giving a baseline of 3. The description adds marginal value by linking rebuild_embeddings to the provider-switching use case, but it adds no semantics beyond the schema for the config params (git_url, memory_dir, auto_distill) and leaves the promote-related parameters entirely unexplained in prose despite them being a substantial cluster of the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear purpose — administrative operations on the knowledge/vector store — and enumerates five concrete actions (status, config, rebuild_embeddings, prune_orphans, vacuum) with their effects. It clearly distinguishes itself from the read/search siblings. However, it silently omits the 'promote' action that exists in the schema enum, and the umbrella phrase 'Admin operations' is vague until the action list clarifies it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives actionable when-to-use context for rebuild_embeddings ('useful when switching providers') and explains what each action accomplishes, which implicitly routes the agent to the right action. But it provides no guidance for the 'promote' action (its dedicated params min_score, min_recall_count, min_unique_queries, promote_mode are never narrated), and it never states when NOT to use the tool or how it differs from siblings beyond 'admin' framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_analyzeA
Analysis tools: find duplicates, unconnected entries, most-connected concepts (god nodes), bridge entries, knowledge gaps, zero-result search queries, stale-by-code-activity entries, or generate a compact knowledge brief. Actions: consolidate, reflect, god_nodes, bridges, gaps, brief, search_gaps, stale_by_code_activity.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | Number of results (action=god_nodes default: 10, action=bridges default: 5) | |
| action | Yes | Action: consolidate (find duplicates), reflect (find unconnected entries), god_nodes (most-connected entries), bridges (cross-cluster connectors), gaps (entries with 0-1 edges), brief (compact knowledge base summary), search_gaps (zero-result knowledge_search queries grouped by similarity — the single best signal for "what entries should I write next?"), stale_by_code_activity (entries whose referenced file paths were modified in recent sessions after the entry body was last edited — automatic staleness signal, v1.8.1). | |
| category | No | Scan only this category (omit for all) | |
| min_count | No | [search_gaps] Minimum occurrence count per merged group (default: 1). Raise to surface only repeated misses. | |
| threshold | No | Similarity threshold 0-1 (action=consolidate, default: 0.5) | |
| since_days | No | [search_gaps] Lookback window in days (default: 30). Only queries logged within this window are considered. | |
| max_entries | No | Max unconnected entries to include (action=reflect, default: 20) | |
| group_similarity | No | [search_gaps] Jaccard token similarity threshold for merging near-duplicate queries (default: 0.35, range 0-1). Low because short queries yield low Jaccard even when topically related. | |
| min_touching_sessions | No | [stale_by_code_activity] Minimum distinct sessions that must have modified one of the entry's referenced files for it to be flagged (default: 1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears the full disclosure burden, yet it is internally contradictory on the consolidate action: the verb implies merging/mutation while the gloss '(find duplicates)' implies read-only discovery. There is no statement about whether any action mutates entries, what output shape results, or performance implications — a real gap for a multi-action analysis tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the whole description runs roughly 60 words with no filler. The trailing 'Actions:' enumeration is partially redundant with the schema enum but serves as a useful name→semantic mapping, earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool — 9 parameters, 8 actions, no output schema, no annotations. All action semantics are enumerated, but the description is silent on per-action return formats and on whether any action (notably consolidate) has side effects, both material for an analysis surface of this breadth.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema's parameter descriptions are unusually rich (per-action defaults, the Jaccard rationale for group_similarity, min_count semantics). The tool description adds little beyond re-listing action names, so the schema-carrying baseline of 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates eight distinct analyses with denotative glosses (duplicates, unconnected entries, god nodes, bridges, gaps, zero-result queries, stale-by-code-activity, brief), clearly binding the tool to knowledge-base entry analysis. This differentiates it from siblings like knowledge_search (querying) and knowledge_admin (admin actions) without needing to open a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action carries clear context, e.g., 'gaps (entries with 0-1 edges)', 'bridges (cross-cluster connectors)', and search_gaps is explicitly framed as 'the single best signal for what entries should I write next?'. Missing, however, are explicit when-not or alternative statements that route selection against sibling tools at the tool level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_graphB
Knowledge graph operations with temporal validity and code structure support. Create/remove edges, traverse via directed BFS, bulk-import code graph edges. Relationship types: related_to, supersedes, depends_on, contradicts, specializes, part_of, alternative_to, builds_on, calls, imports, inherits. Code structure types (calls/imports/inherits) are created by knowledge-ingest and use "code:" prefixed node IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ISO date — only return edges valid at this date (action=list/traverse, optional) | |
| depth | No | Max traversal depth in hops (action=traverse, default: 2) | |
| edges | No | Array of edges to create (action=bulk_link). Each: { source, target, rel_type, strength?, origin? } | |
| entry | No | Entry path for filtering (action=list) or BFS start (action=traverse) | |
| action | Yes | Action: link (create edge), unlink (remove edge), invalidate (set valid_to), list (list edges), traverse (directed BFS), bulk_link (batch-create edges), unlink_by_origin (delete all edges from a specific origin) | |
| origin | No | Edge origin to delete (action=unlink_by_origin). E.g. "tree-sitter" to clear code graph before re-ingest. | |
| source | No | Source entry path (action=link/unlink/invalidate), e.g. 'projects/my-project.md' | |
| target | No | Target entry path (action=link/unlink/invalidate), e.g. 'decisions/architecture.md' | |
| rel_type | No | Relationship type (required for link, optional filter for unlink/invalidate/list) | |
| strength | No | Edge strength 0-1 (action=link, default: 0.5) | |
| valid_to | No | ISO date the fact stopped being true (action=link/invalidate). For invalidate, defaults to today. | |
| direction | No | Traversal direction (action=traverse, default: both). outbound: follow source→target (what does X call?). inbound: follow target→source (who calls X?). both: undirected (default, preserves legacy behavior). | |
| valid_from | No | ISO date the fact became true (action=link, optional). Null/omitted = unbounded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses temporal validity and that code structure edges are created by knowledge-ingest, which is useful. However, it does not warn about destructive side effects of unlink/invalidate or the scope of bulk operations, leaving behavioral uncertainty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise, using three sentences to cover operations, relationship types, and code structure nuance. It could tighten by omitting the redundant relationship list from the enum, but it remains front-loaded and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is present, and the description does not describe return values for actions like list or traverse. It also omits details about state mutations (e.g., irreversibility of unlink). Given the tool's complexity and no annotations, this is a significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds minimal value: it re-lists relationship types (already in the enum) and notes the 'code:' prefix for node IDs. It does not explain parameter interactions beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs knowledge graph operations: create/remove edges, traverse via BFS, bulk-import code edges. It also lists relationship types and code structure specifics. However, it does not explicitly contrast with sibling tools like knowledge_search or knowledge_analyze, so differentiation relies on the implicit 'graph' focus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus siblings. It does not mention when not to use it, nor does it reference alternative tools. The code structure note implies a use case, but there is no clear routing or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_searchA
Search across sessions AND knowledge entries. Returns {mode, sessions, knowledge}. General mode (no scope): hybrid TF-IDF + semantic over both sources, with optional MMR diversity and category boost. Scoped mode (scope set): sessions-only filtered recall for a specific domain (errors, plans, configs, tools, files, decisions).
| Name | Required | Description | Default |
|---|---|---|---|
| mmr | No | Apply Maximal Marginal Relevance re-ranking to knowledge results (default: false). Trades a small amount of top-1 relevance for diversity in the top-K. | |
| role | No | Filter by message role (default: all, ignored when scope is set) | |
| query | Yes | Search query -- supports keywords and phrases | |
| scope | No | Search scope (optional): errors (stack traces), plans (architecture, TODOs), configs (settings, env vars), tools (MCP tool calls), files (file paths, code refs), decisions (trade-offs, choices), all (no filter). When set, response mode switches to "scoped" and results are sessions-only. | |
| ranked | No | Use TF-IDF ranking (default: true, ignored when scope is set). Set false for regex mode. | |
| explain | No | When true, each knowledge hit carries `score_components` (bm25, decay, maturity, confidence, category_boost, mmr_penalty). | |
| project | No | Restrict search to sessions from this project | |
| category | No | Knowledge category hint (optional). By default applied as a boost (non-matching kept, matching +25%). Pass category_mode="filter" for the legacy hard-filter behavior. | |
| semantic | No | Blend semantic vector similarity with TF-IDF (default: true). Falls back to pure TF-IDF if embeddings unavailable. | |
| mmr_lambda | No | MMR tradeoff 0-1 (default: 0.7). 1.0 = pure relevance; 0.0 = pure diversity. | |
| max_results | No | Maximum number of results to return (default: 20) | |
| category_mode | No | How `category` is applied to knowledge results (default: "boost"). "boost" keeps all entries but gives matching-category entries a 25% score boost; "filter" restricts to matching category only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure, and it excels. It reveals the return shape ({mode, sessions, knowledge}), explains the hybrid ranking (TF-IDF + semantic), discloses fallback behavior (pure TF-IDF if embeddings unavailable), details the boost/filter semantics of category, and even mentions the 'score_components' breakdown when explain=true. This is comprehensive transparency for a read-only search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it leads with the core action and return format, then systematically explains the two modes and key behaviors. Every sentence adds distinct information (modes, ranking, fallback, category handling) with no filler. It is long, but each phrase earns its place given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 12 parameters, 4 enums, and no output schema, the description covers the critical decision points: mode selection, source scope, ranking approach, category application, and MMR parameter meaning. It explains the return envelope and the score breakdown for explain mode. No essential usage context appears missing; the schema handles parameter-level details, and the description supplies the higher-level orchestration model.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter is already described. The description adds meaningful context beyond the schema by explaining how scope switches modes, how category boost/filter interacts with category_mode, the MMR tradeoff (lambda 1.0 = pure relevance, 0.0 = diversity), and that 'role' is ignored in scoped mode. This is valuable semantic glue, though it doesn't cover every parameter explicitly – some are only in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search across sessions AND knowledge entries.' It immediately clarifies the dual-source nature and then distinguishes two modes (general vs. scoped) with clear scope semantics. This cleanly differentiates it from sibling tools like knowledge_session or knowledge_graph, which are likely more specialized.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use general mode (no scope) vs. scoped mode ('scope' set), including that scoped mode is sessions-only and filtered by domain. It mentions the behavior of parameters like 'role' being ignored when scope is set. However, it does not name any sibling tools as alternatives or give exclusion conditions, so the guidance is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
knowledge_sessionA
Session operations: list sessions, get a full conversation, or get a summary. Use action "list" to browse sessions, "get" to retrieve messages, "summary" for a quick overview.
| Name | Required | Description | Default |
|---|---|---|---|
| tail | No | Only return the last N messages (action=get) | |
| limit | No | Max sessions to return (action=list, default: 20, max: 500) | |
| action | Yes | Action to perform | |
| offset | No | Skip first N sessions (action=list, default: 0) | |
| project | No | Filter by project name (substring match) | |
| session_id | No | Session UUID (required for get, summary) | |
| include_tools | No | Include tool_use and tool_result messages (action=get, default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It states the actions but does not mention whether operations are read-only, side effects, required permissions, error behavior (e.g., invalid session_id), or any rate limits. For a tool with three read-like actions, this is a notable gap; the agent is left to infer safety and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with zero waste. It front-loads the core concept 'Session operations' and immediately explains the three actions. Every sentence contributes to understanding the tool, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides enough to invoke the tool correctly for the three actions, but it omits the response format entirely. Since there is no output schema, the agent is unaware of what each action returns (e.g., list returns an array, get returns messages). For a multi-action tool, this is a moderate gap, though the actions are simple enough that an agent might infer typical behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All seven parameters are fully described in the schema (100% coverage), so the schema carries the heavy lifting. The description adds context for how the action parameter drives behavior (list vs get vs summary) and clarifies the purpose of some parameters indirectly (e.g., tail for get, limit for list), but it does not add new semantic detail beyond the schema. This aligns with the coverage baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Session operations: list sessions, get a full conversation, or get a summary.' It identifies three distinct actions (list, get, summary) and explicitly differentiates from sibling tools by focusing on session operations, which none of the sibling names (knowledge, knowledge_search, knowledge_admin, knowledge_graph, knowledge_analyze) cover.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides per-action guidance: 'Use action list to browse sessions, get to retrieve messages, summary for a quick overview.' This clarifies when to use each action, but it does not mention when to favor this tool over siblings such as knowledge_search or knowledge_analyze. There is no explicit exclusion or alternative routing at the tool level, though the action-level guidance is useful.
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.
6 tool updates
v1.9.7- First observed
knowledge - First observed
knowledge_admin - First observed
knowledge_analyze - First observed
knowledge_graph - First observed
knowledge_search - First observed
knowledge_session
TDQS
Scored across 6 tools
Each tool targets a distinct functional domain: CRUD operations, cross-source search, session management, admin/maintenance, graph relationships, and analysis/insights. The action-based sub-operations are clearly scoped, and there is no meaningful overlap between tools.
All tool names follow the consistent pattern `knowledge_<verb_noun>` using snake_case throughout. The naming convention is uniform, with descriptive suffixes (search, session, admin, graph, analyze) that clearly differentiate purposes.
Six tools is an ideal count for a knowledge-management server. Each tool encapsulates a distinct set of related operations (CRUD, search, sessions, admin, graph, analysis), providing comprehensive functionality without overwhelming the agent.
The toolset covers the full lifecycle of a knowledge base: creating/reading/updating/deleting entries, searching across sessions and entries, managing session history, performing administrative tasks (embeddings, vacuum), maintaining knowledge graph relationships, and deriving analytical insights. No obvious gaps exist; even advanced features like bulk graph import and orphan pruning are included.
Maintenance
Related MCP Connectors
Shared memory for coding agents. Stop re-explaining your codebase every session.
- EngramOAuthtools.engram
Memory for AI agent teams across tools, sessions, repositories, and teammates.
Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceProvides persistent memory for AI coding assistants, storing and retrieving architectural decisions, patterns, and solutions across sessions using semantic search, while also offering git integration for commit messages and code expertise mapping.MIT- AlicenseAqualityDmaintenanceProvides persistent memory for AI agents using hybrid search (vector embeddings + BM25) with neural reranking, enabling storage and retrieval of insights, debugging solutions, and patterns across coding sessions.8MIT
- AlicenseNot gradedqualityDmaintenanceProvides AI coding assistants with persistent, context-rich memory of a codebase, including documentation and git history, enabling recall across sessions.105Apache 2.0
- AlicenseNot gradedqualityBmaintenanceProvides persistent, searchable memory and knowledge capture for AI-assisted development, enabling agents to retain decisions, bugs, and patterns across sessions and projects.MIT