What's Changed
- fix(core): repair FTS half of hybrid search for natural-language queries by @groksrc in #994
- docs(ci): fix stale basicmachines.co post-release step by @groksrc in #999
- docs: Update README.md by @phernandez in #1000
- ci(ci): validate Auto BM webhook by @phernandez in #1019
- ci(ci): remove legacy Basic Memory workflow by @phernandez in #1020
- fix(core): make local Postgres backend usable (migrations, pooling, default project) by @phernandez in #1018
- test(benchmarks): vendor benchmark suite and add write-load harness by @phernandez in #1021
- docs(core): clarify DCO and CLA requirements by @phernandez in #1025
- fix(mcp): add directory-compliant tool annotations by @phernandez in #1031
- fix(mcp): gate ChatGPT compatibility tools by clientInfo by @phernandez in #1035
- fix(mcp): set explicit destructive hints by @phernandez in #1036
- fix(mcp): expose edit_note operation enum by @phernandez in #1037
- feat(mcp): expose note external_id in list_directory and recent_activity output by @jope-bm in #1040
- chore: formatting fixes by @phernandez in #1042
- chore: add dist recipe for skills by @phernandez in #1049
- chore(deps): refresh dependencies with LiteLLM compatibility cap by @phernandez in #1051
- feat(skills): add memory-onboarding skill by @cfaust990 in #1050
- chore(deps): unpin and refresh FastMCP by @phernandez in #1052
- refactor(core): add shared runtime orchestration by @phernandez in #1002
- refactor(core): structure campaign — collapse seams, honest types, typed boundaries by @phernandez in #1054
- fix(cli): show configured project in list when uncredentialed (#1003) by @rudi193-cmd in #1010
- feat(plugins): fall back to user-level ~/.claude settings for Claude Code hook config by @samuellawerentz in #924
- fix(plugins): make Claude hook tests portable on Windows by @phernandez in #1055
- fix(integrations): stop leaking bm mcp children from the Hermes provider by @phernandez in #1059
- fix(cli): never print a blank doctor failure message by @phernandez in #1058
- fix(core): chunk select_by_ids to stay under SQLite bound-parameter limit by @phernandez in #1057
- test(api): cover single-entity delete for non-markdown file entities by @phernandez in #1056
- feat(cli): add bm cloud share command group (create/list/update/revoke) by @groksrc in #965
- fix(mcp): validate all schema-covered types when schema_validate gets no arguments by @phernandez in #1060
- feat(mcp): add basic_memory_diagnostics tool for version and system info by @groksrc in #963
- fix(core): support CJK terms in relaxed FTS fallback by @liusiyuxyfx in #1022
- feat(cli): add Rich human-readable output to bm tool commands by @groksrc in #967
- fix(core): make replace_section level-aware with replace_subsections opt-out by @phernandez in #1063
- fix(mcp): surface cloud project delete errors and support delete_notes by @phernandez in #1062
- feat(core): add LiteLLM API base and API key config by @lastguru-net in #1043
- fix(cli): remove newly-ignored files from cloud on one-way sync and add bm cloud prune by @phernandez in #1061
- feat(core): add semantic embedding text prefixes by @lastguru-net in #1044
- ci(skills): publish onboarding archive on main pushes by @phernandez in #1067
- fix(mcp): expose unknown search totals by @phernandez in #1069
- fix(core): search complete SQLite note content by @phernandez in #1071
- fix(mcp): prevent phantom memory URL edits by @phernandez in #1073
- fix(mcp): surface cloud project deletion job by @phernandez in #1074
- fix(core): expose previous accepted move path by @phernandez in #1075
- fix(core): persist observations and relations on DB-first accepted writes by @phernandez in #1079
- fix(core): avoid phantom project directory on config load by @phernandez in #1080
- fix(core): reject equivalent note filenames by @phernandez in #1081
- fix(mcp): paginate directory listings by @phernandez in #1082
- fix(cli): replace retired Basic Memory links by @phernandez in #1083
- fix(ci): keep issue triage focused on triage by @phernandez in #1086
- fix(mcp): index recreated projects by @phernandez in #1085
- fix(ci): grant Claude Code workflow write access to open PRs by @phernandez in #1087
- fix(mcp): preserve scoped memory URL paths by @phernandez in #1092
- fix(ci): drop broken pull_request_target trigger + provision toolchain for Claude workflow by @phernandez in #1091
- feat(skills): add Pythonic code guidance by @phernandez in #1095
- test(skills): add issue-derived Pythonic code evals by @phernandez in #1099
- feat(api): add owning-entity external_id to search results by @jope-bm in #1101
- feat(core): honor note timestamps from frontmatter by @phernandez in #1100
- refactor(core): unify accepted note runtime boundaries by @phernandez in #1102
- feat(skills): use Pythonic guidance in GitHub agents by @phernandez in #1104
- feat(mcp): emit external_id in search_notes markdown output by @jope-bm in #1103
- feat(skills): add pull request workflow skills by @phernandez in #1105
- refactor(mcp): remove canvas tool and resource write endpoints by @phernandez in #1111
- refactor(core): delete dead post-seam compatibility shims by @phernandez in #1112
- refactor(api): collapse dead v1/_v2 DI provider tiers by @phernandez in #1113
- refactor(api): inject config from composition roots into the DI graph by @phernandez in #1114
- docs(core): refresh ARCHITECTURE.md after the arch-review cleanup by @phernandez in #1115
- feat(core): add bm hook producer front door for harness capture by @phernandez in #1070
- feat(plugins): surface hook capture setup and health by @phernandez in #1119
- chore(plugins): rename Codex marketplace to basic-memory by @phernandez in #1120
- refactor(core): rename picoschema package and drop legacy routes by @phernandez in #1121
- refactor(core): split search query and row hydration by @phernandez in #1122
- fix(plugins): make Codex hooks and memory notes reliable by @phernandez in #1123
- feat(plugins): add bm-writing skill and coding setup to Claude Code plugin by @phernandez in #1124
- feat(plugins): add queryable coding session profiles by @phernandez in #1125
- feat(plugins): add bm-decide and bm-orient skills to Claude Code plugin by @phernandez in #1126
- fix(migrations): improve async migration handling by adapting to existing event loops by @m-freelance in #1094
- fix(core): normalize coding-session paths to POSIX form by @phernandez in #1127
- feat(cli): add bm config command group for get/set/list/unset by @phernandez in #1088
- feat(mcp): add metadata param to edit_note for frontmatter updates by @phernandez in #1090
- refactor(core): extract semantic chunk planning by @phernandez in #1128
- refactor(core): extract semantic vector synchronization by @phernandez in #1129
- refactor(core): consolidate semantic vector planning by @phernandez in #1130
- perf(core): batch semantic vector prepare transactions by @phernandez in #1131
- perf(core): batch relation resolution writes by @phernandez in #1132
- refactor(core): split configuration concerns by @phernandez in #1134
- refactor(core): split project workflow planning by @phernandez in #1133
- refactor(core): split note content contracts by @phernandez in #1135
- refactor(mcp): split project context helpers by @phernandez in #1136
- feat(plugins): share Codex hook defaults by @phernandez in #1137
- fix(plugins): author Codex checkpoints after compaction by @phernandez in #1138
- fix(plugins): pin Codex hooks to merged runtime by @phernandez in #1140
- fix: auto-reassign default project on delete instead of refusing by @phernandez in #1139
- feat(core): relay self-supersede on stale base + db_version provenance by @phernandez in #1144
- feat(core): relay persists become unconditional versioned exports by @phernandez in #1146
- fix(plugins): prompt Codex checkpoints after compaction by @phernandez in #1142
- fix(core): reject stale file reconciliation by @phernandez in #1149
- feat(plugins): make Codex checkpoints directly resumable by @phernandez in #1147
- refactor(core): remove Vulture-confirmed dead code by @phernandez in #1153
- fix(core): fail loud on ambiguous strict identifier resolution by @jope-bm in #1151
- feat(mcp): first-connect onboarding — instructions, empty-state guidance, getting_started prompt by @phernandez in #1145
- feat(core): add optional cross-encoder reranker stage to search by @ironhalik in #1143
- docs(mcp): add MCP Toplist rank badge by @phernandez in #1157
- fix(core): gate move-orphan skip on a durable move-vacate marker by @jope-bm in #1152
- feat(core): add pluggable semantic vector indexes by @phernandez in #1141
- feat(core): add optional Milvus vector index by @phernandez in #1158
- fix(core): refresh pending relations from accepted content by @phernandez in #1161
- fix(core): give the move-orphan gate a content-checksum source by @jope-bm in #1160
- refactor(core): simplify v0.23 lifecycle and vector surfaces by @phernandez in #1162
- refactor(core): simplify v0.23 runtime protocols by @phernandez in #1164
- fix(core): keep relation search refresh retryable by @phernandez in #1165
- docs(skills): keep PR reviews focused by @phernandez in #1166
- chore(deps): upgrade ruff and ty with strict checking by @phernandez in #1167
- perf(api): add optional Redis read caching by @phernandez in #1168
- fix(core): guard note-file cleanup delete against a check→delete TOCTOU by @jope-bm in #1169
- perf(api): add Redis-cached QUERY and MCP reads by @phernandez in #1172
- fix(core): load existing Milvus collections after restart by @phernandez in #1185
- fix(integrations): stop bm subprocesses inheriting Hermes's Python env by @tonydzi in #1179
- fix(core): preserve malformed frontmatter during sync by @phernandez in #1188
- fix(core): enforce materialization lock order by @phernandez in #1193
- fix(core): remove regular-file permalink lookup by @phernandez in #1191
- fix(cli): warn when embedding reindex has no entities by @phernandez in #1190
- fix(core): canonicalize note type filters by @phernandez in #1189
- fix(api): separate entity and link resolution by @phernandez in #1192
- feat(mcp): adopt FastMCP 4 beta by @phernandez in #1198
- fix(core): lock entity before observation replacement by @phernandez in #1202
- fix(core): defer superseded vector generations by @phernandez in #1203
- fix(core): batch relation target resolution by @phernandez in #1204
- docs(core): define constructive domain modeling by @phernandez in #1207
- fix: keep customer content out of loguru message formatting during index retries by @phernandez in #1216
- fix(core): survive concurrent Windows log cleanup by @phernandez in #1218
- fix(ci): make issue triage labeling deterministic by @phernandez in #1206
- test(ci): locate Git Bash from MinGW Git path by @phernandez in #1221
- fix: generation-versioned relation persistence by @phernandez in #1220
- fix(core): validate schema validation modes by @phernandez in #1223
- fix(core): remove entity read locks from materialization publish by @phernandez in #1227
- refactor(core): split note content planning by state by @phernandez in #1229
- fix(core): fence observation persistence behind note content generation by @phernandez in #1228
- docs(core): set review expectations for eventually consistent state by @phernandez in #1230
- test(core): close reranker phase-1 coverage gaps by @phernandez in #1232
- test(core): add reranker real-model smoke and quality harness by @phernandez in #1233
- fix(cli): surface reindex embedding failures and index identity by @phernandez in #1240
- fix(core): reject timestamp and checkbox-marker observation categories by @phernandez in #1239
- fix(core): default reranker document cap to 2000 chars by @phernandez in #1245
- docs(core): add v0.23.0 changelog entry by @phernandez in #1244
- fix(core): reconcile stale search index rows on reindex by @phernandez in #1247
- perf(mcp): optimize semantic note reads by @phernandez in #1255
- fix(sync): guard project-index deletes against materialization by @phernandez in #1258
- feat(cli): add inspect chunks note-level retrieval view by @phernandez in #1249
- feat(core): add inspect query retrieval execution trace by @phernandez in #1250
- feat(mcp): add directory listing sorting by @phernandez in #1268
- fix(core): preserve repeated default project selection by @phernandez in #1273
- fix(integrations): preserve Hermes registration ownership by @mikemikimike in #1274
- docs(integrations): clarify Hermes monkeypatch by version by @groksrc in #1278
- fix(core): reject transcript timestamp ranges by @phernandez in #1271
- fix(core): resolve root wikilinks by filename by @phernandez in #1272
- fix(core): count non-Latin tokens when relaxing full-text queries by @gingeard in #1269
- fix(core): traverse subdirectories in glob-filtered directory listings by @phernandez in #1285
- test(mcp): add concurrent write_note MCP integration tests by @phernandez in #1286
- fix(cli): run Team push/pull over WebDAV instead of storage credentials by @groksrc in #1263
- fix(core): guard ChatGPT import against missing create_time by @phernandez in #1290
- fix(core): stop minting typed relations from prose tails by @phernandez in #1291
- ci(core): fix the silently-skipped dev release publish by @phernandez in #1292
- docs(core): cover post-entry merges in the v0.23.0 changelog by @phernandez in #1289
- ci(core): publish dev releases via trusted publishing by @phernandez in #1293
- fix(mcp): bound context traversal requests by @phernandez in #1299
- docs(core): explain custom FastEmbed models by @phernandez in #1300
- fix(cli): stop reporting "up to date" when the Homebrew update check fails by @groksrc in #1298
- docs(integrations): require supported Hermes installer by @phernandez in #1303
- docs(core): document FastEmbed E5 prefixes by @phernandez in #1302
- feat(benchmarks): add concurrent-write driver by @phernandez in #1304
- chore(skills): add cmux skills by @phernandez in #1305
- fix(core): update benchmark MCP result fields by @phernandez in #1307
- docs(core): cover the 2026-08-22 merges in the v0.23.0 changelog by @phernandez in #1309
- chore(core): remove legacy benchmark judge by @phernandez in #1308
- fix(cli): route Team WebDAV transfers to the control-plane base by @phernandez in #1310
- docs(core): set the v0.23.0 release date by @phernandez in #1311
- chore(core): release v0.23.0 by @phernandez in #1312
New Contributors
- @cfaust990 made their first contribution in #1050
- @samuellawerentz made their first contribution in #924
- @liusiyuxyfx made their first contribution in #1022
- @lastguru-net made their first contribution in #1043
- @m-freelance made their first contribution in #1094
- @ironhalik made their first contribution in #1143
- @tonydzi made their first contribution in #1179
- @mikemikimike made their first contribution in #1274
- @gingeard made their first contribution in #1269
Full Changelog: v0.22.1...v0.23.0