smart_brain 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/MEMPAL_GUIDE.md +1074 -0
  4. data/README.en.md +173 -173
  5. data/README.md +467 -173
  6. data/config/brain.yml +69 -1
  7. data/conversation_demo.rb +438 -438
  8. data/db/migrate/002_turn_events_payload.sql +9 -0
  9. data/db/migrate/003_tiers_and_lifecycle.sql +28 -0
  10. data/db/migrate/004_kg_edges.sql +30 -0
  11. data/db/migrate/005_domains_and_memory_scopes.sql +163 -0
  12. data/docs/coding_todo.md +139 -0
  13. data/docs/context_package.md +220 -0
  14. data/docs/evidence_pack.md +190 -0
  15. data/docs/gap_vs_mempal.md +161 -0
  16. data/docs/mcp.md +93 -0
  17. data/docs/memory_types.md +278 -0
  18. data/docs/multi_scope_memory_refactor_plan.md +483 -0
  19. data/docs/multi_scope_migration.md +65 -0
  20. data/docs/policies.md +308 -0
  21. data/docs/retrieval_plan.md +231 -0
  22. data/docs/smartbrain_design.md +299 -0
  23. data/docs/user_guide.md +546 -0
  24. data/example.rb +91 -91
  25. data/examples/01_memory_basic.rb +57 -0
  26. data/examples/02_governance.rb +63 -0
  27. data/examples/03_postgres_persistence.rb +63 -0
  28. data/examples/04_ollama_llm.rb +69 -0
  29. data/examples/05_smart_rag_integration.rb +79 -0
  30. data/examples/06_multi_scope_memory.rb +50 -0
  31. data/examples/README.md +49 -0
  32. data/exe/smart_brain +168 -0
  33. data/lib/smart_brain/adapters/smart_rag/direct_client.rb +16 -5
  34. data/lib/smart_brain/adapters/smart_rag/http_client.rb +16 -5
  35. data/lib/smart_brain/adapters/smart_rag/null_client.rb +7 -2
  36. data/lib/smart_brain/adapters/smart_rag/scope_filter.rb +60 -0
  37. data/lib/smart_brain/configuration.rb +57 -0
  38. data/lib/smart_brain/consolidator/working_summary.rb +80 -12
  39. data/lib/smart_brain/context_composer/composer.rb +40 -3
  40. data/lib/smart_brain/contracts/retrieval_plan.rb +10 -0
  41. data/lib/smart_brain/contracts/scope_context.rb +46 -0
  42. data/lib/smart_brain/contracts/scope_ref.rb +25 -0
  43. data/lib/smart_brain/db.rb +109 -0
  44. data/lib/smart_brain/event_store/in_memory.rb +6 -2
  45. data/lib/smart_brain/event_store/postgres.rb +199 -0
  46. data/lib/smart_brain/fusion/merger.rb +31 -2
  47. data/lib/smart_brain/governance/briefing.rb +146 -0
  48. data/lib/smart_brain/governance/fact_check.rb +110 -0
  49. data/lib/smart_brain/governance/knowledge_graph.rb +60 -0
  50. data/lib/smart_brain/governance/lifecycle.rb +225 -0
  51. data/lib/smart_brain/governance/tiers.rb +60 -0
  52. data/lib/smart_brain/memory_extractor/extractor.rb +25 -7
  53. data/lib/smart_brain/memory_store/in_memory.rb +202 -17
  54. data/lib/smart_brain/memory_store/postgres.rb +500 -0
  55. data/lib/smart_brain/model_provider/base.rb +87 -0
  56. data/lib/smart_brain/model_provider/factory.rb +49 -0
  57. data/lib/smart_brain/model_provider/ollama.rb +60 -0
  58. data/lib/smart_brain/model_provider/openai.rb +60 -0
  59. data/lib/smart_brain/model_provider/stub.rb +26 -0
  60. data/lib/smart_brain/model_provider.rb +7 -0
  61. data/lib/smart_brain/observability/tracker.rb +39 -1
  62. data/lib/smart_brain/retrievers/exact_retriever.rb +6 -0
  63. data/lib/smart_brain/retrievers/memory_retriever.rb +59 -5
  64. data/lib/smart_brain/runtime.rb +288 -16
  65. data/lib/smart_brain/scopes/conflict_resolver.rb +67 -0
  66. data/lib/smart_brain/scopes/registry.rb +133 -0
  67. data/lib/smart_brain/scopes/resolver.rb +32 -0
  68. data/lib/smart_brain/server/http_app.rb +143 -0
  69. data/lib/smart_brain/server/mcp_server.rb +385 -0
  70. data/lib/smart_brain/server/service.rb +129 -0
  71. data/lib/smart_brain/support/levenshtein.rb +35 -0
  72. data/lib/smart_brain/version.rb +5 -5
  73. data/lib/smart_brain.rb +80 -35
  74. metadata +88 -36
@@ -0,0 +1,190 @@
1
+ ## 1. 目的
2
+
3
+ EvidencePack 用于将一次检索的结果,以**可复现、可解释、可融合**的方式返回给 SmartBrain,避免:
4
+ - 只返回片段文本,无法追溯来源与评分构成
5
+ - 多模式检索融合过程不可观测,难以调试/评估
6
+ - 跨源融合(memory vs resource)时缺少统一格式
7
+
8
+ EvidencePack 不包含“最终 prompt”,只包含候选证据与必要的元信息。
9
+
10
+ ---
11
+
12
+ ## 2. 顶层结构
13
+
14
+ ```json
15
+ {
16
+ "version": "0.1",
17
+ "plan": { },
18
+ "plan_id": "uuid",
19
+ "request_id": "uuid",
20
+ "generated_at": "2026-02-20T12:00:00Z",
21
+
22
+ "evidences": [],
23
+ "stats": { },
24
+ "explain": { },
25
+ "warnings": []
26
+ }
27
+ ```
28
+
29
+ 字段说明:
30
+
31
+ * `version`:协议版本(必填)
32
+ * `plan`:原始 RetrievalPlan(可选但强烈建议保留,用于复现)
33
+ * `plan_id`:执行方生成的唯一 id(建议必填)
34
+ * `request_id`:来自 RetrievalPlan.request_id(建议必填)
35
+ * `generated_at`:生成时间(必填)
36
+ * `evidences`:证据列表(必填,可能为空)
37
+ * `stats`:执行统计(候选数、耗时、返回数等)
38
+ * `explain`:融合/重排/过滤的解释信息(强烈建议)
39
+ * `warnings`:忽略字段、降级策略等提示(可选)
40
+
41
+ ---
42
+
43
+ ## 3. EvidenceItem 结构
44
+
45
+ ```json
46
+ {
47
+ "id": "string",
48
+ "kind": "resource_section|resource_doc|memory_chunk|other",
49
+
50
+ "document_id": "string",
51
+ "section_id": "string",
52
+
53
+ "title": "string",
54
+ "source_uri": "string",
55
+ "source_type": "url|file|manual|memory_snapshot|other",
56
+
57
+ "snippet": "string",
58
+ "snippet_policy": "l2|l1|l0|auto",
59
+ "language": "zh|en|other",
60
+
61
+ "signals": {
62
+ "vector_score": 0.0,
63
+ "vector_rank": 0,
64
+ "fts_score": 0.0,
65
+ "fts_rank": 0,
66
+ "rrf_score": 0.0,
67
+ "rerank_score": 0.0,
68
+ "tag_score": 0.0,
69
+ "topic_score": 0.0,
70
+ "recency_score": 0.0
71
+ },
72
+
73
+ "provenance": {
74
+ "mode": "exact|semantic|hybrid|relational|associative",
75
+ "query_text": "string",
76
+ "query_index": 0,
77
+ "retrieved_at": "2026-02-20T12:00:00Z"
78
+ },
79
+
80
+ "metadata": {
81
+ "chunk_index": 12,
82
+ "offset_start": 1234,
83
+ "offset_end": 1567,
84
+ "page": 3,
85
+ "section_title": "string"
86
+ },
87
+
88
+ "raw": {
89
+ "content_ref": "section:l2",
90
+ "content_hash": "sha256:...",
91
+ "debug_payload": { }
92
+ }
93
+ }
94
+ ```
95
+
96
+ ### 3.1 必填字段(v0.1 最低要求)
97
+
98
+ * `id`
99
+ * `source_uri`
100
+ * `snippet`
101
+ * `provenance.mode`
102
+ * `signals` 至少包含:`rrf_score`(若使用融合)或 `vector_score/fts_score` 之一
103
+ * `generated_at`(在顶层)
104
+
105
+ ### 3.2 推荐字段
106
+
107
+ * `document_id/section_id`:用于去重与回源
108
+ * `signals` 全量:用于解释与回归评估
109
+ * `metadata`:用于展示与定位(标题、页码、chunk 位置)
110
+ * `plan`:用于复现
111
+
112
+ > 说明:如果某些字段后端暂不支持,应置空/省略,并在 `warnings` 或 `explain.ignored_fields` 中说明。
113
+
114
+ ---
115
+
116
+ ## 4. stats(统计)
117
+
118
+ ```json
119
+ {
120
+ "candidates": 200,
121
+ "returned": 30,
122
+ "took_ms": 128,
123
+ "by_mode": {
124
+ "exact": { "candidates": 50, "returned": 10 },
125
+ "semantic": { "candidates": 100, "returned": 10 },
126
+ "hybrid": { "candidates": 200, "returned": 30 }
127
+ }
128
+ }
129
+ ```
130
+
131
+ ---
132
+
133
+ ## 5. explain(解释)
134
+
135
+ ```json
136
+ {
137
+ "fusion": {
138
+ "method": "rrf|weighted_sum|none",
139
+ "rrf_k": 60,
140
+ "weights": { "exact": 1.0, "semantic": 1.0 }
141
+ },
142
+ "rerank": { "enabled": true, "model": "qwen3-reranker", "top_n": 50 },
143
+ "filters_applied": {
144
+ "tag_ids": ["..."],
145
+ "topic_ids": ["..."],
146
+ "time_range": { "from": "...", "to": "..." }
147
+ },
148
+ "diversity": {
149
+ "by_document": 3,
150
+ "by_source": 10,
151
+ "applied": true
152
+ },
153
+ "ignored_fields": [
154
+ "global_filters.language not supported",
155
+ "diversity.by_source not supported"
156
+ ]
157
+ }
158
+ ```
159
+
160
+ 说明:
161
+
162
+ * `filters_applied`:最终实际生效的过滤条件(非常重要)
163
+ * `ignored_fields`:执行方未支持字段,必须显式说明,方便调用方调整策略
164
+
165
+ ---
166
+
167
+ ## 6. warnings(可选)
168
+
169
+ `warnings` 是字符串数组,用于快速提示调用方问题,例如:
170
+
171
+ * `time_range filter ignored due to missing created_at index`
172
+ * `rerank disabled because model not configured`
173
+
174
+ ---
175
+
176
+ ## 7. 去重与稳定性建议(给执行方)
177
+
178
+ 为了让 SmartBrain 可靠装配上下文,SmartRAG(执行方)建议:
179
+
180
+ * `id` 稳定可重现(例如 `doc_id:section_id:chunk_index`)
181
+ * 对相同 section 的不同 query 命中:保留最高分,并在 provenance 中记录最强来源(或保留多个 provenance)
182
+ * `snippet` 应受 `output.max_snippet_chars` 约束,避免塞爆 token
183
+ * 返回顺序应是“最终排序结果顺序”(已融合/已 rerank)
184
+
185
+ ---
186
+
187
+ ## 8. 版本与兼容
188
+
189
+ * v0.1:新增字段仅可选;执行方忽略未知字段
190
+ * 如需破坏性变更,升级 major 版本并提供迁移说明
@@ -0,0 +1,161 @@
1
+ # SmartBrain + SmartRAG 与 mempal 的差距分析
2
+
3
+ > 对照基准:`MEMPAL_GUIDE.md`(mempal v0.9.0,2026-07-09)
4
+ > 分析对象:smart_brain(v0.1.2,记忆运行时 + 上下文编排器)+ smart_rag(资源 RAG 后端)
5
+ > 生成日期:2026-07-31
6
+
7
+ ---
8
+
9
+ ## 0. 定位差异(决定了所有差距的性质)
10
+
11
+ > **mempal** 是一个「单二进制 + 单 SQLite 文件」的**一体化记忆工具**,把存储、检索、知识治理、多 Agent 协作、MCP/CLI 全部打包进一个进程,any coding agent 装上即用。
12
+ >
13
+ > **smart_brain + smart_rag** 是「两个 Ruby gem、进程内嵌入」的**分层架构**:smart_brain 做记忆运行时 + 上下文装配,smart_rag 做资源 RAG 后端,靠 `DirectClient` / `HttpClient` 适配器串联。
14
+
15
+ 因此差距分两类:
16
+
17
+ - **A 类**:mempal 有、smart_brain 这层压根没有的能力。
18
+ - **B 类**:smart_brain 设计文档承诺了、但代码没兑现(doc-code gap)。
19
+
20
+ ---
21
+
22
+ ## 1. 能力对照总表
23
+
24
+ | 能力域 | mempal | smart_brain | smart_rag | 差距 |
25
+ |---|---|---|---|---|
26
+ | 持久化存储 | SQLite + sqlite-vec 单文件 | **仅内存**(SQL schema 是死代码) | Postgres(Sequel) | 🔴 严重 |
27
+ | 资源混合检索 | BM25 + 向量 + RRF | — | 向量 + FTS + RRF + rerank ✅ | smart_rag 已覆盖 |
28
+ | 记忆侧检索 | 统一进同一索引 | **子串词重叠**(无 FTS / 无向量) | — | 🔴 严重 |
29
+ | 记忆侧语义检索 | sqlite-vec | 无(SemanticRetriever 未实现) | — | 🔴 |
30
+ | 思维分层 Mind Model | dao_tian / ren / shu / qi / evidence | 扁平 9 种 type | — | 🔴 |
31
+ | 知识生命周期 | distill / gate / promote / demote | 仅 active / superseded / retracted | — | 🔴 |
32
+ | Knowledge Card(Phase-2) | card + evidence link + events | 无 | — | 🔴 |
33
+ | Phase-3 自进化 | runtime adoption evidence | 无 | — | 🔴 |
34
+ | 知识图谱 KG | 三元组 + 时态有效性 | entities / mentions(无谓词 / 无时态) | topic 关系(部分) | 🟠 |
35
+ | 事实核查 Fact-check | SimilarName / Relation / StaleFact | 无 | — | 🟠 |
36
+ | MCP Server | 26 个工具 + MEMORY_PROTOCOL 注入 | **无** | 无 | 🔴 |
37
+ | CLI | 全套命令 | **无 `bin/`** | 仅 migrate | 🔴 |
38
+ | 多 Agent Cowork | bus / session / channel / handoff | 无 | — | 🟠 |
39
+ | AAAK 格式化 | compress + 中文 jieba | 无 | — | 🟡 |
40
+ | 跨项目 / 命名空间 | wing / room / projects / resume | 仅 session_id | topics / tags | 🟠 |
41
+ | Tunnels / Taxonomy 路由 | 有 | 无 | — | 🟡 |
42
+ | Brief / wake-up | citation-first brief / L0L1 唤醒 | 无(只有 compose_context) | — | 🟠 |
43
+ | Agent Diary | 约定(OBSERVATION / LESSON / PATTERN) | 无 | — | 🟡 |
44
+ | Bench / 评估 | LongMemEval | 仅回归 spec | — | 🟡 |
45
+ | 可观测追踪 | status / doctor | **request_id → plan_id → context_id 全链路 + P95** | search_logs | 🟢 相对优势 |
46
+
47
+ ---
48
+
49
+ ## 2. 第一类差距:阻塞真正可用 🔴
50
+
51
+ ### 2.1 没有持久化 —— SQL schema 是「死代码」
52
+
53
+ `db/migrate/001_init.sql` 定义了完整的 Postgres schema(sessions / turns / messages / memory_items / memory_chunks / entities / summaries …),但运行时 `lib/smart_brain/runtime.rb` 里写死的是:
54
+
55
+ ```ruby
56
+ event_store = EventStore::InMemory.new
57
+ memory_store = MemoryStore::InMemory.new
58
+ ```
59
+
60
+ 进程一重启,所有对话记忆与结构化记忆全部丢失。这是与 mempal「单文件持久、跨 session 带出处找回历史决策」最根本的差距。`docs/coding_todo.md` 里「Postgres 优先」其实从未落地。
61
+
62
+ ### 2.2 记忆侧检索是玩具级
63
+
64
+ `lib/smart_brain/retrievers/exact_retriever.rb` 的核心是子串包含计数:
65
+
66
+ ```ruby
67
+ hits = terms.count { |t| haystack.include?(t) }
68
+ hits.to_f / terms.length
69
+ ```
70
+
71
+ 既不是 BM25,也没用 FTS,更没有向量。讽刺的是 schema 里 `memory_chunks.tsv + USING GIN` 全文索引、以及 `docs/memory_types.md` 第 7 节的 chunk 文本化规则都设计好了,但**没有任何代码往 memory_chunks 写数据或查询**。`lib/smart_brain/retrievers/relational_retriever.rb` 也只是 entity / ref 名字的子串匹配。
72
+
73
+ 结果:smart_brain 自己的记忆检索质量远低于 smart_rag 的资源检索,也远低于 mempal 的 BM25 + 向量 + RRF。
74
+
75
+ ### 2.3 没有 CLI、没有 MCP —— Agent 用不上
76
+
77
+ mempal 的核心价值主张是「any coding agent 在 10 秒内带出处找回历史决策」,靠的就是 `mempal serve --mcp`(26 个工具)+ 一套 CLI + MEMORY_PROTOCOL 自动注入。
78
+
79
+ smart_brain 当前是**纯库**,只能 `SmartBrain.commit_turn` / `compose_context` 嵌进 Ruby 进程。没有 `bin/`,没有 MCP server,没有 HTTP server(smart_rag 有 API 文档但同样没有 MCP)。这意味着 Claude Code / Codex / 其它 agent 根本无法把 smart_brain 当工具调用——而这恰恰是 mempal 的全部卖点。
80
+
81
+ ---
82
+
83
+ ## 3. 第二类差距:「记忆宫殿」的知识治理深度几乎为零 🔴
84
+
85
+ mempal 的「palace」灵魂在于记忆是有**生命周期、有层级、可证伪、可治理**的。smart_brain 这一层基本是空白:
86
+
87
+ | mempal 治理机制 | smart_brain 现状 |
88
+ |---|---|
89
+ | 思维分层 `dao_tian → dao_ren → shu → qi → evidence`,context 按层装配 | 扁平 type,compose 按固定槽位(system / summary / recent / evidence / user) |
90
+ | `distill`(evidence → candidate) | 无 |
91
+ | `gate`(promotion 门槛检查) | 无 |
92
+ | `promote` / `demote`(evidence-backed) | 无 |
93
+ | Knowledge Card(supports / contradicts / teaches + lifecycle events) | 无 |
94
+ | Phase-3 runtime adoption(used / accepted / rejected / miss / rollback) | 无 |
95
+ | KG 三元组 + `valid_from / valid_to` 时态 | 只有 entities 表,无谓词、无时态 |
96
+ | Fact-check(同名冲突 / 关系矛盾 / 过期事实) | 无 |
97
+ | publish-anchor(worktree → repo → global 作用域) | 无(仅 session 作用域) |
98
+
99
+ smart_brain 的冲突处理只做到 `superseded / retracted` 两个状态(`lib/smart_brain/memory_store/in_memory.rb`),距离 mempal 的「evidence → candidate → gate → promoted → demoted / retired」全流程差一整套治理层。
100
+
101
+ ---
102
+
103
+ ## 4. 第三类差距:Agent 生态与跨项目能力 🟠
104
+
105
+ - **MEMORY_PROTOCOL**:mempal 把 18 条规则塞进 MCP `initialize.instructions`,客户端连上即学。smart_brain 无任何 agent 引导协议。
106
+ - **Cowork / 多 Agent**:mempal 有 legacy cowork、multi-agent bus、team session、channel、handoff、capture。smart_brain 完全没有多 agent 协作原语。
107
+ - **跨项目管理**:mempal 用 wing / room / drawer / source_file 四级作用域 + `projects` / `resume` / `tunnels` / `taxonomy`。smart_brain 只有 `session_id` 一个维度,无命名空间、无路由关键词、无跨项目跳转。
108
+ - **Brief / wake-up**:mempal 有确定性的 citation-first brief 和 L0 / L1 wake-up 唤醒。smart_brain 只有 `compose_context` 一条路。
109
+ - **AAAK 格式化 / Agent Diary / Bench**:均无。
110
+
111
+ ---
112
+
113
+ ## 5. 第四类差距:设计文档承诺了、代码没兑现 🟡
114
+
115
+ 这是 smart_brain 内部的 doc-code gap:
116
+
117
+ 1. **LLM 集成全部缺位**。`docs/smartbrain_design.md` 第 9 节明写 ModelProvider(ollama Qwen3:planner / extractor / summarizer / reranker / embedding),`docs/coding_todo.md` 也列了 `model_provider/` 目录——但**代码里根本不存在 ModelProvider 模块**:
118
+ - `lib/smart_brain/retrieval_planner/planner.rb` 是关键词规则(`RESOURCE_HINTS` 字符串匹配),不是 LLM 意图分析;
119
+ - `lib/smart_brain/memory_extractor/extractor.rb` 是规则门控,不是 LLM 抽取;
120
+ - `lib/smart_brain/consolidator/working_summary.rb` 是**填模板**(拼 `"- #{key}"`),不是 LLM 摘要;
121
+ - `lib/smart_brain/fusion/merger.rb` 的 rerank 是 `score + 词重叠 * 0.05`,不是 qwen3-reranker。
122
+ 2. **9 种记忆类型只实现 6 种**。`docs/memory_types.md` 定义了 profile / preferences / goals / tasks / decisions / entities / events / cases / patterns,但 `lib/smart_brain/memory_extractor/extractor.rb` 只处理 tasks / decisions / goals / events / preferences / entities / retractions——**profile、cases、patterns 三种 type 没有抽取逻辑**。
123
+ 3. **契约校验形同虚设**。`lib/smart_brain/contracts/*.rb` 三个类只检查「必填 key 存在」,不做结构 / 类型校验(`coding_todo` 说要用 dry-validation,实际没引入)。
124
+
125
+ ---
126
+
127
+ ## 6. smart_brain 已经做得不错的地方(重构时别丢掉)🟢
128
+
129
+ 对照下来 smart_brain 也有 mempal 没明显强调的相对优势,路线规划时应保留:
130
+
131
+ 1. **全链路追踪**:`request_id → plan_id → context_id` 三连 ID 贯穿 Plan → Retrieve → Fuse → Compose,`lib/smart_brain/observability/tracker.rb` 还提供 P95 / memory-resource 比 / token 超预算率——这套可观测性比 mempal 的 status / doctor 更细。
132
+ 2. **融合层设计扎实**:`lib/smart_brain/fusion/merger.rb` 的去重 key 设计(resource 用 document + section + chunk,memory 用 item_id 或 turn + message)、多样性约束、memory / resource 比例切分,思路清晰,只是缺真实 rerank 分。
133
+ 3. **smart_rag 资源侧已达标**:向量 + FTS + RRF + rerank + chunking + topics / tags 这条资源 RAG 链路,已经覆盖了 mempal 资源检索的部分,不用重做。
134
+ 4. **写入门控策略可配置**:confidence 三档 + entity gate(频率 / 结构信号)+ 覆盖 / 撤回,策略对象和生效点分离得干净。
135
+
136
+ ---
137
+
138
+ ## 7. 建议的优先级路线(从「能用」到「像 mempal」)
139
+
140
+ 如果目标是追平 mempal,建议按「先解锁可用性、再补治理深度、最后做生态」推进:
141
+
142
+ 1. **P0 持久化 + 记忆检索落地** ✅ 已完成(2026-08):`EventStore` / `MemoryStore` 各有 InMemory / Postgres 两套同接口实现,`Runtime.build` 按 `config/brain.yml` 的 `storage.backend`(或 `SMARTBRAIN_BACKEND`)选择;`memory_chunks` 的 FTS 真正接通——写入时建 `simple` 配置的 TSVECTOR(CJK 按字符 unigram 切分),检索用 `to_tsquery` OR 语义 + `ts_rank`。跨进程重启可召回。新增 `lib/smart_brain/db.rb`、`event_store/postgres.rb`、`memory_store/postgres.rb`、迁移 `db/migrate/002_turn_events_payload.sql`;集成测试 `spec/integration_postgres_spec.rb`(`SMARTBRAIN_PG=1`)。
143
+ 2. **P0 Agent 工具面** ✅ 已完成(2026-08):三件套齐全——stdio MCP server(`lib/smart_brain/server/mcp_server.rb`,零依赖 JSON-RPC,4 工具 + initialize.instructions)、Sinatra/Puma HTTP API(`server/http_app.rb`)、CLI `exe/smart_brain`(serve/mcp/commit/compose/search/status/migrate)。三者共享 `Server::Service` 门面。接入说明见 `docs/mcp.md`。
144
+ 3. **P1 LLM 兑现承诺** ✅ 已完成(2026-08):补齐 `ModelProvider`(`lib/smart_brain/model_provider/`:Stub 默认 / Ollama / OpenAI 兼容 + factory)。默认 Stub(确定性、零网络);切 ollama/openai 后 `working_summary` 走真摘要(带模板兜底 + `summary_method` 标注)、`Fusion::Merger` 走 LLM rerank(`rerank_enabled` 默认关,避免每轮延迟)。runtime 注入 provider。真实 Ollama(llama2 快路径 + qwen3)端到端验证通过;qwen3-thinking 慢/截断属模型侧问题,代码层面优雅降级。注:planner/extractor 仍为规则(本轮只做 summary+rerank+distill 起草)。
145
+ 4. **P1 思维分层 + 知识生命周期** ✅ 已完成(2026-08):引入 mempal 思维分层 `dao_tian/dao_ren/shu/qi/evidence`(`governance/tiers.rb`,memory_items 加 `tier` 列,extractor 按 type 赋默认 tier;ContextComposer 按 tier 优先级装配 + dao_tian 配额)。Stage-1 生命周期 `Governance::Lifecycle`:`distill → candidate → gate → promote → demote`(dao_ren/qi 可蒸馏,gate 门槛 `min_supporting_refs`,evidence-backed 转换,`knowledge_events` 审计表)。补齐 extractor 的 profile/cases/patterns 三类。四个 knowledge 工具暴露到 Service/CLI(`knowledge`)/MCP/HTTP。lifecycle 与冲突 `status` 正交。
146
+ 5. **P2 KG + Fact-check + Brief / wake-up** ✅ 已完成(2026-08):
147
+ - **KG**:`kg_edges` 表(subject/predicate/object + `valid_from`/`valid_to` 时态 + active/invalidated + best-effort 实体链接,迁移 `004_kg_edges.sql`);`Governance::KnowledgeGraph`(add/query/timeline/invalidate/stats);三元组由 `turn_events[:edges]` 规则抽取(commit_turn 落库);RelationalRetriever 匹配 entity 时拉其边作 `mode:'graph'` 证据。与 lifecycle 正交。
148
+ - **Fact-check**:`Governance::FactCheck` 纯 Ruby 离线只读——SimilarNameConflict(Levenshtein,`support/levenshtein.rb`)、RelationContradiction(否定 cue × active triple)、StaleFact(invalidated 边被引用)。零 LLM。
149
+ - **Brief / wake-up**:`Governance::Briefing` 确定性、citation-first、不写 DB——brief(summary/key_facts/evidence/entities/unresolved/uncertainty/next_actions,每条带引用)+ wake_up(L0 identity + L1 goals/decisions)+ resume(session 模糊匹配)。
150
+ - 前端:Service/CLI(`kg`/`fact-check`/`brief`/`wake-up`)/MCP(+6 工具,共 14)/HTTP(`/kg/*`/`/fact-check`/`/brief`/`/wake-up`)。
151
+ 6. **P3 Cowork / Phase-3 自进化 / AAAK / Bench**。
152
+
153
+ ---
154
+
155
+ ## 8. 参考索引
156
+
157
+ - 基准:`MEMPAL_GUIDE.md`
158
+ - smart_brain 设计:`docs/smartbrain_design.md`、`docs/policies.md`、`docs/memory_types.md`、`docs/coding_todo.md`
159
+ - smart_brain 运行时:`lib/smart_brain/runtime.rb`、`lib/smart_brain/memory_store/in_memory.rb`、`lib/smart_brain/retrievers/*.rb`、`lib/smart_brain/fusion/merger.rb`、`lib/smart_brain/consolidator/working_summary.rb`
160
+ - smart_brain schema(未接线):`db/migrate/001_init.sql`
161
+ - smart_rag 检索链路:`/root/smart_rag/lib/smart_rag/retrieve.rb`、`/root/smart_rag/lib/smart_rag.rb`
data/docs/mcp.md ADDED
@@ -0,0 +1,93 @@
1
+ # SmartBrain MCP Server
2
+
3
+ SmartBrain ships a stdio MCP (Model Context Protocol) server so any coding agent
4
+ that speaks MCP — Claude Code, Cursor, etc. — can drive the memory runtime as a
5
+ native tool: persist turns, recall memory, and assemble context.
6
+
7
+ The server is hand-rolled JSON-RPC 2.0 with **no extra gem dependency**.
8
+
9
+ ## Start it
10
+
11
+ ```bash
12
+ smart_brain mcp # uses config/brain.yml (default backend: memory)
13
+ # or, against Postgres for durable, cross-session memory:
14
+ SMARTBRAIN_BACKEND=postgres smart_brain mcp
15
+ ```
16
+
17
+ Run `smart_brain migrate` once before using the `postgres` backend.
18
+
19
+ ## Tools exposed
20
+
21
+ | Tool | What it does |
22
+ |---|---|
23
+ | `commit_turn` | Persist a turn (`messages` + structured events) and extract durable memory. |
24
+ | `compose_context` | Retrieve evidence and assemble a context package for a user message. |
25
+ | `search_memory` | Full-text recall over the session's persistent memory (FTS on Postgres). |
26
+ | `status` | Backend, P95, memory/resource ratio, counts. |
27
+ | `knowledge_distill`, `knowledge_gate`, `knowledge_promote`, `knowledge_demote` | Govern knowledge lifecycle. |
28
+ | `knowledge_promote_to_scope`, `knowledge_retract`, `knowledge_lineage` | Govern cross-scope copies and provenance. |
29
+ | `kg_add`, `kg_query`, `kg_invalidate`, `kg_timeline`, `kg_stats` | Manage and inspect scoped knowledge-graph edges. |
30
+ | `fact_check`, `brief`, `wake_up` | Read scoped knowledge for validation and resume workflows. |
31
+
32
+ On `initialize` the server returns a short `instructions` block (a lightweight
33
+ MEMORY_PROTOCOL) so the client learns the tools immediately.
34
+
35
+ All memory, governance, briefing, fact-check, and KG tools accept `domain_id`
36
+ and `scope_context`. New clients should send both together:
37
+
38
+ ```json
39
+ {
40
+ "domain_id": "tenant-a",
41
+ "session_id": "conversation-1",
42
+ "scope_context": {
43
+ "read": [{"type":"project","id":"project-001"}, {"type":"task","id":"task-030"}],
44
+ "write": [{"type":"project","id":"project-001"}, {"type":"task","id":"task-030"}],
45
+ "default_write": {"type":"task","id":"task-030"}
46
+ }
47
+ }
48
+ ```
49
+
50
+ `write` must be a subset of `read`, and `default_write` must appear in
51
+ `write`. Calls that omit both new fields retain the 0.1 session-only behavior.
52
+ Cross-scope governance is exposed as `knowledge_promote_to_scope`,
53
+ `knowledge_retract`, and `knowledge_lineage`; KG also exposes `kg_timeline`
54
+ and `kg_stats`.
55
+
56
+ ## Claude Code
57
+
58
+ Add to `~/.config/claude/claude_desktop_config.json` (or the project's
59
+ `.mcp.json`):
60
+
61
+ ```json
62
+ {
63
+ "mcpServers": {
64
+ "smart_brain": {
65
+ "command": "/path/to/smart_brain/exe/smart_brain",
66
+ "args": ["mcp"],
67
+ "env": { "SMARTBRAIN_BACKEND": "postgres" }
68
+ }
69
+ }
70
+ }
71
+ ```
72
+
73
+ If you installed the gem, `command` can just be `"smart_brain"`.
74
+
75
+ ## Cursor
76
+
77
+ `Settings → MCP → Add new MCP Server`:
78
+
79
+ - Type: `stdio`
80
+ - Command: `smart_brain mcp` (or the full `exe/smart_brain` path)
81
+ - Env: `SMARTBRAIN_BACKEND=postgres` (optional)
82
+
83
+ ## Other front-ends
84
+
85
+ - **HTTP API**: `smart_brain serve --port 9292` then `POST /commit | /compose | /search`, `GET /status`.
86
+ - **CLI one-shots**: `smart_brain commit|compose|search --data '{...}'` (or pipe JSON via stdin).
87
+
88
+ ## Why no ruby MCP SDK?
89
+
90
+ mempal's value prop is "any agent recalls past decisions in 10 seconds". The MCP
91
+ wire format for the methods clients actually use (`initialize`,
92
+ `notifications/initialized`, `tools/list`, `tools/call`) is small enough that a
93
+ ~150-line stdio loop covers it — keeping SmartBrain dependency-light.