superlocalmemory 4.2.5 → 4.2.6

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 (202) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.cursor-plugin/marketplace.json +29 -0
  3. package/CHANGELOG.md +112 -0
  4. package/README.md +48 -7
  5. package/antigravity-plugin/_GENERATED.md +1 -1
  6. package/antigravity-plugin/agents/slm-governance-advisor.md +1 -1
  7. package/antigravity-plugin/agents/slm-loop-runner.md +1 -1
  8. package/antigravity-plugin/agents/slm-memory-advisor.md +1 -1
  9. package/antigravity-plugin/agents/slm-optimize-advisor.md +1 -1
  10. package/antigravity-plugin/mcp_config.json +1 -2
  11. package/antigravity-plugin/plugin.json +1 -1
  12. package/antigravity-plugin/skills/slm-bot-memory/SKILL.md +1 -1
  13. package/antigravity-plugin/skills/slm-cache/SKILL.md +1 -1
  14. package/antigravity-plugin/skills/slm-compress/SKILL.md +1 -1
  15. package/antigravity-plugin/skills/slm-getting-started-bot/SKILL.md +1 -1
  16. package/antigravity-plugin/skills/slm-governance/SKILL.md +4 -2
  17. package/antigravity-plugin/skills/slm-graph/SKILL.md +7 -13
  18. package/antigravity-plugin/skills/slm-loop/SKILL.md +1 -1
  19. package/antigravity-plugin/skills/slm-media/SKILL.md +1 -1
  20. package/antigravity-plugin/skills/slm-mesh/SKILL.md +1 -1
  21. package/antigravity-plugin/skills/slm-profile/SKILL.md +21 -18
  22. package/antigravity-plugin/skills/slm-recall/SKILL.md +1 -1
  23. package/antigravity-plugin/skills/slm-remember/SKILL.md +1 -1
  24. package/antigravity-plugin/skills/slm-scope/SKILL.md +1 -1
  25. package/antigravity-plugin/skills/slm-session/SKILL.md +1 -1
  26. package/antigravity-plugin/skills/slm-status/SKILL.md +1 -1
  27. package/codex-plugin/.claude-plugin/plugin.json +1 -1
  28. package/codex-plugin/.codex-plugin/plugin.json +7 -3
  29. package/codex-plugin/AGENTS.md +1 -1
  30. package/codex-plugin/README.md +2 -2
  31. package/codex-plugin/_GENERATED.md +2 -1
  32. package/codex-plugin/agents/slm-governance-advisor.md +1 -1
  33. package/codex-plugin/agents/slm-loop-runner.md +1 -1
  34. package/codex-plugin/agents/slm-memory-advisor.md +1 -1
  35. package/codex-plugin/agents/slm-optimize-advisor.md +1 -1
  36. package/codex-plugin/skills/slm-bot-memory/SKILL.md +1 -1
  37. package/codex-plugin/skills/slm-cache/SKILL.md +1 -1
  38. package/codex-plugin/skills/slm-compress/SKILL.md +1 -1
  39. package/codex-plugin/skills/slm-getting-started-bot/SKILL.md +1 -1
  40. package/codex-plugin/skills/slm-governance/SKILL.md +4 -2
  41. package/codex-plugin/skills/slm-graph/SKILL.md +7 -13
  42. package/codex-plugin/skills/slm-loop/SKILL.md +1 -1
  43. package/codex-plugin/skills/slm-media/SKILL.md +1 -1
  44. package/codex-plugin/skills/slm-mesh/SKILL.md +1 -1
  45. package/codex-plugin/skills/slm-profile/SKILL.md +21 -18
  46. package/codex-plugin/skills/slm-recall/SKILL.md +1 -1
  47. package/codex-plugin/skills/slm-remember/SKILL.md +1 -1
  48. package/codex-plugin/skills/slm-scope/SKILL.md +1 -1
  49. package/codex-plugin/skills/slm-session/SKILL.md +1 -1
  50. package/codex-plugin/skills/slm-status/SKILL.md +1 -1
  51. package/copilot-plugin/.github/agents/slm-governance-advisor.agent.md +2 -2
  52. package/copilot-plugin/.github/agents/slm-loop-runner.agent.md +2 -2
  53. package/copilot-plugin/.github/agents/slm-memory-advisor.agent.md +2 -2
  54. package/copilot-plugin/.github/agents/slm-optimize-advisor.agent.md +2 -2
  55. package/copilot-plugin/.github/copilot-instructions.md +4 -4
  56. package/copilot-plugin/.github/prompts/slm-bot-memory.prompt.md +2 -2
  57. package/copilot-plugin/.github/prompts/slm-cache.prompt.md +2 -2
  58. package/copilot-plugin/.github/prompts/slm-compress.prompt.md +2 -2
  59. package/copilot-plugin/.github/prompts/slm-getting-started-bot.prompt.md +2 -2
  60. package/copilot-plugin/.github/prompts/slm-governance.prompt.md +5 -3
  61. package/copilot-plugin/.github/prompts/slm-graph.prompt.md +8 -14
  62. package/copilot-plugin/.github/prompts/slm-loop.prompt.md +2 -2
  63. package/copilot-plugin/.github/prompts/slm-media.prompt.md +2 -2
  64. package/copilot-plugin/.github/prompts/slm-mesh.prompt.md +2 -2
  65. package/copilot-plugin/.github/prompts/slm-profile.prompt.md +22 -19
  66. package/copilot-plugin/.github/prompts/slm-recall.prompt.md +2 -2
  67. package/copilot-plugin/.github/prompts/slm-remember.prompt.md +2 -2
  68. package/copilot-plugin/.github/prompts/slm-scope.prompt.md +2 -2
  69. package/copilot-plugin/.github/prompts/slm-session.prompt.md +2 -2
  70. package/copilot-plugin/.github/prompts/slm-status.prompt.md +2 -2
  71. package/copilot-plugin/.github/prompts/slm-web-access.prompt.md +1 -1
  72. package/copilot-plugin/README.md +2 -2
  73. package/copilot-plugin/_GENERATED.md +3 -3
  74. package/{plugin → cursor-plugin}/.cursor-plugin/plugin.json +3 -3
  75. package/cursor-plugin/LICENSE +24 -0
  76. package/cursor-plugin/assets/logo.svg +36 -0
  77. package/{plugin → cursor-plugin}/cursor-skills/slm-bot-memory/SKILL.md +1 -1
  78. package/cursor-plugin/cursor-skills/slm-cache/SKILL.md +147 -0
  79. package/cursor-plugin/cursor-skills/slm-compress/SKILL.md +150 -0
  80. package/{plugin → cursor-plugin}/cursor-skills/slm-getting-started-bot/SKILL.md +1 -1
  81. package/cursor-plugin/cursor-skills/slm-governance/SKILL.md +279 -0
  82. package/cursor-plugin/cursor-skills/slm-graph/SKILL.md +321 -0
  83. package/cursor-plugin/cursor-skills/slm-loop/SKILL.md +174 -0
  84. package/cursor-plugin/cursor-skills/slm-media/SKILL.md +340 -0
  85. package/cursor-plugin/cursor-skills/slm-mesh/SKILL.md +389 -0
  86. package/cursor-plugin/cursor-skills/slm-profile/SKILL.md +167 -0
  87. package/{plugin → cursor-plugin}/cursor-skills/slm-recall/SKILL.md +1 -1
  88. package/{plugin → cursor-plugin}/cursor-skills/slm-remember/SKILL.md +1 -1
  89. package/{plugin → cursor-plugin}/cursor-skills/slm-scope/SKILL.md +1 -1
  90. package/{plugin → cursor-plugin}/cursor-skills/slm-session/SKILL.md +1 -1
  91. package/cursor-plugin/cursor-skills/slm-status/SKILL.md +231 -0
  92. package/cursor-plugin/cursor-skills/slm-web-access/SKILL.md +179 -0
  93. package/{plugin → cursor-plugin}/mcp.cursor.json +1 -2
  94. package/hermes-plugin/__init__.py +39 -7
  95. package/hermes-plugin/agents/slm-governance-advisor.md +1 -1
  96. package/hermes-plugin/agents/slm-loop-runner.md +1 -1
  97. package/hermes-plugin/agents/slm-memory-advisor.md +1 -1
  98. package/hermes-plugin/agents/slm-optimize-advisor.md +1 -1
  99. package/hermes-plugin/command-inventory.json +2 -2
  100. package/hermes-plugin/plugin.yaml +2 -2
  101. package/hermes-plugin/skills/slm-bot-memory/SKILL.md +1 -1
  102. package/hermes-plugin/skills/slm-cache/SKILL.md +1 -1
  103. package/hermes-plugin/skills/slm-compress/SKILL.md +1 -1
  104. package/hermes-plugin/skills/slm-getting-started-bot/SKILL.md +1 -1
  105. package/hermes-plugin/skills/slm-governance/SKILL.md +4 -2
  106. package/hermes-plugin/skills/slm-graph/SKILL.md +7 -13
  107. package/hermes-plugin/skills/slm-loop/SKILL.md +1 -1
  108. package/hermes-plugin/skills/slm-media/SKILL.md +1 -1
  109. package/hermes-plugin/skills/slm-mesh/SKILL.md +1 -1
  110. package/hermes-plugin/skills/slm-profile/SKILL.md +21 -18
  111. package/hermes-plugin/skills/slm-recall/SKILL.md +1 -1
  112. package/hermes-plugin/skills/slm-remember/SKILL.md +1 -1
  113. package/hermes-plugin/skills/slm-scope/SKILL.md +1 -1
  114. package/hermes-plugin/skills/slm-session/SKILL.md +1 -1
  115. package/hermes-plugin/skills/slm-status/SKILL.md +1 -1
  116. package/ide/configs/copilot-cli-mcp.json +17 -0
  117. package/ide/configs/grok-cli-mcp.toml +11 -0
  118. package/ide/configs/muse-mcp.json +16 -0
  119. package/ide/configs/openclaw-mcp.json +15 -0
  120. package/muse-plugin/.claude-plugin/plugin.json +20 -0
  121. package/muse-plugin/LICENSE +663 -0
  122. package/muse-plugin/README.md +44 -0
  123. package/muse-plugin/_GENERATED.md +3 -0
  124. package/muse-plugin/agents/slm-governance-advisor.md +84 -0
  125. package/muse-plugin/agents/slm-loop-runner.md +82 -0
  126. package/muse-plugin/agents/slm-memory-advisor.md +54 -0
  127. package/muse-plugin/agents/slm-optimize-advisor.md +44 -0
  128. package/muse-plugin/commands/slm-loop.md +33 -0
  129. package/muse-plugin/hooks/hooks.json +102 -0
  130. package/muse-plugin/requirements-cpu-torch.txt +13 -0
  131. package/muse-plugin/requirements.txt +1 -0
  132. package/muse-plugin/scripts/ensure-venv.bat +122 -0
  133. package/muse-plugin/scripts/ensure-venv.sh +169 -0
  134. package/muse-plugin/scripts/slm-launch +207 -0
  135. package/muse-plugin/scripts/slm-launch.bat +32 -0
  136. package/muse-plugin/scripts/slm-resolve.sh +128 -0
  137. package/muse-plugin/scripts/slm-run +76 -0
  138. package/muse-plugin/scripts/torch-cpu-resolve.sh +86 -0
  139. package/muse-plugin/skills/slm-bot-memory/SKILL.md +180 -0
  140. package/muse-plugin/skills/slm-cache/SKILL.md +146 -0
  141. package/muse-plugin/skills/slm-compress/SKILL.md +149 -0
  142. package/muse-plugin/skills/slm-getting-started-bot/SKILL.md +196 -0
  143. package/muse-plugin/skills/slm-governance/SKILL.md +278 -0
  144. package/muse-plugin/skills/slm-graph/SKILL.md +320 -0
  145. package/muse-plugin/skills/slm-loop/SKILL.md +173 -0
  146. package/muse-plugin/skills/slm-media/SKILL.md +339 -0
  147. package/muse-plugin/skills/slm-mesh/SKILL.md +388 -0
  148. package/muse-plugin/skills/slm-profile/SKILL.md +166 -0
  149. package/muse-plugin/skills/slm-recall/SKILL.md +517 -0
  150. package/muse-plugin/skills/slm-remember/SKILL.md +374 -0
  151. package/muse-plugin/skills/slm-scope/SKILL.md +182 -0
  152. package/muse-plugin/skills/slm-session/SKILL.md +290 -0
  153. package/muse-plugin/skills/slm-status/SKILL.md +230 -0
  154. package/muse-plugin/skills/slm-web-access/SKILL.md +178 -0
  155. package/package.json +6 -2
  156. package/plugin/.claude-plugin/plugin.json +4 -2
  157. package/plugin/LICENSE +663 -0
  158. package/plugin/README.md +44 -0
  159. package/plugin/agents/slm-governance-advisor.md +1 -1
  160. package/plugin/agents/slm-loop-runner.md +1 -1
  161. package/plugin/agents/slm-memory-advisor.md +1 -1
  162. package/plugin/agents/slm-optimize-advisor.md +1 -1
  163. package/plugin/hooks/hooks.json +1 -1
  164. package/plugin/requirements.txt +1 -1
  165. package/plugin/skills/slm-bot-memory/SKILL.md +1 -1
  166. package/plugin/skills/slm-cache/SKILL.md +1 -1
  167. package/plugin/skills/slm-compress/SKILL.md +1 -1
  168. package/plugin/skills/slm-getting-started-bot/SKILL.md +1 -1
  169. package/plugin/skills/slm-governance/SKILL.md +4 -2
  170. package/plugin/skills/slm-graph/SKILL.md +7 -13
  171. package/plugin/skills/slm-loop/SKILL.md +1 -1
  172. package/plugin/skills/slm-media/SKILL.md +1 -1
  173. package/plugin/skills/slm-mesh/SKILL.md +1 -1
  174. package/plugin/skills/slm-profile/SKILL.md +21 -18
  175. package/plugin/skills/slm-recall/SKILL.md +1 -1
  176. package/plugin/skills/slm-remember/SKILL.md +1 -1
  177. package/plugin/skills/slm-scope/SKILL.md +1 -1
  178. package/plugin/skills/slm-session/SKILL.md +1 -1
  179. package/plugin/skills/slm-status/SKILL.md +1 -1
  180. package/plugin-src/agents/slm-governance-advisor.md +1 -1
  181. package/plugin-src/agents/slm-loop-runner.md +1 -1
  182. package/plugin-src/agents/slm-memory-advisor.md +1 -1
  183. package/plugin-src/agents/slm-optimize-advisor.md +1 -1
  184. package/plugin-src/rules/AGENTS.md +1 -1
  185. package/plugin-src/rules/CLAUDE.md.fragment +3 -3
  186. package/plugin-src/skills/slm-bot-memory/SKILL.md +1 -1
  187. package/plugin-src/skills/slm-cache/SKILL.md +1 -1
  188. package/plugin-src/skills/slm-compress/SKILL.md +1 -1
  189. package/plugin-src/skills/slm-getting-started-bot/SKILL.md +1 -1
  190. package/plugin-src/skills/slm-governance/SKILL.md +4 -2
  191. package/plugin-src/skills/slm-graph/SKILL.md +7 -13
  192. package/plugin-src/skills/slm-loop/SKILL.md +1 -1
  193. package/plugin-src/skills/slm-media/SKILL.md +1 -1
  194. package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
  195. package/plugin-src/skills/slm-profile/SKILL.md +21 -18
  196. package/plugin-src/skills/slm-recall/SKILL.md +1 -1
  197. package/plugin-src/skills/slm-remember/SKILL.md +1 -1
  198. package/plugin-src/skills/slm-scope/SKILL.md +1 -1
  199. package/plugin-src/skills/slm-session/SKILL.md +1 -1
  200. package/plugin-src/skills/slm-status/SKILL.md +1 -1
  201. package/plugin/CLAUDE.md +0 -56
  202. /package/{plugin/assets/logo.svg → codex-plugin/assets/icon.svg} +0 -0
@@ -0,0 +1,517 @@
1
+ ---
2
+ name: slm-recall
3
+ description: Search and retrieve facts, decisions, and past context from SuperLocalMemory. Use when the user asks to recall, find, search, or "what did we decide/say about X". Triggers multi-channel semantic retrieval with reranking; always call before storing anything new.
4
+ when_to_use: |
5
+ - "What did we decide about X?"
6
+ - "Recall anything about Y"
7
+ - "Do we have context on the Z feature?"
8
+ - "Find stored information about authentication / the database / error handling"
9
+ - "Search for what I said about Y"
10
+ - Automatically before any non-trivial task, to surface prior context
11
+ ---
12
+
13
+ # slm-recall — Search & Retrieve Memory
14
+
15
+ Retrieve stored facts, decisions, and past context from SuperLocalMemory using
16
+ multi-channel retrieval. The golden rule: **recall before you remember**.
17
+
18
+ ---
19
+
20
+ ## When to use recall vs search vs fetch vs list_recent
21
+
22
+ | Situation | Tool |
23
+ |-----------|------|
24
+ | Conceptual or paraphrase query ("what did we agree on for auth?") | `recall` — full multi-channel retrieval + rerank |
25
+ | Exact keyword match needed ("find facts containing BM25") | `search` — FTS5 BM25 only, lower latency |
26
+ | You have a specific `fact_id` from a prior result | `fetch` — exact lookup, full detail |
27
+ | One result looks right and you need what surrounds it | `expand` — source memory, session neighbours, same-entity facts, the correction that replaced it |
28
+ | Browse newest entries without a query | `list_recent` |
29
+ | A day, a project or a session in readable form | `get_memory_summary` |
30
+ | A question the user saved under a name | `run_view` |
31
+
32
+ Use `recall` as the default. `search` is a fallback for zero-result recall on a
33
+ known exact term. `fetch` is for when you already know the ID.
34
+
35
+ ---
36
+
37
+ ## Recall-before-remember discipline
38
+
39
+ Before storing anything new, always call `recall` first. If a near-duplicate
40
+ fact already exists, call `update_memory(fact_id, content)` to refine it
41
+ rather than creating a duplicate. Duplicates degrade retrieval quality for
42
+ every future session.
43
+
44
+ ---
45
+
46
+ ## MCP-first workflow
47
+
48
+ ### 1. Standard recall
49
+
50
+ ```
51
+ recall(
52
+ query="authentication strategy decision",
53
+ limit=20, # default 20; reduce to 5 for quick pre-task checks
54
+ session_id="<sid>", # pass the session_id returned by session_init
55
+ fast=None, # leave unset; see "Fast mode" below for what it controls
56
+ )
57
+ ```
58
+
59
+ Real response shape (trimmed to the fields that matter; `slm recall --json`
60
+ wraps the same data in a `data` envelope):
61
+ ```json
62
+ {
63
+ "success": true,
64
+ "results": [
65
+ {
66
+ "fact_id": "f8a2bc91",
67
+ "memory_id": "m7e19ca0",
68
+ "content": "Decided to use JWT with 1h expiry for API auth (2026-06-10)",
69
+ "score": 0.87,
70
+ "tier": "supported",
71
+ "confidence": 0.91,
72
+ "trust_score": 0.84,
73
+ "fact_type": "semantic",
74
+ "memory_kind": "decision",
75
+ "memory_kind_state": "confirmed",
76
+ "age_label": "4 months ago",
77
+ "channel_scores": {
78
+ "semantic": 0.88,
79
+ "bm25": 0.61,
80
+ "temporal": 0.72,
81
+ "hopfield": 0.55
82
+ }
83
+ }
84
+ ],
85
+ "count": 1,
86
+ "query_type": "semantic",
87
+ "channel_weights": {
88
+ "semantic": 0.4,
89
+ "bm25": 0.2,
90
+ "temporal": 0.2,
91
+ "hopfield": 0.2
92
+ },
93
+ "channel_status": {
94
+ "semantic": "ok",
95
+ "bm25": "ok",
96
+ "temporal": "empty",
97
+ "hopfield": "ok",
98
+ "spreading_activation": "no_candidates",
99
+ "entity_graph": "no_embedding",
100
+ "profile": "disabled"
101
+ },
102
+ "incomplete_channels": [],
103
+ "retrieval_time_ms": 134,
104
+ "query_id": "q-3f9a",
105
+ "no_confident_match": false,
106
+ "calibration_status": "uncalibrated",
107
+ "calibration_id": null,
108
+ "answer_confidence": null,
109
+ "abstained": false,
110
+ "abstention_reason": null,
111
+ "abstention_note": "",
112
+ "tier": "supported",
113
+ "warming_up": false,
114
+ "status_note": "",
115
+ "answer_check_status": "off",
116
+ "answerability": "unjudged",
117
+ "answerability_reason": "disabled"
118
+ }
119
+ ```
120
+
121
+ A result that came from a saved picture or a PDF page also carries a `media`
122
+ block (`media_id`, `kind` of `image` or `page`, `thumbnail_uri`, `page`,
123
+ `document_id`, `citation` such as `page 12`). Pictures and pages are searched
124
+ by a normal `recall` while pictures and documents are on; nothing changes when
125
+ they are off. From an app on this computer, up to three thumbnails follow the
126
+ JSON as image blocks; `get_media(media_id)` shows any other. Look at a
127
+ thumbnail before saying a picture shows something, and give the page when you
128
+ quote a PDF. See `slm-media`.
129
+
130
+ Other fields that can appear: `profile` (the namespace that answered),
131
+ `project_scope` (what a `project` filter did), `tag_scope` (what a `tags`
132
+ filter did), `temporal_frame`, `reranker_status`, and `thematic_context`.
133
+ Long contents are clamped and later results can come back as short stubs
134
+ (`truncated` / `stub` on the result); call `fetch` for the full text.
135
+
136
+ **Read `channel_status` before concluding that nothing is stored.** It reports
137
+ what each retrieval channel did on this query. `channel_weights` says how much
138
+ each channel counts; `channel_status` says whether it ran at all.
139
+
140
+ | status | meaning |
141
+ |---|---|
142
+ | `ok` | the channel ran and contributed candidates |
143
+ | `empty` | it ran and there was genuinely nothing to return |
144
+ | `no_candidates` | it ran but nothing survived fusion |
145
+ | `error` | it raised — **its results are missing from this answer** |
146
+ | `timeout` | it exceeded its guard — **results missing** |
147
+ | `no_embedding` | the query could not be embedded, so it could not run |
148
+ | `warming` | the embedding model, or the entity graph, was still loading right after a start — **results missing**, and the same question a little later usually works |
149
+ | `disabled` | switched off by configuration |
150
+ | `not_configured` | the backing service is not set up |
151
+
152
+ `semantic`, `bm25`, `temporal`, `hopfield` and `spreading_activation` each
153
+ search and return their own candidates. `profile` is a shortcut that runs before
154
+ them and can answer directly. `entity_graph` produces nothing of its own — it
155
+ re-scores what the others found, by how well each result connects to the
156
+ entities in your question, which is why it reports `no_candidates` when the
157
+ rest come back empty.
158
+
159
+ `empty`, `no_candidates`, `disabled` and `not_configured` are normal. `error`,
160
+ `timeout`, `no_embedding` and `warming` mean the answer is **incomplete, not
161
+ negative** — say so to the user rather than reporting "no memories found".
162
+
163
+ **Busy is not empty.** When many agents ask at once, recall waits up to about
164
+ twelve seconds for a free slot. If it still cannot start, it returns
165
+ `code: "RECALL_BUSY"`, `retryable: true` and a plain sentence ("Ask again in
166
+ about N seconds"). Wait that long and ask again; never tell the user the memory
167
+ lacks the answer. The same question asked twice at once runs once, and an answer
168
+ is reused for a few seconds only while nothing is written, so a `remember` you
169
+ just made is always visible to your next `recall`.
170
+ `incomplete_channels` lists the channels abandoned at the time limit, so two
171
+ runs of the same question that differ only there are an incomplete answer, not
172
+ a changed memory.
173
+
174
+ **Refine on low confidence.** `recall` returns confidence signals with every result. If `no_confident_match` is `true` (or `answer_confidence` is low / `abstained` is `true`), do NOT invent a memory — rewrite the query into 1–3 more specific sub-queries (split multi-hop questions; try entity names, synonyms, or broader phrasing) and call `recall` again before concluding nothing was found. A confident match → use it directly. SLM answers from this machine, typically in a second or two, with no server-side LLM round — unless the user turned on the online answer check, which adds one request to that service per recall — and lets you, the calling model, drive this refinement.
175
+
176
+ **`abstained` means the results shown do not answer the question.** If `abstained` is `true`, say you don't have it, or ask — never present the returned memories as the answer anyway. `abstention_reason` distinguishes why: `"judged_insufficient"` means candidates were found and scored, but none of them actually answers this question; `"evidence_floor"` / `"no_candidates"` means nothing was found at all. `answer_confidence` is a measurement, not a guarantee — treat a low number the same way you'd treat `abstained: true`. `calibration_status: "uncalibrated"` means no judge is configured for this recall; in that case `abstained` only ever reflects the older "nothing found" signal.
177
+
178
+ **Scores rank results; they are not probabilities.** `score` (an alias of
179
+ `relevance_score`) says how relevant a memory is to this query compared with
180
+ the others. It does not say how likely an answer is to be right, so never turn
181
+ it into a percentage, average it, or compare it across releases or
182
+ configurations. `answer_confidence` is `null` unless an answer check ran. When
183
+ the answer check is on and judges that the memories do not answer the
184
+ question, `abstained` is `true` and you say you do not have it. See
185
+ `docs/retrieval-score-contract.md`.
186
+
187
+ **`abstained: false` does not mean the answer was checked.** `answerability` says
188
+ whether it was: `supported` (the answer check ran and judged the shown memories
189
+ sufficient), `unsupported` (it ran and judged them insufficient) or `unjudged`
190
+ (it produced no verdict). `answerability_reason` gives the cause: `judged_fresh`
191
+ or `judged_from_memo` for a verdict, and for `unjudged` one of `disabled`,
192
+ `warming`, `unavailable`, `busy`, `budget_exhausted`, `no_results`,
193
+ `not_a_question` or `other_profile`. An empty result set is `unjudged` /
194
+ `no_results`, which is not evidence that no answer exists (check
195
+ `channel_status`). `answer_check_note` carries a sentence you can show a person.
196
+
197
+ ### 1b. Tiers: supported, related, none
198
+
199
+ Every recall says which of three answers it is, in `tier` (on the response and
200
+ on each result):
201
+
202
+ | `tier` | what it means | what you do |
203
+ |---|---|---|
204
+ | `supported` | a memory carries the answer | use it |
205
+ | `related` | the question is real, but nothing answers it exactly | `abstention_note` is "I don't have this exactly — here are the closest memories." Say you don't have it exactly; you may mention the closest memories (each labelled `tier: related`, a short preview), never present them as the answer |
206
+ | `none` | nonsense, or nothing close | `abstention_note` is "That isn't in SuperLocalMemory." **Stop. Do not invent an answer**, and do not keep rephrasing the same question |
207
+
208
+ The MCP `recall` returns `supported` results only. Pass `include_related=true`
209
+ to see up to three related memories when there is no supported one (without
210
+ it, a related answer comes back empty with "I don't have this exactly. Closer
211
+ memories exist; ask with include_related to see them."). `search`, the CLI and
212
+ the dashboard show related memories by default, labelled. `show_weak=true`
213
+ shows every weak match anyway, each labelled `weak: true`.
214
+
215
+ **`warming_up: true` means ask again shortly.** Right after a start, while the
216
+ models and inputs are still loading, recall returns what keyword search found
217
+ (as `related`) with `status_note`: "SuperLocalMemory is still warming up —
218
+ results may be incomplete. Try again in a few minutes." Tell the user that, and
219
+ do not conclude the memory is absent: SLM never says "That isn't in
220
+ SuperLocalMemory." while warming up.
221
+
222
+ ### 1c. Depth, max_tokens and expand
223
+
224
+ Recall in layers and spend context only where it pays:
225
+
226
+ | `depth` | returns |
227
+ |---|---|
228
+ | `0` glance | ids, `tier`, score and a one-line preview — the cheapest look |
229
+ | `1` recall | the full facts (the default) |
230
+ | `2` context | + `context`: the source memory, up to three facts from the same session, up to three about the same entities, and `superseded_by` when a correction replaced it |
231
+
232
+ `max_tokens` caps the whole result list and is never exceeded: context goes
233
+ first, then the last memory is shortened, then memories are left out, and
234
+ `layers` says what was trimmed. Start at `depth=0` or `1`; when one result is
235
+ the right one, drill into it with `expand`:
236
+
237
+ ```
238
+ recall(query="hub resultType fix", depth=0, max_tokens=400, session_id="<sid>")
239
+ expand(memory_id="f8a2bc91", depth=2, max_tokens=800)
240
+ ```
241
+
242
+ `expand` takes a result's `fact_id` or `memory_id` and runs the same profile,
243
+ quarantine and visibility checks as `fetch`; every memory it adds passes them
244
+ too.
245
+
246
+ ### 2. Passing session_id
247
+
248
+ Pass the `session_id` returned by `session_init`, on **every** recall in that
249
+ session. It does two things.
250
+
251
+ 1. **It carries the conversation forward.** Each recall offers its five
252
+ best-ranked results to a small per-session working set of seven slots. A
253
+ memory that keeps coming back is reinforced rather than duplicated, and the
254
+ least-activated slot is the one evicted, so something referenced across
255
+ several turns is hard to lose. Later recalls in the same session rank the
256
+ held memories higher, and turn three is not as cold as turn one. The bias is
257
+ deliberately small — it nudges the order, it never overrides an exact match.
258
+ 2. **It attributes engagement to the session**, so a later `report_outcome`
259
+ can close the loop on the right recall.
260
+
261
+ If you omit it, SLM looks for `SLM_SESSION_ID`, `CLAUDE_SESSION_ID` or
262
+ `CLAUDE_CODE_SESSION_ID` in the environment, then for the host's registered
263
+ session, and only then falls back to a per-agent label that is never credited
264
+ to a conversation. Recall still returns correct results either way, but a
265
+ fallback label means turns start cold and feedback cannot be attributed.
266
+
267
+ **Use the real id, not a made-up one.** An id beginning `http:`, `mcp:`, `cli:`,
268
+ `probe:`, `engine:`, `agent:`, `api:` or `view:` is treated as a synthetic
269
+ per-request label, not a conversation, and is excluded from the working set —
270
+ inventing one per call would otherwise fill the registry and evict genuine
271
+ conversations.
272
+
273
+ ### 3. Fast mode
274
+
275
+ `fast` controls **one** thing: whether the server runs its own internal LLM
276
+ reformulation round. It does **not** disable any retrieval channel — every
277
+ channel and the reranker run either way. Four channels register always: meaning,
278
+ keyword, entity graph and time. Spreading activation and Hopfield register as a
279
+ fifth and sixth when their prerequisites are present, so a store sees up to six
280
+ (`profile` in `channel_status` is a shortcut ahead of them, not a search).
281
+
282
+ Leave it unset. Unset resolves to "skip the internal round", because you are the
283
+ reasoner: you refine the query yourself using the confidence signals above, and
284
+ you do it better than a local model would. Pass `fast=False` only when SLM is
285
+ deployed with no capable client in front of it.
286
+
287
+ ```
288
+ recall(query="rate limiting approach", limit=5, session_id="<sid>")
289
+ ```
290
+
291
+ ### 4. Keyword fallback via search
292
+
293
+ When `recall` returns zero results on a specific term, try `search`:
294
+
295
+ ```
296
+ search(query="BM25 indexing", limit=20)
297
+ ```
298
+
299
+ Full-text FTS5 with BM25 ranking, no semantic channel. It takes the same
300
+ `kind`, `tags` / `tags_match` and `profile_id` arguments as `recall` (below).
301
+ The response has `success`, `results` (each with `fact_id`, `content`,
302
+ `fact_type`, `confidence`, `date` and the memory-kind fields) and `count`, but
303
+ no `channel_scores`, `query_type` or answer-check fields.
304
+
305
+ ### 5. Pull full detail for a known fact
306
+
307
+ ```
308
+ fetch(fact_ids="f8a2bc91,d4c1e203")
309
+ ```
310
+
311
+ Returns the full record for each ID: `entities`, `lifecycle`, `access_count`,
312
+ `importance`, `observation_date`, `referenced_date`, `project`. `fact_ids` may be
313
+ a comma-separated string or a list. Ids it could not resolve come back in
314
+ `not_found`; if none resolve, `success` is `false`. Use this when the recall
315
+ summary (120-char truncation in `list_recent`) is not enough.
316
+
317
+ ### 6. Browse recent memories
318
+
319
+ ```
320
+ list_recent(limit=20, kind="", tags="", tags_match="all", profile_id="")
321
+ ```
322
+
323
+ Returns facts newest-first. Content is truncated to 120 chars. Use `fetch`
324
+ once you have the `fact_id` for full content.
325
+
326
+ ### 7. Narrow a recall
327
+
328
+ Every filter below is optional and composes with the others as AND.
329
+
330
+ | Argument | Effect |
331
+ |---|---|
332
+ | `project` | Only memories saved under that project (a name or a path; case ignored). If none of the memories found were saved under it, the unfiltered results come back and `project_scope.filter.applied` is `false` with a `note` — never a silent empty answer. |
333
+ | `project_strict=True` | With `project`: no fall-back, only that project's memories even if there are none. |
334
+ | `prefer_project` | Ranks memories saved under that project above others of similar relevance and removes nothing. Pass your working directory on every recall in a project. |
335
+ | `saved_by` | Only memories saved by that agent id (for example `claude-desktop`). |
336
+ | `about` | Only memories that mention that person, project or tool. |
337
+ | `kind` | Only memories of one kind: `semantic`, `episodic`, `status`, `opinion`, `rule`, `decision`, `procedure`, `prospective` or `correction`. An unknown value is refused with `INVALID_KIND`. |
338
+ | `tags`, `tags_match` | Only memories saved with these exact labels (a comma-separated string, or a list when a label contains a comma). `tags_match` is `"all"` (default) or `"any"`. Case and spacing do not matter. Unlike `project`, a tag filter never falls back; an empty answer says why in `tag_scope`. |
339
+ | `window` | Event-time range: `"24h"`, `"7d"`, `"30d"`, `"1y"` or `"2026-07-01..2026-07-31"`. An unreadable value is refused. |
340
+ | `as_of`, `known_as_of`, `valid_at` | Point-in-time recall (ISO 8601). `known_as_of` is what SLM knew by then; `valid_at` is what was true then. `include_unknown=True` also admits older memories with no recorded time provenance. |
341
+ | `profile_id` | Serve this one call from another existing profile without moving the active one. |
342
+
343
+ Questions phrased like "what did we decide", "how do I" or "what is the current
344
+ status of" are answered with decisions, how-tos and the newest current-state
345
+ memory first, without any filter.
346
+
347
+ ```
348
+ recall(query="rollback procedure", kind="procedure", tags="ops", prefer_project="/work/api", session_id="<sid>")
349
+ ```
350
+
351
+ ### 8. Summaries and saved views
352
+
353
+ `get_memory_summary(kind="day", target="")` returns a readable summary of a
354
+ `day` (an ISO date, `today` or `yesterday`), a `project` (a directory path), a
355
+ `session` (a session id; leave `target` empty to get `recent_sessions` to pick
356
+ from) or a `community` (the `community_id` a recall gave in `thematic_context`).
357
+ It comes with `coverage` and `source_fact_ids`; session data is sparse, so do
358
+ not present a partial summary as a complete record.
359
+
360
+ `run_view(name="")` lists the user's saved views; with a name it runs that
361
+ saved question through ordinary recall, and the same `no_confident_match` rule
362
+ applies. Views are created from the dashboard, with `slm view create`, or with
363
+ `manage_view`.
364
+
365
+ ---
366
+
367
+ ### 9. Close the loop — say which memories helped
368
+
369
+ Whether a memory has been useful is evidence SLM records only if you supply it.
370
+ It is stored as learning signals (the count shows in `session_init`'s `learning`
371
+ block and on the dashboard). Signals reorder results only where adaptive ranking
372
+ is switched on by the operator (`SLM_RANKING`); it is off unless set, so do not
373
+ promise the user that a report changes the next answer.
374
+
375
+ ```
376
+ report_outcome(
377
+ memory_ids="f8a2bc91,c31d0f77", # the ids you actually used
378
+ outcome="success", # "success" | "failure" | "partial"
379
+ context="used the JWT expiry decision to write the refresh handler",
380
+ recall_query_id="q-3f9a", # the query_id of the recall; ties the report to that answer
381
+ )
382
+ ```
383
+
384
+ `report_outcome` and `report_feedback` are not in the smallest (`core`) tool set.
385
+ If your host does not list them, skip this step; nothing else depends on it.
386
+
387
+ Call it when a recall visibly changed what you did: you applied the decision,
388
+ followed the convention, or avoided the gotcha. Report `failure` when a
389
+ confidently-returned memory turned out to be wrong or stale — a negative signal
390
+ is recorded the same as a positive one. To retire a stale memory outright, save
391
+ the new version with `replaces` (see `slm-remember`).
392
+
393
+ Report only ids you genuinely used. Reporting every returned id marks the
394
+ irrelevant ones useful and records noise as signal. Without `recall_query_id`
395
+ the report is matched to a recall by overlapping memory ids within a time window.
396
+
397
+ `report_feedback(fact_id, feedback, query)` is the finer-grained form for a
398
+ single fact and the query that surfaced it; `feedback` is `"relevant"` (the
399
+ default), `"irrelevant"` or `"partial"`. If the signal could not be written to
400
+ the learning store it answers `success: false` with `durable: false`: do not
401
+ tell the user it was recorded.
402
+
403
+ ---
404
+
405
+ ## How multi-channel retrieval works
406
+
407
+ `recall` runs multiple candidate producers in parallel — semantic vector similarity,
408
+ keyword matching, temporal recency weighting, and contextual graph channels — then
409
+ fuses and reranks the combined results, with an optional entity-graph score
410
+ enhancement. The `channel_weights` field in the response shows how each channel
411
+ contributed for that query. Adaptive re-weighting from engagement signals is an
412
+ operator opt-in (`SLM_RANKING`) and is off by default.
413
+
414
+ To inspect per-channel scores for a real query against your own data:
415
+
416
+ ```bash
417
+ slm trace "<query>" [--limit N] [--json]
418
+ ```
419
+
420
+ No benchmark numbers are cited here; performance is workload-dependent.
421
+
422
+ ---
423
+
424
+ ## CLI fallback (when MCP is unavailable)
425
+
426
+ ```bash
427
+ # Multi-channel recall (related memories are shown, labelled [related])
428
+ slm recall "<query>" [--limit N] [--json]
429
+ slm recall "<query>" --depth 0|1|2 [--max-tokens N] # glance, full, with context
430
+ slm recall "<query>" --show-weak # every weak match, labelled [weak]
431
+
432
+ # Narrow it (all optional, combined as AND)
433
+ slm recall "<query>" --project <name-or-path> [--project-strict] [--prefer-project <path>]
434
+ slm recall "<query>" --kind decision --tag auth --tag security [--tags-match any]
435
+ slm recall "<query>" --saved-by claude-desktop --about "Alice" --window 7d
436
+ slm recall "<query>" --as-of 2026-01-01T00:00:00+00:00 [--known-as-of ...] [--valid-at ...] [--include-unknown]
437
+
438
+ # Opt into shared/global facts for one query (off by default)
439
+ slm recall "<query>" --include-global --include-shared
440
+
441
+ # Per-channel score breakdown
442
+ slm trace "<query>" [--limit N] [--json]
443
+
444
+ # Browse recent memories; each line shows the memory's kind and its id
445
+ slm list [--limit N] [--kind KIND] [--tag LABEL ...] [--tags-match all|any] [--json]
446
+
447
+ # Summaries and saved views
448
+ slm summary day [today|yesterday|YYYY-MM-DD] | project <path> | session <id> | sessions [--json]
449
+ slm view list | create <name> "<query>" [--kind K --window W --limit N] | run <name> | show <name> | rename <name> <new> | delete <name>
450
+ ```
451
+
452
+ `slm search` is an alias of `slm recall`: it runs the same multi-channel
453
+ retrieval, not the FTS5-only keyword search the MCP `search` tool performs.
454
+ `--fast` forces the quick path; it is already the default for agents.
455
+
456
+ Flags that do **not** exist on `slm recall`: `--min-score`, `--format`,
457
+ `--tags` (the flag is the repeatable `--tag`).
458
+
459
+ Recall returns only this profile's own memories unless you pass
460
+ `--include-global` / `--include-shared` (or the MCP `include_global` /
461
+ `include_shared` arguments), or the user has set the defaults in their
462
+ configuration. See [docs/shared-memory.md](../../../docs/shared-memory.md).
463
+
464
+ ---
465
+
466
+ ## Never fabricate a memory
467
+
468
+ "That isn't in SuperLocalMemory." (`tier: none`) is final for that question:
469
+ stop and say so; do not invent an answer. While `warming_up` is true, say SLM
470
+ is still warming up and to try again in a few minutes instead.
471
+
472
+ After re-querying with refined sub-queries (see **Refine on low confidence** above), if `no_confident_match` is still `true` or results are empty, report it plainly.
473
+ Never construct a response as if a memory was found when it was not. The user
474
+ trusts that what you surface came from the store.
475
+
476
+ ---
477
+
478
+ ## Shared and global memories (opt-in)
479
+
480
+ By default `recall` returns only memories in the active profile (personal scope).
481
+ To also surface memories shared from other profiles, pass the scope flags:
482
+
483
+ ```
484
+ recall(
485
+ query="...",
486
+ include_global=True, # include global-scope memories (visible to all profiles)
487
+ include_shared=True, # include shared-scope memories (shared with this profile)
488
+ session_id="<sid>",
489
+ )
490
+ ```
491
+
492
+ Scope flags are **off by default**. Only enable them when the user explicitly asks
493
+ to see shared or global facts. See `slm-scope` for the full sharing model.
494
+
495
+ ---
496
+
497
+ ## Profile-aware retrieval
498
+
499
+ `recall` queries the active profile. To read another existing profile for one
500
+ call, pass `profile_id="<name>"` (the active profile is not moved). The
501
+ `switch_profile` tool changes the active profile for every later call and for
502
+ other sessions on this machine, so reserve it for when the user asks to move.
503
+ See `slm-profile`.
504
+
505
+ ---
506
+
507
+ ## Related skills
508
+
509
+ - `slm-remember` — store the decisions and facts that recall surfaces later
510
+ - `slm-session` — session lifecycle (must call before first recall)
511
+ - `slm-scope` — multi-scope sharing model (personal / shared / global)
512
+ - `slm-profile` — workspace isolation and profile switching
513
+ - `slm-media` — pictures and PDF pages in results, and how to save them
514
+
515
+ ---
516
+
517
+ *SuperLocalMemory v4.2.6 · Qualixar · AGPL-3.0-or-later*