superlocalmemory 4.0.8 → 4.0.10

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 (147) hide show
  1. package/CHANGELOG.md +221 -1
  2. package/README.md +6 -6
  3. package/package.json +1 -1
  4. package/plugin/.claude-plugin/plugin.json +1 -1
  5. package/plugin/CLAUDE.md +3 -3
  6. package/plugin/agents/slm-governance-advisor.md +1 -1
  7. package/plugin/agents/slm-loop-runner.md +1 -1
  8. package/plugin/agents/slm-memory-advisor.md +1 -1
  9. package/plugin/agents/slm-optimize-advisor.md +1 -1
  10. package/plugin/requirements.txt +1 -1
  11. package/plugin/scripts/ensure-venv.sh +1 -1
  12. package/plugin/skills/slm-cache/SKILL.md +1 -1
  13. package/plugin/skills/slm-compress/SKILL.md +1 -1
  14. package/plugin/skills/slm-governance/SKILL.md +1 -1
  15. package/plugin/skills/slm-graph/SKILL.md +1 -1
  16. package/plugin/skills/slm-loop/SKILL.md +1 -1
  17. package/plugin/skills/slm-mesh/SKILL.md +1 -1
  18. package/plugin/skills/slm-profile/SKILL.md +1 -1
  19. package/plugin/skills/slm-recall/SKILL.md +1 -1
  20. package/plugin/skills/slm-remember/SKILL.md +1 -1
  21. package/plugin/skills/slm-scope/SKILL.md +1 -1
  22. package/plugin/skills/slm-session/SKILL.md +1 -1
  23. package/plugin/skills/slm-status/SKILL.md +3 -3
  24. package/plugin-src/rules/AGENTS.md +1 -1
  25. package/plugin-src/skills/slm-status/SKILL.md +2 -2
  26. package/pyproject.toml +1 -1
  27. package/scripts/postinstall.js +4 -0
  28. package/src/superlocalmemory/__init__.py +1 -1
  29. package/src/superlocalmemory/cli/_lazy_init.py +1 -1
  30. package/src/superlocalmemory/cli/commands.py +164 -11
  31. package/src/superlocalmemory/cli/db_migrate.py +0 -2
  32. package/src/superlocalmemory/cli/gdpr_io.py +1 -1
  33. package/src/superlocalmemory/cli/main.py +7 -7
  34. package/src/superlocalmemory/cli/service_installer.py +2 -1
  35. package/src/superlocalmemory/cli/setup_wizard.py +1 -1
  36. package/src/superlocalmemory/code_graph/bridge/maintenance.py +8 -0
  37. package/src/superlocalmemory/core/config.py +41 -7
  38. package/src/superlocalmemory/core/context_cache.py +0 -2
  39. package/src/superlocalmemory/core/engine.py +371 -63
  40. package/src/superlocalmemory/core/evidence_bundle.py +3 -1
  41. package/src/superlocalmemory/core/fact_consolidator.py +316 -125
  42. package/src/superlocalmemory/core/install_detector.py +131 -0
  43. package/src/superlocalmemory/core/maintenance.py +44 -6
  44. package/src/superlocalmemory/core/memory_health.py +266 -0
  45. package/src/superlocalmemory/core/operation_policy_registry.py +1 -1
  46. package/src/superlocalmemory/core/operation_request.py +1 -1
  47. package/src/superlocalmemory/core/ops_remediation.py +2 -2
  48. package/src/superlocalmemory/core/progressive_abstraction.py +1 -1
  49. package/src/superlocalmemory/core/security_primitives.py +3 -6
  50. package/src/superlocalmemory/core/store_pipeline.py +172 -29
  51. package/src/superlocalmemory/core/topic_signature.py +0 -2
  52. package/src/superlocalmemory/core/transactions/concrete_owners.py +15 -8
  53. package/src/superlocalmemory/dynamics/eap_scheduler.py +17 -6
  54. package/src/superlocalmemory/encoding/cognitive_consolidator.py +15 -1
  55. package/src/superlocalmemory/encoding/graph_builder.py +2 -2
  56. package/src/superlocalmemory/encoding/scene_builder.py +8 -2
  57. package/src/superlocalmemory/hooks/adapter_base.py +0 -2
  58. package/src/superlocalmemory/hooks/context_payload.py +0 -2
  59. package/src/superlocalmemory/hooks/portable_kit.py +8 -8
  60. package/src/superlocalmemory/hooks/post_tool_async_hook.py +0 -2
  61. package/src/superlocalmemory/hooks/prewarm_auth.py +0 -2
  62. package/src/superlocalmemory/hooks/user_prompt_hook.py +0 -2
  63. package/src/superlocalmemory/infra/backup.py +44 -8
  64. package/src/superlocalmemory/integrations/bounded_loops_mcp.py +24 -7
  65. package/src/superlocalmemory/learning/arm_catalog.py +0 -2
  66. package/src/superlocalmemory/learning/bandit.py +0 -2
  67. package/src/superlocalmemory/learning/bandit_cache.py +0 -2
  68. package/src/superlocalmemory/learning/dedup_hnsw.py +11 -11
  69. package/src/superlocalmemory/learning/ensemble.py +0 -2
  70. package/src/superlocalmemory/learning/labeler.py +0 -2
  71. package/src/superlocalmemory/learning/legacy_migration.py +0 -2
  72. package/src/superlocalmemory/learning/model_cache.py +0 -2
  73. package/src/superlocalmemory/learning/ranker.py +0 -2
  74. package/src/superlocalmemory/learning/reward_archive.py +6 -1
  75. package/src/superlocalmemory/learning/reward_proxy.py +0 -2
  76. package/src/superlocalmemory/learning/signal_worker.py +0 -2
  77. package/src/superlocalmemory/math/fisher.py +1 -1
  78. package/src/superlocalmemory/math/hopfield.py +4 -1
  79. package/src/superlocalmemory/math/langevin.py +1 -1
  80. package/src/superlocalmemory/math/sheaf.py +7 -3
  81. package/src/superlocalmemory/mcp/cli_fallback.py +1 -1
  82. package/src/superlocalmemory/mcp/profiles.py +1 -1
  83. package/src/superlocalmemory/mcp/server.py +2 -2
  84. package/src/superlocalmemory/mcp/session_binding.py +92 -0
  85. package/src/superlocalmemory/mcp/tools_active.py +56 -0
  86. package/src/superlocalmemory/mcp/tools_core.py +41 -40
  87. package/src/superlocalmemory/mcp/tools_ops.py +2 -2
  88. package/src/superlocalmemory/optimize/cache/manager.py +2 -2
  89. package/src/superlocalmemory/optimize/compress/ccr.py +1 -1
  90. package/src/superlocalmemory/optimize/compress/router.py +1 -1
  91. package/src/superlocalmemory/optimize/proxy/_helpers.py +2 -2
  92. package/src/superlocalmemory/optimize/proxy/server.py +1 -1
  93. package/src/superlocalmemory/optimize/proxy/vertex_surface.py +2 -2
  94. package/src/superlocalmemory/optimize/storage/db.py +2 -2
  95. package/src/superlocalmemory/retrieval/agentic.py +1 -1
  96. package/src/superlocalmemory/retrieval/ann_index.py +9 -2
  97. package/src/superlocalmemory/retrieval/bm25_channel.py +6 -10
  98. package/src/superlocalmemory/retrieval/bridge_discovery.py +2 -2
  99. package/src/superlocalmemory/retrieval/engine.py +272 -43
  100. package/src/superlocalmemory/retrieval/entity_channel.py +8 -2
  101. package/src/superlocalmemory/retrieval/hopfield_channel.py +8 -2
  102. package/src/superlocalmemory/retrieval/profile_channel.py +1 -1
  103. package/src/superlocalmemory/retrieval/quantization_aware_search.py +1 -1
  104. package/src/superlocalmemory/retrieval/remote_reranker.py +2 -2
  105. package/src/superlocalmemory/retrieval/reranker.py +3 -3
  106. package/src/superlocalmemory/retrieval/scope_policy.py +22 -1
  107. package/src/superlocalmemory/retrieval/semantic_channel.py +3 -3
  108. package/src/superlocalmemory/retrieval/spreading_activation.py +8 -8
  109. package/src/superlocalmemory/retrieval/strategy.py +94 -0
  110. package/src/superlocalmemory/retrieval/temporal_channel.py +179 -10
  111. package/src/superlocalmemory/retrieval/temporal_validity_filter.py +1 -1
  112. package/src/superlocalmemory/retrieval/vector_store.py +151 -10
  113. package/src/superlocalmemory/server/api.py +6 -1
  114. package/src/superlocalmemory/server/asset_versions.py +171 -0
  115. package/src/superlocalmemory/server/recall_serializer.py +10 -0
  116. package/src/superlocalmemory/server/routes/abstraction.py +201 -0
  117. package/src/superlocalmemory/server/routes/brain.py +2 -2
  118. package/src/superlocalmemory/server/routes/data_io.py +29 -1
  119. package/src/superlocalmemory/server/routes/entity.py +13 -1
  120. package/src/superlocalmemory/server/routes/mesh.py +1 -1
  121. package/src/superlocalmemory/server/routes/prewarm.py +4 -4
  122. package/src/superlocalmemory/server/routes/v3_api.py +2 -2
  123. package/src/superlocalmemory/server/ui.py +8 -1
  124. package/src/superlocalmemory/server/unified_daemon.py +570 -16
  125. package/src/superlocalmemory/storage/_migration_internals.py +4 -0
  126. package/src/superlocalmemory/storage/_schema_version.py +46 -3
  127. package/src/superlocalmemory/storage/backup.py +531 -0
  128. package/src/superlocalmemory/storage/database.py +139 -34
  129. package/src/superlocalmemory/storage/embedding_codec.py +129 -0
  130. package/src/superlocalmemory/storage/embedding_migrator.py +5 -3
  131. package/src/superlocalmemory/storage/migration_runner.py +153 -2
  132. package/src/superlocalmemory/storage/migrations/M043_quarantine_display_summaries.py +488 -0
  133. package/src/superlocalmemory/storage/migrations/__init__.py +1 -1
  134. package/src/superlocalmemory/storage/migrations.py +15 -1
  135. package/src/superlocalmemory/storage/models.py +7 -0
  136. package/src/superlocalmemory/storage/quantized_store.py +4 -2
  137. package/src/superlocalmemory/storage/schema.py +98 -0
  138. package/src/superlocalmemory/summaries/base.py +1 -1
  139. package/src/superlocalmemory/summaries/non_answer.py +223 -0
  140. package/src/superlocalmemory/summaries/session_summary.py +1 -1
  141. package/src/superlocalmemory/ui/css/legacy-dashboard.css +1 -1
  142. package/src/superlocalmemory/ui/css/neural-glass.css +1 -1
  143. package/src/superlocalmemory/ui/index.html +1 -1
  144. package/src/superlocalmemory/ui/js/core.js +1 -1
  145. package/src/superlocalmemory/ui/js/od-brain.js +1 -1
  146. package/src/superlocalmemory/ui/js/od-memories.js +190 -1
  147. package/src/superlocalmemory/ui/js/od-ops-health.js +1 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,226 @@ All notable changes to SuperLocalMemory will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [4.0.10] — Your memories, not the summarizer's
9
+
10
+ ### Fixed
11
+ - **A background pass had been writing its own summaries into your memory, and
12
+ they answered your questions.** SuperLocalMemory groups related memories and
13
+ writes a short summary of each group, meant for the dashboard. Since June
14
+ those summaries were being stored as memories, where they competed with your
15
+ own notes — and won, because each one carried the combined subjects of
16
+ everything it summarised and so looked more connected than any single note you
17
+ had written. Asked what you were working on, a store could answer with the
18
+ summarizer apologising for having nothing to say. Summaries now live
19
+ separately and are shown on the dashboard only. They are never returned as
20
+ answers, by any route: recall, search, the recent list, pinned context, an
21
+ export, or the memory count.
22
+ - **Summarising a group set aside the memories in it.** That made sense while
23
+ the summary stood in for them in your answers. It does not now, so it has
24
+ stopped — and upgrading brings back the memories it had already set aside.
25
+ Where a store had been running long enough for those memories to have faded on
26
+ their own, they are restored to whatever standing their own history warrants,
27
+ not promoted.
28
+ - **Upgrading repairs an affected store by itself.** No commands, no files to
29
+ edit. A verified backup is taken first, the repair is safe to interrupt and
30
+ safe to repeat, and it reports in plain language what it changed. It also
31
+ keeps checking: if the problem ever reappears, the next start handles it.
32
+ - **The setting that turns summarising off did nothing.** It has been
33
+ documented and ignored since it was added.
34
+ - **A summary that is a refusal is no longer stored as one.** When a group has
35
+ nothing in common, a model does not fail — it answers in prose, and that prose
36
+ was indistinguishable from a summary to anything that only checked whether
37
+ text came back. Model output is now cleaned of chat framing and rejected if it
38
+ turns out to be about the request rather than about your memories. A summary
39
+ assembled from your own sentences is exempt, so a note that happens to be
40
+ phrased like a chatbot is not thrown away.
41
+ - **A summary of a group could pull real memories into a later grouping pass
42
+ and set them aside with it.**
43
+ - **Summarising an unchanged group repeated its work indefinitely**, including
44
+ calling a language model to regenerate text it already had. It now recognises
45
+ that nothing has changed and stops.
46
+ - **An exported backup carried the summaries**, and importing it would have
47
+ turned them back into memories on a machine where nothing was wrong.
48
+ - **A memory can now be dated to when it happened**, not just to when it was
49
+ written. Everything was previously stamped with its ingestion date, so a note
50
+ written today about something from March filed itself under today. A date that
51
+ cannot be understood is refused rather than quietly dropped.
52
+ - **A dated memory is now findable by its date even when nothing in it was
53
+ recognised as a name.** Roughly a quarter of a typical store was reachable
54
+ only by being recent, rather than by being about the right time.
55
+ - **Stored memories now record which conversation they came from.** Reading
56
+ memories worked this out; writing them did not, so almost nothing carried it —
57
+ which left the feature that spreads an answer across different conversations
58
+ with nothing to work with.
59
+
60
+ ### Added
61
+ - **`slm doctor` and the dashboard now tell you whether your memories can
62
+ actually be found**, with the counts behind the answer: how many you have, how
63
+ many are searchable by meaning, and how many are being held back and why. This
64
+ was previously unknowable without writing your own queries against the
65
+ database — one machine ran for months with 44% of its memory unreachable while
66
+ every status line said it was healthy.
67
+ - **A Knowledge Overview on the Summaries tab.** What your memory knows, how
68
+ many memories each summary covers, and the stretch of time it spans. Summaries
69
+ that came back empty are counted rather than shown, and near-identical ones
70
+ are collapsed, so the page reflects what is there instead of padding itself.
71
+
72
+ ### Changed
73
+ - **Searching by meaning no longer spends its results on held-back summaries.**
74
+ On a store with a lot of them, a question close to their subject matter could
75
+ come back with nothing usable at all while appearing to have answered.
76
+ - **The startup repair no longer reports itself finished while memories remain
77
+ unsearchable.** It says how many are left, why, and that it will retry — and
78
+ it does retry, instead of recording success and never looking again.
79
+ - **Dashboard files now carry a version taken from their own contents**, so a
80
+ changed script or stylesheet is always served as a new address. The version
81
+ numbers were maintained by hand and had stopped matching the files they named.
82
+
83
+ ## [4.0.9] — Findable the moment you write it
84
+
85
+ ### Fixed
86
+ - **A memory you just wrote could not be found by asking for it.** Until a
87
+ background pass caught up, a new memory was reachable only by quoting its own
88
+ wording — which is not how anyone asks a question. "What am I working on"
89
+ shares no distinctive word with any particular note, so the memory describing
90
+ what you are doing right now was the hardest thing in the store to find. Every
91
+ way of storing one — command line, tool interface, dashboard — now makes it
92
+ searchable by meaning before it answers, bounded so that a slow or missing
93
+ model costs a short wait and never the write itself. The receipt says which of
94
+ three states a memory is in: stored, findable by its wording, findable by
95
+ meaning.
96
+ - **"What am I working on" answered with notes from a month ago.** Four separate
97
+ faults sat between the question and the answer. The present-tense path weighted
98
+ word-matching more heavily than the path it replaced, so a stale note
99
+ containing the word "working" beat a fresh one. A recency lookup was switched
100
+ off by an unrelated condition that is almost always true. A fact carrying
101
+ several dated events crowded out other recent facts with copies of itself. And
102
+ the lookup drew its candidates from a list that is only assembled later, and
103
+ only for notes that mention a recognisable name and a date — so a plain note
104
+ written seconds ago was not merely ranked low, it was not a candidate at all.
105
+ Recent notes are now read from the memories themselves. Questions about topics
106
+ still answer on topic — asking about the schema does not return whatever is
107
+ newest.
108
+ - **A memory could be reported as findable by meaning when it was not.** Two
109
+ things have to agree before a search on meaning can reach a memory, and one of
110
+ the two ways of storing one wrote them in the wrong order: if the second write
111
+ was refused — because the store was at a different size, or the search
112
+ extension was unavailable on the platform — the memory was left in a state that
113
+ reads as complete, so the pass that repairs missed memories skipped it forever
114
+ while the receipt claimed success. Both writes now happen in the one order that
115
+ is safe, through shared code rather than two copies of it, and if the second
116
+ fails the first is undone so the repair pass can retry. "Already findable" is
117
+ now decided by asking whether a search could actually return the memory.
118
+ - **Questions like "what is the latest authentication design" returned the newest
119
+ notes rather than an answer.** Two words routed any question containing them
120
+ down the time-based path, where a question with no recognisable name in it fell
121
+ back to listing recent memories with no regard for the topic. Asking what is
122
+ latest about something now answers about that something. "What am I currently
123
+ focused on" still answers with current work.
124
+ - **A question about a span of time missed anything recorded as spanning it.** An
125
+ entry describing a period rather than a moment carries no single date, and the
126
+ lookup for date-anchored questions required one — so "what happened in March
127
+ 2024" could not return an entry that says it covers March 2024.
128
+ - **The documented switch for turning the present-tense ranking off did nothing
129
+ when set in configuration.** It worked only as an environment variable, which
130
+ is not what it is documented as. Both now work, and the environment variable
131
+ still wins.
132
+ - **Converting a store could stop making progress instead of finishing.** A row
133
+ that cannot be converted — malformed, or the wrong size — was left in place and
134
+ then selected again on the next pass, so a single bad row meant the conversion
135
+ ran indefinitely without converting anything further. It now moves past what it
136
+ cannot convert, reports how many, and finishes.
137
+ - **Retention could delete half of a safety copy.** The two files taken before an
138
+ upgrade were sometimes counted as two separate copies rather than one, so
139
+ retention could keep one file of a pair and discard the other, leaving a copy
140
+ that cannot be restored from. Choosing the newest copy also relied on file
141
+ timestamps, which on some filesystems cannot tell two copies apart; it now uses
142
+ the timestamp in the name, which can.
143
+ - **An upgrade could be refused on a disk with room for it.** The space check
144
+ asked for roughly twice what the copy actually needs.
145
+ - **Retrying an upgrade that had failed did not take a fresh copy first.** A
146
+ failed step was treated as a finished one, so the retry ran against the
147
+ half-changed store with no new copy taken. The message now also says where the
148
+ copy from the first attempt is.
149
+ - **Shutting the service down could exceed its shutdown budget** and be killed
150
+ mid-write, because the workers that make new memories searchable were never
151
+ released. They are now released on shutdown, and a memory arriving during
152
+ shutdown is declined rather than starting new work.
153
+ - **A question about a particular time missed anything older than the most recent
154
+ few thousand events**, returning nothing rather than answering slowly.
155
+ - **`slm remember --sync` promised to wait and did not.** The flag is now
156
+ honoured, and asking to wait buys a longer attempt at making the memory
157
+ searchable.
158
+ - **A failed upgrade could report that your data was untouched when earlier steps
159
+ had already been applied.** The message now distinguishes a partial change from
160
+ no change, and points at the copy taken beforehand.
161
+ - **The copy taken before an upgrade could be deleted by a later start.** It was
162
+ being retaken on every ordinary start and pruned by retention, so two restarts
163
+ after an upgrade removed the last copy of the original. It is now taken only
164
+ when something is actually about to change.
165
+
166
+ ### Changed
167
+ - **Embeddings are stored in binary rather than text** — the same values to the
168
+ last decimal, five and a half times smaller. Existing stores are converted in
169
+ place; the conversion copies the store aside and verifies the copy first,
170
+ refuses while a service still holds it, and asks before rewriting anything.
171
+ - **Recall tail latency is roughly halved**, and the time a write may spend
172
+ making itself findable has been raised rather than lowered. Giving up early on
173
+ that was never free: it decided whether a memory could be found by asking a
174
+ question or only by quoting its own words. A retrieval channel is likewise
175
+ given more time to answer, because a channel that runs out of time contributes
176
+ nothing at all and the answer silently loses whatever only it could see. That
177
+ limit is now what it was always described as — a guard against one part of
178
+ retrieval getting stuck, set far above how long any of them actually takes,
179
+ rather than a cutoff that trims the wait by dropping part of the answer.
180
+ - **When part of an answer is missing, the reply now says which part.** If one
181
+ source of results has to be abandoned, its memories are absent from that
182
+ answer rather than merely late — so asking again can legitimately give
183
+ something better. Replies carry the list of anything that was abandoned, which
184
+ is empty on a healthy answer, so it is possible to tell an incomplete answer
185
+ from a changed one instead of guessing.
186
+ - **Asking the same question twice gives the same answer.** This had two
187
+ separate causes. Several points in retrieval ordered results by score alone,
188
+ so memories that scored equally were ranked by where they happened to sit on
189
+ disk or which thread finished first. And two stages that improve an answer —
190
+ one that brings in related memories, one that re-scores results by how they
191
+ connect to the things your question mentions — ran only if the answer was not
192
+ already taking too long. Both stages change which memory comes first, so
193
+ whether they ran decided the answer, and the time they were measured against
194
+ was close to how long a typical question takes anyway. The same question
195
+ asked twice took different paths depending on how busy the machine was, and
196
+ nothing in the reply said so. Ordering is now decided only by the data, and
197
+ those stages always run. Measured over 140 questions on a 1 GB store, asked
198
+ twice: the top answer changed on 15% of them before and 5.7% after, and the
199
+ top ten changed on 41% before and 13.6% after. Answering takes roughly a
200
+ tenth of a second longer.
201
+ - **A ranking adjustment for questions about time now actually affects the
202
+ order results come back in.** It was being calculated and then discarded.
203
+ - **Storing a memory stays inside its time budget.** The durable write and the
204
+ work that makes the memory findable by meaning run one after the other, and
205
+ each had been given the whole budget, so a slow write could push the reply to
206
+ several seconds. The second now takes what the first left.
207
+ - **Converting a store can no longer report success while storing nonsense.**
208
+ Two malformed shapes — a vector of one-element lists, and numbers too large to
209
+ represent — passed the size check and would have been written as garbage.
210
+ Both are now rejected and reported, and the memory keeps its original value.
211
+ - **A memory is no longer reported findable by meaning unless both of its stored
212
+ forms agree.** Either one alone could be present without the other, and each
213
+ case was invisible to the pass that repairs it.
214
+ - **Shutting the service down twice in one process no longer halves the capacity
215
+ that makes new memories findable.**
216
+ - **More of your memories can be reached at all.** One stage of retrieval decides
217
+ the final set of results, and the number of candidates handed to it had been cut
218
+ to save time — which quietly meant anything ranked below that cut could never be
219
+ returned, no matter how well it matched. The cut is undone. Recall spends a
220
+ little longer and can reach everything.
221
+ - **Questions about the past distinguish two days ago from a month ago again.**
222
+ The adjustment applied to time-based questions was capped so low that it landed
223
+ on the same value for everything inside about five weeks, so it could not tell
224
+ recent from distant. Note that this changes ranking order for such questions.
225
+ - Storing a memory reports whether it is searchable by meaning yet, so a caller
226
+ no longer has to assume.
227
+
8
228
  ## [4.0.8] — Where you were actually looking
9
229
 
10
230
  ### Added
@@ -944,7 +1164,7 @@ Eight community pull requests merged after line-by-line review, plus fixes for t
944
1164
 
945
1165
  ## [3.6.14] - 2026-06-18 — Audit-hardened: memory bounds, cross-tenant cache isolation, atomic credentials
946
1166
 
947
- Shipped through two adversarial audit passes (Qualixar Iron Pattern Stages 8–9), validated against a green 5933-test suite under the real 3.12 runtime. Default single-machine behavior is unchanged.
1167
+ Default single-machine behavior is unchanged.
948
1168
 
949
1169
  ### Security
950
1170
 
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  </picture>
6
6
  </p>
7
7
 
8
- <h1 align="center">SuperLocalMemory V4.0.8</h1>
8
+ <h1 align="center">SuperLocalMemory V4.0.10</h1>
9
9
 
10
10
  <h2 align="center">Rent the LLM. Own the memory.</h2>
11
11
 
@@ -27,12 +27,12 @@ guarantee here is stated as a falsifiable invariant, tested under an adversarial
27
27
  negative control, and shipped with the harness that regenerates the evidence:
28
28
  <code>python benchmark/run_all.py --trials 200 --output-dir results/</code>. What each experiment
29
29
  does <em>not</em> exercise is stated too.</p>
30
- <p align="center"><code>v4.0.8</code> — one control plane: <strong>SLM-Mesh</strong> peer coordination · multi-scope memory (personal / shared / global) · profiles · Cache · Compress · 7-layer retrieval · code graph · Entity Explorer · skill evolution · Modes A/B/C · GDPR retention &amp; audit chain · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
30
+ <p align="center"><code>v4.0.10</code> — one control plane: <strong>SLM-Mesh</strong> peer coordination · multi-scope memory (personal / shared / global) · profiles · Cache · Compress · 7-layer retrieval · code graph · Entity Explorer · skill evolution · Modes A/B/C · GDPR retention &amp; audit chain · bounded loops — across CLI, MCP, dashboard, the <strong>Claude plugin</strong>, the <strong>Codex add-on</strong>, and documented IDE integrations.<br/>
31
31
  Proxy: <code>slm wrap claude</code> &nbsp;·&nbsp; MCP: add <code>slm_compress</code> to your config &nbsp;·&nbsp; Skill: zero-config</p>
32
32
  <p align="center"><strong>Four public arXiv preprints</strong> · V4: <a href="https://arxiv.org/abs/2608.08253">arXiv:2608.08253</a> · companion archive: <a href="https://zenodo.org/records/21853302">Zenodo 21853302</a> (<a href="https://doi.org/10.5281/zenodo.21853302">DOI 10.5281/zenodo.21853302</a>) · prior preprints: <a href="https://arxiv.org/abs/2603.02240">2603.02240</a> · <a href="https://arxiv.org/abs/2603.14588">2603.14588</a> · <a href="https://arxiv.org/abs/2604.04514">2604.04514</a>.</p>
33
33
 
34
34
  <p align="center">
35
- <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.0.8-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.0.8 — Current Release"/></a>
35
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/v4.0.10-Current_Release-2ea44f?style=for-the-badge&logo=checkmarx&logoColor=white" alt="v4.0.10 — Current Release"/></a>
36
36
  <a href="https://arxiv.org/abs/2608.08253"><img src="https://img.shields.io/badge/arXiv-2608.08253-b31b1b?style=for-the-badge&logo=arxiv&logoColor=white" alt="SuperLocalMemory 4.0 paper on arXiv:2608.08253"/></a>
37
37
  <a href="https://zenodo.org/records/21853302"><img src="https://img.shields.io/badge/Zenodo-10.5281%2Fzenodo.21853302-1682D4?style=for-the-badge&logo=zenodo&logoColor=white" alt="V4 paper on Zenodo: 10.5281/zenodo.21853302"/></a>
38
38
  <a href="https://arxiv.org/abs/2603.14588"><img src="https://img.shields.io/badge/arXiv-2603.14588-b31b1b?style=for-the-badge&logo=arxiv&logoColor=white" alt="arXiv Paper"/></a>
@@ -386,8 +386,8 @@ Full docs: [docs/multi-machine.md](docs/multi-machine.md) · [docs/distributed-d
386
386
  | **Python CLI + SDK** (primary) | Activate a Python virtual environment, then `python -m pip install superlocalmemory` | Python 3.11+; the `slm` CLI and importable SDK stay inside that environment |
387
387
  | **Repository clone — macOS/Linux** | `./scripts/install.sh install` | Research/contributor path; delegates to an existing uv or pipx installation |
388
388
  | **Repository clone — Windows** | `.\scripts\install.ps1 -Action Install` | Research/contributor path; delegates to an existing uv or pipx installation |
389
- | **Claude Code Plugin** (WP-06) | `/plugin marketplace add qualixar/superlocalmemory` then `/plugin install superlocalmemory@qualixar` | Self-bootstraps venv, isolated SLM_DATA_DIR, additive — 16-tool core. Ships the skills/agents/hooks/commands |
390
- | **Portable / IDE connect** (WP-08) | `slm connect <ide> [--here]` | Wire any IDE without reinstalling; `slm connect claude-code` → plugin pointer |
389
+ | **Claude Code Plugin** | `/plugin marketplace add qualixar/superlocalmemory` then `/plugin install superlocalmemory@qualixar` | Self-bootstraps venv, isolated SLM_DATA_DIR, additive — 16-tool core. Ships the skills/agents/hooks/commands |
390
+ | **Portable / IDE connect** | `slm connect <ide> [--here]` | Wire any IDE without reinstalling; `slm connect claude-code` → plugin pointer |
391
391
 
392
392
  After any install path: `slm setup` → `slm doctor` → `slm warmup` (optional, pre-downloads ~500MB embedding model).
393
393
 
@@ -433,7 +433,7 @@ Or: `claude mcp add --transport http superlocalmemory http://127.0.0.1:8765/mcp/
433
433
  { "mcpServers": { "superlocalmemory": { "command": "slm", "args": ["mcp"] } } }
434
434
  ```
435
435
 
436
- ### MCP Profiles (WP-01)
436
+ ### MCP Profiles
437
437
 
438
438
  Control tool surface via `SLM_MCP_PROFILE`:
439
439
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superlocalmemory",
3
- "version": "4.0.8",
3
+ "version": "4.0.10",
4
4
  "description": "Local-first agent memory with MCP and an agent-native CLI. Documented clients include Claude Code, Cursor, and Windsurf.",
5
5
  "keywords": [
6
6
  "ai-memory",
@@ -15,5 +15,5 @@
15
15
  "mcpServers": "./.mcp.json",
16
16
  "name": "superlocalmemory",
17
17
  "repository": "https://github.com/qualixar/superlocalmemory",
18
- "version": "4.0.8"
18
+ "version": "4.0.10"
19
19
  }
package/plugin/CLAUDE.md CHANGED
@@ -1,4 +1,4 @@
1
- <!-- BEGIN SuperLocalMemory v4.0.8 -->
1
+ <!-- BEGIN SuperLocalMemory v4.0.10 -->
2
2
 
3
3
  ## SuperLocalMemory (SLM) — Agent Rules
4
4
 
@@ -39,6 +39,6 @@ slm-recall · slm-remember · slm-session · slm-status · slm-cache · slm-comp
39
39
  ### Subagents
40
40
  slm-memory-advisor (memory decisions, session hygiene, scope/profile guidance) · slm-optimize-advisor (context compression + KV cache) · slm-governance-advisor (scope/roles/compliance/GDPR)
41
41
 
42
- <!-- END SuperLocalMemory v4.0.8 -->
42
+ <!-- END SuperLocalMemory v4.0.10 -->
43
43
 
44
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -77,4 +77,4 @@ slm-scope · slm-governance · slm-profile · slm-remember · slm-recall
77
77
  # What NOT to do
78
78
  Never session_init twice; never forget without dry-run preview; never store secrets; never bypass role checks; never claim an erasure succeeded without verifying via recall.
79
79
 
80
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
80
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -68,4 +68,4 @@ assessment. The gate is the authority.
68
68
 
69
69
  ---
70
70
 
71
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
71
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -46,4 +46,4 @@ slm-recall · slm-remember · slm-session · slm-scope · slm-profile · slm-gov
46
46
  # What NOT to do
47
47
  Never session_init twice; never forget dry_run=False without reporting preview; never dump a whole file into remember; never invent a memory; never claim "saved" without success:true / clean CLI exit; never bypass scope or governance restrictions.
48
48
 
49
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
49
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -41,4 +41,4 @@ slm-compress · slm-cache · slm-status · slm-profile
41
41
  # What NOT to do
42
42
  Never compress code-for-edit/JSON-to-parse/<500 chars; never store secrets/ccr_ids; never let optimize failure block/alter the task; never claim a specific savings %; never carry ccr_ids across profile switches.
43
43
 
44
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
44
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -1 +1 @@
1
- superlocalmemory==4.0.8
1
+ superlocalmemory==4.0.10
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # ensure-venv.sh — WP-06 SuperLocalMemory plugin venv bootstrap
2
+ # ensure-venv.sh — SuperLocalMemory plugin venv bootstrap
3
3
  #
4
4
  # Called by Claude Code SessionStart hook. Idempotent: fast-path exits in <100ms
5
5
  # on repeat invocations when requirements.txt is unchanged.
@@ -145,4 +145,4 @@ These subcommands control daemon-level cache settings. They do not read or write
145
145
 
146
146
  ---
147
147
 
148
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
148
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -147,4 +147,4 @@ Content over 1 MB (1 000 000 bytes UTF-8) is processed but `reversible` is force
147
147
 
148
148
  ---
149
149
 
150
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
150
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -245,4 +245,4 @@ Before running any destructive operation (`forget`, `compact_memories`):
245
245
 
246
246
  ---
247
247
 
248
- *SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later*
248
+ *SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later*
@@ -312,4 +312,4 @@ profile. See `slm-profile` for the full profile switching workflow.
312
312
 
313
313
  ---
314
314
 
315
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
315
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -96,4 +96,4 @@ paused, name the approval needed; when errored, quote the short detail.
96
96
 
97
97
  ---
98
98
 
99
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
99
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -279,4 +279,4 @@ mesh availability.
279
279
 
280
280
  ---
281
281
 
282
- *SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later*
282
+ *SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later*
@@ -146,4 +146,4 @@ Name them differently in your MCP config (e.g. `superlocalmemory-personal` and
146
146
 
147
147
  ---
148
148
 
149
- *SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later*
149
+ *SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later*
@@ -236,4 +236,4 @@ before recalling, then switch back. See `slm-profile` for workspace switching.
236
236
 
237
237
  ---
238
238
 
239
- *SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later*
239
+ *SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later*
@@ -238,4 +238,4 @@ different workspace, use `switch_profile` first. See `slm-profile`.
238
238
 
239
239
  ---
240
240
 
241
- *SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later*
241
+ *SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later*
@@ -173,4 +173,4 @@ to review the impact. See `slm-remember` for the full deletion discipline.
173
173
 
174
174
  ---
175
175
 
176
- *SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later*
176
+ *SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later*
@@ -227,4 +227,4 @@ explicitly and call `recall` with `include_global`/`include_shared` after
227
227
 
228
228
  ---
229
229
 
230
- *SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later*
230
+ *SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later*
@@ -61,7 +61,7 @@ If `cache_kv_hits` is 0 after repeated work, verify key naming consistency (the
61
61
  slm status [--json] [--verbose]
62
62
  ```
63
63
 
64
- Reports system-level state — not optimization counters. Canonical fields (WP-02):
64
+ Reports system-level state — not optimization counters. Canonical fields:
65
65
 
66
66
  - **mode** — active operation mode (e.g. `local`)
67
67
  - **profile** — current memory profile name
@@ -101,7 +101,7 @@ Do not rely on the human-readable format for parsing — always use `--json` whe
101
101
  slm doctor [--json] [--quick]
102
102
  ```
103
103
 
104
- Preflight check covering dependencies, embedding worker, daemon connectivity, and Surface B health. The **"Optimize (Surface B)"** line (WP-03) confirms whether the compression and cache subsystem initialised correctly.
104
+ Preflight check covering dependencies, embedding worker, daemon connectivity, and Surface B health. The **"Optimize (Surface B)"** line confirms whether the compression and cache subsystem initialised correctly.
105
105
 
106
106
  `--quick` skips the daemon and embedding probes — runs only dependency and config checks; faster but incomplete.
107
107
 
@@ -163,4 +163,4 @@ multi-profile setup. To switch the active profile, see `slm-profile`.
163
163
 
164
164
  ---
165
165
 
166
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
166
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -129,4 +129,4 @@ When the SLM MCP server is unavailable, use these CLI equivalents:
129
129
  - **slm-optimize-advisor** — context compression and KV cache
130
130
  - **slm-governance-advisor** — scope/role compliance, retention policies, GDPR
131
131
 
132
- SuperLocalMemory v4.0.8 · Qualixar · AGPL-3.0-or-later
132
+ SuperLocalMemory v4.0.10 · Qualixar · AGPL-3.0-or-later
@@ -61,7 +61,7 @@ If `cache_kv_hits` is 0 after repeated work, verify key naming consistency (the
61
61
  slm status [--json] [--verbose]
62
62
  ```
63
63
 
64
- Reports system-level state — not optimization counters. Canonical fields (WP-02):
64
+ Reports system-level state — not optimization counters. Canonical fields:
65
65
 
66
66
  - **mode** — active operation mode (e.g. `local`)
67
67
  - **profile** — current memory profile name
@@ -101,7 +101,7 @@ Do not rely on the human-readable format for parsing — always use `--json` whe
101
101
  slm doctor [--json] [--quick]
102
102
  ```
103
103
 
104
- Preflight check covering dependencies, embedding worker, daemon connectivity, and Surface B health. The **"Optimize (Surface B)"** line (WP-03) confirms whether the compression and cache subsystem initialised correctly.
104
+ Preflight check covering dependencies, embedding worker, daemon connectivity, and Surface B health. The **"Optimize (Surface B)"** line confirms whether the compression and cache subsystem initialised correctly.
105
105
 
106
106
  `--quick` skips the daemon and embedding probes — runs only dependency and config checks; faster but incomplete.
107
107
 
package/pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "superlocalmemory"
3
- version = "4.0.8"
3
+ version = "4.0.10"
4
4
  description = "Local-first agent memory with auditable hybrid retrieval"
5
5
  readme = "README.md"
6
6
  license = "AGPL-3.0-or-later"
@@ -201,6 +201,10 @@ function main(argv = process.argv.slice(2)) {
201
201
  console.log(`SuperLocalMemory ${packageVersion}: isolated runtime verified.`);
202
202
  console.log('No memory database, IDE hooks, daemon, configuration, or models were changed.');
203
203
  console.log('');
204
+ console.log(' Your database will be automatically migrated on first run.');
205
+ console.log(' A backup is created in ~/.superlocalmemory/pre-migration-snapshots/ before');
206
+ console.log(' any migration runs. No action is needed from you.');
207
+ console.log('');
204
208
  console.log(' Next step — run the guided setup (picks your mode, downloads');
205
209
  console.log(' models, connects your IDEs). Takes about a minute:');
206
210
  console.log('');
@@ -32,7 +32,7 @@ if "OMP_NUM_THREADS" not in os.environ:
32
32
  os.environ["OMP_NUM_THREADS"] = "2"
33
33
  # ---------------------------------------------------------------------------
34
34
 
35
- __version__ = "4.0.8"
35
+ __version__ = "4.0.10"
36
36
 
37
37
  _REQUIRED_VERSIONS = {
38
38
  "sentence_transformers": "5.3.0",
@@ -2,7 +2,7 @@
2
2
  # Licensed under AGPL-3.0-or-later - see LICENSE file
3
3
  # Part of SuperLocalMemory V3 | https://qualixar.com | https://varunpratap.com
4
4
 
5
- """WP-07 — Lazy first-run initialisation (pip cross-install).
5
+ """Lazy first-run initialisation for pip cross-installs.
6
6
 
7
7
  Lightweight import only — zero heavy imports, STDOUT-SILENT.
8
8