@@ -10,12 +10,15 @@ Milvus adapter, and a batch of embedding-correctness fixes; the indexing and
1010persistence path is rebuilt around generation-versioned, compare-and-swap
1111writes so concurrent multi-agent workloads can no longer deadlock or lose
1212observations and relations. Day-to-day operation gets a real front door with
13- ` bm config ` , Rich ` bm tool ` output, a diagnostics tool, and an honest
14- reindex; ` bm hook ` brings harness lifecycle capture into the package; and
15- cloud adds ` bm cloud share ` , ` bm cloud prune ` , and an optional Redis read
16- cache. Five database migrations run automatically on first start, including
17- a one-time repair that dedupes duplicate observation rows and purges their
18- stale full-text search entries.
13+ ` bm config ` , Rich ` bm tool ` output, a diagnostics tool, an honest reindex,
14+ and a retrieval inspector — ` bm inspect chunks ` shows a note exactly as the
15+ index sees it and ` bm inspect query ` traces how a search ranked its results;
16+ ` bm hook ` brings harness lifecycle capture into the package; and cloud adds
17+ ` bm cloud share ` , ` bm cloud prune ` , an optional Redis read cache, and Team
18+ workspace ` bm cloud push ` /` pull ` over permissioned WebDAV. Five database
19+ migrations run automatically on first start, including a one-time repair
20+ that dedupes duplicate observation rows and purges their stale full-text
21+ search entries.
1922
2023### Breaking Changes
2124
@@ -73,6 +76,16 @@ stale full-text search entries.
7376 ` api_key ` for OpenAI-compatible and self-hosted servers (** #1005 ** ), and
7477 literal document/query prefixes support prefix-sensitive asymmetric
7578 models (** #1044 ** , ** #1008 ** ).
79+ - ** #1249 / #1250 ** : New retrieval inspector (** #1155 ** ). `bm inspect
80+ chunks <note >` shows a note exactly as the index sees it — its search
81+ rows, the vector chunks each row produced, and per-chunk
82+ ready/pending/stale/orphaned status — separating chunking problems from
83+ freshness problems in one command. ` bm inspect query "<query>" ` captures
84+ an opt-in execution trace from the same search call that returns the
85+ results: FTS and vector candidates, fusion, filtering, reranking, and the
86+ final page window, with stable JSON output and ` --show-misses ` for
87+ rejected candidates. Ordinary search behavior and responses are
88+ unchanged.
7689- ** #1088 ** : New ` bm config ` command group: ` list ` (effective values with
7790 env overrides marked), ` get ` , ` set ` (validated through the config model),
7891 and ` unset ` (** #991 ** ).
@@ -129,9 +142,20 @@ stale full-text search entries.
129142- ** #1061 ** : New ` bm cloud prune ` removes ` .bmignore ` d files from the cloud
130143 on demand (** #1032 ** ; see Breaking Changes for the one-way sync behavior
131144 change).
145+ - ** #1263 ** : Team-workspace ` bm cloud push ` /` pull ` run over the service's
146+ permissioned WebDAV surface instead of tenant-wide storage credentials,
147+ so any member can sync the projects they have access to — previously only
148+ workspace owners could provision the required credentials and every other
149+ member got a 403 (** #1262 ** ). Same flags and semantics: ` --on-conflict `
150+ still defaults to ` fail ` , and transfers stay additive — nothing is ever
151+ deleted. Requires the updated cloud server, already deployed in
152+ production; the Personal rclone path is untouched.
132153- ** #1168 / #1172 ** : Optional Redis read caching accelerates standalone MCP
133154 reads via the ` basic-memory[redis] ` extra (` redis_url ` ,
134155 ` redis_max_connections ` ) (** #980 ** ).
156+ - ** #1255 ** : Semantic note reads make the minimum number of API requests —
157+ exact-ID reads skip resolve and resource calls entirely — and ordinary
158+ read-cache entries live 300 seconds instead of 60.
135159- ** #1062 / #1074 ** : Cloud project deletion errors are surfaced, with an
136160 optional notes purge and a visible deletion job (** #1033 ** , ** #1034 ** ).
137161- ** #1145 ** : First-connect MCP onboarding: server instructions, empty-state
@@ -141,6 +165,10 @@ stale full-text search entries.
141165- ** #1075 ** : ` move_note ` returns the previous accepted path (** #1072 ** ).
142166- ** #1040 / #1101 / #1103 ** : ` external_id ` is exposed in ` list_directory ` ,
143167 ` recent_activity ` , search results, and ` search_notes ` markdown output.
168+ - ** #1268 ** : ` list_directory ` accepts a ` sort ` parameter (` title_asc ` ,
169+ ` title_desc ` , ` updated_asc ` , ` updated_desc ` ) with deterministic
170+ folders-first ordering applied before pagination (** #1267 ** ); omitting it
171+ keeps the existing filename order.
144172- ** #1031 / #1036 / #1037 ** : MCP tool annotations are directory-compliant,
145173 destructive hints are explicit, and ` edit_note ` exposes its operation
146174 enum.
@@ -153,9 +181,17 @@ stale full-text search entries.
153181 (** #1187 ** , ** #1199 ** , ** #1209 ** ).
154182- A one-time migration dedupes historical duplicate observation rows and
155183 purges their orphaned full-text search entries (companion to ** #1228 ** ).
184+ - ** #1247 ** : Incremental ` bm reindex --search ` purges stale search-index
185+ rows whose backing entity, observation, or relation is gone, so DB-only
186+ search divergence on unchanged files converges without a ` --full ` rebuild
187+ (** #1226 ** ; the last loose end of the ** #1214 ** repair).
156188- ** #1152 / #1160 ** : Moves record a durable vacate marker, so a
157189 byte-identical copy at the old path indexes as a new note instead of
158190 being skipped as a lingering move source.
191+ - ** #1258 ** : A note accepted while a project scan is in flight can no
192+ longer be deleted as "externally removed" — destructive project-index
193+ deletes re-verify the database lineage and the path's current absence
194+ from storage at apply time (** #1256 ** ).
159195- ** #1016 ** : Direct on-disk edits picked up by the file watcher are now
160196 vector-embedded, so externally edited notes no longer go missing from
161197 semantic search until a reindex (closed by the vector-sync overhaul,
@@ -165,6 +201,12 @@ stale full-text search entries.
165201- ** #1071 ** : SQLite full-text search covers complete note content —
166202 previously content beyond ~ 6000 characters was invisible (** #1065 ** ) —
167203 and CJK terms work in the relaxed FTS fallback (** #1022 ** ).
204+ - ** #1269 ** : Full-text query relaxation counts non-Latin tokens, so
205+ Cyrillic, Greek, Hebrew, Arabic, and other non-Latin queries relax to an
206+ OR retry instead of silently degrading hybrid search to vector-only
207+ ranking, and combining marks stay inside their word so Devanagari and
208+ Thai terms are not shredded into fragments (extends the CJK-only fix from
209+ ** #1022 ** ).
168210- ** #1069 ** : Unknown semantic/hybrid result totals are explicit in
169211 structured search responses (** #1068 ** ).
170212- ** #1190 ** : ` bm reindex --embeddings ` warns when the project has no synced
@@ -175,18 +217,34 @@ stale full-text search entries.
175217 returning the wrong note (** #1148 ** ), and project-scoped entity
176218 resolution is separated from cross-project wikilink resolution
177219 (** #1192 ** , ** #1170 ** ).
220+ - ** #1272 ** : Root-level wikilinks written as filename stems resolve via the
221+ ` .md ` file-path fallback, and a forgiving underscore/hyphen/case alias
222+ resolves links in directly edited vaults — tried only after every exact
223+ identity, and failing closed when two files collide on the same alias
224+ (** #1253 ** ).
178225- ** #1189 ** : Note-type filters are case-canonicalized, so ` Person ` and
179226 ` person ` match the same population (** #1180 ** ).
180227- ** #1081 ** : ` write_note ` rejects filename-convention twins (kebab-case vs
181228 Title Case) instead of creating duplicate notes (** #1077 ** ).
182229- ** #1073 ** : ` edit_note ` with a ` memory:// ` URL routes to the target
183230 project instead of creating phantom notes (** #1066 ** ), and scoped
184231 ` memory:// ` URL paths are preserved (** #1092 ** ).
232+ - ** #1285 ** : Glob-filtered directory listings traverse subdirectories
233+ again: ` file_name_glob ` filters results instead of accidentally pruning
234+ recursion, so ` *.md ` with depth 2 finds files inside subdirectories.
185235- ** #1188 ** : Sync preserves malformed frontmatter instead of prepending a
186236 second frontmatter block that shadows ` name ` /` description ` (** #1171 ** ).
187237- ** #1239 ** : Timestamp-prefixed transcript lines and checkbox markers
188238 (` [x] ` , ` [/] ` , ` [>] ` , ` [?] ` ) no longer mint junk observation categories
189239 (** #1219 ** , ** #1241 ** ).
240+ - ** #1271 ** : Transcript timestamp ranges like ` [24:33.098 - 24:41.260] ` no
241+ longer mint junk observation categories either — the remaining
242+ range-shaped case from ** #1239 ** (** #1270 ** ).
243+ - ** #1291 ** : Prose bullets no longer mint typed relations: a sentence like
244+ ` - Added [[Target]] to the roster ` filed a relation * type* called ` Added `
245+ and silently dropped the rest of the line, including any further links in
246+ it. An explicit relation now ends at its target or its ` (context) ` ;
247+ anything else keeps every wikilink as a plain ` links_to ` edge (** #1260 ** ).
190248- ** #1060 ** : ` schema_validate ` with no arguments validates all
191249 schema-covered types instead of type "unknown" (** #1013 ** ), and invalid
192250 schema-validation modes are rejected instead of silently degrading to
@@ -196,6 +254,13 @@ stale full-text search entries.
196254- ** #1010 ** : ` bm project list ` shows configured cloud-mode projects even
197255 when uncredentialed (** #1003 ** ), and deleting the default project
198256 auto-reassigns the default instead of refusing (** #1139 ** ).
257+ - ** #1273 ** : Re-selecting the project that is already the default no longer
258+ clears the default flag — a state that broke project discovery and every
259+ project-scoped MCP tool until a default was set again.
260+ - ** #1290 ** : ChatGPT import no longer crashes on conversations missing
261+ ` create_time ` — timestamps fall back to ` update_time ` , then the earliest
262+ message time, so the whole archive imports (** #1276 ** ); undecodable
263+ import uploads return a 400 with the parse error instead of a 500.
199264- ** #1058 / #1094 ** : ` bm doctor ` never prints a blank failure message, and
200265 migrations adapt to existing event loops (** #1027 ** ).
201266- ** #1080 ** : Loading config no longer recreates an empty ` ~/basic-memory `
@@ -210,6 +275,11 @@ stale full-text search entries.
210275- ** #1059 / #1179 ** : Hermes: ` bm mcp ` child processes no longer leak
211276 (** #1017 ** ), and bm subprocesses no longer inherit Hermes's Python
212277 environment (** #1093 ** ).
278+ - ** #1274 ** : Hermes: commands and skills register through Hermes's own
279+ registration APIs instead of private PluginManager writes, preserving the
280+ lifecycle ownership that cleans them up on provider unload (** #1257 ** );
281+ the slash-command monkeypatch docs are split by Hermes version so modern
282+ installs skip the legacy collector workaround (** #1278 ** ).
213283
214284### Maintenance
215285
0 commit comments