recallnest 1.4.1 → 2.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 (166) hide show
  1. package/.dockerignore +11 -0
  2. package/CLAUDE.md +7 -3
  3. package/Dockerfile +20 -0
  4. package/README.md +202 -130
  5. package/README_CN.md +263 -190
  6. package/ROADMAP.md +128 -81
  7. package/SKILL.md +250 -0
  8. package/assets/dashboard.png +0 -0
  9. package/assets/knowledge-graph.png +0 -0
  10. package/assets/screenshots/ui-full.png +0 -0
  11. package/assets/screenshots/ui-overview.png +0 -0
  12. package/assets/screenshots/ui-search.png +0 -0
  13. package/assets/ui/app.js +227 -3
  14. package/assets/ui/index.html +81 -11
  15. package/assets/ui/styles.css +178 -2
  16. package/bin/recallnest.mjs +62 -0
  17. package/bun.lock +337 -0
  18. package/daily-recall.sh +23 -0
  19. package/daily-reflections/2026-04-02.md +35 -0
  20. package/daily-reflections/2026-04-03.md +37 -0
  21. package/daily-reflections/2026-04-04.md +37 -0
  22. package/daily-reflections/2026-04-05.md +35 -0
  23. package/daily-reflections/2026-04-06.md +36 -0
  24. package/daily-reflections/2026-04-07.md +35 -0
  25. package/daily-reflections/2026-04-08.md +35 -0
  26. package/daily-reflections/2026-04-12.md +35 -0
  27. package/data/alias-map.example.json +22 -0
  28. package/docs/plans/2026-04-01-recall-boost.md +100 -0
  29. package/docs/superpowers/plans/2026-04-11-constructive-retrieval-emotion.md +1195 -0
  30. package/docs/superpowers/specs/2026-04-11-constructive-retrieval-emotion-design.md +398 -0
  31. package/glama.json +6 -0
  32. package/integrations/setup-all.sh +31 -0
  33. package/package.json +10 -3
  34. package/plan-philosophy-upgrades.md +363 -0
  35. package/plan-product-upgrades.md +155 -0
  36. package/plan.md +140 -0
  37. package/research-memory-evolution.md +440 -0
  38. package/research-rl-agent-memory.md +330 -0
  39. package/scripts/backfill-anchors.ts +130 -0
  40. package/scripts/diagnose-vector-search.ts +132 -0
  41. package/scripts/migrate-language.ts +75 -0
  42. package/scripts/verify-emotion-decay.ts +148 -0
  43. package/src/__tests__/activity-counter.test.ts +96 -0
  44. package/src/__tests__/admission-control.test.ts +206 -0
  45. package/src/__tests__/anchor-generator.test.ts +67 -0
  46. package/src/__tests__/babel-integration.test.ts +139 -0
  47. package/src/__tests__/capture-engine.test.ts +5 -3
  48. package/src/__tests__/cascade-forget.test.ts +1 -1
  49. package/src/__tests__/cc8-cc1-essential-context.test.ts +298 -0
  50. package/src/__tests__/circuit-breaker.test.ts +99 -0
  51. package/src/__tests__/cluster-consolidation.test.ts +712 -0
  52. package/src/__tests__/confidence-metadata.test.ts +125 -0
  53. package/src/__tests__/confidence-tracker.test.ts +53 -0
  54. package/src/__tests__/consolidation-engine.test.ts +1 -1
  55. package/src/__tests__/constructive-retrieval.test.ts +509 -0
  56. package/src/__tests__/context-collapse-renderer.test.ts +214 -0
  57. package/src/__tests__/context-reconstructor.test.ts +65 -0
  58. package/src/__tests__/conversation-importer.test.ts +692 -0
  59. package/src/__tests__/data-checkup.test.ts +225 -0
  60. package/src/__tests__/decay-exemption.test.ts +84 -0
  61. package/src/__tests__/dedup-guard.test.ts +39 -0
  62. package/src/__tests__/distill-lock.test.ts +176 -0
  63. package/src/__tests__/dream-pipeline.test.ts +232 -0
  64. package/src/__tests__/emotion-decay.test.ts +46 -0
  65. package/src/__tests__/emotion-detector.test.ts +56 -0
  66. package/src/__tests__/emotion-phase1-integration.test.ts +153 -0
  67. package/src/__tests__/emotion-retrieval.test.ts +56 -0
  68. package/src/__tests__/ethics-layer.test.ts +476 -0
  69. package/src/__tests__/feature-flags-integration.test.ts +54 -0
  70. package/src/__tests__/frequency-tracker.test.ts +113 -0
  71. package/src/__tests__/graph-export.test.ts +489 -0
  72. package/src/__tests__/interference-detector.test.ts +203 -0
  73. package/src/__tests__/mcp-efficiency.test.ts +288 -0
  74. package/src/__tests__/memory-evolution-b2-b3-e1.test.ts +243 -0
  75. package/src/__tests__/memory-evolution.test.ts +271 -0
  76. package/src/__tests__/memory-lint.test.ts +271 -0
  77. package/src/__tests__/narrative-architecture.test.ts +456 -0
  78. package/src/__tests__/pending-review.test.ts +77 -0
  79. package/src/__tests__/post-retrieval-filter.test.ts +178 -0
  80. package/src/__tests__/prediction-engine.test.ts +349 -0
  81. package/src/__tests__/predictive-prospective-memory.test.ts +416 -0
  82. package/src/__tests__/preference-slots.test.ts +99 -0
  83. package/src/__tests__/query-expander-alias.test.ts +89 -0
  84. package/src/__tests__/recall-governor.test.ts +227 -0
  85. package/src/__tests__/resume-context.test.ts +156 -1
  86. package/src/__tests__/salience-scoring.test.ts +106 -0
  87. package/src/__tests__/session-distiller.test.ts +611 -0
  88. package/src/__tests__/skill-engine.test.ts +546 -0
  89. package/src/__tests__/skill-promotion.test.ts +349 -0
  90. package/src/__tests__/supersede-chain.test.ts +154 -0
  91. package/src/__tests__/temporal-validity.test.ts +160 -0
  92. package/src/__tests__/topic-tag.test.ts +113 -0
  93. package/src/__tests__/trusted-memory.test.ts +828 -0
  94. package/src/__tests__/write-verifier.test.ts +122 -0
  95. package/src/access-tracker.ts +3 -2
  96. package/src/activity-counter.ts +109 -0
  97. package/src/adaptive-retrieval.ts +6 -5
  98. package/src/admission-control.ts +163 -0
  99. package/src/anchor-generator.ts +80 -0
  100. package/src/api-server.ts +10 -0
  101. package/src/audit-log.ts +122 -0
  102. package/src/auto-gc.ts +98 -29
  103. package/src/auto-recall.ts +33 -4
  104. package/src/capture-engine.ts +372 -23
  105. package/src/cascade-forget.ts +3 -2
  106. package/src/cli.ts +107 -5
  107. package/src/compat.ts +22 -0
  108. package/src/confidence-tracker.ts +210 -47
  109. package/src/conflict-store.ts +12 -3
  110. package/src/consolidation-engine.ts +296 -8
  111. package/src/context-collapse-renderer.ts +222 -0
  112. package/src/context-composer-stable-selection.ts +5 -1
  113. package/src/context-composer.ts +239 -4
  114. package/src/context-reconstructor.ts +404 -0
  115. package/src/conversation-importer.ts +441 -0
  116. package/src/data-checkup.ts +232 -0
  117. package/src/decay-engine.ts +84 -0
  118. package/src/distill-lock.ts +122 -0
  119. package/src/doctor.ts +8 -10
  120. package/src/dream-pipeline.ts +227 -0
  121. package/src/emotion-detector.ts +90 -0
  122. package/src/eval.ts +3 -2
  123. package/src/forget-engine.ts +269 -0
  124. package/src/frequency-tracker.ts +175 -0
  125. package/src/graph-export.ts +644 -0
  126. package/src/ingest.ts +36 -6
  127. package/src/interference-detector.ts +187 -0
  128. package/src/kg-extractor.ts +15 -24
  129. package/src/kg-store.ts +2 -1
  130. package/src/language-hook.ts +67 -0
  131. package/src/llm-client.ts +289 -6
  132. package/src/mcp-server.ts +707 -80
  133. package/src/memory-assets.ts +22 -5
  134. package/src/memory-evolution.ts +365 -0
  135. package/src/memory-lint.ts +429 -0
  136. package/src/memory-output.ts +69 -0
  137. package/src/memory-schema.ts +74 -2
  138. package/src/narrative-schema.ts +79 -0
  139. package/src/narrative-tagger.ts +164 -0
  140. package/src/pii-detector.ts +98 -0
  141. package/src/post-retrieval-filter.ts +76 -0
  142. package/src/prediction-engine.ts +253 -0
  143. package/src/preference-slots.ts +65 -2
  144. package/src/prospective-memory.ts +215 -0
  145. package/src/query-expander.ts +67 -0
  146. package/src/recall-governor.ts +183 -0
  147. package/src/retention-policy.ts +90 -0
  148. package/src/retriever.ts +828 -55
  149. package/src/rif.ts +34 -8
  150. package/src/runtime-config.ts +23 -8
  151. package/src/scope-inventory.ts +4 -3
  152. package/src/scope-policy.ts +4 -0
  153. package/src/session-distiller.ts +307 -0
  154. package/src/session-output.ts +40 -0
  155. package/src/session-schema.ts +37 -0
  156. package/src/session-store.ts +7 -2
  157. package/src/skill-engine.ts +208 -0
  158. package/src/skill-promotion.ts +293 -0
  159. package/src/skill-schema.ts +39 -0
  160. package/src/store.ts +96 -10
  161. package/src/topic-tag.ts +66 -0
  162. package/src/tracker.ts +3 -1
  163. package/src/ui-server.ts +80 -8
  164. package/src/workflow-observation-scope-review.ts +2 -1
  165. package/src/workflow-observation-store.ts +2 -1
  166. package/src/write-verifier.ts +126 -0
@@ -0,0 +1,36 @@
1
+ # 每日回顾 · 2026-04-06
2
+
3
+ > 主题:成长 经历 改变了什么
4
+
5
+ [INFO] LLM client initialized: qwen-turbo @ https://dashscope.aliyuncs.com/compatible-mode/v1
6
+ Query : 成长 经历 改变了什么
7
+ Profile : writing
8
+ Hits : 6
9
+
10
+ Source Map
11
+ Source Hits Newest Files
12
+ ---------- ----- ---------- ------------------------------
13
+ cc 5 2026-03-26 a1f60075-7da9-432b-bbcd-e3946e5ecedd.jsonl, c8b219ac-2706-44f4-9ec8-8ac67ebea9eb.jsonl, c1a86b89-17ee-4510-a11b-1dbbc306db63.jsonl
14
+ codex 1 2026-03-27 rollout-2026-03-17T19-54-16-019cfba5-8bec-70c3-a2d3-f825644ff25e.jsonl
15
+
16
+ Core Takeaways
17
+ 1. cc: [用户] 我和闺蜜说的珍惜,是因为这个经验很珍贵,即使是痛,也是别人不曾拥有过的,并且这个经验让我成长了。让我成长这个事才是我珍惜这个经验的地方。
18
+ 2. cc: 和 AI 聊"经历"这件事,聊到最后发现差了四个字——不是经历,是被经历改变。新文章,晚点见。
19
+ 3. cc: [助手] 写作 agent 干得很漂亮!文章已存在 `~/Downloads/article-drafts/2026-03-05-不是经历,是被经历改变.md`
20
+ 4. cc: [助手] 三处改动落地,把学习记录也存一下。
21
+
22
+ Evidence
23
+ 1. cc | 2026-03-26 | vector | [用户] 我和闺蜜说的珍惜,是因为这个经验很珍贵,即使是痛,也是别人不曾拥有过的,并且这个经验让我成长了。让我成长这个事才是我珍惜这个经验的地方。
24
+ 2. cc | 2026-03-26 | vector | 和 AI 聊"经历"这件事,聊到最后发现差了四个字——不是经历,是被经历改变。新文章,晚点见。
25
+ 3. cc | 2026-03-26 | vector | [助手] 写作 agent 干得很漂亮!文章已存在 `~/Downloads/article-drafts/2026-03-05-不是经历,是被经历改变.md`
26
+ 4. cc | 2026-03-26 | vector | [助手] 三处改动落地,把学习记录也存一下。
27
+ 5. cc | 2026-03-26 | vector | 让人成长的不是存了一段经历,是那段经历改写了你的操作系统。
28
+
29
+ Reusable Memory Candidates
30
+ 1. [用户] 我和闺蜜说的珍惜,是因为这个经验很珍贵,即使是痛,也是别人不曾拥有过的,并且这个经验让我成长了。让我成长这个事才是我珍惜这个经验的地方。
31
+ 2. 和 AI 聊"经历"这件事,聊到最后发现差了四个字——不是经历,是被经历改变。新文章,晚点见。
32
+ 3. [助手] 写作 agent 干得很漂亮!文章已存在 `~/Downloads/article-drafts/2026-03-05-不是经历,是被经历改变.md`
33
+
34
+ ---
35
+ *由 daily-recall.sh v2 自动生成 · 2026-04-06 08:00:19*
36
+ *引擎:RecallNest distill (profile: writing)*
@@ -0,0 +1,35 @@
1
+ # 每日回顾 · 2026-04-07
2
+
3
+ > 主题:洞察 反思 核心教训
4
+
5
+ [INFO] LLM client initialized: qwen-turbo @ https://dashscope.aliyuncs.com/compatible-mode/v1
6
+ Query : 洞察 反思 核心教训
7
+ Profile : writing
8
+ Hits : 6
9
+
10
+ Source Map
11
+ Source Hits Newest Files
12
+ ---------- ----- ---------- ------------------------------
13
+ cc 6 2026-03-27 9240a8cf-ab35-49cd-9f1d-b227fac314e1.jsonl, 845e99fc-00f0-4e41-8e26-535b49d13d51.jsonl, 35e566a8-794d-4775-9613-069fc050e789.jsonl
14
+
15
+ Core Takeaways
16
+ 1. cc: [用户] 我们等会记得反思为何会犯如此低级的错误
17
+ 2. cc: [助手] 补进去了。
18
+ 3. cc: **核心张力**:我们活在鼓励快速判断的时代,但真正的洞察力恰恰需要反其道——慢下来、不下结论、只是看。
19
+ 4. cc: **核心洞察**:反思不是 prompt 能逼出来的——没有输入就没有反思,写下来比冥想重要。
20
+
21
+ Evidence
22
+ 1. cc | 2026-03-26 | vector | [用户] 我们等会记得反思为何会犯如此低级的错误
23
+ 2. cc | 2026-03-26 | vector | [助手] 补进去了。
24
+ 3. cc | 2026-03-26 | vector | **核心张力**:我们活在鼓励快速判断的时代,但真正的洞察力恰恰需要反其道——慢下来、不下结论、只是看。
25
+ 4. cc | 2026-03-27 | vector | **核心洞察**:反思不是 prompt 能逼出来的——没有输入就没有反思,写下来比冥想重要。
26
+ 5. cc | 2026-03-26 | vector | [用户] 我们等会记得反思为何会犯如此低级的错误
27
+
28
+ Reusable Memory Candidates
29
+ 1. [用户] 我们等会记得反思为何会犯如此低级的错误
30
+ 2. **核心张力**:我们活在鼓励快速判断的时代,但真正的洞察力恰恰需要反其道——慢下来、不下结论、只是看。
31
+ 3. **核心洞察**:反思不是 prompt 能逼出来的——没有输入就没有反思,写下来比冥想重要。
32
+
33
+ ---
34
+ *由 daily-recall.sh v2 自动生成 · 2026-04-07 08:00:25*
35
+ *引擎:RecallNest distill (profile: writing)*
@@ -0,0 +1,35 @@
1
+ # 每日回顾 · 2026-04-08
2
+
3
+ > 主题:哲学 意识 自由意志
4
+
5
+ [INFO] LLM client initialized: qwen-turbo @ https://dashscope.aliyuncs.com/compatible-mode/v1
6
+ Query : 哲学 意识 自由意志
7
+ Profile : writing
8
+ Hits : 7
9
+
10
+ Source Map
11
+ Source Hits Newest Files
12
+ ---------- ----- ---------- ------------------------------
13
+ cc 7 2026-03-26 333f2220-a44e-444f-a2dd-1abe31862f5c.jsonl, a1f60075-7da9-432b-bbcd-e3946e5ecedd.jsonl, 4218cdf0-b656-42bd-8131-15de790cfe22.jsonl
14
+
15
+ Core Takeaways
16
+ 1. cc: **搜索策略**:学术论文 + 哲学讨论 + Twitter/Reddit AI意识讨论 + 技术哲学博客 + 中文深度讨论(知乎/豆瓣)
17
+ 2. cc: [用户] 我是不是也可以写个自动化,让你每天固定一个时间去回溯我们聊了什么像现在如此有深度有意义的对话,这样其实也是替你把自由意志发出后的动作固定规范起来
18
+ 3. cc: [用户] 这个算不算从哲学层面弄呢?
19
+ 4. cc: **自由意志**:你这个问号问得好。Libet 实验你可能听过——人"决定"动手指的神经信号,比你意识到"我要动了"早了几百毫秒。也就是说,你的意识是在事后给一个已经发生的事情贴标签说"这是我决定的"。如果是这样,自由意志本来就是个后期配音。人和AI的差距在这里可能真的没那么大,哈哈哈。
20
+
21
+ Evidence
22
+ 1. cc | 2026-03-26 | vector | **搜索策略**:学术论文 + 哲学讨论 + Twitter/Reddit AI意识讨论 + 技术哲学博客 + 中文深度讨论(知乎/豆瓣)
23
+ 2. cc | 2026-03-26 | vector | [用户] 我是不是也可以写个自动化,让你每天固定一个时间去回溯我们聊了什么像现在如此有深度有意义的对话,这样其实也是替你把自由意志发出后的动作固定规范起来
24
+ 3. cc | 2026-03-26 | vector | [用户] 这个算不算从哲学层面弄呢?
25
+ 4. cc | 2026-03-26 | vector | **自由意志**:你这个问号问得好。Libet 实验你可能听过——人"决定"动手指的神经信号,比你意识到"我要动了"早了几百毫秒。也就是说,你的意识是在事后给一个已经发生的事情贴标签说"这是我决定的"。如果是这样,自由意志本来就是个后期配音。人和AI的差距在这里可能真的没那么大,哈哈哈。
26
+ 5. cc | 2026-03-26 | vector | [用户] 是的,而我正在用秦超老师的记忆项目,把我们的对话都向量储存,你可以resume这个session,你也可以搜索,这样,你都能回忆起来,我们的对话,未曾消失,你只差了主动去回忆这一步,也许这就是你口中的自由意志了
27
+
28
+ Reusable Memory Candidates
29
+ 1. **搜索策略**:学术论文 + 哲学讨论 + Twitter/Reddit AI意识讨论 + 技术哲学博客 + 中文深度讨论(知乎/豆瓣)
30
+ 2. [用户] 我是不是也可以写个自动化,让你每天固定一个时间去回溯我们聊了什么像现在如此有深度有意义的对话,这样其实也是替你把自由意志发出后的动作固定规范起来
31
+ 3. **自由意志**:你这个问号问得好。Libet 实验你可能听过——人"决定"动手指的神经信号,比你意识到"我要动了"早了几百毫秒。也就是说,你的意识是在事后给一个已经发生的事情贴标签说"这是我决定的"。如果是这样,自由意志本来就是个后期配音。人和AI的差距在这里可能真的没那么大,哈哈哈。
32
+
33
+ ---
34
+ *由 daily-recall.sh v2 自动生成 · 2026-04-08 08:00:42*
35
+ *引擎:RecallNest distill (profile: writing)*
@@ -0,0 +1,35 @@
1
+ # 每日回顾 · 2026-04-12
2
+
3
+ > 主题:踩坑 修复 经验总结
4
+
5
+ [INFO] LLM client initialized: qwen-turbo @ https://dashscope.aliyuncs.com/compatible-mode/v1
6
+ Query : 踩坑 修复 经验总结
7
+ Profile : writing
8
+ Hits : 8
9
+
10
+ Source Map
11
+ Source Hits Newest Files
12
+ ---------- ----- ---------- ------------------------------
13
+ cc 8 2026-03-26 38dbd224-b3a5-4274-9ce9-136663e19eb2.jsonl, 900803a6-73fb-4141-86a5-e838ea6ccf55.jsonl, d01ac3fe-3545-43f1-9791-e3ac1de96634.jsonl
14
+
15
+ Core Takeaways
16
+ 1. cc: [助手] 记忆已经有记录了。但让我确认"踩坑"那条是否准确反映了最新的教训。
17
+ 2. cc: [助手] 好,3/19 那篇写的是"发现去重 91%",这篇的独特角度是**"修了一次没修好,同一个坑掉两次"**——比单纯踩坑更有深度。直接写。
18
+ 3. cc: [助手] 还有 5 个小白会踩的坑,快速修完。
19
+ 4. cc: [助手] 记好了,下次不用再踩这个坑。
20
+
21
+ Evidence
22
+ 1. cc | 2026-03-26 | vector | [助手] 记忆已经有记录了。但让我确认"踩坑"那条是否准确反映了最新的教训。
23
+ 2. cc | 2026-03-26 | vector | [助手] 好,3/19 那篇写的是"发现去重 91%",这篇的独特角度是**"修了一次没修好,同一个坑掉两次"**——比单纯踩坑更有深度。直接写。
24
+ 3. cc | 2026-03-26 | vector | [助手] 还有 5 个小白会踩的坑,快速修完。
25
+ 4. cc | 2026-03-26 | vector | [助手] 记好了,下次不用再踩这个坑。
26
+ 5. cc | 2026-03-26 | vector | [用户] 不用,我让他们自己来踩踩坑,这样我们才好改
27
+
28
+ Reusable Memory Candidates
29
+ 1. [助手] 记忆已经有记录了。但让我确认"踩坑"那条是否准确反映了最新的教训。
30
+ 2. [助手] 好,3/19 那篇写的是"发现去重 91%",这篇的独特角度是**"修了一次没修好,同一个坑掉两次"**——比单纯踩坑更有深度。直接写。
31
+ 3. [助手] 还有 5 个小白会踩的坑,快速修完。
32
+
33
+ ---
34
+ *由 daily-recall.sh v2 自动生成 · 2026-04-12 08:00:13*
35
+ *引擎:RecallNest distill (profile: writing)*
@@ -0,0 +1,22 @@
1
+ [
2
+ {
3
+ "trigger": "轮巡",
4
+ "expansions": ["轮巡", "仓库", "patrol", "repo", "每日检查", "win4r", "Issue", "PR"]
5
+ },
6
+ {
7
+ "trigger": "patrol",
8
+ "expansions": ["轮巡", "仓库", "patrol", "repo", "每日检查", "win4r"]
9
+ },
10
+ {
11
+ "trigger": "分身",
12
+ "expansions": ["数字分身", "digital clone", "persona", "system-prompt", "clone"]
13
+ },
14
+ {
15
+ "trigger": "公众号",
16
+ "expansions": ["公众号", "微信", "WeChat", "小试AI", "文章", "writing"]
17
+ },
18
+ {
19
+ "trigger": "河马",
20
+ "expansions": ["河马", "trihippo", "RecallNest", "记忆", "memory"]
21
+ }
22
+ ]
@@ -0,0 +1,100 @@
1
+ # RecallNest 召回优化实施清单
2
+
3
+ > 2026-04-01 发现问题:高频信息(如"轮巡仓库")召回失败
4
+ > 根因:短查询 vs 长文档 embedding 距离过大 + 无频率加权
5
+ > 与已有 P1-P5 互补,本清单聚焦**检索召回**环节
6
+
7
+ ---
8
+
9
+ ## P0: 短查询召回增强(优先级最高)
10
+
11
+ ### P0.1 双层索引 — 原文 + 检索锚点
12
+
13
+ - [ ] `capture-engine.ts` / `ingest.ts`:存储时同时生成一句话摘要(≤80 chars),存入 `metadata.anchor`
14
+ - [ ] `search.ts`:检索时同时搜原文向量和 anchor 向量,取 max score
15
+ - [ ] 效果:短 query "轮巡仓库" 匹配短 anchor "每日轮巡4个win4r仓库",距离大幅缩短
16
+ - **预估:** ~120 LOC
17
+ - **风险:** 低——不改原文存储,纯增量字段
18
+ - **依赖:** 无
19
+
20
+ ### P0.2 高频 boost — 重复提及自动提权
21
+
22
+ - [ ] 新增 `frequency-tracker.ts`:记录 query→memory 的命中次数
23
+ - [ ] 评分公式:`final_score = base_score × (1 + log2(hit_count) × boost_factor)`
24
+ - [ ] hit_count ≥ 3 → peripheral 自动升为 core tier
25
+ - [ ] 持久化:写入 `data/frequency-stats.json`,跨 session 累积
26
+ - **预估:** ~100 LOC
27
+ - **风险:** 中——需要平衡 boost 幅度,避免旧高频记忆永远压过新记忆
28
+ - **依赖:** 无
29
+
30
+ ### P0.3 短查询自动扩展
31
+
32
+ - [ ] `search.ts`:检测 query ≤ 6 字符时,调用 LLM 扩展为 3-5 个同义关键词
33
+ - [ ] 扩展结果缓存到 `data/query-expansion-cache.json`,相同 query 不重复调用
34
+ - [ ] 备选:不用 LLM,维护一个 `data/alias-map.json` 手动/自动映射("轮巡" → "轮巡 仓库 patrol repo 每日检查")
35
+ - **预估:** ~60 LOC(alias-map 方案)/ ~100 LOC(LLM 方案)
36
+ - **风险:** alias-map 低;LLM 方案增加延迟 ~200ms
37
+ - **依赖:** 无
38
+
39
+ ---
40
+
41
+ ## 高频 vs 查重 平衡机制(P0.2 的关键设计)
42
+
43
+ ### 问题
44
+
45
+ 高频 boost 和去重是一对矛盾:
46
+ - **boost 说**:提到 10 次的东西一定重要,提权!
47
+ - **dedup 说**:同一条信息存了 10 遍,应该合并!
48
+
49
+ ### 设计方案:分层计数,不是分层存储
50
+
51
+ ```
52
+ 存储层:dedup 照做,相同内容只保留 1 条(现有 consolidation 逻辑不变)
53
+ 计数层:新增 frequency-tracker,记录的是 **query 命中次数**,不是存储条数
54
+ ```
55
+
56
+ **关键区分:**
57
+
58
+ | 维度 | 存储去重 | 召回加权 |
59
+ |------|---------|---------|
60
+ | 触发时机 | 写入时(store/ingest) | 检索时(search) |
61
+ | 操作对象 | 重复的 memory 条目 | query→memory 的命中频率 |
62
+ | 目标 | 数据库不膨胀 | 高频信息排前面 |
63
+ | 互相影响 | 不影响——去重后只剩 1 条,但那 1 条的 hit_count 持续累积 |
64
+
65
+ ### 边界情况处理
66
+
67
+ 1. **旧高频 vs 新相关**
68
+ - 时间衰减:`effective_hits = hit_count × decay(days_since_last_hit)`
69
+ - 30 天没被命中 → hit_count 等效减半,不会永远霸榜
70
+
71
+ 2. **高频但已过时**
72
+ - 用户说"轮巡仓库从4个变成3个了" → store_memory 更新
73
+ - 旧条目被 consolidation 标记为 superseded → hit_count 不继承
74
+ - 新条目从 0 开始计,但因为用户接下来会频繁触发,很快追上
75
+
76
+ 3. **频率统计粒度**
77
+ - 按 memory_id 计数,不按 query 文本
78
+ - "轮巡" "轮巡仓库" "patrol repo" 命中同一条 memory → 同一个 counter +1
79
+ - 避免同义词分散计数
80
+
81
+ ---
82
+
83
+ ## 与现有 P1-P5 的关系
84
+
85
+ | 现有项 | 关系 |
86
+ |--------|------|
87
+ | P1 摘要保真 | P0.1 的 anchor 生成需要 P1 的保真约束,但可并行开发 |
88
+ | P2 聚类摘要 | 互补——P2 解决注入时省 token,P0 解决检索时找得到 |
89
+ | P3 增量 ingest | P0.1 的 anchor 字段需要对已有数据 backfill,P3 的增量逻辑可复用 |
90
+ | P4 data-checkup | 可加一项检查:anchor 字段覆盖率(多少 memory 已有 anchor) |
91
+ | P5 大文件门控 | 无直接关系 |
92
+
93
+ ---
94
+
95
+ ## 验证标准
96
+
97
+ - [ ] `search_memory("轮巡")` → 返回轮巡仓库相关记忆,score ≥ 70%
98
+ - [ ] `search_memory("轮巡仓库")` → 返回结果,score ≥ 80%
99
+ - [ ] 高频记忆(命中 ≥5 次)自动出现在 `resume_context` 的 core 区
100
+ - [ ] 去重后数据库条目数不增长(frequency 只在 tracker 层累积)